Skip to content

Partial Mode 通过在 messages 末尾插入一条 partial=True 的 assistant 消息,强制模型从指定内容开始续写,适合固定回复格式、续写截断内容、角色扮演等场景。需要手动将"喂给"模型的前缀拼接到最终输出中。

使用 Kimi API 的 Partial Mode

核心原理

在 messages 末尾添加一条 role=assistantpartial=True 的消息,将想要强制开头的内容放入 content,模型会接着这段内容继续生成:

python
messages = [
    {"role": "user", "content": "你好?"},
    {
        "role": "assistant",
        "partial": True,          # 开启 Partial Mode
        "content": "尊敬的用户您好,",  # 模型会接着这里继续说
    }
]

注意:最终输出需要手动拼接前缀:

python
full_response = "尊敬的用户您好," + completion.choices[0].message.content

场景一:固定客服回复前缀

python
from openai import OpenAI

client = OpenAI(
    api_key="MOONSHOT_API_KEY",
    base_url="https://api.moonshot.cn/v1",
)

prefix = "尊敬的用户您好,"

completion = client.chat.completions.create(
    model="kimi-k2.6",
    messages=[
        {"role": "system", "content": "你是智能客服助手。"},
        {"role": "user", "content": "我的订单什么时候发货?"},
        {"role": "assistant", "partial": True, "content": prefix},
    ]
)

print(prefix + completion.choices[0].message.content)

场景二:续写被 max_tokens 截断的内容

finish_reason="length" 时,表示输出被 max_tokens 截断。用 Partial Mode 续写:

python
# 第一次请求(设置较小的 max_tokens 演示截断)
completion = client.chat.completions.create(
    model="kimi-k2.6",
    messages=[{"role": "user", "content": "请背诵完整的出师表。"}],
    max_tokens=1200,
)

if completion.choices[0].finish_reason == "length":
    prefix = completion.choices[0].message.content
    reasoning = completion.choices[0].message.reasoning_content

    # 续写请求
    completion2 = client.chat.completions.create(
        model="kimi-k2.6",
        messages=[
            {"role": "user", "content": "请背诵完整的出师表。"},
            {
                "role": "assistant",
                "content": prefix,
                "partial": True,
                "reasoning_content": reasoning,  # thinking 模式需保留
            },
        ],
        max_tokens=86400,
    )

    print(prefix + completion2.choices[0].message.content)

场景三:角色扮演保持一致性

name 字段可强化模型对角色的认知:

python
completion = client.chat.completions.create(
    model="kimi-k2.6",
    messages=[
        {"role": "system", "content": "你扮演凯尔希医生,用凯尔希的语气和风格回复。"},
        {"role": "user", "content": "你怎么看待阿米娅?"},
        {
            "role": "assistant",
            "partial": True,
            "name": "凯尔希",  # 强化角色认知
            "content": "",    # 空内容,让模型自由续写
        },
    ],
    max_tokens=65536,
)

print(completion.choices[0].message.content)

Thinking 模式下的使用

启用 thinking 时,reasoning_content 也必须传入(如续写场景):

python
{"role": "assistant", "content": prefix, "partial": True, "reasoning_content": reasoning_content}

常见问题

Q: Partial Mode 和直接在 prompt 里说"请以...开头"有什么区别?

A: Partial Mode 从模型解码层面强制约束,100% 保证前缀存在;prompt 方式是软约束,模型有时会不遵守。

Q: partial=True 的消息必须是 messages 的最后一条吗?

A: 是的,partial 消息必须是 messages 列表的最后一个元素。

Q: 续写时为什么要保留 reasoning_content?

A: Kimi K2.6 的 thinking 模式要求多轮对话中每轮的 reasoning_content 都原样保留,否则模型状态不一致会报错。

Kimi API Partial Mode 允许你在 messages 末尾放一条 partial: true 的 assistant 消息,模型会接着这个前缀继续生成。适用于三个场景:强制前缀、续写被截断的内容、角色扮演保持角色一致性。

使用 Kimi API 的 Partial Mode

什么是 Partial Mode

Partial Mode 让模型强制以你指定的内容作为回复开头,然后续写剩余内容。

