Skip to content

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"])

注意事项

  1. 必须在 prompt 中说明格式:开启 JSON Mode 后,如果 prompt 没有描述期望的 JSON 结构,模型会生成不符合预期的内容
  2. 只支持 JSON Object:不能让模型输出 JSON Array,如果需要列表,用 {"items": [...]} 包装
  3. 输出被截断:如果 finish_reasonlength,说明 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,有两个常见问题:

  1. 多余说明:模型可能会在 JSON 前后添加解释文字,导致 JSON.parse 失败
  2. 格式错误:可能有多余逗号、未闭合括号等语法错误

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(字段名、括号等)。