Files
zhuangang/topics/ai/agent-design/02-context-skills-multiagent.md

5.2 KiB
Raw Permalink Blame History

id, title, type, domain, stack, tags, level, prerequisites, est_hours, related, week, order
id title type domain stack tags level prerequisites est_hours related week order
ai.agent-design.context-skills-multiagent 上下文工程、Skills、多 Agent 和 A2A lesson ai
agent-design
上下文工程
Context Engineering
Skills
多 Agent
Supervisor
Handoff
A2A
advanced
ai.agent-design.react-planning
3.5
ai.prompt-engineering.index
ai.mcp.protocol-server
ai.ai-coding.index
ai.agent-design.interview
11
13
2

上下文工程、Skills、多 Agent 和 A2A

Skills、A2A 都是 2025 年之后快速发展的概念,规范和各产品的支持情况以官方文档为准。

解释说明

上下文工程(Context Engineering)

提示词工程关注“怎么写指令”,上下文工程关注每一次调用时,模型的上下文窗口里放什么:系统提示词、工具定义、检索结果、对话历史、记忆、工具返回、当前任务状态。Agent 效果不好,很多时候不是模型不行,而是上下文里缺了关键信息,或者塞了太多无关内容。

手段 说明
选择(Select) 只放相关的:检索结果精选、按任务挑选工具子集、按需加载技能
压缩(Compress) 历史对话摘要、工具结果只保留需要的字段
隔离(Isolate) 子任务交给子 Agent,在独立的上下文中完成,只把结论返回
外部化(Write) 长期信息写进文件 / 记忆库 / 状态,需要时再读取

Skills(技能)

把某类任务的说明、规范、脚本打包成一个目录(例如 SKILL.md + 辅助文件),系统提示词里只放每个技能的名字和一句话描述,模型判断需要时再加载全文——这叫渐进式披露,可以在不撑爆上下文的前提下给 Agent 很多“专业知识”。Claude Code 等 AI 编程工具已经支持这种形式;团队也可以用它沉淀开发工作流(见 AI 编程专题)。

多 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 中的 Skills 渐进式加载和上下文预算:

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。

易错点

  • 把所有规范、所有工具都塞进系统提示词。
  • 摘要丢失了关键事实(订单号、用户已确认的选择):摘要要求明确保留哪些信息,并用评测验证。
  • 多 Agent 之间只传结论不传依据,出错后无法追溯。
  • 为了“看起来高级”上多 Agent,实际效果和成本都不如单 Agent。
  • 混淆 MCP 和 A2A:一个是 Agent 与工具,一个是 Agent 与 Agent。

面试常问

  • 什么是上下文工程?和提示词工程有什么区别?
  • 工具很多时怎么办?
  • 什么时候需要多 Agent?有什么代价?
  • A2A 和 MCP 的区别?