阶段4(上):LangGraph、Function Calling、MCP(SDK 2.x)、Agent 评测与运维、Agent 设计专题;run_examples 设置 RUN_EXAMPLES=1
This commit is contained in:
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 的区别?
|
||||
Reference in new issue
Block a user