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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 01:02:42