在信息抽取场景,您可以通过提示词来指引大模型生成标准格式的 JSON 字符串。但大模型输出内容具有不确定性,返回的内容可能不符合 JSON 格式(比如输出的内容多了```json```
,或“以下为JSON字符串”等内容),这会影响到后续的解析步骤。开启结构化输出功能可以确保大模型输出标准格式的 JSON 字符串。
支持的模型
结构化输出功能支持以下模型:
qwen-max 系列
qwen-max、qwen-max-0125、qwen-max-0919、qwen-max-latest
qwen-plus 系列
qwen-plus、qwen-plus-2025-01-25、qwen-plus-0112、qwen-plus-1220、qwen-plus-1127、qwen-plus-1125、qwen-plus-0919、qwen-plus-latest
qwen-turbo 系列
qwen-turbo、qwen-turbo-1101、qwen-turbo-0919、qwen-turbo-latest
qwen-开源系列
qwen2.5系列的文本模型(除了math与coder模型)
开始使用
前提条件
您需要已获取API Key并配置API Key到环境变量。如果通过 OpenAI SDK 或 DashScope SDK 进行调用,需要安装SDK。
使用方法
您的请求需要满足两个条件:
设置参数
您需要设置请求参数
response_format
为{"type": "json_object"}
。提示词指引
您需要在提示词中指引模型输出 JSON 字符串,否则会报错:
'messages' must contain the word 'json' in some form, to use 'response_format' of type 'json_object'.
建议您在提示词中说明每个属性的数据类型,并提供样例给大模型参考。
示例代码
# 步骤 1:发出请求
from openai import OpenAI
import os
import json
# 预定义示例响应(用于few-shot提示)
example1_response = json.dumps(
{
"info": {"name": "张三", "age": "25岁", "email": "zhangsan@example.com"},
"hobby": ["唱歌"]
},
ensure_ascii=False
)
example2_response = json.dumps(
{
"info": {"name": "李四", "age": "30岁", "email": "lisi@example.com"},
"hobby": ["跳舞", "游泳"]
},
ensure_ascii=False
)
example3_response = json.dumps(
{
"info": {"name": "王五", "age": "40岁", "email": "wangwu@example.com"},
"hobby": ["Rap", "篮球"]
},
ensure_ascii=False
)
client = OpenAI(
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)
completion = client.chat.completions.create(
model="qwen-plus",
messages=[
{
"role": "system",
"content": f"""提取name、age、email和hobby(数组类型),输出包含info层和hobby数组的JSON。
示例:
Q:我叫张三,今年25岁,邮箱是zhangsan@example.com,爱好是唱歌
A:{example1_response}
Q:我叫李四,今年30岁,邮箱是lisi@example.com,平时喜欢跳舞和游泳
A:{example2_response}
Q:我的邮箱是wangwu@example.com,今年40岁,名字是王五,会Rap和打篮球
A:{example3_response}"""
},
{
"role": "user",
"content": "大家好,我叫刘五,今年34岁,邮箱是liuwu@example.com,平时喜欢打篮球和旅游",
},
],
response_format={"type": "json_object"},
)
json_string = completion.choices[0].message.content
print(json_string)
返回结果
{"info": {"name": "刘五", "age": "34岁", "email": "liuwu@example.com"}, "hobby": ["打篮球", "旅游"]}
示例代码
// 步骤 1:发出请求
import OpenAI from "openai";
// 预定义示例响应
const example1Response = JSON.stringify({
info: { name: "张三", age: "25岁", email: "zhangsan@example.com" },
hobby: ["唱歌"]
});
const example2Response = JSON.stringify({
info: { name: "李四", age: "30岁", email: "lisi@example.com" },
hobby: ["跳舞", "游泳"]
});
const example3Response = JSON.stringify({
info: { name: "王五", age: "40岁", email: "wangwu@example.com" },
hobby: ["Rap", "篮球"]
});
const openai = new OpenAI({
// 若没有配置环境变量,请用百炼API Key将下行替换为:apiKey: "sk-xxx",
apiKey: process.env.DASHSCOPE_API_KEY,
baseURL: "https://dashscope.aliyuncs.com/compatible-mode/v1"
});
const completion = await openai.chat.completions.create({
model: "qwen-plus",
messages: [
{
role: "system",
content: `提取name、age、email和hobby(数组类型),输出包含info层和hobby数组的JSON。
示例:
Q:我叫张三,今年25岁,邮箱是zhangsan@example.com,爱好是唱歌
A:${example1Response}
Q:我叫李四,今年30岁,邮箱是lisi@example.com,平时喜欢跳舞和游泳
A:${example2Response}
Q:我的邮箱是wangwu@example.com,今年40岁,名字是王五,会Rap和打篮球
A:${example3Response}`
},
{
role: "user",
content: "大家好,我叫刘五,今年34岁,邮箱是liuwu@example.com,平时喜欢打篮球和旅游"
}
],
response_format: {
type: "json_object"
}
});
const jsonString = completion.choices[0].message.content
console.log(jsonString);
返回结果
{"info":{"name":"刘五","age":"34岁","email":"liuwu@example.com"},"hobby":["篮球","旅游"]}
示例请求
curl -X POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "qwen-plus",
"messages": [
{
"role": "system",
"content": "你需要提取出name(名字,为string类型)、age(年龄,为string类型)与email(邮箱,为string类型),请输出JSON 字符串,不要输出其它无关内容。\n示例:\nQ:我叫张三,今年25岁,邮箱是zhangsan@example.com\nA:{\"name\":\"张三\",\"age\":\"25岁\",\"email\":\"zhangsan@example.com\"}\nQ:我叫李四,今年30岁,我的邮箱是lisi@example.com\nA:{\"name\":\"李四\",\"age\":\"30岁\",\"email\":\"lisi@example.com\"}\nQ:我叫王五,我的邮箱是wangwu@example.com,今年40岁\nA:{\"name\":\"王五\",\"age\":\"40岁\",\"email\":\"wangwu@example.com\""
},
{
"role": "user",
"content": "大家好,我叫刘五,今年34岁,邮箱是liuwu@example.com"
}
],
"response_format": {
"type": "json_object"
}
}'
返回结果
{
"choices": [
{
"message": {
"role": "assistant",
"content": "{\n \"name\": \"张三\",\n \"age\": 25,\n \"email\": \"zhangsan@example.com\"\n}"
},
"finish_reason": "stop",
"index": 0,
"logprobs": null
}
],
"object": "chat.completion",
"usage": {
"prompt_tokens": 65,
"completion_tokens": 29,
"total_tokens": 94,
"prompt_tokens_details": {
"cached_tokens": 0
}
},
"created": 1736771145,
"system_fingerprint": null,
"model": "qwen-plus",
"id": "chatcmpl-59b28c8b-6cb7-9e4d-9a78-3cbed664d3c0"
}
暂不支持通过 Java SDK 使用结构化输出功能。
示例代码
# 步骤 1:发出请求
import os
import json
import dashscope
# 预定义示例响应(用于few-shot提示)
example1_response = json.dumps(
{
"info": {"name": "张三", "age": "25岁", "email": "zhangsan@example.com"},
"hobby": ["唱歌"]
},
ensure_ascii=False
)
example2_response = json.dumps(
{
"info": {"name": "李四", "age": "30岁", "email": "lisi@example.com"},
"hobby": ["跳舞", "游泳"]
},
ensure_ascii=False
)
example3_response = json.dumps(
{
"info": {"name": "王五", "age": "40岁", "email": "wangwu@example.com"},
"hobby": ["Rap", "篮球"]
},
ensure_ascii=False
)
messages=[
{
"role": "system",
"content": f"""提取name、age、email和hobby(数组类型),输出包含info层和hobby数组的JSON。
示例:
Q:我叫张三,今年25岁,邮箱是zhangsan@example.com,爱好是唱歌
A:{example1_response}
Q:我叫李四,今年30岁,邮箱是lisi@example.com,平时喜欢跳舞和游泳
A:{example2_response}
Q:我的邮箱是wangwu@example.com,今年40岁,名字是王五,会Rap和打篮球
A:{example3_response}"""
},
{
"role": "user",
"content": "大家好,我叫刘五,今年34岁,邮箱是liuwu@example.com,平时喜欢打篮球和旅游",
},
]
response = dashscope.Generation.call(
# 若没有配置环境变量,请用百炼API Key将下行替换为:api_key="sk-xxx",
api_key=os.getenv('DASHSCOPE_API_KEY'),
model="qwen-plus",
messages=messages,
result_format='message',
response_format={'type': 'json_object'}
)
json_string = response.output.choices[0].message.content
print(json_string)
返回结果
{"info": {"name": "刘五", "age": "34岁", "email": "liuwu@example.com"}, "hobby": ["篮球", "旅游"]}
示例代码
curl -X POST https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "qwen-plus",
"input": {
"messages": [
{
"role": "system",
"content": "你需要提取出name(名字,为string类型)、age(年龄,为string类型)与email(邮箱,为string类型),请输出JSON 字符串,不要输出其它无关内容。\n示例:\nQ:我叫张三,今年25岁,邮箱是zhangsan@example.com\nA:{\"name\":\"张三\",\"age\":\"25岁\",\"email\":\"zhangsan@example.com\"}\nQ:我叫李四,今年30岁,我的邮箱是lisi@example.com\nA:{\"name\":\"李四\",\"age\":\"30岁\",\"email\":\"lisi@example.com\"}\nQ:我叫王五,我的邮箱是wangwu@example.com,今年40岁\nA:{\"name\":\"王五\",\"age\":\"40岁\",\"email\":\"wangwu@example.com\""
},
{
"role": "user",
"content": "大家好,我叫刘五,今年34岁,邮箱是liuwu@example.com"
}
]
},
"parameters": {
"result_format": "message",
"response_format": {
"type": "json_object"
}
}
}'
返回结果
{
"output": {
"choices": [
{
"finish_reason": "stop",
"message": {
"role": "assistant",
"content": "{\"name\":\"刘五\",\"age\":\"34岁\",\"email\":\"liuwu@example.com\"}"
}
}
]
},
"usage": {
"prompt_tokens_details": {
"cached_tokens": 0
},
"total_tokens": 223,
"output_tokens": 20,
"input_tokens": 203
},
"request_id": "0c353885-ffdc-9b99-a273-ade7b14f3fab"
}
解析 JSON 字符串
在获取大模型输出的 JSON 字符串后,您可以直接使用 JSON 工具进行解析。
# 步骤 2:解析 JSON 字符串。请将以下代码添加到步骤 1 之后
import json
json_object = json.loads(json_string)
print(json_object)
// 步骤 2:解析 JSON 字符串。请将以下代码添加到步骤 1 之后
const jsonObject = JSON.parse(jsonString);
console.log(jsonObject);
运行以上代码可以将 JSON 字符串转换为 JSON 对象。
{'info': {'name': '刘五', 'age': '34岁', 'email': 'liuwu@example.com'}, 'hobby': ['打篮球', '旅游']}
常见问题
Q: 通义千问 API 是否支持根据我提供的 JSON Schema 生成数据?
A:当前通义千问 API 支持根据您输入的提示词生成合法的 JSON 字符串,无法根据您提供的 JSON Schema 来生成。
您可以在提示词中明确描述所需 JSON 的键值结构和数据类型,并提供标准数据样例,这会帮助大模型达到类似效果。
错误码
如果模型调用失败并返回报错信息,请参见错误信息进行解决。
- 本页导读 (1)
- 支持的模型
- 开始使用
- 前提条件
- 使用方法
- 解析 JSON 字符串
- 常见问题
- Q: 通义千问 API 是否支持根据我提供的 JSON Schema 生成数据?
- 错误码