Appearance
Kimi API 通过 response_format 参数开启 JSON Mode,确保输出为合法可解析的 JSON 对象。适合结构化数据提取、智能客服回复格式控制、API 响应生成等需要强格式约束的场景。
使用 Kimi API 的 JSON Mode
为什么需要 JSON Mode
直接在 prompt 中要求输出 JSON,模型可能:
- 在 JSON 前后加说明文字(无法直接 parse)
- 生成格式错误的 JSON(如多余逗号)
response_format 参数解决了这个问题,强制输出合法 JSON。
两种模式
json_object 模式
保证输出为合法 JSON 对象,但结构由 prompt 描述:
python
from openai import OpenAI
import json
client = OpenAI(
api_key="MOONSHOT_API_KEY",
base_url="https://api.moonshot.cn/v1",
)
completion = client.chat.completions.create(
model="kimi-k2.6",
messages=[
{
"role": "system",
"content": """请用以下 JSON 格式总结文章:
{
"title": "文章标题",
"author": "文章作者",
"publish_time": "发布时间(YYYY-MM-DD)",
"summary": "100字以内摘要"
}"""
},
{"role": "user", "content": "文章内容:..."}
],
response_format={"type": "json_object"},
)
result = json.loads(completion.choices[0].message.content)
print(result["summary"])json_schema 模式(推荐)
按严格 JSON Schema 约束输出,更适合生产环境:
python
completion = client.chat.completions.create(
model="kimi-k2.6",
messages=[{"role": "user", "content": "提取以下文本中的联系人信息:张三,电话 13800138000,邮箱 zhangsan@example.com"}],
response_format={
"type": "json_schema",
"json_schema": {
"name": "contact_info",
"strict": True,
"schema": {
"type": "object",
"properties": {
"name": {"type": "string", "description": "联系人姓名"},
"phone": {"type": "string", "description": "电话号码"},
"email": {"type": "string", "description": "邮箱地址"}
},
"required": ["name", "phone", "email"]
}
}
}
)
contact = json.loads(completion.choices[0].message.content)实际应用示例:智能客服多类型回复
python
import json
from openai import OpenAI
client = OpenAI(api_key="MOONSHOT_API_KEY", base_url="https://api.moonshot.cn/v1")
system_prompt = """你是月之暗面(Kimi)的智能客服。回复用户问题时,根据内容可以返回文字、图片链接或购买链接。
请使用以下 JSON 格式输出(所有字段可选):
{
"text": "文字回复内容",
"image": "图片链接(以 oss:// 开头)",
"url": "购买或参考链接"
}"""
completion = client.chat.completions.create(
model="kimi-k2.6",
messages=[
{"role": "system", "content": system_prompt},
{"role": "user", "content": "你们的产品定价是多少?"}
],
response_format={"type": "json_object"},
)
response = json.loads(completion.choices[0].message.content)
if response.get("text"):
print("文字回复:", response["text"])
if response.get("url"):
print("相关链接:", response["url"])注意事项
- 必须在 prompt 中说明格式:开启 JSON Mode 后,如果 prompt 没有描述期望的 JSON 结构,模型会生成不符合预期的内容
- 只支持 JSON Object:不能让模型输出 JSON Array,如果需要列表,用
{"items": [...]}包装 - 输出被截断:如果
finish_reason为length,说明max_completion_tokens设置太小,输出 JSON 被截断无法解析,需要增大此值
常见问题
Q: json_object 和 json_schema 模式有什么区别?
A: json_object 保证输出合法 JSON,但字段由 prompt 描述,模型可能生成不完全符合预期的字段名;json_schema 通过严格 Schema 约束输出结构,生产环境推荐用 json_schema。
Q: JSON Mode 和直接在 prompt 写"请输出 JSON"有什么区别?
A: JSON Mode 从模型解码层面强制约束,不会在 JSON 前后生成多余文字,也不会输出格式非法的 JSON。纯 prompt 方式是软约束,偶尔会失效。
Q: 这个功能和 OpenAI 的 Structured Outputs 一样吗?
A: json_schema 模式类似 OpenAI 的 Structured Outputs,需符合 MFJS(Moonshot Flavored JSON Schema)规范,与标准 JSON Schema 有些微差异。如遇校验问题可到 MoonshotAI/walle 提交反馈。
Kimi API 的 JSON Mode 通过 response_format: { type: "json_object" } 开启,保证模型只输出合法的 JSON 对象。需要在 prompt 中明确定义期望的 JSON 格式,否则输出可能不稳定。本文含智能客服场景的完整示例。
使用 Kimi API 的 JSON Mode
为什么需要 JSON Mode
直接在 prompt 里要求输出 JSON,有两个常见问题:
- 多余说明:模型可能会在 JSON 前后添加解释文字,导致
JSON.parse失败 - 格式错误:可能有多余逗号、未闭合括号等语法错误
response_format: { type: "json_object" } 参数保证输出是合法的 JSON 对象,可以直接 parse。
与 OpenAI 相同:OpenAI 也用
response_format: { type: "json_object" }开启 JSON Mode,用法完全一致。
基本用法
typescript
import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.MOONSHOT_API_KEY,
baseURL: "https://api.moonshot.cn/v1",
});
const completion = await client.chat.completions.create({
model: "kimi-k2.6",
messages: [
{
role: "system",
content: `你是一个文章分析助手,请按以下 JSON 格式输出:
{
"title": "文章标题",
"author": "作者(未知则为 null)",
"publish_time": "发布时间(未知则为 null)",
"summary": "100字以内的摘要"
}`,
},
{
role: "user",
content: "请分析以下文章:\n\n[文章内容...]",
},
],
response_format: { type: "json_object" }, // 开启 JSON Mode
});
const result = JSON.parse(completion.choices[0].message.content ?? "{}");
console.log(result.title);
console.log(result.summary);python
from openai import OpenAI
import json
client = OpenAI(
api_key="MOONSHOT_API_KEY",
base_url="https://api.moonshot.cn/v1",
)
completion = client.chat.completions.create(
model="kimi-k2.6",
messages=[
{
"role": "system",
"content": """你是一个文章分析助手,请按以下 JSON 格式输出:
{
"title": "文章标题",
"author": "作者(未知则为 null)",
"summary": "100字以内的摘要"
}""",
},
{"role": "user", "content": "请分析以下文章:\n\n[文章内容...]"},
],
response_format={"type": "json_object"},
)
result = json.loads(completion.choices[0].message.content)
print(result["title"])实际场景:消息分类
识别用户消息中包含的内容类型(文字/图片/链接):
typescript
const systemPrompt = `你是一个智能客服助手,分析用户发来的消息内容。
请按以下 JSON 格式输出:
{
"type": "text" | "image" | "url",
"content": "消息的主体内容",
"intent": "用户的意图描述"
}`;
const completion = await client.chat.completions.create({
model: "kimi-k2.6",
messages: [
{ role: "system", content: systemPrompt },
{ role: "user", content: "帮我看看这张图 https://example.com/img.jpg 里面有什么" },
],
response_format: { type: "json_object" },
});
const parsed = JSON.parse(completion.choices[0].message.content ?? "{}");
// { type: "url", content: "https://example.com/img.jpg", intent: "查看图片内容" }注意事项
必须在 prompt 中说明格式:即使开启了 JSON Mode,也需要在 system 或 user prompt 中明确描述期望的 JSON 字段和含义,否则输出结果不稳定。
只能输出 JSON Object:JSON Mode 只支持 JSON Object({}),不支持 JSON Array([])。如果需要返回数组,把数组包在一个对象里:
json
{
"items": [...]
}JSON 截断问题:如果模型返回的 JSON 不完整,检查 finish_reason 是否为 length,适当增大 max_completion_tokens:
typescript
const completion = await client.chat.completions.create({
model: "kimi-k2.6",
messages: [...],
response_format: { type: "json_object" },
max_completion_tokens: 4096, // 确保 JSON 有足够空间生成完整
});
if (completion.choices[0].finish_reason === "length") {
console.error("JSON 输出被截断,需增大 max_completion_tokens");
}与 tool_calls 的对比
| 场景 | 推荐方案 |
|---|---|
| 需要固定格式的文本提取、摘要 | JSON Mode |
| 需要执行具体操作(搜索、查询) | tool_calls |
| 需要多个字段严格校验(含类型、枚举) | tool_calls(使用 JSON Schema) |
常见问题
Q: JSON Mode 和在 prompt 里说"输出 JSON"有什么区别?
A: JSON Mode 会在 API 层面强制输出合法 JSON,模型不会输出多余说明文字,也不会产生语法错误。仅靠 prompt 说明时,模型有时会在 JSON 前后加解释文字,导致 parse 失败。
Q: 流式输出支持 JSON Mode 吗?
A: 支持,但流式输出时每个 chunk 不是完整的 JSON,需要等全部数据接收完后再 parse。
Q: 开启 JSON Mode 会影响 token 消耗吗?
A: 不影响计费方式,但 JSON 格式通常比纯文本占用更多 token(字段名、括号等)。