Multi-Agent Orchestrator 框架入门:多智能体编排的核心概念、特性与架构解析
【免费下载链接】agent-squadFlexible and powerful framework for managing multiple AI agents and handling complex conversations项目地址: https://gitcode.com/GitHub_Trending/mu/agent-squad
本文基于 Multi-Agent Orchestrator 开源框架(agent-squad 仓库)介绍多智能体编排的核心概念:为什么需要"智能体 + 编排器"的架构、框架解决了哪些多智能体管理难题,以及内置的意图分类、上下文管理、流式响应、可扩展架构等关键特性。读完本文,你将理解该框架的设计理念、一次请求从分类到路由再到上下文保存的完整调用链,并掌握 Python 与 TypeScript 两套运行时下最基础的接入方式。
从"专用模型"到"智能体":问题的起点
随着大语言模型(LLM)与小型模型的不断涌现,云环境或本地系统都可以部署模型,这带来了一个明显的机会:为特定任务选用多个专用模型。当这些专用模型被配置为在指定任务上独立运行时,通常被称为智能体(Agents)——例如一个专门处理航班预订的 Lex Bot、一个专门解答技术问题的 Bedrock LLM、一个专门执行数学运算的工具型模型。
在 Agent 抽象基类源码 中可以看到,框架对所有智能体做了统一抽象:每个智能体必须拥有name、description,并实现process_request方法(接收用户输入、用户 ID、会话 ID、聊天历史与附加参数,返回单条ConversationMessage或可异步迭代的流式结果)。这套抽象正是"多模型协同"落地的基础——无论底层是 Bedrock、Anthropic、OpenAI 还是本地模型,对上层调用方而言都呈现为同一套接口。
为什么需要编排器:多智能体管理的三大核心挑战
构建智能、具备上下文感知能力的 AI 应用时,管理一组多样化的智能体是显著的难点。这一核心难题被三个要素放大:
- 跨领域统一操作:不同智能体可能来自完全不同的技术栈(AWS Lambda、Bedrock Agent、Lex Bot、本地模型),需要统一的调度入口;
- 上下文维护:多轮对话中,用户可能在同一会话里切换多个主题(先订机票、再问天气、又算一道数学题),系统必须知道"这句话该交给谁、它之前聊了什么";
- 可扩展架构:从单智能体原型到大规模并发系统,架构需要在不推翻重写的前提下平滑演进。
从 Python 编排器实现 看,MultiAgentOrchestrator的核心构造即围绕这三点设计:内部维护agents字典(统一操作)、storage(上下文)、classifier(智能路由),并通过OrchestratorConfig暴露日志、重试、默认智能体等可调参数。
Multi-Agent Orchestrator 是什么
Multi-Agent Orchestrator是一个灵活且强大的框架,专门用于管理多个 AI 智能体、智能路由用户查询并处理复杂对话。它以**可扩展性(Scalability)与模块化(Modularity)**为设计目标,允许开发者构建跨多个领域保持连贯对话的 AI 应用:系统能把任务高效委派给专用智能体,同时在整个交互过程中保持上下文。
框架面向广泛的用例设计,包括但不限于:
- 复杂的客户支持系统(Complex customer support systems)
- 多领域虚拟助手(Multi-domain virtual assistants)
- 智能家居与 IoT 设备管理(Smart home and IoT device management)
- 多语言客户支持(Multi-lingual customer support)
仓库中对应的实战示例可验证这些场景的真实落地:例如 chat-demo-app 示例 用 6 个专用智能体(旅行、天气、餐厅、数学、技术、健康)演示多领域会话切换;ecommerce-support-simulator 示例 则是一个融合了自动回复、复杂问题转人工与 human-in-the-loop 的电商客服系统。
核心特性深度解读
框架内置了以下关键特性,下面逐一结合源码说明其实现原理。
智能意图分类:动态路由到最合适的智能体
Intelligent Intent Classification是框架的第一环:基于上下文与内容,动态地把查询路由到最合适的智能体。其底层实现位于 Classifier 基类 与 BedrockClassifier:
- Classifier 内置了一段"AgentMatcher"提示词模板,会注入两个关键占位符:
{{AGENT_DESCRIPTIONS}}(全部智能体的 id 与描述)和{{HISTORY}}(当前用户、当前会话的全量历史),并明确要求:对于"yes""ok""Tell me more""12"这类短回复,视为对上一次交互的续接,沿用之前的智能体选择; - 分类结果通过 Bedrock Converse API 的toolUse 结构化输出返回:模型调用名为
analyzePrompt的工具,输出userinput、selected_agent、confidence三个字段(见 bedrock_classifier.py); - 默认分类模型为
anthropic.claude-3-5-sonnet-20240620-v1:0(常量定义见 types.py),分类时temperature默认取0.0、maxTokens默认1000、topP默认0.9,以保证分类结果尽可能确定。
从源码结构看,分类器把所有智能体的对话历史汇总后交给 LLM 做全局判断(fetch_all_chats),而单个智能体只能拿到自己的历史——这正是"分类器有全局视角、智能体只有局部视角"隔离设计的实现来源。
灵活的响应模式:流式与非流式并存
Flexible Agent Responses特性允许不同智能体同时提供**流式(streaming)与非流式(non-streaming)**响应。框架通过AgentResponse的streaming标志区分两种模式(见 agent.py):
- 非流式:智能体返回完整的
ConversationMessage,编排器直接透传; - 流式:智能体返回
AsyncIterable,调用方通过async for逐块消费输出。Python 侧通过AgentCallbacks.on_llm_new_token回调逐 token 输出(示例见下文代码); - 是否启用流式由智能体自身决定:
is_streaming_enabled()基类默认返回False,具体智能体(如 BedrockLLMAgent 配置streaming=True)可覆盖该行为(见 agent.py)。
上下文管理:跨智能体维持连贯对话
Context Management特性保证多轮交互的连贯性。编排器在agent_process_request中自动完成两件事(见 orchestrator.py):把用户输入与智能体响应保存进存储,并在下一次请求前按(user_id, session_id, agent_id)维度取回历史。
默认存储为InMemoryChatStorage(in_memory_chat_storage.py),其内部用user_id#session_id#agent_id作为键隔离各智能体的会话,并通过MAX_MESSAGE_PAIRS_PER_AGENT(默认 100 对,即最多保留 200 条消息,见 types.py)裁剪历史。生产环境可替换为 DynamoDB 存储 或 SQL 存储,也可以按 存储自定义指南 实现自己的存储方案后传入编排器。
可扩展架构:按需接入与替换组件
Extensible Architecture体现在三个层面,均有对应文档与源码支撑:
- 替换分类器:内置 BedrockClassifier、Anthropic、OpenAI 三种实现,也可按 自定义分类器指南 实现
Classifier抽象类(如使用本地模型); - 新增智能体:内置 13 种开箱即用的智能体(详见下文),也可继承
Agent抽象类编写自定义智能体,参考 Agents 总览文档; - 扩展检索器:通过 Retriever 抽象 为 LLM 智能体按需注入外部知识,降低对模型训练数据的依赖。
编排器构造时通过依赖注入接收classifier、storage、default_agent(见 orchestrator.py),未指定时默认使用 BedrockClassifier 与 InMemoryChatStorage。
通用部署:从 AWS Lambda 到本地环境
Universal Deployment意味着同一套代码可以运行在 AWS Lambda、任意云平台或本地环境。框架对运行环境无强绑定——分类器与智能体通过boto3client 连接 Bedrock(且支持传入自定义client),存储层可插拔;仓库的 fast-api-streaming 示例 展示了用 FastAPI 暴露流式接口,python 本地示例 与 typescript 本地示例 则演示了不依赖云服务的本地运行方式。官方文档还提供了 AWS Lambda 部署指南(Node.js 版见 aws-lambda-nodejs.md)。
可扩展设计:从简单聊天机器人到复杂 AI 系统
Scalable Design强调高效处理多个并发会话。编排器以(user_id, session_id)唯一标识一段对话,各会话的历史在存储层相互隔离,天然支持"每个用户多个会话、每个会话多个智能体"的并发模型;同时OrchestratorConfig提供LOG_EXECUTION_TIMES、MAX_RETRIES等参数用于观测与调优(参数完整清单见 orchestrator.ts)。
Agent 重叠分析:内置配置优化工具
Agent Overlap Analysis是框架内置的分析工具,用于检测多个智能体描述之间的重叠,避免因描述模糊导致错误路由。从源码结构看,TypeScript 实现提供了独立的AgentOverlapAnalyzer(agentOverlapAnalyzer.ts),编排器通过analyzeAgentOverlap()方法调用(见 orchestrator.ts)。使用方式与案例分析可参考 agent-overlap 监控文档。
预配置智能体:开箱即用的组件
Pre-configured Agents提供由 Amazon Bedrock 等模型驱动的即用智能体。仓库内置的智能体(Python 实现位于 agents 目录,TypeScript 位于 typescript/src/agents)包括:
| 智能体 | 说明 | 文档 |
|---|---|---|
| BedrockLLMAgent | 基于 Bedrock Converse API 的 LLM 对话智能体,支持工具调用 | bedrock-llm-agent.mdx |
| AmazonBedrockAgent | 封装 Amazon Bedrock Agent(含 Knowledge Base、动作组) | amazon-bedrock-agent.mdx |
| LexBotAgent | 封装 Amazon Lex 对话机器人 | lex-bot-agent.mdx |
| LambdaAgent | 将 AWS Lambda 函数封装为智能体 | lambda-agent.mdx |
| AnthropicAgent / OpenAIAgent | 直接调用 Anthropic / OpenAI 模型 | anthropic-agent.mdx、openai-agent.mdx |
| ChainAgent | 将多个智能体串成链式处理流程 | chain-agent.mdx |
| SupervisorAgent | 以"智能体即工具"模式协调团队协作、支持并行执行 | supervisor-agent.mdx |
| 其他 | Bedrock Flows、Inline Agent、翻译、Comprehend 过滤等 | 见 built-in 目录 |
一次请求的完整调用链
框架对每次用户请求遵循固定的编排流程(详见 How it works 文档),结合源码可梳理出如下调用链:
- 请求发起:用户输入进入
route_request(user_input, user_id, session_id)(orchestrator.py); - 意图分类:
classify_request从存储中取回该用户该会话的全部智能体历史,交给 Classifier 分析"用户输入 + 智能体描述 + 全局历史",返回ClassifierResult{selected_agent, confidence}(classifier.py); - 智能体选择与兜底:若分类器未选出智能体,且配置了默认智能体(
USE_DEFAULT_AGENT_IF_NONE_IDENTIFIED默认True),则回退到default_agent(orchestrator.py); - 请求路由:
dispatch_to_agent按(user_id, session_id, agent_id)取回该智能体自己的历史,调用process_request(orchestrator.py); - 智能体处理:智能体基于自身历史生成响应(流式或非流式);
- 对话保存:编排器自动把本轮 user/assistant 消息写入存储(受
save_chat开关与MAX_MESSAGE_PAIRS_PER_AGENT限制); - 响应返回:以
AgentResponse{metadata, output, streaming}结构返回给调用方,metadata中携带agent_id、agent_name、confidence等信息,便于前端展示"由哪个智能体作答"。
这一流程的关键设计在于分类器的全局视角与智能体的局部视角相分离:分类器能看到所有智能体的对话以判断"当前话题应归属谁",而每个智能体只能看到自己的历史,保证各领域上下文互不污染。
快速上手:最小可运行示例
Python 版本
Python 实现发布为multi-agent-orchestrator包(源码见 python 目录)。推荐使用虚拟环境并按需选择安装选项:
python -m venv venv source venv/bin/activate # Windows 使用 venv\Scripts\activate pip install "multi-agent-orchestrator[aws]" # AWS 集成(BedrockLLMAgent、LambdaAgent 等) # 可选:pip install "multi-agent-orchestrator[anthropic]" # Anthropic 集成 # 可选:pip install "multi-agent-orchestrator[openai]" # OpenAI 集成 # 可选:pip install "multi-agent-orchestrator[all]" # 全部可选依赖下面是一个同时注册Bedrock LLM 智能体与Lex Bot 智能体的最小示例,演示流式与非流式两种响应的处理:
import os import asyncio from multi_agent_orchestrator.orchestrator import MultiAgentOrchestrator from multi_agent_orchestrator.agents import (BedrockLLMAgent, LexBotAgent, BedrockLLMAgentOptions, LexBotAgentOptions, AgentCallbacks) orchestrator = MultiAgentOrchestrator() # 通过回调接收流式 token class BedrockLLMAgentCallbacks(AgentCallbacks): def on_llm_new_token(self, token: str) -> None: print(token, end='', flush=True) # 1) 技术问答智能体(流式) tech_agent = BedrockLLMAgent(BedrockLLMAgentOptions( name="Tech Agent", streaming=True, description="Specializes in technology areas including software development, " "hardware, AI, cybersecurity, blockchain, cloud computing and " "related technology products and services.", model_id="anthropic.claude-3-sonnet-20240229-v1:0", callbacks=BedrockLLMAgentCallbacks() )) orchestrator.add_agent(tech_agent) # 2) 旅行预订智能体(Lex Bot,非流式) orchestrator.add_agent( LexBotAgent(LexBotAgentOptions( name="Travel Agent", description="Helps users book and manage their flight reservations", bot_id=os.environ.get('LEX_BOT_ID'), bot_alias_id=os.environ.get('LEX_BOT_ALIAS_ID'), locale_id="en_US", )) ) async def main(): response = await orchestrator.route_request( "I want to book a flight", 'user123', 'session456') if response.streaming: print("\n** RESPONSE STREAMING ** \n") print(f"> Agent: {response.metadata.agent_name}") async for chunk in response.output: print(chunk, end='', flush=True) else: print("\n** RESPONSE ** \n") print(f"> Agent: {response.metadata.agent_name}") print(f"> Response: {response.output.content}") if __name__ == "__main__": asyncio.run(main())更完整的运行示例可参考 python 官方 README 与 examples/python 全局演示。
TypeScript 版本
TypeScript 实现发布为multi-agent-orchestratornpm 包(源码见 typescript 目录):
npm install multi-agent-orchestratorimport { MultiAgentOrchestrator, BedrockLLMAgent, LexBotAgent } from "multi-agent-orchestrator"; const orchestrator = new MultiAgentOrchestrator(); orchestrator.addAgent( new BedrockLLMAgent({ name: "Tech Agent", description: "Specializes in technology areas including software development, " + "hardware, AI, cybersecurity, blockchain, cloud computing.", streaming: true, }) ); orchestrator.addAgent( new LexBotAgent({ name: "Travel Agent", description: "Helps users book and manage their flight reservations", botId: process.env.LEX_BOT_ID, botAliasId: process.env.LEX_BOT_ALIAS_ID, localeId: "en_US", }) ); const response = await orchestrator.routeRequest( "I want to book a flight", 'user123', 'session456'); if (response.streaming) { console.log(`> Agent: ${response.metadata.agentName}`); for await (const chunk of response.output) { if (typeof chunk === "string") process.stdout.write(chunk); } } else { console.log(`> Agent: ${response.metadata.agentName}`); console.log(`> Response: ${response.output}`); }TypeScript 侧OrchestratorConfig的完整参数(日志开关、MAX_RETRIES、NO_SELECTED_AGENT_MESSAGE、MAX_MESSAGE_PAIRS_PER_AGENT等)及默认值见 orchestrator.ts。更完整的 TypeScript 用法见 typescript README。
编写高质量智能体描述
无论使用哪种运行时,智能体描述(description)都是路由质量的关键。分类器完全依赖"智能体描述 + 当前输入 + 全局历史"来判断归属(Agent 选择机制详见 agents 总览),因此描述应:
- 清晰概括智能体的能力与专长范围;
- 提供它能处理的具体任务示例;
- 与其他智能体形成明确区分,避免重叠描述导致的误路由。
典型应用场景与延伸阅读
围绕框架的四大设计目标,社区与仓库示例覆盖了从原型到生产的典型路径:
- 复杂客户支持系统:参见 电商客服模拟器,含自动回复生成、复杂问题智能转人工、实时聊天与邮件式沟通、human-in-the-loop 复核;
- 多领域虚拟助手:参见 chat-demo-app,6 个专用智能体在同一会话中无缝切换(订机票→查天气→算数学→健康咨询);
- 智能家居与 IoT 管理、多语言客户支持:可利用 BedrockTranslatorAgent 等组件组合实现,多语言模式可参考 多语言实践指南。
想进一步深入底层机制,推荐继续阅读仓库内文档:How it works(完整编排逻辑)、编排器总览、分类器总览、存储总览 与 快速开始。
【免费下载链接】agent-squadFlexible and powerful framework for managing multiple AI agents and handling complex conversations项目地址: https://gitcode.com/GitHub_Trending/mu/agent-squad
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考