Article
第一章:A2A 基础概念
1.1 什么是 A2A(Agent-to-Agent)?
| 概念名称 | 说明 | 注意事项 |
|---|---|---|
| A2A(Agent-to-Agent) | 指两个或多个基于大语言模型(LLM)构建的智能体(Agent)之间通过自然语言或结构化消息进行自主通信、协作与任务分解的交互范式。A2A 强调智能体具备目标理解、推理、工具使用和对话协调能力。 | A2A 不是简单的 API 调用链,而是具有语义理解、上下文感知和动态决策能力的多智能体系统;需避免将 A2A 简化为”函数调用嵌套”。 |
| 智能体(Agent) | 在 A2A 上下文中,指由 LLM 驱动、具备自主性(autonomy)、目标导向(goal-directed)和环境交互能力(如调用工具、读写记忆)的软件实体。 | 单个 Agent 必须具备至少一种外部交互能力(如工具调用或记忆读写),否则仅为被动语言生成器,不构成真正智能体。 |
| 多智能体系统(MAS) | 由多个 Agent 组成的协作系统,通过消息传递实现任务分工、冲突解决或共识达成。A2A 是 MAS 在 LLM 时代的一种实现形式。 | 并非所有多 Agent 场景都属于 A2A;只有当 Agent 之间存在双向、语义级通信时,才构成 A2A。 |
1.2 大语言模型作为智能体(LLM Agent)的基本能力
| 概念名称 | 说明 | 注意事项 |
|---|---|---|
| 推理能力(Reasoning) | LLM Agent 能够对输入任务进行分解、规划步骤、评估选项并生成逻辑连贯的行动计划(如使用 ReAct、Chain-of-Thought)。 | 推理质量高度依赖提示词设计和模型能力;小模型可能无法稳定执行复杂推理。 |
| 工具调用(Tool Use) | Agent 可识别何时需要外部工具(如搜索、计算、数据库查询),并按规范调用(如 OpenAI Function Calling、LangChain Tools)。 | 工具接口必须结构化(如 JSON Schema),且需严格校验输出格式,防止幻觉导致无效调用。 |
| 记忆管理(Memory) | Agent 能存储和检索历史交互信息,包括短期上下文(对话历史)和长期知识(向量数据库、文件等)。 | 长期记忆需配合嵌入与检索机制;过度依赖记忆可能导致上下文污染或信息过载。 |
| 自主决策(Autonomy) | 在无显式人类干预下,Agent 能根据目标动态选择行动路径、调用工具或与其他 Agent 协作。 | 完全自主存在风险,实际系统常设置”人工审核点”或最大迭代次数限制。 |
| 角色扮演(Role-playing) | Agent 可被赋予特定身份(如”研究员”、“程序员”、“审稿人”),其行为和语言风格随之调整。 | 角色指令需明确且一致,否则易导致行为混乱或角色漂移。 |
1.3 A2A 与传统 API 调用、函数调用的区别
| 概念名称 | 说明 | 注意事项 |
|---|---|---|
| A2A 通信 | 基于语义消息的双向或多向交互,消息内容包含意图、上下文、中间结果,接收方需理解并生成响应。通信内容可为自然语言或半结构化格式(如 JSON + 文本)。 | A2A 通信不可预设固定流程;每次交互可能改变任务路径,需动态路由。 |
| 传统 API 调用 | 客户端向服务端发送结构化请求(如 RESTful POST),服务端返回确定性结果,调用方无需”理解”响应语义。 | API 调用是单向、同步、确定性的;失败通常抛出错误码,不涉及协商或重试策略。 |
| 函数调用(Function Calling) | LLM 根据用户指令生成函数调用参数,由外部系统执行后返回结果,再由 LLM 整合答案。本质是”LLM → 工具 → LLM”单轮闭环。 | 函数调用是单 Agent 内部行为,不涉及多个 LLM 实例之间的协作;无法实现角色分工或辩论机制。 |
| 控制流 vs 语义流 | 传统调用依赖预定义控制流(if-else、循环);A2A 依赖语义流(intent → response → new intent)。 | 将 A2A 强行套入传统工作流引擎(如 Airflow)会导致灵活性丧失;应使用图计算框架(如 LangGraph)建模。 |
| 错误处理机制 | A2A 中错误可通过协商、澄清、角色切换等方式恢复;传统调用通常直接失败或重试。 | A2A 的容错依赖于 Agent 的元认知能力(如”我无法完成,请换人”),需在 System Prompt 中显式设计。 |
第二章:A2A 通信协议与消息格式
2.1 消息结构设计(JSON Schema、自然语言模板等)
| 概念名称 | 说明 | 注意事项 |
|---|---|---|
| 结构化消息(Structured Message) | 采用 JSON 或类似格式封装通信内容,包含字段如 sender、recipient、content、intent、timestamp 等,便于程序解析与路由。 | 字段命名应统一;避免过度嵌套导致解析复杂;建议使用 JSON Schema 校验。 |
| JSON Schema 定义 | 为消息格式提供标准化描述,例如定义 {"type": "object", "properties": {"role": {"type": "string"}, "content": {"type": "string"}}},用于验证消息合法性。 | 所有参与 Agent 必须遵循同一 Schema;版本变更需兼容或通知机制。 |
| 自然语言模板(Natural Language Template) | 使用预设句式(如”作为{role},我建议…”)生成可读性强的消息,适用于调试或人机混合场景。 | 模板需保留关键语义槽位(如任务ID、状态);不可完全依赖自然语言,因 LLM 可能偏离模板。 |
| 混合消息格式 | 同时包含结构化字段(如 tool_calls)和自由文本(如 explanation),兼顾机器处理与人类理解。 | 自由文本部分不应承载关键逻辑;关键操作必须通过结构化字段表达。 |
| 消息唯一标识(Message ID) | 每条消息分配全局唯一 ID(如 UUID),用于追踪、去重、日志关联。 | 在分布式系统中必须保证 ID 全局唯一;建议结合时间戳+节点ID生成。 |
2.2 通信协议标准(如 LangChain Message、OpenAI Function Calling 格式)
| 概念名称 | 说明 | 注意事项 |
|---|---|---|
| LangChain Message 格式 | 使用 HumanMessage、AIMessage、SystemMessage、FunctionMessage 等类表示对话轮次,支持 content、additional_kwargs 等字段。示例:{"role": "assistant", "content": "...", "tool_calls": [...]}。 | 需配合 LangChain 的 ChatModel 使用;自定义 Agent 若不基于 LangChain 需手动对齐格式。 |
| OpenAI Function Calling 格式 | 在聊天完成响应中包含 tool_calls 数组,每个元素含 id、function.name、function.arguments;调用结果以 role: tool 消息返回。 | arguments 为 JSON 字符串,需 json.loads() 解析;函数名必须预先注册。 |
| Anthropic Tool Use 格式 | 使用 tool_use block 类型,在消息 content 中嵌入结构化工具调用指令,响应通过 tool_result block 返回。 | 需启用 tools 参数并指定 schema;与 OpenAI 格式不兼容,迁移需转换层。 |
| 自定义 A2A 协议 | 团队自定义消息协议,如包含 from_agent、to_agent、task_id、status、payload 等字段。 | 必须文档化并强制所有 Agent 实现;建议提供序列化/反序列化工具函数。 |
| 协议互操作性 | 不同框架(如 AutoGen 与 LangGraph)间通信需中间适配器转换消息格式。 | 避免在生产系统中混用多种原生协议;推荐统一到一种标准(如 OpenAI 格式)作为内部总线。 |
2.3 上下文管理与对话历史传递
| 概念名称 | 说明 | 注意事项 |
|---|---|---|
| 对话上下文(Conversation Context) | 包含当前会话的所有历史消息列表,通常按时间顺序排列,作为 LLM 生成新响应的输入。 | 上下文长度受模型 token 限制(如 128K);需实施截断或摘要策略。 |
| 上下文窗口管理 | 动态维护最近 N 条消息或按任务分段保留上下文,避免无关历史干扰当前决策。 | 截断策略应保留关键系统消息和最新交互;避免切断工具调用-结果对。 |
| 任务级上下文隔离 | 不同任务(如 task_id=101 vs task_id=102)使用独立上下文,防止信息交叉污染。 | 需在消息中显式携带 task_id;Agent 内部应维护多任务上下文映射表。 |
| 上下文摘要(Context Summarization) | 当历史过长时,由专门 Agent 或 LLM 生成摘要(如”此前已完成数据收集,当前需分析”),替换原始消息。 | 摘要可能丢失细节;关键步骤(如审批、错误)应保留原文。 |
| 全局记忆 vs 会话记忆 | 全局记忆(如向量库)存储长期知识;会话记忆仅限当前任务对话历史。两者需区分使用。 | 切勿将临时对话存入长期记忆;反之,长期知识应主动注入会话上下文。 |
第三章:单智能体构建基础
3.1 LLM Agent 的核心组件(推理引擎、工具调用、记忆模块)
| 概念名称 | 说明 | 注意事项 |
|---|---|---|
| 推理引擎(Reasoning Engine) | 负责任务理解、规划与决策的核心逻辑模块,通常由 LLM 配合提示模板(如 ReAct、Plan-and-Execute)实现。 | 推理质量高度依赖 System Prompt 设计;应限制最大推理步数以防无限循环。 |
| 工具调用模块(Tool Invocation Module) | 解析 LLM 输出中的工具调用请求,执行外部函数(如搜索、计算、API),并将结果返回给 LLM。 | 必须校验工具参数合法性;避免将未注册工具名传入执行器。 |
| 记忆模块(Memory Module) | 管理 Agent 的历史交互与知识,包括短期上下文(对话历史)和长期存储(向量数据库、文件等)。 | 记忆读写需有明确触发机制;避免在每次调用时全量加载长期记忆。 |
| 输入解析器(Input Parser) | 将用户或其它 Agent 的消息解析为结构化输入(如任务目标、约束条件),供推理引擎使用。 | 应支持多种输入格式(自然语言、JSON);需处理模糊或冲突指令。 |
| 输出生成器(Output Formatter) | 将 LLM 的原始响应转换为标准消息格式(如符合 A2A 协议的 JSON),便于下游 Agent 解析。 | 输出必须包含必要元信息(如 sender、intent);自由文本不应承载关键操作指令。 |
3.2 工具集成(Tool Use / Function Calling)
| 方法名称 | 语法 | 用途 | 代码示例 | 注意事项 |
|---|---|---|---|---|
| 定义工具(Function Definition) | 使用 JSON Schema 描述函数名称、参数、描述,如 {"name": "search_web", "parameters": {"type": "object", "properties": {"query": {"type": "string"}}}} | 向 LLM 声明可用工具,使其能生成合规调用 | tools = [{"name": "get_weather", "description": "获取城市天气", "parameters": {"type": "object", "properties": {"city": {"type": "string"}}, "required": ["city"]}}] | 参数必须标记 required;描述应清晰说明用途与限制 |
| 工具注册(Tool Registration) | 在框架中注册工具函数及其元数据,如 LangChain 的 @tool 装饰器或 AutoGen 的 register_function | 使 Agent 能在运行时调用对应函数 | @tool def get_weather(city: str) -> str: return f"{city} 晴,25°C" | 函数返回值应为字符串或可序列化对象;避免副作用不可逆操作 |
| 工具调用解析(Tool Call Parsing) | 从 LLM 响应中提取 tool_calls 字段并解析参数 | 将 LLM 的意图转化为实际函数调用 | for call in response.tool_calls: func = get_tool(call.function.name); args = json.loads(call.function.arguments); result = func(**args) | 必须处理 JSON 解析异常;参数类型需与函数签名匹配 |
| 工具结果封装(Tool Result Packaging) | 将工具执行结果封装为 role: tool 消息,回传给 LLM | 使 LLM 能基于结果继续推理 | messages.append({"role": "tool", "tool_call_id": call.id, "content": result}) | tool_call_id 必须与原调用一致;内容不可包含敏感信息 |
| 工具安全沙箱(Tool Sandbox) | 在隔离环境中执行工具(如限制网络访问、文件系统权限) | 防止恶意或错误工具调用导致系统风险 | 使用 Docker 容器或 Python subprocess 限制执行环境 | 生产环境必须启用;开发阶段可关闭但需标注风险 |
3.3 记忆与状态管理(短期记忆 vs 长期记忆)
| 概念名称 | 说明 | 注意事项 |
|---|---|---|
| 短期记忆(Short-term Memory) | 指当前对话或任务的上下文历史,通常以消息列表形式保存在内存中,作为 LLM 的输入上下文。 | 受模型 token 限制(如 128K);需定期清理或摘要;不应跨任务共享。 |
| 长期记忆(Long-term Memory) | 持久化存储的知识库,如向量数据库(Chroma、Pinecone)、文件或 SQL 表,用于跨会话检索历史经验。 | 写入需嵌入(embedding);读取需相似性检索;更新存在延迟。 |
| 记忆写入策略(Write Strategy) | 决定何时将信息存入长期记忆,如”仅存关键结论”、“每轮都存”或”由 Agent 主动决定”。 | 频繁写入增加成本;应过滤噪声(如”好的”、“明白了”等无意义回复)。 |
| 记忆读取策略(Read Strategy) | 在生成响应前,根据当前任务查询相关长期记忆,并注入上下文。 | 检索结果需排序并截断;避免引入无关或过时信息。 |
| 状态快照(State Snapshot) | 保存 Agent 当前状态(如任务进度、变量值、待办列表),用于恢复或调试。 | 快照应可序列化(JSON/YAML);敏感状态需脱敏;建议版本化管理。 |
| 记忆一致性(Memory Consistency) | 确保短期与长期记忆不冲突(如长期记忆说”已完成”,但短期上下文显示”进行中”)。 | 可采用”短期优先”原则;或设计冲突检测与合并逻辑。 |
第四章:多智能体架构设计
4.1 多智能体拓扑结构(中心化、去中心化、混合式)
| 概念名称 | 说明 | 注意事项 |
|---|---|---|
| 中心化拓扑(Centralized Topology) | 所有 Agent 通过一个中央协调者(Orchestrator)通信,任务分配、消息路由、状态同步均由其控制。 | 单点故障风险高;适合任务流程明确、需强管控的场景(如审批流)。 |
| 去中心化拓扑(Decentralized Topology) | Agent 之间直接通信,无中央节点,通过广播、订阅或点对点方式交换信息。 | 容错性强、扩展性好;但易出现消息风暴或状态不一致,需设计冲突解决机制。 |
| 混合式拓扑(Hybrid Topology) | 结合中心化与去中心化,例如按功能分组(小组内去中心化,组间由 Orchestrator 协调)。 | 平衡控制力与灵活性;适用于复杂系统(如科研协作平台)。 |
| 星型结构(Star Architecture) | 所有 Worker Agent 仅与中心 Orchestrator 通信,彼此不可见。 | 实现简单、调试方便;但 Orchestrator 成为性能瓶颈。 |
| 网状结构(Mesh Architecture) | 每个 Agent 可与其他任意 Agent 直接通信,形成全连接或部分连接图。 | 通信效率高、响应快;但需复杂路由逻辑和身份管理。 |
4.2 角色定义与职责划分(Orchestrator、Worker、Reviewer 等)
| 角色名称 | 职责说明 | 注意事项 |
|---|---|---|
| Orchestrator(协调者) | 负责任务分解、Agent 调度、消息路由、结果聚合与流程控制。通常不执行具体业务逻辑。 | 必须具备全局视图;避免在 Orchestrator 中嵌入业务规则,应保持通用性。 |
| Worker(执行者) | 执行具体子任务,如数据查询、代码生成、文本撰写等,依赖工具调用完成工作。 | 应专注单一能力(如”Python 工程师”、“市场分析师”);避免角色泛化导致性能下降。 |
| Reviewer(评审者) | 对 Worker 的输出进行质量检查、事实核查或风格校验,并提出修改建议或批准通过。 | 需配备评估标准(如 checklist);可多级 Review(初审+终审)。 |
| Moderator(主持人) | 在辩论或多观点场景中主持讨论,控制发言顺序、总结共识、防止偏题。 | 需中立立场;应具备摘要与冲突调解能力。 |
| Memory Agent(记忆代理) | 专职管理长期记忆的读写,响应其他 Agent 的检索请求,不参与任务逻辑。 | 可提升系统一致性;避免每个 Agent 自行实现记忆逻辑导致冗余。 |
| Fallback Agent(兜底代理) | 当主流程失败或超时,接管任务并尝试替代方案(如换模型、简化目标)。 | 应预设降级策略;避免无限重试。 |
4.3 协作策略(协商、分工、投票、共识机制)
| 策略名称 | 操作细节 | 注意事项 |
|---|---|---|
| 任务分工(Task Partitioning) | Orchestrator 将主任务拆解为子任务,分配给不同能力的 Worker Agent 并行执行。 | 子任务需正交且可独立完成;依赖关系需显式声明(如”先 A 后 B”)。 |
| 协商机制(Negotiation) | 两个 Agent 就资源、时间、方案等进行多轮对话达成一致(如”你负责数据,我负责可视化”)。 | 需设置最大协商轮次;应提供默认方案以防僵局。 |
| 投票机制(Voting) | 多个 Agent 对同一问题生成答案,由 Orchestrator 或独立 Voter Agent 统计多数意见作为最终结果。 | 适用于事实性问题;对开放性问题效果有限;可加权投票(按角色权威性)。 |
| 共识机制(Consensus Building) | Agent 通过迭代讨论逐步收敛到共同结论,常用于复杂决策(如论文评审、产品设计)。 | 需记录每轮观点变化;可引入 Moderator 引导讨论方向。 |
| 流水线协作(Pipeline Collaboration) | Agent 按固定顺序依次处理任务(A → B → C),前一 Agent 输出为后一 Agent 输入。 | 适合线性流程;任一环节失败将阻断整个流水线,需异常跳转机制。 |
| 广播-响应(Broadcast-Response) | 一个 Agent 广播请求(如”谁会 Python?”),具备能力的 Agent 主动响应并承接任务。 | 提升动态适配性;需防多个 Agent 同时响应导致重复执行。 |
第五章:A2A 协作流程实现
5.1 启动与初始化流程
| 步骤名称 | 操作细节 | 注意事项 |
|---|---|---|
| 系统配置加载 | 读取 YAML/JSON 配置文件,包含 Agent 列表、角色定义、工具注册表、通信协议、记忆后端等。 | 配置应支持环境变量覆盖;敏感信息(如 API Key)需通过安全方式注入。 |
| Agent 实例化 | 根据配置创建各 Agent 对象,绑定 LLM、工具集、记忆模块和 System Prompt。 | 每个 Agent 应有唯一 ID 和角色标签;避免共享可变状态(如内存上下文)。 |
| 工具注册与验证 | 将函数工具注册到每个 Agent 的工具调用模块,并校验参数 Schema 是否合规。 | 工具名必须全局唯一;建议在启动时进行 dry-run 测试。 |
| 初始上下文构建 | 为 Orchestrator 或主任务 Agent 注入初始任务描述、约束条件和目标输出格式。 | 初始消息应符合 A2A 消息协议;避免模糊指令(如”做点什么”)。 |
| 通信通道初始化 | 建立消息队列、事件总线或内存消息池,用于 Agent 间异步/同步通信。 | 在分布式部署中需使用 Redis、Kafka 等中间件;单机可使用 Python Queue。 |
5.2 消息路由与分发机制
| 方法名称 | 语法 / 机制 | 用途 | 代码示例 | 注意事项 |
|---|---|---|---|---|
| 直接寻址路由 | 消息包含 to_agent: "coder",由消息总线直接投递给指定 Agent。 | 点对点通信,适用于明确分工场景。 | message_bus.send(to="reviewer", content="请审核代码") | 目标 Agent 必须在线;需处理”收件人不存在”异常。 |
| 广播路由 | 消息发送给所有 Agent,由接收方根据角色/能力决定是否处理。 | 适用于能力发现或紧急通知。 | for agent in agents: if agent.can_handle(msg): agent.receive(msg) | 易造成冗余处理;建议配合”能力声明”机制过滤。 |
| 主题订阅路由 | Agent 订阅特定主题(如 "data_analysis"),消息按主题分发。 | 解耦发送方与接收方,提升扩展性。 | agent.subscribe("weather_tasks"); message_bus.publish(topic="weather_tasks", msg=msg) | 需维护主题-订阅者映射表;避免主题爆炸。 |
| 动态路由(基于 LLM 决策) | 由 Orchestrator 调用 LLM 分析当前任务,动态决定下一跳 Agent。 | 适用于非固定流程的复杂任务。 | next_agent = llm.predict(f"当前状态:{state},谁该下一步?", choices=agent_names) | 需限制 LLM 输出为预定义 Agent 列表;防止幻觉导致无效路由。 |
| 消息队列优先级 | 为消息设置优先级(如 high/normal/low),高优任务优先处理。 | 保证关键任务响应速度。 | message_bus.enqueue(msg, priority="high") | 需配套优先级调度器;避免低优任务饥饿。 |
5.3 异常处理与重试策略
| 异常类型 | 处理策略 | 注意事项 |
|---|---|---|
| 工具调用失败(如 API 超时) | 自动重试(最多 N 次,指数退避),失败后通知 Fallback Agent 或降级处理。 | 重试间隔应递增(如 1s, 2s, 4s);幂等性工具才可安全重试。 |
| LLM 生成无效工具调用 | 捕获 JSON 解析错误或参数缺失,返回错误消息并要求 LLM 重新生成。 | 应提供具体错误原因(如”缺少 city 参数”);避免无限循环。 |
| Agent 无响应(超时) | 设置消息处理超时(如 30 秒),超时后标记失败并触发备用流程。 | 超时阈值应根据任务复杂度调整;记录超时日志用于分析。 |
| 消息格式不合规 | 消息总线校验 Schema,拒绝非法消息并告警。 | 应返回标准化错误码(如 INVALID_MESSAGE_FORMAT);禁止静默丢弃。 |
| 死锁或循环依赖 | 检测消息环路(如 A→B→A)或任务停滞(长时间无进展),强制终止并上报。 | 可记录消息路径哈希;建议设置最大协作轮次(如 max_turns=10)。 |
| 重试上限与熔断 | 单任务失败超过阈值后熔断,不再重试,转人工或记录失败。 | 熔断后应提供诊断信息;避免系统资源耗尽。 |
5.4 终止条件与结果聚合
| 终止条件类型 | 判定方式 | 注意事项 |
|---|---|---|
| 显式完成信号 | 某 Agent 发出 {"status": "completed", "result": ...} 消息。 | 必须由具备权限的 Agent(如 Worker 或 Orchestrator)发出;需校验结果完整性。 |
| 最大轮次限制 | 协作轮数达到预设上限(如 10 轮)自动终止。 | 防止无限循环;应记录最终状态供分析。 |
| 所有子任务完成 | Orchestrator 检测所有分配的子任务均已返回成功状态。 | 需维护任务-状态映射表;支持部分失败下的部分聚合。 |
| 共识达成 | 多个 Reviewer 投票一致通过,或 Moderator 宣布讨论结束。 | 共识阈值可配置(如 2/3 同意);需记录反对意见。 |
| 用户中断 | 接收到外部终止指令(如用户点击”停止”)。 | 应优雅关闭,保存中间状态;不可强制 kill 进程。 |
| 聚合方法 | 操作细节 | 注意事项 |
|---|---|---|
| 结果拼接(Concatenation) | 将多个 Worker 的输出按顺序合并为最终报告。 | 适用于流水线任务;需统一输出格式(如 Markdown 段落)。 |
| 投票聚合(Majority Vote) | 对多个答案取多数结果作为最终输出。 | 仅适用于离散答案(如选择题、分类);需处理平票。 |
| 加权融合(Weighted Fusion) | 根据 Agent 权威性(如专家角色)加权平均或选择最优结果。 | 权重应在配置中定义;避免主观赋权偏差。 |
| 元 Agent 总结 | 由专门 Summarizer Agent 阅读所有中间结果,生成连贯最终输出。 | 提升可读性;但增加额外 LLM 调用成本。 |
| 结构化输出封装 | 将结果按预定义 JSON Schema 封装,便于下游系统消费。 | Schema 应提前约定;必须校验字段完整性。 |
第六章:典型 A2A 应用场景
6.1 多角色辩论系统
| 概念/组件 | 说明 | 注意事项 |
|---|---|---|
| 辩论角色(Debater Roles) | 预设多个立场不同的 Agent(如”正方”、“反方”、“中立观察员”),各自持有论点与证据。 | 角色指令需明确立场边界;避免角色在辩论中”倒戈”。 |
| 发言轮次控制 | 由 Moderator Agent 按规则分配发言权(如轮流制、抢答制),防止抢占或沉默。 | 应设置最大发言次数;支持打断机制(如提出关键质疑)。 |
| 论点生成与反驳 | 每个 Debater 基于当前上下文生成新论点或针对对方论点进行逻辑反驳。 | 需启用 Chain-of-Thought 提示以提升逻辑性;避免情绪化语言。 |
| 共识或结论输出 | 辩论结束后,由 Moderator 或独立 Judge Agent 总结各方观点并给出平衡结论。 | 结论应标注”未达成共识”若存在重大分歧;不可强行统一。 |
| 评估指标 | 可衡量逻辑连贯性、论据质量、反驳有效性等,用于迭代优化 Prompt。 | 建议结合人工评估;自动评估易受语言风格干扰。 |
6.2 分布式任务规划(如 AutoGen 中的 GroupChat)
| 概念/机制 | 说明 | 注意事项 |
|---|---|---|
| GroupChat 管理器 | AutoGen 中的 GroupChatManager 负责协调多个 Agent 在群聊中自主发言、推进任务。 | 所有参与 Agent 必须注册到同一 GroupChat 实例。 |
| 自主发言机制 | 每个 Agent 根据当前对话判断”是否该我发言”,若认为相关则生成响应。 | 需在 System Prompt 中强调”仅在必要时发言”;否则易导致话痨。 |
| 任务分解与接力 | 主任务被隐式拆解,Agent 通过对话自然交接子任务(如”我查完数据,下一步谁分析?”)。 | 依赖 LLM 的上下文理解能力;复杂任务建议显式分工。 |
| 终止检测 | 当某 Agent 输出 TERMINATE 或满足预设完成条件时,GroupChat 停止。 | TERMINATE 必须作为独立消息;不可嵌入长文本中。 |
| 消息历史共享 | 所有 Agent 共享同一对话历史,确保上下文一致。 | 历史过长时需启用摘要或截断;避免 token 超限。 |
6.3 自主科研代理协作(如 MetaGPT)
| 角色/模块 | 职责说明 | 注意事项 |
|---|---|---|
| 产品经理(Product Manager) | 定义科研目标、输出需求文档(如”实现一个 Transformer 训练 pipeline”)。 | 需具备领域知识;避免提出不切实际目标。 |
| 架构师(Architect) | 设计系统架构、模块划分、技术选型,并输出设计文档。 | 应引用最新论文或最佳实践;避免过度工程。 |
| 工程师(Engineer) | 编写可运行代码、单元测试,并提交至虚拟代码库。 | 代码需符合 PEP8 等规范;必须包含注释和错误处理。 |
| 审稿人(Reviewer) | 审查设计文档与代码,提出修改意见,直至通过。 | 应使用 checklist(如”是否有内存泄漏?”);支持多轮迭代。 |
| 项目经理(Project Manager) | 跟踪进度、协调阻塞、汇总成果,驱动项目闭环。 | 需定期生成进度报告;可触发超时告警。 |
| 虚拟代码仓库 | 模拟 Git 仓库,存储各轮次代码版本,供后续 Agent 读取。 | 代码变更需带 commit message;支持 diff 对比。 |
6.4 客服多轮协同应答
| 协作流程 | 操作细节 | 注意事项 |
|---|---|---|
| 用户意图识别 | 首接 Agent(Triage Agent)分析用户问题,分类为”账单”、“技术故障”、“退货”等。 | 意图分类需高准确率;模糊问题应主动澄清。 |
| 动态路由至专家 | 根据意图将对话转交给对应领域 Expert Agent(如”网络工程师”、“财务专员”)。 | 转交时需附带上文摘要;避免用户重复描述问题。 |
| 多专家会诊 | 复杂问题触发多个 Expert Agent 协同(如技术+法务),通过内部 A2A 讨论后统一回复。 | 内部讨论不可暴露给用户;最终回复需风格一致。 |
| 上下文无缝传递 | 用户历史交互(包括已尝试方案、身份信息)在 Agent 间安全共享。 | 敏感信息(如身份证号)需脱敏或加密;遵守隐私法规。 |
| 服务闭环确认 | 最终 Agent 主动询问”问题是否解决?“,并记录满意度或触发升级流程。 | 必须提供”转人工”选项;不可强制结束对话。 |
| 会话日志归档 | 全程对话存入 CRM 系统,用于质检、训练与审计。 | 日志需结构化存储(含 Agent ID、时间戳、操作类型);保留至少 6 个月。 |
第七章:评估与优化
7.1 A2A 系统评估指标(效率、准确性、鲁棒性、通信开销)
| 指标类别 | 指标名称 | 说明 | 注意事项 |
|---|---|---|---|
| 效率 | 任务完成时间(Task Completion Time) | 从任务启动到最终结果输出的总耗时。 | 应排除人工干预时间;可分”端到端”与”纯 LLM 推理”两部分统计。 |
| 效率 | LLM 调用次数(LLM Invocation Count) | 完成单任务所调用 LLM 的总次数(含工具调用往返)。 | 越少越好;高次数可能反映提示设计低效或流程冗余。 |
| 准确性 | 任务成功率(Task Success Rate) | 在测试集上,系统输出符合预期目标的比例(人工或自动判定)。 | 需明确定义”成功”标准;避免模糊通过。 |
| 准确性 | 工具调用准确率(Tool Call Accuracy) | 工具参数正确且调用时机合理的比例。 | 可通过单元测试验证工具输入输出是否匹配预期。 |
| 鲁棒性 | 异常恢复率(Recovery Rate) | 系统在发生工具失败、超时等异常后仍能完成任务的比例。 | 应模拟各类故障(如 API 返回 500)进行压力测试。 |
| 鲁棒性 | 最大协作轮次稳定性 | 在不同输入下,系统是否总能在预设轮次内终止。 | 避免因提示偏差导致某些任务无限循环。 |
| 通信开销 | 消息总量(Total Message Count) | 单任务执行过程中 Agent 间交换的消息总数。 | 过高可能表示过度协商;可结合消息平均长度评估总 token 消耗。 |
| 通信开销 | 上下文 token 占用 | 每次 LLM 调用所携带的上下文 token 数量。 | 应监控是否接近模型上限(如 128K);影响成本与延迟。 |
7.2 提示工程优化(System Prompt 设计、角色指令精炼)
| 优化方法 | 操作细节 | 注意事项 |
|---|---|---|
| 角色指令显式化 | 在 System Prompt 中明确 Agent 的身份、能力边界、禁止行为(如”你不能访问用户私人文件”)。 | 避免模糊描述(如”你是一个助手”);应具体到”你是 Python 代码审查专家”。 |
| 行为约束模板 | 使用结构化指令模板,如:“你必须:1. 先分析问题;2. 若需工具则调用;3. 否则直接回答。“ | 模板应简洁;过多规则会干扰 LLM 理解。 |
| 输出格式强制 | 要求 LLM 以固定格式输出(如 JSON、XML),便于下游解析。 | 必须配合 Schema 校验;可使用 response_format 参数(如 OpenAI)。 |
| 少样本示例(Few-shot) | 在 Prompt 中嵌入 1–3 个高质量输入-输出示例,引导 LLM 行为。 | 示例需覆盖典型与边界情况;避免引入偏见或错误模式。 |
| 元提示(Meta-prompting) | 让 LLM 自我反思或优化其输出,如”请检查你的回答是否有事实错误”。 | 增加推理步数;仅在关键任务中使用。 |
| 角色一致性强化 | 在每轮对话中重复角色声明(如”作为审稿人…”),防止角色漂移。 | 可通过消息前缀自动注入;避免手动维护。 |
7.3 通信压缩与缓存策略
| 策略名称 | 操作细节 | 注意事项 |
|---|---|---|
| 上下文摘要压缩 | 当历史消息超过阈值时,调用专用 Summarizer Agent 生成摘要,替换原始消息。 | 摘要应保留关键实体、决策点和工具调用结果;避免丢失任务状态。 |
| 消息去重 | 对相同内容或语义高度相似的消息进行过滤,防止重复处理。 | 可基于文本哈希或嵌入向量相似度(如 cosine > 0.95)判断。 |
| 工具结果缓存 | 对幂等工具(如天气查询、知识检索)的结果按参数缓存,避免重复调用。 | 缓存需设置 TTL(如 5 分钟);敏感数据不可缓存。 |
| 向量缓存(Embedding Cache) | 对高频查询的嵌入结果缓存,加速长期记忆检索。 | 嵌入模型版本变更时需清空缓存;避免语义漂移。 |
| 增量上下文传递 | 仅传递自上次交互以来的新增状态,而非全量历史。 | 需设计状态 diff 机制;适用于状态机类任务。 |
| 二进制序列化(高级) | 在内部通信中使用 Protobuf 或 MessagePack 替代 JSON,减少体积。 | 仅适用于性能敏感场景;增加开发复杂度,一般 A2A 系统无需。 |
7.4 安全与隐私考量
| 风险类型 | 防护措施 | 注意事项 |
|---|---|---|
| 提示注入(Prompt Injection) | 对用户输入进行过滤或转义;限制 Agent 可执行的操作范围。 | 不可信任任何外部输入;即使来自其他 Agent 也需校验。 |
| 敏感信息泄露 | 在消息传递前自动识别并脱敏 PII(如手机号、身份证号)。 | 使用正则或 NER 模型检测;脱敏后应保留占位符供调试。 |
| 工具滥用 | 限制高危工具(如文件删除、网络请求)的调用权限,仅授权特定角色。 | 所有工具调用应记录审计日志;生产环境禁用 shell 执行。 |
| 记忆污染 | 长期记忆写入前需审核;不同用户/任务的记忆严格隔离。 | 多租户系统必须实现 memory namespace 隔离。 |
| 拒绝服务(DoS) | 限制单任务最大 LLM 调用次数、消息数、执行时间。 | 设置硬性上限(如 max_turns=15, timeout=120s);触发即终止。 |
| 审计与追溯 | 记录完整消息流、工具调用、Agent 决策路径,支持事后回溯。 | 日志应包含 timestamp、agent_id、message_id、action_type;保留至少 180 天。 |
第八章:主流框架支持
8.1 Microsoft AutoGen
| 方法/组件名称 | 语法 / 用法 | 用途 | 代码示例 | 注意事项 |
|---|---|---|---|---|
| ConversableAgent | agent = ConversableAssistantAgent("coder", llm_config=llm_config) | 创建可对话的智能体,支持自动回复、工具调用、人类输入等模式 | user_proxy = UserProxyAgent("user", code_execution_config={"work_dir": "coding"}) | 所有 Agent 必须注册到同一 GroupChat 或直接配对;默认启用代码执行需谨慎 |
| GroupChat | groupchat = GroupChat(agents=[user_proxy, coder, reviewer], messages=[], max_round=10) | 实现多 Agent 群聊协作,自动轮询发言权 | manager = GroupChatManager(groupchat=groupchat, llm_config=llm_config) | 需指定 max_round 防止无限循环;Agent 的 System Prompt 决定是否主动发言 |
| register_function | register_function(get_weather, caller=coder, executor=user_proxy, description="获取天气") | 将 Python 函数注册为跨 Agent 可用的工具 | coder.initiate_chat(manager, message="查北京明天天气") | 工具调用由 caller 发起,executor 执行;executor 需具备执行权限 |
| code_execution_config | {"work_dir": "tmp", "use_docker": True} | 配置代码执行环境,支持 Docker 沙箱 | UserProxyAgent(..., code_execution_config={"use_docker": "python:3.10"}) | 生产环境必须启用沙箱;避免在主进程执行任意代码 |
| human_input_mode | "ALWAYS" / "TERMINATE" / "NEVER" | 控制是否等待人工介入 | UserProxyAgent(..., human_input_mode="TERMINATE") | ”TERMINATE” 表示收到 TERMINATE 关键词后停止;适合自动化流程 |
8.2 LangGraph(LangChain 生态)
| 方法/组件名称 | 语法 / 用法 | 用途 | 代码示例 | 注意事项 |
|---|---|---|---|---|
| StateGraph | graph = StateGraph(AgentState) | 定义基于状态机的多 Agent 协作图 | class AgentState(TypedDict): messages: Annotated[list, add_messages] | 状态类必须继承 TypedDict;使用 Annotated 支持消息累加 |
| add_node | graph.add_node("planner", plan_node) | 向图中添加节点(即 Agent 或函数) | def plan_node(state): return {"messages": [AIMessage(content="Plan: ...")]} | 节点函数必须返回字典,更新全局状态 |
| add_edge / add_conditional_edges | graph.add_conditional_edges("planner", route_next, {"review": "reviewer", "end": END}) | 定义静态或条件跳转边 | def route_next(state): return "review" if needs_review else "end" | 条件函数返回值必须匹配目标节点名;支持动态路由 |
| compile() | app = graph.compile() | 编译图为可执行应用 | result = app.invoke({"messages": [HumanMessage(content="Write a blog")]}) | 编译后不可修改图结构;支持异步 .ainvoke() |
| checkpointer | MemorySaver() | 启用状态持久化,支持中断恢复 | app = graph.compile(checkpointer=MemorySaver()) | 分布式部署需替换为 RedisSaver 等;调试时可用内存存储 |
8.3 CrewAI
| 方法/组件名称 | 语法 / 用法 | 用途 | 代码示例 | 注意事项 |
|---|---|---|---|---|
| Agent | researcher = Agent(role='Senior Researcher', goal='Find AI trends', backstory='...') | 定义具有角色、目标和背景的智能体 | tools=[search_tool], verbose=True | backstory 影响行为风格;verbose 用于调试 |
| Task | task = Task(description='Analyze 2025 AI trends', agent=researcher) | 将任务分配给特定 Agent | output_file='report.md' | 支持 expected_output 明确输出格式;可链式依赖 |
| Crew | crew = Crew(agents=[researcher, writer], tasks=[task1, task2], process=Process.sequential) | 组装多 Agent 团队并定义协作流程 | result = crew.kickoff() | process 支持 sequential(顺序)或 hierarchical(层级) |
| Process.hierarchical | Crew(..., process=Process.hierarchical, manager_llm=llm) | 启用管理层 Agent 自动协调任务 | 需额外指定 manager_llm | 适合复杂任务;增加 LLM 调用成本 |
| Tool 集成 | from crewai_tools import SerperDevTool; search_tool = SerperDevTool() | 使用内置或自定义工具 | Agent(..., tools=[search_tool]) | 工具需符合 CrewAI 接口;支持 LangChain 工具适配 |
8.4 Semantic Kernel(Microsoft)
| 方法/组件名称 | 语法 / 用法 | 用途 | 代码示例 | 注意事项 |
|---|---|---|---|---|
| Kernel | kernel = sk.Kernel() | 创建核心运行时容器 | kernel.add_service(sk.OpenAIChatCompletionService("gpt-4", api_key)) | 需先注册 AI 服务;支持 OpenAI、Azure、HuggingFace |
| Plugin | kernel.import_plugin_from_directory("plugins", "WriterPlugin") | 从目录加载插件(含多个 functions) | 插件目录需含 config.json 和 Python 文件 | 函数需用 @sk_function 装饰;参数通过 sk_function_context_parameter 声明 |
| Function Invocation | result = await kernel.invoke(function, input="AI trends") | 调用单个语义函数 | 支持链式调用:kernel.create_semantic_function(prompt) | 函数可组合为 pipeline;但原生不支持多 Agent 直接通信 |
| Memory | kernel.register_memory_store(memory_store=sk.VolatileMemoryStore()) | 注册短期记忆存储 | 长期记忆需集成 Azure Cognitive Search 或 Qdrant | SK 本身无内置多 Agent 架构;需自行构建 A2A 层 |
| Planner | planner = ActionPlanner(kernel); plan = await planner.create_plan(goal="Write report") | 自动生成函数调用计划 | 返回可执行 plan 对象 | 适用于单 Agent 复杂任务规划;非多 Agent 协作原生方案 |
8.5 自定义轻量级 A2A 实现
| 组件/方法 | 实现要点 | 用途 | 最小代码示例 | 注意事项 |
|---|---|---|---|---|
| 消息总线(Message Bus) | 使用 Python queue.Queue 或 asyncio.Queue 实现同步/异步消息传递 | Agent 间通信基础设施 | message_queue = Queue(); agent.send(msg); other.receive() | 单机可行;分布式需换为 Redis Pub/Sub |
| Agent 基类 | 定义 name, receive(), decide(), send() 等接口 | 统一 Agent 行为规范 | class BaseAgent: def receive(self, msg): self.messages.append(msg); self.act() | 所有具体 Agent 继承此类 |
| 简易 Orchestrator | 主循环轮询消息队列,分发给对应 Agent | 控制协作流程 | while not done: msg = queue.get(); agents[msg.to].receive(msg) | 需处理终止条件和超时 |
| JSON 消息协议 | 定义标准消息格式:{"from": str, "to": str, "content": str, "tool_calls": [...]} | 确保互操作性 | msg = {"from": "user", "to": "coder", "content": "print hello"} | 所有 Agent 必须遵守此格式 |
| 工具调用解析器 | 从 LLM 输出中提取并执行工具 | 实现 Tool Use 能力 | if "tool_calls" in response: for call in response.tool_calls: exec_tool(call) | 必须校验函数名白名单;禁止 eval() |