Prompt Engineering
Prompt Engineering 是让模型稳定输出预期行为的工程。对 Agent 来说,Prompt 不是开场白,而是运行时配置:它同时服务人类可读性和程序可解析性,还要在工具调用、多轮对话、外部信息注入下保持稳定。
一条核心认知:System Prompt 是软约束。 真正安全靠鉴权、沙箱、输出过滤和人工审批,不是靠在 Prompt 里写“请不要作恶”。Prompt 决定模型做什么,Harness 决定它能不能做。
System Prompt 的三段结构
顺序不要随意调换,每个区块职责不同:
| 区块 | 职责 | 写作要点 |
|---|---|---|
| 角色 | 定义“我是谁、能做什么” | 用动词边界:分析、规划、调用工具;避免“万能助手” |
| 约束 | 定义“绝不能做什么” | 否定句加触发条件,比“请谨慎”可执行;安全与合规(密钥、PII、越权工具)优先于质量 |
| 输出格式 | 定义“程序如何读我” | 与解析器、JSON Schema、工具参数一一对应;解析器只认 JSON 就别允许“偶尔用自然语言总结” |
约束要可测试。写“无法确认时返回 NEED_CLARIFICATION”,比写“请如实告知”强。上线前用对抗用例过一遍:空输入、超长输入、多语言混杂、伪造工具返回,确认模型仍遵守格式和约束。
多 Agent 系统里,每个子 Agent 的 System Prompt 应该窄而深,全局目标由 orchestrator 负责,避免多个“全能 System”互相打架。
Few-shot:缩小输出分布
Few-shot 不是“多给几个例子就更聪明”,而是让模型对齐你期望的格式、语气和决策边界。
- 固定分类、槽位填充、工单路由:2 到 5 个覆盖边界的样例
- 长文档开放式创作:0 到 1 个样例,防止风格锚定
- 工具名称与参数选择:用“错误示范、纠正说明、正确示范”结构,比一堆正确例子更有效
高质量样例的特征:输入真实、输出可直接进业务库、覆盖失败模式(空值、歧义、多意图)。样例放在 user/assistant 轮次里呈现,不要塞进 System Prompt,否则挤占常驻窗口,还难以单独迭代。定期淘汰过时样例,产品改名、API 字段变更后,模型会顽固复用过期格式。
工具描述就是 Agent 的 ACI
Agent 的下游是代码。工具描述决定模型能不能选对工具、填对参数,这就是 Agent-Computer Interface(ACI)。核心原则和 Function Calling 篇一致:description 写清“做什么、何时用、边界”,离散参数用 enum,参数给示例值。工具数量超过 10 个时,选择准确率开始下降,这通常是升级到动态工具加载或拆分 Agent 的信号。
Prompt Caching:前缀即架构
Agent 每走一步都要把完整对话历史发给模型,模型只输出一小段。有团队披露过 input 和 output 的比值接近 100 比 1。没有缓存,每一步都重新计算全部历史,成本随步数二次方增长。
缓存机制是前缀精确匹配:前缀必须逐 token 完全一致且位于开头,任何位置的改动都会让该位置之后全部失效。这直接决定了 Prompt 的布局:
稳定内容前置,动态内容后置
三个破坏缓存的常见坑:开头放时间戳(第一个 token 就变,整个缓存废掉)、动态增删工具定义(工具列表在 prompt 前部)、非确定性序列化(JSON key 排序不一致,相同语义不同 token 序列)。
工具管理的 cache-aware 方案:工具定义保持完整不变,用其他机制限制可用范围。Claude Code 把 Plan Mode 本身做成工具,工具列表永远不变;Manus 用 logits masking 控制可用工具;OpenAI 用 allowed_tools 参数。
版本管理与评测
Prompt 不应散落在 if/else 字符串里。模板文件加变量注入加语义化版本号,日志里记录 prompt_id@version,出问题时才能回答“是模型变了还是 Prompt 变了”。
上线流程:黄金评测集门禁(同一批任务对比通过率、平均 Token、违规率),灰度 5% 流量,再全量。把 Prompt 当配置资产管理,而不是个人笔记本里的草稿。
面试追问
- System Prompt 怎么写? 三段结构:角色(动词边界)、约束(否定句加触发条件,安全优先)、输出格式(与解析器契约一致)。约束要可测试,上线前用对抗用例验证
- Few-shot 给多少合适? 看场景。分类和工具选择 2 到 5 个覆盖边界的样例,开放式创作 0 到 1 个防风格锚定。样例放 user/assistant 轮次,不放 System
- Prompt Caching 的原理和坑? 缓存固定前缀的 KV 状态,跳过重复 prefill,省的是 prefill 计算和首 token 延迟。前缀必须逐 token 一致且位于开头。坑:时间戳放开头、动态增删工具、非确定性序列化
- Agent 为什么比 Chatbot 更需要缓存? 每步全量重发历史,input 和 output 接近 100 比 1,没缓存成本二次方增长
- Prompt 能解决安全问题吗? 不能。System Prompt 是软约束,Prompt Injection 防护靠输入输出隔离、工具最小权限、参数校验和人工确认