使用Langchain create_retrieval_chain时JsonOutputParser解析失败求助
解决JsonOutputParser解析JSON失败的问题
常见问题排查与修复步骤
1. 确保LLM输出严格为纯JSON
LLM经常会额外输出说明性文字(比如"这是生成的结果:")、换行符或注释,直接导致解析失败。解决办法:
- 在prompt中强制要求仅输出JSON,无任何额外内容,示例代码:
from langchain.prompts import PromptTemplate prompt = PromptTemplate( template="根据简历内容生成候选人信息,仅输出JSON格式,不要添加任何解释或额外文字:\n{resume_content}", input_variables=["resume_content"], ) - 对LLM的原始输出做清洗,提取其中的JSON结构:
import re from langchain.output_parsers import JsonOutputParser # llm_output为LLM返回的原始内容 llm_output = llm.invoke(prompt.format(resume_content=your_resume_text)) # 用正则匹配完整JSON块 json_match = re.search(r'\{.*\}', llm_output, re.DOTALL) if json_match: clean_json = json_match.group() result = parser.parse(clean_json) else: raise ValueError("LLM输出未包含有效JSON结构")
2. 绑定Pydantic Schema约束输出结构
用Pydantic模型定义你期望的JSON结构,让LLM严格按照该结构生成,从根源降低解析出错概率:
from pydantic import BaseModel, Field from langchain.output_parsers import JsonOutputParser # 定义目标JSON的结构模型 class CandidateInfo(BaseModel): name: str = Field(description="候选人姓名") position: str = Field(description="应聘职位") skills: list[str] = Field(description="掌握技能列表") experience: int = Field(description="工作年限") # 初始化解析器并绑定模型 parser = JsonOutputParser(pydantic_object=CandidateInfo) # 将schema规则加入prompt,明确告知LLM生成要求 prompt = PromptTemplate( template="根据简历内容生成候选人信息,严格按照以下JSON Schema输出,仅返回JSON:\n{format_instructions}\n简历内容:{resume_content}", input_variables=["resume_content"], partial_variables={"format_instructions": parser.get_format_instructions()} )
3. 添加解析异常的兜底逻辑
即使做了以上处理,仍可能出现解析失败,建议添加异常捕获与处理:
try: result = parser.parse(llm_output) except Exception as e: # 记录错误日志,返回友好提示或触发重试 print(f"JSON解析失败: {str(e)}") # 可选:调用LLM重新生成,或返回预设的默认结构
4. 调整LLM的温度参数
如果LLM的temperature设置过高,输出会更随机,容易偏离JSON格式。可以适当降低温度(比如设为0.1或0),提升输出稳定性:
from langchain.llms import OpenAI llm = OpenAI(temperature=0.1) # 降低温度减少输出随机性
内容的提问来源于stack exchange,提问作者Aliasgar Taksali
相关产品推荐
相关产品推荐

