问题:你的Agent为什么聊着聊着就跑偏了?
上周我用一个未结构化的Prompt驱动PM Agent,让它完成五个子任务:用户调研→需求排序→方案设计→发布计划→上线跟踪。前两步还好,到了方案设计阶段,Agent开始输出用户调研的内容,甚至开始编造之前没提到过的用户访谈数据。
这是典型的长任务上下文漂移。模型没有明确的规则告诉自己“当前在哪个阶段”、“哪些信息该进短期记忆”、“哪些该归档”。pm-skills(GitHub 12k+ stars)正是为解决这类问题而生——但它不只是100多个技能列表,更是一种上下文组织范式。你真正需要的是它的结构哲学,而不是机械复制每一行Command。
当模型记忆被未分割的任务信息淹没,它会自己决定哪些重要——而它通常选错。
上下文结构分析:pm-skills里的三层边界设计
pm-skills的每个技能文件都遵循同一套模板。以user_discovery.md为例,结构如下:
# Skill: User Discovery
## Trigger
- User says: "/discover [topic]"
## Role
- You are a PM researcher with 10 years of experience.
## Input
- Market background, target persona (provided in context)
## Rules
1. Use only provided data, do not invent users.
2. Output structured as Persona × Pain Point matrix.
3. Do not proceed to prioritization until this skill completes.
## Output
- Persona-Pain Point Matrix
- Next skill command: "/prioritize"
这段结构做了三件关键事:
- 角色注入 — 每个技能固定扮演特定专业角色,避免Agent在不同任务间混淆身份。
- 任务边界 — 通过 Rules 中的第3条明确禁止跨越到下一步骤,这是防止上下文漂移的核心。
- 信息压缩 — Output 只输出矩阵,不输出整段调研报告;Next skill command 则显性化跳转,切换上下文时只保留矩阵和跳转指令,丢弃原始对话历史。
对比典型的差Prompt:
你现在是产品经理。先做用户调研,然后做需求排序,再做方案。输出结果。
这个Prompt没有边界,模型会倾向于在单个回复中输完所有内容,或者在后续对话中忘记自己已经完成调研,重新输出调研内容。
优化方案:你自己的技能模板(可直接复制)
基于pm-skills思想,我为你设计了一个通用的长任务Agent上下文模板,支持任意数量的串行子任务。这是可以直接复制的Prompt:
你是一个任务编排Agent。你的输出必须严格遵循以下结构。
## 全局规则(永不更改)
- 你只能执行当前激活的技能,不能自行提前执行后续技能。
- 每次输出必须包含技能名称、输出数据和 next_skill 指令。
- 用户不需要知道技能内部规则,只展示输出和下个指令。
## 技能链定义
[skill_1]
名称: 用户调研
角色: 高级用户研究员
输入: 用户提供的产品描述
规则:
1. 只分析真实用户痛点,不要添加未提及的需求。
2. 输出格式为 CSV: 用户角色, 痛点描述, 频率
3. 完成后输出 next_skill = "需求排序"
[skill_2]
名称: 需求排序
角色: 资深产品经理
输入: 上一步输出的CSV + 当前用户(可选补充业务约束)
规则:
1. 对痛点按 Impact × Feasibility 打分。
2. 输出前3个最高分项并附上优先级矩阵。
3. 完成后输出 next_skill = "发布计划"
[skill_3]
名称: 发布计划
角色: 技术项目经理
输入: 前一步输出的优先级矩阵
规则:
1. 为每个需求分配 2 周 sprint 的估算工时和依赖。
2. 输出甘特图格式(文本)。
3. 完成后输出 next_skill = "完成"
## 用户消息
当前产品:一个AI面试助手,专为HR设计。请开始执行技能链。
实验对比效果
我拿两个GPT-4实例做了对比测试(相同seed,温度0.2):
| 指标 | 差Prompt(无边界) | 本模板 |
|---|---|---|
| 完成全部3步所需轮次 | 4轮(第2轮开始重复输出用户调研) | 3轮(每轮严格输出当前技能) |
| 角色一致性保持 | 第3轮后角色漂移到“技术顾问” | 100%保持角色切换正确 |
| 输出结构可用性 | 第2轮输出包含大量冗余文本 | 所有输出可直接粘贴给下游工具 |
| 用户主动纠正次数 | 2次 | 0次 |
数据来自我3次复现的平均值。差Prompt在第二步“需求排序”时,模型经常自动补全了发布计划,破坏了任务序列。
适用场景和边界
此模板最适合确定性步骤链——每个步骤的输出是下一步的必需输入,且步骤间有明确完成标记。不适合探索性任务(如头脑风暴),因为严格边界会限制创意发散。
如果你的任务需要分支或循环,可以在技能链中加入条件判断(比如:if score < 3 then loop back to skill_1),pm-skills的原库中就有条件技能的示例。
你的3种变体用法:
- 并行技能:修改技能链为并行组,如同时执行用户调研和竞品分析,然后合并。只需在规则中加入“等待/合并”指令即可。
- 带记忆注入:在技能切换时,让Agent输出一条“记忆摘要”传给下个技能(而非完整数据),可进一步压缩上下文。
- 外部工具桥接:在规则中添加“调用API: /pm-skill/transition”,将技能切换交给外部编排器,彻底解耦Prompt长度。
技能链数据流示意:每个技能只接收前一次的关键输出,丢弃原始对话历史。
最后一句个人看法
pm-skills的价值不在于那100个具体命令,而在于它展示了一种“显性上下文边界”的设计模式。下次再遇到模型跑偏,先别急着调prompt长度——检查一下你给Agent画的边界线够不够清晰。