我正在使用来自Azure OpenAI的GPT-4作为语言模型的langchain pandas代理。我正在处理一个包含我们员工企业数据的DataFrame,主要目标是使用代理检索员工的信息。目前,我们遇到了两个主要问题:
-
当要求从部分子字符串中查找信息时,代理从未检索到信息。它要么寻找完全匹配,要么寻找包含输入的子字符串。
-
当要求检索每周工作时间最长或最短的员工时,即使指示要查找平局,它也不检查平局。它就是不起作用。
这是我正在使用的代码,以及我使用的前缀和后缀。
前缀:
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."""
输出:
和
所以,在前缀和后缀中,尽量提供更具体的示例和数据框详情。