典型应用:

  1. 固定回复前缀(如客服每次以"尊敬的用户您好,"开头)
  2. 续写被 max_tokens 截断的输出
  3. 角色扮演时保持角色一致性

基本用法

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: "你是 Kimi,由 Moonshot AI 提供的人工智能助手。" },
    { role: "user", content: "你好?" },
    {
      role: "assistant",
      content: "尊敬的用户您好,", // 强制以此开头
      // @ts-ignore
      partial: true,
    },
  ],
} as any);

// 注意:需要把前缀拼接到模型生成的内容前面
const fullReply = "尊敬的用户您好," + completion.choices[0].message.content;
console.log(fullReply);
python
from openai import OpenAI

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": "你是 Kimi,由 Moonshot AI 提供的人工智能助手。"},
        {"role": "user", "content": "你好?"},
        {
            "role": "assistant",
            "content": "尊敬的用户您好,",
            "partial": True,
        },
    ],
)

full_reply = "尊敬的用户您好," + completion.choices[0].message.content
print(full_reply)

续写被截断的输出

finish_reason === "length" 时,说明输出被 max_completion_tokens 截断。可以用 Partial Mode 接着续写:

typescript
// 第一次请求,可能被截断
const response1 = await client.chat.completions.create({
  model: "kimi-k2.6",
  messages: [{ role: "user", content: "请背诵完整的出师表。" }],
  max_completion_tokens: 1200,
});

if (response1.choices[0].finish_reason === "length") {
  const prefix = response1.choices[0].message.content ?? "";
  console.log(prefix); // 输出已截断的部分
  
  // 续写:把已有内容作为前缀
  const response2 = await client.chat.completions.create({
    model: "kimi-k2.6",
    messages: [
      { role: "user", content: "请背诵完整的出师表。" },
      {
        role: "assistant",
        content: prefix,
        partial: true,
        // 如果是思考模式,还需带上 reasoning_content
        // reasoning_content: (response1.choices[0].message as any).reasoning_content,
      } as any,
    ],
    max_completion_tokens: 86400,
  } as any);
  
  console.log(response2.choices[0].message.content); // 续写的剩余部分
}

角色扮演场景

name 字段配合 Partial Mode,可以强化模型的角色认知:

typescript
const completion = await client.chat.completions.create({
  model: "kimi-k2.6",
  messages: [
    {
      role: "system",
      content: "你现在扮演一位严肃的医生,请用专业的医疗语气回答用户的问题。",
    },
    { role: "user", content: "我最近总是头痛,怎么办?" },
    {
      role: "assistant",
      content: "", // 内容可以为空,name 就能起到角色强化作用
      name: "医生", // 强化角色认知
      partial: true,
    } as any,
  ],
} as any);

长对话中的角色强化

对话轮次很多时,可以在 messages 中间定期插入 system 消息重申角色,配合 Partial Mode 结尾的 name 字段:

typescript
const messages = [
  { role: "system", content: "你扮演角色 A,..." },
  // ... 很多轮对话 ...
  { role: "system", content: "记住,你仍然是角色 A,..." }, // 中途再次强化
  { role: "user", content: "最新问题" },
  { role: "assistant", content: "", name: "角色A", partial: true } as any,
];

使用要点

  1. Partial Mode 消息放在 messages 列表末尾roleassistantpartialtrue
  2. content 是你指定的前缀,模型会接着它继续生成
  3. 模型返回的 content 不包含前缀,需要你自己拼接
  4. 续写截断内容时,如果是思考模式,需要同时传 reasoning_content 字段

常见问题

Q: Partial Mode 和直接在 system prompt 里要求"以 XX 开头"有什么区别?

A: Partial Mode 是"强制执行"——模型一定会以指定内容开头。在 system prompt 里说"以 XX 开头"只是提示,模型可能不总是遵守,特别是在长对话或复杂场景中。

Q: content 字段可以是空字符串吗?

A: 可以。content: "" 配合 name 字段主要用于角色强化,不实际强制前缀内容。

Q: Partial Mode 支持流式输出吗?

A: 支持,在 stream: true 时同样可以使用 Partial Mode,流式输出的内容同样不包含你指定的前缀。