Skip to content

高质量 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 中多次强调,或给出示例。