Appearance
高质量 Prompt 是稳定使用 Kimi API 的关键。本页总结 6 大技巧:细节丰富、角色扮演、分隔符、步骤明确、few-shot 示例、指定长度,附实际 messages 代码示例。
Kimi API Prompt 最佳实践
1. 包含足够细节
模型无法读懂你的意图,细节越多输出越精准:
| 模糊请求 | 精确请求 |
|---|---|
| 如何在 Excel 中增加数字? | 我如何在 Excel 表对一行数字求和?我想自动为整张表的每一行进行求和,并将所有总计放在名为"总数"的最右列中。 |
| 工作汇报总结 | 将 2023 年工作记录总结为 500 字以内的段落,以序列形式列出每个月的工作亮点,并做出全年总结。 |
2. 让模型扮演角色
在 system prompt 中指定角色,获得风格更一致的输出:
python
messages = [
{"role": "system", "content": "你是一位资深 Python 工程师,专注于代码审查。用专业但简洁的语气,指出代码的性能问题和最佳实践违规。"},
{"role": "user", "content": "请审查以下代码:\n```python\nfor i in range(len(items)):\n print(items[i])\n```"}
]3. 使用分隔符区分内容
用三重引号、XML 标签或 Markdown 标题区分不同部分,避免模型混淆:
python
messages = [
{"role": "system", "content": "你将收到两篇文章,用 XML 标签分隔。比较两篇文章的论点,指出哪篇更有说服力并解释原因。"},
{"role": "user", "content": "<article>第一篇文章内容</article>\n<article>第二篇文章内容</article>"}
]4. 明确列出步骤
对于需要多步骤的任务,明确列出步骤序列:
python
messages = [
{"role": "system", "content": "按以下步骤处理用户输入:\n步骤一:用三引号提供的文本,加前缀"摘要:"写出一句话摘要。\n步骤二:将第一步的摘要翻译成英文,加前缀"Translation: "。"},
{"role": "user", "content": "\"\"\"在此插入文本\"\"\""}
]5. Few-shot 示例
提供 2~3 个输入/输出示例,帮助模型理解你期望的风格和格式:
python
messages = [
{"role": "system", "content": "将用户描述的技术错误转换为简洁的用户友好错误消息。"},
{"role": "user", "content": "NullPointerException at line 42"},
{"role": "assistant", "content": "出了点问题,请刷新页面重试。"},
{"role": "user", "content": "Connection timeout after 30s"},
{"role": "assistant", "content": "网络连接超时,请检查网络后重试。"},
{"role": "user", "content": "IndexOutOfBoundsException: index 5, size 3"},
]6. 指定输出长度
模型对"段落数"和"条目数"的控制比"字数"更精准:
python
# 更可靠
messages = [{"role": "user", "content": "用 3 个要点总结以下文本。\"\"\"文本内容\"\"\""}]
# 较难精确控制,但可用
messages = [{"role": "user", "content": "用 50 字以内总结以下文本。\"\"\"文本内容\"\"\""}]高级技巧
提供参考文本
当有准确的背景资料时,指示模型只基于提供的内容回答,减少幻觉:
python
messages = [
{"role": "system", "content": "只基于用三引号包围的文章回答问题。如果答案不在文章中,回复"我找不到答案"。"},
{"role": "user", "content": "\"\"\"文章内容\"\"\"\n\n问题:文章中提到了哪些性能优化方案?"}
]长对话总结压缩
当 messages 历史过长时,用摘要替代旧消息,保留要点同时减少 token:
python
def summarize_old_messages(old_messages: list, client) -> str:
summary_prompt = [
{"role": "system", "content": "请用 200 字以内总结以下对话的要点。"},
{"role": "user", "content": str(old_messages)}
]
resp = client.chat.completions.create(model="kimi-k2.6", messages=summary_prompt)
return resp.choices[0].message.content常见问题
Q: system prompt 和 user prompt 应该放什么内容?
A: system prompt 放角色设定、规则约束、输出格式要求(固定不变的内容);user prompt 放当前具体请求和动态输入。这样设计利于 KV Cache 复用,降低费用。
Q: 如何让模型不在 JSON 外面加说明文字?
A: 使用 response_format={"type": "json_object"} 参数,同时在 prompt 中给出期望的 JSON 格式示例。详见 JSON Mode 指南。
Q: Kimi 的 prompt 技巧与 OpenAI/DeepSeek 通用吗?
A: 大部分通用,因为底层都是 transformer 架构的模型。但 kimi-k2.6 特有 Thinking 模式:复杂推理任务可以不在 prompt 中要求"让我们一步一步想",直接让模型的 thinking 过程处理。
Kimi API 的输出质量很大程度取决于 prompt 质量。本文总结六大核心技巧:包含更多细节、角色扮演、分隔符、明确步骤、few-shot 示例、指定输出长度,并覆盖参考文本提供和复杂任务拆分的最佳实践。
Prompt 最佳实践
核心原则
**模型无法读懂你的想法。**给模型的指令越清晰、越具体,输出结果就越稳定。以下是六个提升 prompt 质量的核心技巧。
1. 包含更多细节
模糊的问题得到泛化的答案,具体的问题得到有用的答案:
| 一般请求 | 更好的请求 |
|---|---|
| 如何在 Excel 中增加数字? | 如何在 Excel 对一行数字求和?我想自动为整张表每一行求和,将结果放在名为"总数"的最右列。 |
| 工作汇报总结 | 将 2023 年工作记录总结为 500 字以内的段落,以序列形式列出每月亮点,并做全年总结。 |
2. 让模型扮演角色
在 system 消息中定义角色,输出更有针对性:
typescript
const messages = [
{
role: "system",
content: "你是一位有 10 年经验的 TypeScript 架构师,专注于大型前端工程。回答时优先考虑可维护性和类型安全。",
},
{
role: "user",
content: "如何设计一个可扩展的状态管理方案?",
},
];3. 使用分隔符区分内容块
XML 标签、三引号、章节标题等分隔符,让模型清楚区分不同的输入部分:
typescript
// XML 标签分隔多篇文章
{
role: "system",
content: "你将收到两篇文章,用 XML 标签分隔。首先概括每篇的论点,然后指出哪篇论点更好并说明原因。",
},
{
role: "user",
content: "<article>文章一内容...</article><article>文章二内容...</article>",
}typescript
// 三引号分隔需要处理的文本
{
role: "user",
content: '摘要:\"\"\"此处插入摘要。\"\"\"\n\n请将此摘要改写成更吸引人的版本。',
}4. 明确完成任务所需的步骤
对多步骤任务,明确列出步骤比泛泛说"总结这段文字"效果更好:
typescript
{
role: "system",
content: `使用以下步骤回应用户输入:
步骤一:用前缀"摘要:"将用户提供的文本(三引号包围)概括成一句话。
步骤二:将步骤一的摘要翻译成英语,加上前缀 "Translation: "。`,
}5. 提供 Few-shot 示例
如果想让模型模仿特定风格,提供示例比文字描述更有效:
typescript
const messages = [
{
role: "system",
content: "你是一个技术文档助手,以下是输入/输出示例,请保持这种风格:",
},
{
role: "user",
content: "函数 useState 的作用",
},
{
role: "assistant",
content: "useState 是 React Hook,用于在函数组件中添加状态。返回 [state, setState] 对。",
},
{
role: "user",
content: "函数 useEffect 的作用",
},
// 模型会模仿上面的简洁风格回答
];6. 指定期望的输出长度
字数指令比段落数更模糊,段落数比"详细"/""简短"更精确:
typescript
// 更精确
{ content: "用两句话概括以下文本,50 字以内:" }
// 次之
{ content: "用一个段落概括" }
// 最模糊
{ content: "简短总结" }提供参考文本
让模型基于你提供的内容回答,而不是凭训练数据推测:
typescript
{
role: "system",
content: `使用提供的文章(三引号分隔)回答问题。
如果答案在文章中找不到,回复"我找不到答案"。`,
},
{
role: "user",
content: `"""${documentContent}"""
问题:${userQuestion}`,
}这种方式适合:文档问答、合同分析、代码审查、知识库检索等场景。
拆分复杂任务
分类后再处理
复杂的客服/路由场景,先分类再处理:
typescript
// 第一步:分类
const classifyMessages = [
{
role: "system",
content: "判断用户的问题类型:billing/technical/general,只返回类型名称。",
},
{ role: "user", content: userQuery },
];
const category = await getCompletion(classifyMessages);
// 第二步:根据分类选择对应的处理 prompt
const handlerPrompts = {
billing: "你是账单专家,帮助处理计费相关问题...",
technical: "你是技术支持工程师,帮助排查技术问题...",
general: "你是通用助手...",
};
const handleMessages = [
{ role: "system", content: handlerPrompts[category] },
{ role: "user", content: userQuery },
];长对话总结管理
上下文接近上限时,触发摘要而不是直接截断:
typescript
const TOKEN_THRESHOLD = 100000; // 接近模型上限时触发
async function manageContext(messages: any[], newUserMessage: string) {
const estimatedTokens = estimateTokens(messages);
if (estimatedTokens > TOKEN_THRESHOLD) {
// 对历史对话做摘要
const summary = await summarizeConversation(messages.slice(0, -10));
return [
{ role: "system", content: `之前对话摘要:${summary}` },
...messages.slice(-10), // 保留最近 10 条
{ role: "user", content: newUserMessage },
];
}
return [...messages, { role: "user", content: newUserMessage }];
}长文档递归摘要
对超长文档(如一本书),分章节摘要后再汇总:
typescript
async function summarizeBook(chapters: string[]): Promise<string> {
// 第一层:逐章摘要
const chapterSummaries = await Promise.all(
chapters.map(chapter => summarize(chapter, "请用 200 字概括这一章的主要内容。"))
);
// 第二层:汇总摘要
const allSummaries = chapterSummaries.join("\n\n---\n\n");
return summarize(allSummaries, "请基于以上各章摘要,写一个 500 字的全书概述。");
}常见问题
Q: system prompt 和 user 消息哪个更权威?
A: system 消息用于设定角色和规则,user 消息代表实际请求。两者有冲突时,模型通常优先遵循 system 的约束。对于关键约束,建议同时在 system 和 user 消息中强调。
Q: 输出总是不稳定,每次格式不一样怎么办?
A: 用 JSON Mode(response_format: { type: "json_object" })强制结构化输出,或在 prompt 里给出具体格式示例(few-shot),而不是只说"请按指定格式输出"。
Q: 模型不遵守字数限制怎么办?
A: 字数限制是"软约束",模型做不到精确控制字数。可以:①要求"大约 N 字"而非严格 N 字;②用段落数/句子数替代字数;③在 prompt 中多次强调,或给出示例。