LangChain CSV/Pandas Dataframe Agent返回函数调用JSON未执行问题
CSV Agent仅返回工具调用JSON未执行代码的解决方法
问题概述
- 背景:基于
langchain-experimental的CSV Agent(Pandas Dataframe Agent封装)编写CSV数据分析脚本,调用agent.run(user_message)执行分析 - 预期:Agent调用
python_repl_ast工具执行代码,最终返回自然语言形式的分析结果 - 异常:仅返回工具调用的JSON结构,未实际执行代码,也无自然语言输出
问题示例
执行agent.run("How many rows are there?")后输出:
> Entering new AgentExecutor chain... { "function": "python_repl_ast", "parameters": { "query": "len(df)" } } > Finished chain.
问题原因
- 参数传递错误:
create_csv_agent的openai_model参数需传入模型名称字符串,而非ChatOpenAI实例,错误的参数会导致Agent逻辑异常 - 模型兼容性问题:使用的Mixtral 8x7B Instruct模型对OpenAI函数调用格式的响应不符合LangChain的OPENAI_FUNCTIONS Agent预期,仅返回函数调用JSON但未触发工具执行流程
解决方法
1. 修正参数错误
将openai_model=chat_model改为传入模型名称字符串model:
agent = create_csv_agent( chat_model, filepath, verbose=True, openai_model=model, # 改为模型名称字符串 agent_type=AgentType.OPENAI_FUNCTIONS, )
2. 更换Agent类型(推荐)
改用ZERO_SHOT_REACT_DESCRIPTION类型,该类型依赖自然语言描述工具,对非OpenAI模型的兼容性更好:
agent = create_csv_agent( chat_model, filepath, verbose=True, agent_type=AgentType.ZERO_SHOT_REACT_DESCRIPTION, )
3. 强制模型遵循函数调用格式
若坚持使用OPENAI_FUNCTIONS类型,需在系统提示中明确要求模型返回符合OpenAI规范的函数调用格式,并触发工具执行后生成自然语言回答。可通过自定义提示模板实现:
from langchain.prompts import ChatPromptTemplate system_prompt = """你是一个数据分析专家,需要使用提供的python_repl_ast工具执行代码,然后根据执行结果生成自然语言回答。请严格按照以下格式返回: 如果需要调用工具,返回: {{ "function": "python_repl_ast", "parameters": {{ "query": "要执行的代码" }} }} 工具执行完成后,根据结果生成自然语言回答。""" prompt = ChatPromptTemplate.from_messages([ ("system", system_prompt), ("human", "{input}"), ("ai", "{agent_scratchpad}") ]) agent = create_csv_agent( chat_model, filepath, verbose=True, agent_type=AgentType.OPENAI_FUNCTIONS, prompt=prompt )
完整修正代码
import os from langchain.chat_models import ChatOpenAI from langchain.agents.agent_types import AgentType from langchain_experimental.agents.agent_toolkits import create_csv_agent api_key = os.environ.get("OPENROUTER_API_KEY") api_base = "https://openrouter.ai/api/v1" model = "mistralai/mixtral-8x7b-instruct" chat_model = ChatOpenAI( api_key=api_key, base_url=api_base, model=model, temperature=0.0, ) def main(): filepath = input("Enter the path to the CSV file: ") agent = create_csv_agent( chat_model, filepath, verbose=True, agent_type=AgentType.ZERO_SHOT_REACT_DESCRIPTION, ) while True: user_message = input("You: ") lower_message = user_message.lower() if lower_message == "goodbye" or lower_message == "goodbye!": break response = agent.run(user_message) print(response) if __name__ == "__main__": main()
内容的提问来源于stack exchange,提问作者imclerran
相关产品推荐
相关产品推荐

