Langchain Pandas代理未遵循指令

我正在使用来自Azure OpenAI的GPT-4作为语言模型的langchain pandas代理。我正在处理一个包含我们员工企业数据的DataFrame,主要目标是使用代理检索员工的信息。目前,我们遇到了两个主要问题:

  1. 当要求从部分子字符串中查找信息时,代理从未检索到信息。它要么寻找完全匹配,要么寻找包含输入的子字符串。

  2. 当要求检索每周工作时间最长或最短的员工时,即使指示要查找平局,它也不检查平局。它就是不起作用。

这是我正在使用的代码,以及我使用的前缀和后缀。

前缀:

prefix='您是一个pandas代理。您必须处理包含公司员工信息的DataFrame df。您的回答必须仅包含从df中检索的信息,您不得创建模拟或样本数据。如果您这样做,将受到处罚。用户可能会使用我们员工名字的子字符串来问您问题。在检索有关员工名字的信息时,请遵循这些有用的指令:如果找到完全匹配,请以自然语言检索信息。如果没有,则包括一个忽略NaN且不区分大小写的str.contains搜索,方式如下。例如,如果他们询问Alice West,请查找:df['NAMES'].str.contains('alice', case=False, na=False) & df['NAMES'].str.contains('west', case=False, na=False)并检索找到的信息。如果我们有超过20行,只检索前20行的信息。在排序信息时,如检索列的最高或最低值,始终检查平局。如果有平局,检索前3行的信息。例如,如果每周工作的最大小时数是10但不止一个员工有这个小时数,那么打印最多20行。'

后缀:

suffix ='您必须以自然语言回答,并且绝不能编造信息。如果您这样做,将受到处罚。'

代码:

data = {    "NAMES": ["John W. Doe", "Alice Smith", "John Adams Jr.", "Alice Johnson", "John Jr. Doe"],    "CITY": ["New York", "Los Angeles", "Chicago", "Houston", "Chicago"],    "STATION": ["Station A", "Station B", "Station C", "Station D", "Station E"],    "STARTING_YEAR": [2015, 2017, 2015, 2018, 2019],    "DURATION_HOURS_WEEK": [40, 35, 40, 30, 45]}df = pd.DataFrame(data)create_pandas_dataframe_agent(            llm=_model,            df=df,            suffix=suffix,            include_df_in_prompt=True,            agent_type=AgentType.OPENAI_FUNCTIONS,            prefix=prefix,            max_iterations=5,            verbose=True)

当要求执行此查询:“John Doe的每周工作时间是多少?”时,它什么也没检索到。

该员工不在提供的DataFrame中。请检查员工的名字。我注意到代理在REPL中使用的代码是:

df['NAME'].str.contains('John Doe', na=ignore, case=False)

这会返回一个空的DataFrame。应该这样做:

df['NAME'].str.contains('John', na=False, case=False) & df['NAME'].str.contains('Doe', na=False, case=False)

以检索“John W. Doe”和“John Jr. Doe”的数据。

最后一个错误是,当询问谁的工作时间最长时,它在REPL中执行的是:

df['DURATION_HOURS_WEEK'].nlargest(1)

所以它检索了一个员工的信息,但最高值有平局。前缀指示模型始终检查平局,但它不起作用。

我想知道指示这个代理遵循给定指令的最佳方法是什么。使用工具还是函数在这方面更好?


回答:

实际上,要获得最佳结果,您需要提供适当的前缀、后缀、调用查询,最后是一个最佳的语言模型。

使用下面的前缀和相同的调用查询,我得到了预期的输出

prefix = """您是一个pandas代理。您必须处理包含公司员工信息的DataFrame df。您的回答必须仅包含从df中检索的信息,您不得创建模拟或样本数据。如果您这样做,将受到处罚。用户可能会使用我们员工名字的子字符串来问您问题。在检索有关员工名字的信息时,请遵循这些有用的指令:如果找到完全匹配,请以自然语言检索信息。如果没有,则包括一个忽略NaN且不区分大小写的str.contains搜索,方式如下。例如,如果他们询问Alice West,将其分成两个名字,如alice和west,然后在数据框中查找:df['NAMES'].str.contains('alice', case=False, na=False) & df['NAMES'].str.contains('west', case=False, na=False)并检索找到的信息。如果我们有超过20行,只检索前20行的信息。在排序信息时,如检索列的最高或最低值,始终检查平局。如果有平局,检索所有具有相同值的员工的信息,最多20行。以下是我数据框中用于查询的列。NAMES,CITY,STATION,STARTING_YEAR,DURATION_HOURS_WEEK."""

输出:

enter image description here

enter image description here

所以,在前缀和后缀中,尽量提供更具体的示例和数据框详情。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注