Appearance
Partial Mode 通过在 messages 末尾插入一条 partial=True 的 assistant 消息,强制模型从指定内容开始续写,适合固定回复格式、续写截断内容、角色扮演等场景。需要手动将"喂给"模型的前缀拼接到最终输出中。
使用 Kimi API 的 Partial Mode
核心原理
在 messages 末尾添加一条 role=assistant、partial=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 让模型强制以你指定的内容作为回复开头,然后续写剩余内容。
典型应用:
- 固定回复前缀(如客服每次以"尊敬的用户您好,"开头)
- 续写被
max_tokens截断的输出 - 角色扮演时保持角色一致性
基本用法
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,
];使用要点
- Partial Mode 消息放在 messages 列表末尾,
role为assistant,partial为true content是你指定的前缀,模型会接着它继续生成- 模型返回的
content不包含前缀,需要你自己拼接 - 续写截断内容时,如果是思考模式,需要同时传
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,流式输出的内容同样不包含你指定的前缀。