阶段4(上):LangGraph、Function Calling、MCP(SDK 2.x)、Agent 评测与运维、Agent 设计专题;run_examples 设置 RUN_EXAMPLES=1

This commit is contained in:
Shikui Wang committed 2026-10-23 16:06:54 +08:00
1 parent 6650f7eb6d
commit caaec830b3
38 files changed
+3515 -64

No files matched your search

@@ -0,0 +1,105 @@
---
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 的区别?