LangChain Agent JSON解码错误求助:未终止字符串问题
解决LangChain Agent的JSON解码错误与工具选择问题
问题概述
- 基于LangChain Python开发自定义知识库聊天机器人,向量库运行正常
- 使用
CHAT_CONVERSATIONAL_REACT_DESCRIPTION类型Agent时,多数场景正常,但偶尔触发json.decoder.JSONDecodeError: Unterminated string starting at: line 3 column 21 (char 52) - 尝试其他Agent类型,均存在特定场景报错问题
- 唯一无报错的
CONVERSATIONAL_REACT_DESCRIPTION类型Agent,常出现工具选择错误(不调用知识库工具,直接回复“我不知道”)
解决方案
1. 修复JSON解码错误:规范Agent输出格式
该错误本质是LLM输出内容不符合Agent期望的JSON结构(如字符串未闭合),可通过以下方式解决:
自定义提示词模板
修改默认提示词,明确要求LLM输出严格符合JSON格式:
from langchain.agents import ChatConversationalAgent from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder # 自定义提示词,强制规范输出格式 template = """你是一个可使用工具的助手,必须严格按照以下格式输出: 思考:[你的思考内容] 行动:[要调用的工具名称] 行动输入:[工具的输入参数,必须是合法JSON格式,字符串用双引号包裹] 历史对话: {chat_history} 当前问题:{input} 可用工具:{tools} 注意:所有输出必须符合格式要求,确保引号闭合、JSON结构合法。""" prompt = ChatPromptTemplate.from_messages([ ("system", template), MessagesPlaceholder(variable_name="chat_history"), ("user", "{input}"), MessagesPlaceholder(variable_name="agent_scratchpad"), ]) # 用自定义提示词初始化Agent agent = ChatConversationalAgent(llm=ChatLLM, tools=tools, prompt=prompt) agent_executor = AgentExecutor(agent=agent, tools=tools, memory=conversational_memory, verbose=True)
使用结构化输出解析器
通过PydanticOutputParser强制LLM输出符合预设结构的内容:
from langchain.output_parsers import PydanticOutputParser from pydantic import BaseModel, Field # 定义Agent输出的结构 class AgentActionSchema(BaseModel): thought: str = Field(description="你的思考过程") action: str = Field(description="要调用的工具名称") action_input: str = Field(description="工具的输入参数") parser = PydanticOutputParser(pydantic_object=AgentActionSchema) # 将格式说明加入提示词 template = f"""你是一个可使用工具的助手,必须按照以下格式输出: {parser.get_format_instructions()} 历史对话: {chat_history} 当前问题:{input} 可用工具:{tools}""" # 后续用该提示词初始化Agent
2. 解决工具选择错误:优化工具配置
CONVERSATIONAL_REACT_DESCRIPTION不调用知识库工具,通常是工具描述不清晰或Agent逻辑判断偏差导致:
完善工具描述
给知识库工具编写明确的触发条件,让Agent清楚何时调用:
from langchain.tools import Tool # 重新定义知识库工具,强化描述 knowledge_base_tool = Tool( name="知识库查询", func=lambda query: vector_db_chain.run(query), description="当用户的问题涉及自定义知识库内容(如特定领域知识、私有数据、产品信息)时,必须调用此工具查询,禁止直接回答。" ) tools = [knowledge_base_tool]
调整AgentExecutor参数
开启错误处理,避免解析错误影响工具选择:
agent_executor = AgentExecutor( agent=agent, tools=tools, memory=conversational_memory, verbose=True, handle_parsing_errors=True, # 自动处理解析错误 return_direct=False # 确保Agent先完成工具调用再返回结果 )
3. 升级LangChain版本
部分旧版本存在Agent输出解析的bug,升级到最新稳定版可解决部分兼容性问题:
pip install --upgrade langchain
4. 替换为StructuredChatAgent
STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION类型Agent对输出格式要求更严格,工具选择逻辑更精准,能有效减少解码错误:
from langchain.agents import AgentType, initialize_agent agent = initialize_agent( agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION, tools=tools, llm=ChatLLM, verbose=True, memory=conversational_memory, handle_parsing_errors=True )
内容的提问来源于stack exchange,提问作者user21966626
相关产品推荐
相关产品推荐

