跳到主要内容

结构化输出

简介

JSON 是世界上应用最广泛的数据交换格式之一。而符合 JSON Schema 规范的 JSON 数据可以被广泛地解析和验证。模力方舟的模型支持结构化输出功能,允许开发者在请求中指定 JSON Schema,从而确保模型生成的响应符合预期的格式。只需在请求中携带 guided_json 参数即可,无需担心模型遗漏必填键,或生成无效的枚举值。

优势

使用 JSON 结构化输出的一些优势包括:

  1. 数据格式保证:确保模型输出始终符合预定义的 JSON Schema 格式,无需额外的格式验证步骤
  2. 类型安全性:自动确保数据类型正确(如字符串、整数、布尔值),避免类型转换错误
  3. 必填字段控制:通过 required 属性确保关键字段不会被遗漏,提高数据完整性
  4. 枚举值约束:可以限制某些字段只能取特定的值,防止生成无效的选项
  5. 错误处理标准化:当模型无法生成有效内容时,可以返回标准格式的错误信息,便于程序处理
  6. 减少解析复杂度:无需编写复杂的文本解析逻辑,直接获得结构化数据
  7. API 集成友好:生成的 JSON 可以直接用于 API 调用、数据库存储或其他系统集成
  8. 提示词简化:不需要在提示词中反复强调输出格式要求,让提示更加专注于业务逻辑

示例代码

python
"guided_json": """{
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "用户的姓名"
},
"age": {
"type": "integer",
"description": "用户的年龄"
},
"city": {
"type": "string",
"description": "用户的城市"
}
},
"required": ["name", "age", "city"]
}""",

再添加一些 prompt 提升可靠性,AI 将会根据输入提取数据生成标准的 JSON:

python
from langchain_openai import ChatOpenAI

model_name = "Qwen2.5-72B-Instruct"
base_url = "https://ai.gitee.com/v1"
# https://ai.gitee.com/dashboard/settings/tokens 获取您的访问令牌
GITEE_AI_API_KEY = ""
llm = ChatOpenAI(model=model_name, api_key=GITEE_AI_API_KEY, base_url=base_url, streaming=True, temperature=0.1,
presence_penalty=1.05, top_p=0.9,
extra_body={
"guided_json": """{
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "用户的姓名"
},
"age": {
"type": "integer",
"description": "用户的年龄"
},
"city": {
"type": "string",
"description": "用户的城市"
}
},
"required": ["name", "city"]
}"""
})

prompt = [{"role": "system", "content": "你是聪明的助手,以 json 格式输出数据,如果无法判断年龄,则 age 为 0"},
{"role": "user", "content": """
在一个风和日丽的春日午后,小马走在了北京的街头。时间是 2023年的4月15日,
正值樱花盛开的季节。作为一位热爱摄影的年轻人,他带着相机,希望能捕捉到这个季节最美的瞬间。
北京的春天总是短暂而美丽,每一处公园、每一条街道都充满了生机与活力。
"""}]

for response in llm.stream(prompt):
if (response.content):
print(response.content, end="")

输出 JSON:

{ "name": "小马", "age": 0, "city": "北京" }