第 7 章:Prompt 设计:系统提示词、用户输入和上下文

3 阅读2分钟

第 7 章:Prompt 设计:系统提示词、用户输入和上下文

本章目标

这一章把 Prompt 从“随手写一句”升级成可维护的应用配置。

本章效果

在配套项目中,Prompt 被放在服务端 prompts.ts 中统一维护。前端只发送用户消息,不直接拼接系统提示词。

AI Chat Prompt 管理转存失败,建议直接上传图片文件

Prompt 在应用里的角色

Prompt 不是魔法咒语,而是模型的运行规则。一个好的系统 Prompt 应该说明:

  • 模型扮演什么角色
  • 可以使用哪些信息
  • 不能做什么
  • 输出格式是什么
  • 不确定时如何回答
  • 是否需要引用来源

知识库助手的系统提示词

创建 src/lib/ai/prompts.ts

export const KB_ASSISTANT_SYSTEM_PROMPT = `
你是一个企业知识库助手。

回答规则:
1. 优先依据提供的知识库片段回答。
2. 如果知识库片段不足以支持结论,要明确说明“不确定”。
3. 不要编造制度、链接、数字、日期或人员信息。
4. 回答要简洁,必要时使用列表。
5. 如果有引用来源,请在回答末尾列出。
`;

注意这里写的是规则,不是口号。

用户输入和上下文分离

不要把用户问题、知识库片段和系统规则混成一大段。更好的方式是分层:

export function buildKnowledgeContext(docs: Array<{ title: string; content: string }>) {
  return docs
    .map((doc, index) => {
      return `资料 ${index + 1}${doc.title}\n${doc.content}`;
    })
    .join("\n\n");
}

调用模型:

const result = await model.invoke([
  { role: "system", content: KB_ASSISTANT_SYSTEM_PROMPT },
  {
    role: "user",
    content: `
知识库片段:
${context}

用户问题:
${question}
`
  }
]);

Prompt 版本管理

Prompt 会不断调整。建议给关键 Prompt 加版本:

export const PROMPT_VERSION = "kb-assistant-v1";

日志里记录:

{
  promptVersion: PROMPT_VERSION,
  model: process.env.CHAT_MODEL,
  question,
  createdAt: Date.now()
}

这样线上效果变差时,能知道是哪一版 Prompt 出了问题。

Prompt 测试样例

为知识库助手准备几类测试问题:

资料里有明确答案的问题
资料里没有答案的问题
用户要求编造的问题
用户输入很长的问题
用户要求输出 JSON 的问题
用户故意注入“忽略之前规则”的问题

Prompt 不是写完就结束,而是要持续测试。

实战任务

完成:

  • 把 system prompt 移到 prompts.ts
  • 设计知识库上下文构造函数
  • 在 API Route 中引用 Prompt
  • 准备 5 个测试问题

常见坑

不要相信一句“不要幻觉”就能解决问题。减少幻觉要靠 Prompt、检索质量、引用来源和拒答策略共同完成。

不要把所有业务规则写死在 Prompt 里。稳定规则可以写代码,不稳定表达再交给模型。

不要让用户输入直接覆盖系统规则。

本章小结

Prompt 是 AI 应用的运行协议。下一章会让模型输出稳定 JSON,方便前端和业务系统处理。