LangChain调用Llama3生成JSON时缺失value键的解决方法
解决Llama3返回JSON缺失'value'键的问题
1. 强化提示词的明确性与约束
- 直接在提示词中写出强制JSON结构模板,搭配示例让模型明确输出要求,避免模糊描述:
<|begin_of_text|><|start_header_id|>system<|end_header_id|> 你是文本相似度匹配助手,从列表{context}中找出与{query}重合单词最多的句子(忽略语序,重点关注否定词如"not""no""never")。 必须返回严格符合以下格式的JSON对象,两个键缺一不可: { "key": "匹配到的句子内容", "value": "REPORTABLE"|"NOT REPORTABLE"|"REVIEW" } 禁止返回任何JSON以外的内容,禁止遗漏'value'键。 <|end_header_id|><|start_header_id|>assistant<|end_header_id|> - 增加约束性表述,比如"如果返回的JSON缺少'value'键,视为任务失败",强化模型对格式的重视。
2. 使用LangChain结构化输出解析器
通过LangChain的PydanticOutputParser或JsonOutputParser,用Schema强制约束输出结构,即使模型输出不符合,解析器会自动校验并触发重试/处理:
from langchain.output_parsers import PydanticOutputParser from pydantic import BaseModel, Field from langchain.prompts import PromptTemplate # 定义输出结构Schema class MatchResult(BaseModel): key: str = Field(description="匹配到的句子") value: str = Field(description="必须是REPORTABLE、NOT REPORTABLE、REVIEW中的一个") parser = PydanticOutputParser(pydantic_object=MatchResult) # 重构提示词,加入解析器的格式说明 prompt = PromptTemplate( template="<|begin_of_text|><|start_header_id|>system<|end_header_id|>你是文本相似度匹配助手...{format_instructions}<|end_header_id|><|start_header_id|>assistant<|end_header_id|>", input_variables=["context", "query"], partial_variables={"format_instructions": parser.get_format_instructions()} ) # 调用模型后解析输出 response = chain.run(context=your_context, query=your_query) try: result = parser.parse(response) except: # 解析失败时的重试或兜底逻辑 pass
这种方式会把Schema约束直接传递给模型,大幅提升输出规范性。
3. 调整模型生成参数
降低生成随机性,让输出更稳定:
- 设置
temperature=0:完全确定性输出,减少模型自由发挥空间 - 调整
top_p=0.1:限制模型只选择概率最高的词汇,降低格式偏差可能 - 在LangChain调用时配置参数:
from langchain.llms import HuggingFacePipeline llm = HuggingFacePipeline( pipeline=pipeline, # 你的Llama3推理管道 model_kwargs={"temperature": 0, "top_p": 0.1} )
4. 后处理兜底逻辑
通过代码补全缺失的键,避免因模型输出异常导致报错:
import json def fix_missing_value(json_str): try: data = json.loads(json_str) if "value" not in data: # 可根据匹配逻辑默认赋值,或标记为人工审核 data["value"] = "REVIEW" return json.dumps(data) except json.JSONDecodeError: # 解析失败时返回标准格式默认值 return json.dumps({"key": "", "value": "REVIEW"}) # 调用模型后处理响应 raw_response = chain.run(...) fixed_response = fix_missing_value(raw_response)
内容的提问来源于stack exchange,提问作者joshpopelka20
相关产品推荐
相关产品推荐

