调用LangChain结构化聊天Agent工具时JSON解析不一致问题
解决LangChain Structured Chat Agent工具调用JSON解析异常问题
排查方向和修复办法
1. 对齐工具描述的格式
既然get_device_model_data能正常输出JSON,大概率是get_social_insights的工具描述在格式引导上出了问题。LLM会模仿描述里的示例格式,如果你的工具描述里加了反引号包裹的调用示例,模型就会跟着输出带反引号的内容。
- 修复:把
get_social_insights的描述里所有反引号、代码块示例删掉,只用纯文本说明参数要求,比如改成“传入包含account_id字段的JSON对象,account_id是目标Instagram账号ID”。
2. 给Agent的prompt加硬约束
直接在系统prompt里明确规则,避免模型输出格式混乱:
- 追加一句:调用任何工具时,必须输出纯JSON格式内容,绝对不能用反引号包裹。
3. 给解析器添加容错处理
如果模型偶尔还是输出带反引号的内容,可以给解析器加预处理逻辑,自动剥离多余标记:
from langchain.agents import StructuredChatOutputParser class CustomParser(StructuredChatOutputParser): def parse(self, text: str): # 清除前后的```json和```标记,再去除首尾空格 cleaned_text = text.strip().removeprefix("```json").removesuffix("```").strip() return super().parse(cleaned_text) # 替换原解析器 output_parser = CustomParser.from_llm(llm)
4. 检查LLM的参数设置
更换API密钥后可能间接切换了模型或调整了参数,比如temperature过高会导致输出不稳定。
- 把
temperature设为0,强制模型输出确定性内容;同时确认调用LLM时的格式指令明确要求纯JSON输出。示例:
from langchain.chat_models import ChatOpenAI llm = ChatOpenAI( temperature=0, model_name="gpt-3.5-turbo", openai_api_key="你的新API密钥" )
5. 校验工具的参数Schema
确保get_social_insights的参数定义标准清晰,避免模型对参数格式产生混淆。比如用Pydantic定义参数时,字段类型和描述要准确:
from langchain.tools import StructuredTool from pydantic import BaseModel, Field class SocialInsightsInput(BaseModel): account_id: str = Field(description="目标Instagram账号的ID") def get_social_insights(account_id: str): # 你的工具业务逻辑 pass get_social_insights_tool = StructuredTool.from_function( func=get_social_insights, name="get_social_insights", description="获取指定Instagram账号的洞察数据", args_schema=SocialInsightsInput )
内容的提问来源于stack exchange,提问作者Sahil
相关产品推荐
相关产品推荐

