使用LangChain create_csv_agent调用Flan-T5-xxl时遇解析错误
问题:LangChain create_csv_agent 搭配 Flan-T5-XXL 触发 OutputParserException
我在用LangChain的create_csv_agent工具,基于小型CSV数据集测试google/flan-t5-xxl模型查询表格数据的能力,现在遇到OutputParserException错误,提示Could not parse LLM output: \0``。
报错栈信息
> Entering new AgentExecutor chain... --------------------------------------------------------------------------- OutputParserException Traceback (most recent call last) <ipython-input-13-f86336065d8e> in <cell line: 1>() ----> 1 agent.run('how many rows are there?') 7 frames /usr/local/lib/python3.10/dist-packages/langchain/chains/base.py in run(self, callbacks, tags, metadata, *args, **kwargs) 473 if len(args) != 1: 474 raise ValueError("`run` supports only one positional argument.") --> 475 return self(args[0], callbacks=callbacks, tags=tags, metadata=metadata)[ 476 _output_key 477 ] /usr/local/lib/python3.10/dist-packages/langchain/chains/base.py in __call__(self, inputs, return_only_outputs, callbacks, tags, metadata, include_run_info) 280 except (KeyboardInterrupt, Exception) as e: 281 run_manager.on_chain_error(e) --> 282 raise e 283 run_manager.on_chain_end(outputs) 284 final_outputs: Dict[str, Any] = self.prep_outputs( /usr/local/lib/python3.10/dist-packages/langchain/chains/base.py in __call__(self, inputs, return_only_outputs, callbacks, tags, metadata, include_run_info) 274 try: 275 outputs = ( --> 276 self._call(inputs, run_manager=run_manager) 277 if new_arg_supported 278 else self._call(inputs) /usr/local/lib/python3.10/dist-packages/langchain/agents/agent.py in _call(self, inputs, run_manager) 1034 # We now enter the agent loop (until it returns something). 1035 while self._should_continue(iterations, time_elapsed): --> 1036 next_step_output = self._take_next_step( 1037 name_to_tool_map, 1038 color_mapping, /usr/local/lib/python3.10/dist-packages/langchain/agents/agent.py in _take_next_step(self, name_to_tool_map, color_mapping, inputs, intermediate_steps, run_manager) 842 raise_error = False 843 if raise_error: --> 844 raise e 845 text = str(e) 846 if isinstance(self.handle_parsing_errors, bool): /usr/local/lib/python3.10/dist-packages/langchain/agents/agent.py in _take_next_step(self, name_to_tool_map, color_mapping, inputs, intermediate_steps, run_manager) 831 832 # Call the LLM to see what to do. --> 833 output = self.agent.plan( 834 intermediate_steps, 835 callbacks=run_manager.get_child() if run_manager else None, /usr/local/lib/python3.10/dist-packages/langchain/agents/agent.py in plan(self, intermediate_steps, callbacks, **kwargs) 455 full_inputs = self.get_full_inputs(intermediate_steps, **kwargs) 456 full_output = self.llm_chain.predict(callbacks=callbacks, **full_inputs) --> 457 return self.output_parser.parse(full_output) 458 459 async def aplan( /usr/local/lib/python3.10/dist-packages/langchain/agents/mrkl/output_parser.py in parse(self, text) 50 51 if not re.search(r"Action\s*\d*\s*:[\s]*(.*?)", text, re.DOTALL): --> 52 raise OutputParserException( 53 f"Could not parse LLM output: `{text}`", 54 observation=MISSING_ACTION_AFTER_THOUGHT_ERROR_MESSAGE, OutputParserException: Could not parse LLM output: `0`
我的代码
import os from langchain import PromptTemplate, HuggingFaceHub, LLMChain, OpenAI, SQLDatabase, HuggingFacePipeline from langchain.agents import create_csv_agent from langchain.chains.sql_database.base import SQLDatabaseChain from transformers import AutoTokenizer, AutoModelForSeq2SeqLM, AutoConfig import transformers model_id = 'google/flan-t5-xxl' config = AutoConfig.from_pretrained(model_id) tokenizer = AutoTokenizer.from_pretrained(model_id) model = AutoModelForSeq2SeqLM.from_pretrained(model_id, config=config) pipe = pipeline('text2text-generation', model=model, tokenizer=tokenizer, max_length = 1024 ) local_llm = HuggingFacePipeline(pipeline = pipe) agent = create_csv_agent(llm = hf_llm, path = "dummy_data.csv", verbose=True) agent.run('how many unique status are there?')
我试过轻量版Flan-T5和OpenAI模型,但OpenAI单次查询就触发速率限制,而且create_csv_agent除OpenAI外的文档很少,求解决这个解析错误。
解决方案
1. 核心原因
create_csv_agent默认使用MRKL(ReAct)代理的输出解析器,要求LLM输出必须包含Action和Action Input等特定格式内容。但Flan-T5这类模型直接返回答案(比如0),未遵循代理格式要求,导致解析失败。
2. 修复步骤
步骤1:修正代码变量名笔误
代码中定义了local_llm,但创建agent时误用了hf_llm,先修正:
agent = create_csv_agent(llm = local_llm, path = "dummy_data.csv", verbose=True)
步骤2:自定义代理提示模板,强制格式输出
Flan-T5对指令遵循性依赖明确提示,需修改默认agent提示,让它严格按照ReAct格式输出:
from langchain.agents import AgentType, initialize_agent from langchain.agents.mrkl.prompt import FORMAT_INSTRUCTIONS from langchain.tools.python.tool import PythonREPLTool from langchain import PromptTemplate # 自定义提示,强化格式要求 CUSTOM_PROMPT = f""" 你是处理CSV数据的助手,必须严格按照以下格式输出: {FORMAT_INSTRUCTIONS} 现在处理用户问题:{{input}} """ # 加载CSV操作工具 tools = [PythonREPLTool()] # 初始化agent并绑定自定义提示 agent = initialize_agent( tools, local_llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True, agent_kwargs={ "prompt": PromptTemplate( input_variables=["input", "agent_scratchpad"], template=CUSTOM_PROMPT + "\n\n{agent_scratchpad}" ) } ) # 查询时明确告知agent操作对象 agent.run("先加载dummy_data.csv,然后告诉我有多少个唯一的status?")
步骤3:改用更适配的工具链替代create_csv_agent
如果不需要完整代理能力,直接用CSVLoader+RetrievalQA或把CSV转成SQLite用SQLDatabaseChain,可避免格式问题:
from langchain.document_loaders.csv_loader import CSVLoader from langchain.vectorstores import FAISS from langchain.embeddings import HuggingFaceEmbeddings from langchain.chains import RetrievalQA # 加载CSV数据 loader = CSVLoader(file_path="dummy_data.csv") documents = loader.load() # 创建向量检索库 embeddings = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2") db = FAISS.from_documents(documents, embeddings) # 构建QA链 qa_chain = RetrievalQA.from_chain_type( llm=local_llm, chain_type="stuff", retriever=db.as_retriever(), verbose=True ) # 执行查询 qa_chain.run("有多少个唯一的status?")
3. 额外优化建议
- 给Flan-T5添加参数减少输出随机性,提升格式稳定性:
pipe = pipeline('text2text-generation', model=model, tokenizer=tokenizer, max_length=1024, do_sample=False, temperature=0.0 )
- 若用OpenAI,调整参数规避速率限制:
openai_llm = OpenAI( temperature=0.0, max_retries=3, request_timeout=10 )
内容的提问来源于stack exchange,提问作者newuser
相关产品推荐
相关产品推荐

