LangChain Agent输出解析失败问题求助(AWS环境)
解决LangChain zero-shot-react-description Agent解析失败问题(含Bedrock模型输出无效标记)
问题核心
基于AWS Bedrock、Lambda构建的LangChain RAG应用中,使用zero-shot-react-description类型Agent时,约1/5概率出现LLM输出解析失败。添加handle_parsing_errors=True参数无效,LangSmith显示LLM输出包含<|start_header_id|>这类无效内容,StrOutputParser能生成答案但Agent执行失败。
针对性解决方案
1. 自定义输出解析器过滤无效标记
在LLM输出传递给Agent前,先过滤Bedrock生成的特殊标记:
from langchain.schema import BaseOutputParser from langchain.agents.initialize import initialize_agent class BedrockCleanParser(BaseOutputParser): def parse(self, text: str) -> str: # 移除Bedrock特殊标记 cleaned_text = text.replace("<|start_header_id|>", "").replace("<|end_header_id|>", "") return cleaned_text # 给LLM绑定清理解析器 llm_with_cleaner = llm | BedrockCleanParser() # 初始化Agent agent = initialize_agent( tools=tools, llm=llm_with_cleaner, agent="zero-shot-react-description", verbose=True, handle_parsing_errors=True )
2. 强制模型输出标准格式
修改Agent的提示词,明确要求模型不得输出特殊标记:
from langchain.agents import ZeroShotAgent, AgentExecutor from langchain.prompts import PromptTemplate # 自定义提示模板,添加格式约束 prompt = ZeroShotAgent.create_prompt( tools, prefix="你需要根据用户问题选择合适工具解决", suffix="注意:输出仅包含思考过程和工具调用的标准格式,禁止添加<|start_header_id|>或类似特殊标记。\n\n用户问题:{input}\n{agent_scratchpad}" ) # 创建带约束的Agent agent = ZeroShotAgent(llm_chain=llm | BedrockCleanParser(), prompt=prompt, tools=tools) agent_executor = AgentExecutor.from_agent_and_tools( agent=agent, tools=tools, verbose=True, handle_parsing_errors=True )
3. 调整Bedrock模型参数
通过模型参数阻止输出特殊标记,以Claude系列为例:
# 配置Bedrock模型参数 llm.model_kwargs = { "stop_sequences": ["<|start_header_id|>", "<|end_header_id|>"], "temperature": 0.1 # 降低温度减少输出随机性 }
4. 增强Agent错误处理
提升Agent容错能力,允许多次尝试解析:
agent = initialize_agent( tools=tools, llm=llm_with_cleaner, agent="zero-shot-react-description", verbose=True, handle_parsing_errors=True, max_iterations=5, # 增加迭代次数,失败后重试 return_intermediate_steps=True # 便于调试查看失败过程 )
内容的提问来源于stack exchange,提问作者Aryan Raj
相关产品推荐
相关产品推荐

