You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 14:02:04