106 lines
5.2 KiB
Markdown
106 lines
5.2 KiB
Markdown
---
|
||
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 的区别?
|