使用LangChain+Llama2构建CSV聊天机器人时卡在AgentExecutor环节求助
以下是几个可能导致你的代码卡在> Entering new AgentExecutor chain...的原因及对应解决办法:
本地LLM推理速度过慢
你使用的Llama-2-7B量化模型,即使是q3_K_S版本,在普通CPU上推理速度也极慢,而CSV Agent需要模型多轮思考并调用工具,会导致长时间无响应看起来像卡住。
解决:换用更轻量的量化模型(比如q4_K_M或q2_K版本),或切换到更小的模型如Mistral-7B的量化版;如果有NVIDIA GPU,给CTransformers添加device='cuda'参数启用GPU加速(需确保安装了对应GPU版本的依赖)。模型无法正确解析Agent的默认Prompt
CSV Agent的默认Prompt相对复杂,量化后的小模型可能无法理解其中的工具调用逻辑,导致无法生成有效指令。
解决:简化Prompt模板,明确引导模型调用工具。比如先打印默认Prompt(你的代码中已注释#agent.agent.llm_chain.prompt.template),然后替换为更简洁的版本:from langchain.prompts import PromptTemplate custom_prompt = PromptTemplate( input_variables=["input", "agent_scratchpad"], template="""你需要根据提供的CSV数据回答问题,只能使用给定工具。 问题:{input} 请直接调用工具完成计算,输出工具调用内容: {agent_scratchpad}""" ) agent.agent.llm_chain.prompt = custom_prompt模型文件损坏或加载异常
如果模型文件下载不完整或损坏,CTransformers加载后可能出现无声阻塞的情况。
解决:重新下载模型文件,确认文件路径和名称完全匹配;同时调整LLM参数,将max_new_tokens调低(比如128)、temperature设为0,减少模型生成的不确定性。工具调用逻辑异常
即使CSV只有2行,若模型生成了错误的工具调用指令,也可能导致循环等待。
解决:先手动用pandas验证数据操作,比如运行pd.read_csv("rating.csv").shape[0]确认能正确获取行数,再通过Prompt强制模型调用正确的工具函数。
修改后的示例代码(启用GPU+简化Prompt):
!pip -q install langchain langchain_experimental ctransformers pandas from langchain.llms import CTransformers from langchain_experimental.agents.agent_toolkits.csv.base import create_csv_agent from langchain.prompts import PromptTemplate # 加载LLM,启用GPU(如果有) llm = CTransformers( model="llama-2-7b-chat.ggmlv3.q4_K_M.bin", model_type="llama", max_new_tokens=128, temperature=0.0, device='cuda' ) # 创建CSV Agent agent = create_csv_agent(llm, "rating.csv", verbose=True, separator=",") # 设置自定义Prompt custom_prompt = PromptTemplate( input_variables=["input", "agent_scratchpad"], template="""你是CSV数据助手,只能用提供的工具回答问题。 问题:{input} 请调用工具完成计算,输出工具调用内容: {agent_scratchpad}""" ) agent.agent.llm_chain.prompt = custom_prompt # 执行查询 agent.run("how many rows are there?")
内容的提问来源于stack exchange,提问作者Alberto

