LangChain代理集成CSV与文本文件工具遇数据访问异常求助
解决代理调用CSV工具时无法访问数据的问题
问题根源
直接调用csv_agent时,它已经完成了CSV文件的加载并缓存了DataFrame,因此可以直接使用df执行操作;但通过上层代理调用csv-chain工具时,上层代理传递的输入指令中包含了"指定文件路径"的要求,导致csv_agent误解为需要重新读取文件,而它并不知道实际的文件路径,最终触发FileNotFoundError。
解决方案
方案1:优化工具描述,明确无需指定文件路径
修改csv-chain工具的description,清晰告知该工具已绑定目标CSV数据,无需再提供文件路径,只需直接描述数据分析需求:
description = "用于分析已预加载的CSV数据,无需提供文件路径,直接描述具体分析操作(如计算平均值、找出数值降幅最大的测试项等)"
这样上层代理生成调用指令时,就不会要求传入文件路径,csv_agent会直接使用已加载的DataFrame执行操作。
方案2:封装工具函数,屏蔽文件读取逻辑
给csv_agent.run套一层包装函数,自动过滤输入中涉及"读取文件""文件路径"的内容,确保工具始终基于已加载的DataFrame处理请求:
def wrapped_csv_agent(query): # 过滤掉可能触发文件读取的关键词 processed_query = query.replace("文件路径", "").replace("读取CSV", "").replace("加载文件", "") return csv_agent.run(processed_query) # 更新工具定义 tools = [ Tool( name='process_info', func=process_chain.run, description=desc_process ), Tool( name='csv-chain', func=wrapped_csv_agent, description=description ) ]
方案3:调整上层代理Prompt,明确工具能力
在构建上层代理的prompt时,补充说明csv-chain工具的预加载特性,避免代理生成不合理的调用指令:
prompt = PromptTemplate( input_variables=["input", "agent_scratchpad"], template=""" 你可以使用以下工具回答问题: - process_info:用于查询业务流程说明 - csv-chain:已预加载目标CSV数据,无需提供文件路径,直接描述数据分析需求 当前输入:{input} 执行记录:{agent_scratchpad} """ )
方案4:确保CSV Agent的上下文被正确保留
检查csv_agent的初始化逻辑,确保它在作为工具注入上层代理前,已经完成CSV文件的加载,且实例可复用:
# 提前完成CSV Agent初始化,加载目标数据 csv_agent = create_csv_agent( llm=llm, path="/实际的CSV文件绝对路径.csv", verbose=True, allow_dangerous_code=True # 若需要执行Python代码则开启 )
修改完成后重新运行上层代理查询,csv_agent会直接使用已加载的df执行计算,不再尝试读取新文件。
内容的提问来源于stack exchange,提问作者user1450410
相关产品推荐
相关产品推荐

