Prompt 工程
Prompt 工程不是「咒语学」,而是在摸清 LLM 的输入-输出规律后,把任务、约束与格式讲清楚的技术:模型的能力基线由预训练决定(见 LLM 原理),提示词做的是「给定能力下的最优激发与最稳约束」。本页给出可直接复用的模式库、让输出可解析的工程做法,以及配套的评测与安全防线。
一、工作原理与五条原则
- 提示词 = 填进上下文窗口的一段文本;模型按统计分布续写,系统提示(system)、用户消息、助手历史构成了「角色 + 任务 + 已有进度」的完整上下文;
- 五条经验原则(每条都有失败样例支撑):
| 原则 | 解释 | 反例 → 正例 |
|---|---|---|
| 具体到可执行 | 说「做什么、对谁、什么格式」 | 「总结一下」→「用 3 条要点总结,每条 ≤20 字,按 问题-原因-动作 结构」 |
| 一步一问 | 拆小任务给清晰输入 | 「分析并重写并翻译」→ 拆成多次调用 |
| 给例子胜过给描述 | few-shot 立规矩 | 「要简洁」→ 附 2 个符合/不符合示例 |
| 先约束后发散 | 格式与边界前置 | 让模型自由发挥再求 JSON → 直接声明「只输出 JSON」 |
| 把「不知道」写进去 | 显式允许拒答 | 不写时模型会硬编 → 声明「不确定就回答:信息不足」 |
二、模式库:场景化配方
| 模式 | 一句话 | 典型模板 | 适用 |
|---|---|---|---|
| 角色扮演 | 用身份圈定语气与知识范围 | 你是资深后端工程师,请审查下面代码… | 风格/视角化任务 |
| 零样本结构化 | 用「步骤编号 + 输出模板」一次性约束 | 分四步:1)…2)…最后按模板输出 | 常规任务 baseline |
| 少样本(few-shot) | 带 k 个完整样例,含边界反例 | 例1…例2(拒绝回答的例子)…现在处理: | 规则微妙、易跑偏 |
| 思维链 CoT | 要求先推理再作答 | 一步步思考,最后给出结论 | 数学/逻辑/多步推理 |
| 自洽性 Self-consistency | 多次采样多数投票 | 重复 CoT 3-5 次,取答案众数 | 推理可靠性 |
| 思维树 ToT | 显式枚举多分支并评估 | 列出候选方案,评估后选优 | 规划/搜索类 |
| ReAct | 想→做→看 循环接工具 | 见 RAG 与 Agent | 需要事实/计算 |
| 拆解委托 | 把大任务拆成子任务再各自调用 | 先分诊再逐模块处理 | 复杂工作流 |
- 少样本选例原则:贴近目标分布、覆盖边界与反例、示例顺序(近期与开头位置权重高);每加一个示例也要注意「污染」——示例里的错误倾向会被复制;
- 要效果先确认是「会做但没说清」还是「不会做」:后者换更好的基座/微调/工具,提示词解决不了能力缺失。
三、结构化输出:让机器能消费的结果
- 两类做法配合使用:
- Prompt 层:明示输出 schema + 给 JSON 示例,再要求「不要输出任何其他文字」;
- 约束解码层(更稳):API 的 response_format / JSON schema 校验、工具调用(tools/function calling)强制参数化输出;自建服务可用 grammar 约束采样(如 vLLM 的 guided decoding);
- 工程红线:解析必须容忍失败——总是带重试、schema 校验、失败降级(返给模型「上次输出不合规,请重试」);
- 工具/函数调用本质 = 把「调用哪个函数 + 什么参数」当结构化输出生成,再由你的代码执行并回填结果——这是 Agent 的机械基础;
- 数字与事实输出建议直接约束「若无法确定,输出 null 并在备注说明」,比让模型硬猜好。
四、上下文工程:系统提示、记忆与长度经济
- 系统提示的最佳实践:目标(给谁用、做什么)、规则(禁止/必须)、知识或风格参考、输出格式、兜底行为——写成「当 X 时做 Y」的条件句比抽象口号有效;
- 记忆管理:长对话/多轮 Agent 场景,历史是资产也是成本——滑动窗口、关键信息摘要化、只保留最近 N 轮 + 长期记忆外置(向量库,见 RAG 与 Agent);
- 长度经济:省 token = 省成本与延迟(见 AI 工程化);指令与关键约束放开头与结尾(中间信息权重低),完整模板放消息末端让「最近内容」先行;
- 每类任务维护自己的提示模板库(版本化!),prompt 与代码一样需要 review、diff、回滚。
五、评测与迭代:没有评测就没有工程
- 建立 golden set(金标评测集):覆盖主要场景 + 边界与坏例,通常 30-100 条起步;
- 迭代闭环:改 prompt → 跑金标 → 对比前后输出(diff 高亮)→ 只保留净提升的改动;严禁「凭感觉微调」;
- 自动化评测三件套:
- 规则检查(输出是否含关键词/格式合法/长度约束);
- 指标评分(事实类可用 RAGAS 等,见 RAG 与 Agent 评测节);
- LLM-as-judge:用更强的模型按 rubrics 打分/对比,注意裁判偏好偏差(位置、长度、自夸),做盲排与抽样人工复核;
- 线上加「回归看门狗」:抽样请求自动重放评测,模型升级/提示变更前必须过门禁(详见 AI 工程化 可观测与评测节)。
六、安全:提示注入是真实的攻击面
- 直接注入:用户对「你的指令」说「忽略以上规则…」——系统提示被越权改写;
- 间接注入:网页/邮件/文档内容里藏指令,被 Agent 检索后执行(2023 起的高危面);
- 基础防线(纵深,别指望一层):
- 权限最小化:LLM 触达的每项工具都要鉴权与额度限制,注入后也只能做最小操作;
- 输入输出过滤:输入侧检测注入特征,输出侧脱敏 PII/拦截危险指令;
- 系统提示声明 + 定界:让模型区分「指令区」与「不可信数据区」,对「忽略/越狱」措辞显式禁止;
- 人工确认关卡:高权限操作(转账/删库/发布)必须人工或规则二验;
- 敏感数据(密钥/用户隐私)不进上下文,只放最小必要字段;
- 越狱与诱导属于对抗持续演进:定期用红队样例回归(见 AI 工程化 安全合规节)。
七、踩坑清单
- 先动手后设计:不写金标集就调 prompt,等于盲调,改动无法归因;
- 一个 prompt 塞所有任务:任务混装 = 规则互相打架,拆场景各写模板;
- 示例带毒:few-shot 里的一个错误示例会被放大复制,示例必须人工校验过;
- 让模型「自由发挥后解析」:JSON 外包一层花括号也稳不住,直接约束解码 + 失败重试;
- 忽略长度与预算:没算 token 就上线,长文档场景账单爆炸;
- 系统提示写散文:写作文不如写「规则列表 + 条件句」;
- 只加不减:prompt 越长不一定越好,删掉无效约束用评测验证;
- 不防注入就接工具:无鉴权工具 = 一个「帮我查资料」的链接就能打穿;
- 温度默认拉满做事实任务:事实/结构化任务用低温度或贪心;
- 换模型不回归:新模型对同样 prompt 行为漂移,金标集回归是必做动作。
继续学习:提示词接上外部知识与工具见 RAG 与 Agent;想让模型稳定按格式/领域输出(而非靠提示词硬撑)时进入 模型微调;评测与监控体系见 AI 工程化。