JSON 格式作为轻量级数据交换格式,已成为 API 接口、数据存储、系统集成中的 “通用语言”。然而,传统大语言模型(LLM)在生成 JSON 时,常面临格式错乱、字段缺失、语法错误等问题 —— 可能因自然语言表述偏差导致括号不匹配,也可能因复杂逻辑处理遗漏关键参数,最终让自动化数据流转 “卡壳”,不仅增加人工校验成本,更可能引发下游系统故障,成为业务效率提升的隐性瓶颈。LLM 稳定 JSON 输出功能的出现,正是为解决这一核心痛点而生。原理:这个包能智能地处理各种常见错误,例如:修正缺失或错误的引号、移除多余的逗号,并能自动忽略JSON内容前后无关的文本https://github.com/mangiucugna/json_repair/"好的,这是您要的JSON:\n{'user': 'Alex', 'id': 123}\n希望对您有帮助!"为例这种一般是因为前后有多余的字,无法直接使用json.load进行转换,因为需要使用json-repair。fromjson_repairimportrepair_jsonllm_output_string="好的,这是您要的JSON:\n{'user':'Alex','id':123}\n希望对您有帮助!"repaired_string=repair_json(llm_output_string)#输出:{"user":"Alex","id":123}原理:定义了一个类作为数据“蓝图”,规定了数据有哪些字典。其次,当传入llm返回结果时(一般是字符串),Pydantic会自动验证数据结构,并将相应数据转换为对应的type。缺点:Pydantic 本身无法像json-repair处理额外的文字。frompydanticimportBaseModelclassUser(BaseModel):id:intname:stris_active:bool=Trueinput_data={"id":"123","name":"Alice"}user=User(**input_data)print(user.model_dump_json(indent=2))#输出:{"id":123,"name":"Alice","is_active":true}原理:和schema的原理是一样,只是vllm里面集成好,可以直接设置参数extra_body来输出。frompydanticimportBaseModelclassTopic(BaseModel):问题:str答案:strcompletion=client.chat.completions.create(model=model,messages=[{"role":"system","content":system_prompt},{"role":"user","content":user_prompt},],extra_body={"guided_json":Topic.model_json_schema()},)这类方法有很多,比如:LM-Format-Enforcer库,Xgrammar等原理:在LLM生成每个token时基于策略选择满足约束的token,从而指导LLM生成给定的json格式。简单地说,通过一个预设的规则(如JSON Schema),在模型选择下一个词(Token)的瞬间,动态地屏蔽掉所有不符合语法或格式的选项。缺点:实现复杂,增加开销,可能会稍微降低生成速度,一定程度上牺牲模型的灵活性和创造性。 |