--- id: ai.agent-design.context-skills-multiagent title: 上下文工程、Skills、多 Agent 和 A2A type: lesson domain: ai stack: [agent-design] tags: [上下文工程, Context Engineering, Skills, 多 Agent, Supervisor, Handoff, A2A] level: advanced prerequisites: [ai.agent-design.react-planning] est_hours: 3.5 related: [ai.prompt-engineering.index, ai.mcp.protocol-server, ai.ai-coding.index, ai.agent-design.interview] week: [11, 13] order: 2 --- # 上下文工程、Skills、多 Agent 和 A2A > Skills、A2A 都是 2025 年之后快速发展的概念,规范和各产品的支持情况以官方文档为准。 ## 解释说明 ### 上下文工程(Context Engineering) 提示词工程关注“怎么写指令”,上下文工程关注**每一次调用时,模型的上下文窗口里放什么**:系统提示词、工具定义、检索结果、对话历史、记忆、工具返回、当前任务状态。Agent 效果不好,很多时候不是模型不行,而是上下文里缺了关键信息,或者塞了太多无关内容。 | 手段 | 说明 | | --- | --- | | 选择(Select) | 只放相关的:检索结果精选、按任务挑选工具子集、按需加载技能 | | 压缩(Compress) | 历史对话摘要、工具结果只保留需要的字段 | | 隔离(Isolate) | 子任务交给子 Agent,在独立的上下文中完成,只把结论返回 | | 外部化(Write) | 长期信息写进文件 / 记忆库 / 状态,需要时再读取 | ### Skills(技能) 把某类任务的说明、规范、脚本打包成一个目录(例如 `SKILL.md` + 辅助文件),系统提示词里只放每个技能的**名字和一句话描述**,模型判断需要时再加载全文——这叫**渐进式披露**,可以在不撑爆上下文的前提下给 Agent 很多“专业知识”。Claude Code 等 AI 编程工具已经支持这种形式;团队也可以用它沉淀开发工作流(见 [AI 编程专题](../ai-coding/index.md))。 ### 多 Agent | 模式 | 做法 | 适合 | | --- | --- | --- | | Supervisor(主管) | 一个主 Agent 分派任务给多个专职子 Agent,汇总结果 | 任务可拆分、子任务独立 | | Handoff(转交) | 当前 Agent 把对话转交给更合适的 Agent | 客服分流(售前 → 售后 → 技术) | | 流水线 | 固定顺序:研究 → 写作 → 审校 | 内容生产 | 多 Agent 的代价:调用次数多、成本高、Agent 之间信息传递会丢失细节、更难调试。**先用单 Agent + 好的工具,确实需要上下文隔离或专业分工时再拆。** ### A2A(Agent2Agent 协议) MCP 解决“Agent 怎么调用工具”,A2A 解决“**不同团队 / 不同框架的 Agent 之间怎么协作**”。核心概念:Agent Card(描述 Agent 的能力、地址、鉴权方式)、Task(有状态的任务:已提交、处理中、需要输入、完成、失败等)、Message / Artifact(消息和产出物),基于 HTTP + JSON-RPC,支持流式更新。了解即可,面试时能说清和 MCP 的区别。 ## 案例 一个企业助手接入了 40 个工具和 6 份业务规范,系统提示词超过 2 万 token,模型经常选错工具。改造: 1. 规范改成 Skills,系统提示词只保留索引,按需加载; 2. 按意图把工具分组,每次只给相关的 8 个; 3. 报表类任务交给“数据分析子 Agent”,它在自己的上下文里多轮查询,只把结论和图表返回; 4. 长对话超过预算时压缩早期内容。 提示词长度降到 5000 token 左右,工具选择错误明显减少(用评测集验证)。 ## 代码示例 [examples/agent-patterns/patterns.py](examples/agent-patterns/patterns.py) 中的 Skills 渐进式加载和上下文预算: ```python def skills_index(skills): """放进系统提示词的只有名字和描述。""" return "\n".join(f"- {s.name}: {s.description}" for s in skills) skill = pick_skill("我上周买的耳机想退款,800 元", skills) # 真实项目由模型决定加载哪个 context.append(skill.body()) # 需要时才加载全文 @dataclass class Context: system: str budget: int keep_recent: int = 4 ... def add(self, role, text): self.messages.append((role, text)) while self.size() > self.budget and len(self.messages) > self.keep_recent: old = self.messages[: -self.keep_recent] self.messages = self.messages[-self.keep_recent:] self.summary = summarize(self.summary, old) # 早期对话压缩成摘要 ``` 技能文件示例:[skills/refund-policy/SKILL.md](examples/agent-patterns/skills/refund-policy/SKILL.md)。 ## 易错点 - 把所有规范、所有工具都塞进系统提示词。 - 摘要丢失了关键事实(订单号、用户已确认的选择):摘要要求明确保留哪些信息,并用评测验证。 - 多 Agent 之间只传结论不传依据,出错后无法追溯。 - 为了“看起来高级”上多 Agent,实际效果和成本都不如单 Agent。 - 混淆 MCP 和 A2A:一个是 Agent 与工具,一个是 Agent 与 Agent。 ## 面试常问 - 什么是上下文工程?和提示词工程有什么区别? - 工具很多时怎么办? - 什么时候需要多 Agent?有什么代价? - A2A 和 MCP 的区别?