我以为我懂Prompt,直到看了Perplexity这份内部手册
我以为我懂Prompt,直到看了Perplexity这份内部手册
最近,Perplexity的一份内部手册在开发者圈子里悄悄流传。
这份名为"Agent Skills"的文档,是Perplexity用来训练内部团队如何设计AI Agent的指导手册。它不是一份面向公众的PR材料,所以没有刻意讨好任何人。也正因为如此,它在第一页就说了一句让很多"Prompt老手"不舒服的话:
"你在对话式AI上积累的大部分直觉,在Agent系统中不仅无效,甚至有害。"
我第一次读到这句话的时候,坐在椅子上愣了大概十秒钟。
我写Prompt也有一两年了,从Zero-shot到Few-shot,从Chain-of-Thought到Self-consistency,自以为摸出了一套方法论。但这句话让我意识到,我可能一直在用"说服一个人"的思维,去"设计一个系统"。
这两件事,根本不是一回事。
本文不是手册的全文翻译,也不是资讯搬运。我只拆其中最反常识的3个设计原则——那些会让有经验的Prompt工程师皱眉头的部分。如果你是小白,恭喜你,你没有坏习惯,反而是优势。
---
原则一:别告诉Agent怎么做,告诉它什么时候停
普通Prompt工程师的直觉:步骤写得越详细,AI执行得越准确。这个直觉在单轮对话里是对的。但在Agent场景里,它会让你的系统变成一个停不下来的失控机器。
手册里有一段话我反复读了好几遍:
"执行逻辑是AI自己的事,终止条件是你必须设计的事。一个没有明确停止信号的Agent,会在任务完成之后继续'优化',直到它把结果搞坏为止。"
来看一个具体对比。假设任务是:从一批网页里提取竞品价格信息,整理成表格。
Prompt写法(传统思维):请按以下步骤操作:
1. 访问以下URL列表
2. 找到每个页面上的价格信息
3. 提取产品名称、价格、货币单位
4. 整理成Markdown表格
5. 如果某个页面没有价格,标注"N/A"
6. 最后检查表格格式是否整齐
Agent Skills写法(系统思维):
任务目标:从URL列表提取价格数据
终止条件(满足任一即停止):
- 所有URL均已处理(成功或失败均记录)
- 连续3次网络请求失败
- 运行时间超过120秒
- 提取到的数据行数超过500行
输出格式:{产品名, 价格, 货币, 来源URL, 状态}
状态枚举:success | not_found | access_denied | parse_error
不要做的事:
- 不要尝试"猜测"缺失的价格
- 不要重试已经标注access_denied的URL
- 不要在输出之后继续"优化"格式
你看到差异了吗?
Prompt写法在描述"怎么做",Agent写法在定义"边界"。前者假设AI是一个执行指令的工人,后者把AI当作一个需要被约束的自主系统。
步骤越详细,Agent越容易在步骤之间的缝隙里"自由发挥"。而终止条件,才是防止它失控的真正护栏。
💡 一行总结:给Agent写说明书,不如给它画围栏。
---
原则二:上下文不是越长越好,是越干净越好
这是手册里我觉得最被低估的洞察,也是最容易被忽视的工程问题。
Prompt工程的常见建议是"多给信息"——背景、约束、例子、格式要求,全部塞进去,越详细越好。这个建议在单轮对话里成立,但在Agent的多步执行链路里,它会制造一个叫做"上下文污染"的问题。
手册里的原话是:
"Agent在执行过程中产生的中间状态、错误信息、工具调用日志,如果不加过滤地累积在Context Window里,会让模型在后续步骤里越来越'分心'。我们内部把这个现象叫做Context Drift。"
想象一个Agent在执行一个10步的数据处理任务。到第5步的时候,它已经在上下文里积累了:
- 第1步的原始输入(有用)
- 第2步的中间结果(部分有用)
- 第3步的工具调用失败日志(已无用)
- 第4步的重试记录(已无用)
- 第5步之前的所有思考过程(大部分无用)
这堆东西全部压在模型的注意力上,它在执行第6步的时候,质量会显著下降——不是因为任务变难了,而是因为它需要从一堆噪音里找到真正有用的信号。
判断"上下文已经脏了"的3个信号:1. 模型开始重复之前步骤已经完成的工作——它迷失了,不知道自己在哪里
2. 输出开始出现与当前步骤无关的内容——之前的错误信息在"污染"当前输出
3. 相同指令的执行质量在第N步明显低于第1步——这是Context Drift的典型症状
上下文裁剪策略(可直接复用):每个执行步骤结束后,只保留以下内容传入下一步:
✅ 最终目标(不变)
✅ 当前步骤的输出结果(压缩版)
✅ 已完成步骤的状态摘要(一行)
✅ 当前步骤的失败原因(如有)
主动丢弃:
❌ 中间思考过程
❌ 工具调用的原始日志
❌ 已经被覆盖的中间状态
❌ 重试记录(只保留最终结果)
这个策略的本质是:把Agent的"工作记忆"和"长期记忆"分开管理,而不是让它们混在一个越来越长的对话历史里。
💡 一行总结:上下文是Agent的工作台,你要定期清桌子,不是一直往上堆东西。
---
💡 想直接动手验证这些原则?
文中的对比案例都可以在 [api.884819.xyz](https://api.884819.xyz) 上直接跑——支持调用 GPT、Claude、Deepseek 等主流模型API,你可以把"Prompt写法"和"Agent写法"的两个版本分别测试,亲眼看输出质量的差距。
对于想认真学Agent开发的读者,自己跑一遍比看十遍文章管用。新用户注册即送体验token,国产模型(Deepseek/千问等)完全免费,没有月租,注册即用。
---
原则三:失败路径比成功路径更值得设计
这是手册里篇幅最长的章节,也是最让我坐立不安的部分。
普通Prompt工程师(包括一年前的我)花90%的精力在写"让AI做对"的指令。我们反复调试,直到Happy Path跑通,然后就觉得大功告成了。
但手册里有一句话直接戳穿了这个幻觉:
"一个只在理想条件下工作的Agent,不是一个Agent,是一个演示。真实环境里,API会超时,网页会返回403,数据会有脏字段,用户输入会完全超出预期。一个不知道如何优雅失败的Agent,是一个危险的Agent。"
"危险"这个词用得很重。因为Agent不像单轮对话——它会在真实环境里自主执行多个步骤,如果中途出错但没有失败处理机制,它会继续往下走,把错误一路带到最终输出,甚至触发一些不可逆的操作(比如发送了一封格式错误的邮件,或者删除了不该删的文件)。
Agent失败路径设计的决策树:任务执行
│
├── 成功 → 输出结果,记录状态,清理上下文
│
└── 失败
│
├── 可重试的失败(网络超时、限流)
│ │
│ ├── 重试次数 < 3 → 等待后重试
│ └── 重试次数 ≥ 3 → 降级处理
│
├── 不可重试的失败(权限不足、数据格式错误)
│ │
│ └── 立即停止当前子任务
│ │
│ ├── 有回退方案 → 执行回退
│ └── 无回退方案 → 标记失败,继续其他子任务
│
└── 不确定的失败(输出无法验证、置信度低)
│
└── 不要猜测,主动暴露不确定性
│
├── 有人工介入机制 → 请求确认
└── 无人工介入机制 → 标注"低置信度"后输出
最后一个分支是手册里我觉得最有价值的洞察:不确定的时候,Agent必须说"我不确定",而不是给出一个听起来自信的错误答案。
手册里把这个能力叫做"Uncertainty Expression",并且明确说:
"一个会表达不确定性的Agent,比一个永远自信的Agent更可信。前者让你知道哪里需要人工介入,后者让你在不知情的情况下信任了一个错误。"具体怎么设计失败路径?以下是可以直接复用的模板:
失败处理规范:
1. 每个工具调用必须有明确的成功/失败判断标准
示例:HTTP状态码200-299为成功,其他为失败
2. 失败分类必须在Prompt里预先定义
- RETRY: 可重试,等待{n}秒后重试,最多{m}次
- SKIP: 跳过当前项,继续处理下一项
- ABORT: 终止整个任务,返回已完成部分
- ESCALATE: 标记需要人工处理
3. 不确定性输出格式
{
"result": "...",
"confidence": "high|medium|low",
"uncertainty_reason": "...", // confidence非high时必填
"requires_human_review": true/false
}
4. 禁止的行为
- 不要在失败后继续执行依赖该结果的步骤
- 不要用"可能""也许"掩盖真实的失败
- 不要在没有回退方案时强行给出一个"差不多"的结果
💡 一行总结:Happy Path是你的期望,Failure Path才是你的产品。
---
收尾:放弃控制幻觉,才是真正的掌控
把这三个原则放在一起,你会发现它们指向同一个认知转变:
Prompt是你在控制AI。Agent是你在约束一个会自主行动的系统。写Prompt的时候,你是导演,AI是演员,你说什么它演什么。这种关系让你有一种清晰的控制感——我说了,它就做了。
但Agent不是这样工作的。你设计的是规则、边界、终止条件、失败处理机制——然后你放手,让它在真实环境里自主运行。你无法预测它会遇到什么,但你可以设计它遇到任何情况时的行为准则。
这不是技术问题,是设计哲学问题。
就像城市规划师不会告诉每辆车怎么开,但他设计了红绿灯、单行道、限速标志。车辆在这个系统里自主行驶,但不会失控——因为约束设计得足够好。
从Prompt工程师到Agent设计师,这个转变的本质是:放弃对每一个步骤的控制幻觉,换取对整个系统行为的真正掌控。
如果你想迈出第一步,我的建议很具体:
1. 找一个你现在正在用的Prompt,问自己:"这个任务的终止条件是什么?" 如果你答不上来,说明它还不是Agent思维。
2. 把你下一个Agent项目的失败路径先于成功路径写出来。
3. 在 [api.884819.xyz](https://api.884819.xyz) 上跑一次"Prompt写法 vs Agent写法"的对比实验,用同一个模型,看输出质量的差距。
思维模型的升级,从来不是读完一篇文章就发生的。但有时候,一篇文章可以让你意识到自己一直坐在错误的椅子上。
希望今天这篇,是那个让你站起来的时刻。
---
「下一篇我想聊一个更底层的问题:
当Agent开始能够调用Agent——也就是Multi-Agent架构真正普及之后,"谁来写Prompt"这个问题本身就消失了。
那时候,今天我们讨论的所有技巧——终止条件、上下文裁剪、失败路径——会变成历史,还是会变成地基?
这个问题,我自己也还没有答案。」
---
本文由8848AI原创,转载请注明出处。关注8848AI,带你从零开始学AI。#AI Agent #Prompt工程 #Agent开发 #人工智能 #8848AI #AI学习 #大模型 #Agent设计