【Agent 设计模式】路由模式(Routing)
路由模式Routing相比提示链模式的固定线性流程路由模式能根据输入动态选择不同的处理路径。它通过一个路由器对输入进行分类或评估然后将其导向最合适的专用处理器使系统从固定执行路径转变为动态决策系统。这种动态决策能力——即根据特定条件将控制流导向不同的专用函数、工具或子流程——就是通过路由机制实现的。路由为智能体的操作框架引入了条件逻辑使其从固定执行路径转变为动态决策系统。这种机制使智能体能够根据输入数据的特征、上下文信息或外部环境的变化选择最合适的工具或子流程来处理任务。核心思想条件分发—— 先判断这是什么类型的请求再决定交给谁处理。例如一个用于客户咨询的智能体在具备路由功能后可以对用户查询进行分类以判断意图。根据分类结果查询可以被导向专门的问答智能体、用于账户信息检索的数据库工具或者用于复杂问题升级的流程。与提示链的关系对比提示链模式路由模式流程固定线性A → B → C动态分支A → B₁ / B₂ / B₃决策无决策按顺序执行有分类/判断步骤适用步骤确定的流水线任务输入类型多样、需要不同处理方式的任务路由模式的核心组件路由模式的核心组件是执行评估并引导流程的机制其实现方式包括以下五种1. 基于 LLM 的路由通过提示语言模型分析输入并输出指示下一步或目标标识符或指令。示例 Prompt“分析用户查询仅输出类别‘订单状态’、‘产品信息’、‘技术支持’或’其他’。”智能体系统读取输出并据此引导工作流。优点灵活能处理复杂和新颖的输入缺点有延迟和成本结果可能不稳定2. 基于嵌入的路由利用嵌入向量RAG来表示输入数据并通过计算与不同工具或子流程的嵌入向量之间的相似度来决定路由。例如智能体可以将用户查询转换为嵌入向量并计算与预定义工具或子流程的嵌入向量之间的相似度以确定最相关的工具或子流程来处理查询。优点语义理解能力强适合模糊匹配缺点需要预先计算各路径的嵌入表示3. 基于规则的路由通过预定义的规则或条件如 if-else、switch-case来指导路由决策根据关键词或者结构化数据进行路由。优点比 LLM 路由更快、更确定无 LLM 调用成本缺点处理复杂或新颖输入的灵活性较低4. 基于机器学习模型的路由采用如分类器等判别模型在小规模标注数据集上专门训练以实现路由任务。与嵌入方法类似但其特点是监督微调过程路由逻辑编码在模型权重中。与 LLM 路由不同决策组件是一个独立的判别模型而非提示引导的语言模型输出。LLM 可用于生成合成训练数据但不参与实时路由决策。优点快速且准确适合高频场景缺点需要标注数据和训练过程5. 混合路由结合上述多种方法以实现更鲁棒的路由机制。例如系统可以首先使用基于规则的路由进行快速分类如果输入不符合任何规则则退回到基于 LLM 的路由进行更深入的分析。流程示意┌→ [处理器 A] → 结果 A 输入 → [路由器] ──→├→ [处理器 B] → 结果 B └→ [处理器 C] → 结果 C路由机制可以在智能体操作周期的多个阶段实现既可用于分配初始任务分类也可在处理链中间决定后续动作或在子流程中选择最合适的工具。适用场景路由模式是设计自适应智能体系统的关键控制机制使其能够根据输入和内部状态动态调整执行路径广泛应用于多个领域场景路由示例客服系统分类意图 → 订单查询 / 技术支持 / 投诉处理文档处理识别格式 → JSON 解析 / CSV 转换 / 纯文本提取AI 编程助手识别语言和意图 → 调试 / 解释 / 代码翻译研究系统判断任务类型 → 检索 / 摘要 / 深度分析人机交互场景在虚拟助手、AI 教师等场景中路由用于解析用户意图。系统对自然语言查询进行初步分析决定后续动作如调用信息检索工具、升级到人工、或根据用户表现选择下一个课程模块从而实现超越线性对话流的上下文响应。自动化数据与文档处理路由承担分类与分发功能。系统根据内容、元数据或格式分析如邮件、工单、API 数据并将其导向相应工作流如销售线索导入、针对 JSON/CSV 的数据转换、或紧急问题升级。多工具/多智能体协作系统路由充当高级调度器。例如研究系统由检索、摘要、分析等智能体组成路由器根据当前目标分配任务。同样AI 编程助手会先识别编程语言和用户意图调试、解释、翻译再将代码片段交给对应工具处理。总之路由为系统提供了逻辑仲裁能力是构建功能多样、具备上下文感知系统的基础。它将智能体从静态执行者转变为能根据变化条件做出决策的动态系统。代码示例示例 1LangChain 实现fromdotenvimportload_dotenvfromlangchain_openaiimportChatOpenAIfromlangchain_core.promptsimportChatPromptTemplatefromlangchain_core.output_parsersimportStrOutputParserfromlangchain_core.runnablesimportRunnablePassthrough,RunnableBranch load_dotenv()# --- 配置 ---# 确保环境变量已设置 OPENAI_API_KEYtry:llmChatOpenAI(modelgpt-4o-mini,temperature0)print(f语言模型初始化成功{llm.model_name})exceptExceptionase:print(f语言模型初始化失败{e})llmNone# --- 定义模拟子智能体处理器等同于 ADK sub_agents---defbooking_handler(request:str)-str:模拟预订智能体处理请求。print(\n--- 委托给预订处理器 ---)returnf预订处理器已处理请求{request}。结果模拟预订动作。definfo_handler(request:str)-str:模拟信息智能体处理请求。print(\n--- 委托给信息处理器 ---)returnf信息处理器已处理请求{request}。结果模拟信息检索。defunclear_handler(request:str)-str:处理无法委托的请求。print(\n--- 处理不明确请求 ---)returnf协调者无法委托请求{request}。请补充说明。# --- 定义协调者路由链等同于 ADK 协调者指令---coordinator_router_promptChatPromptTemplate.from_messages([(system,分析用户请求判断应由哪个专属处理器处理。 - 若请求涉及预订机票或酒店输出 booker。 - 其他一般信息问题输出 info。 - 若请求不明确或不属于上述类别输出 unclear。 只输出一个词booker、info 或 unclear。),(user,{request})])ifllm:coordinator_router_chaincoordinator_router_prompt|llm|StrOutputParser()# --- 定义委托逻辑等同于 ADK 的 Auto-Flow---branches{booker:RunnablePassthrough.assign(outputlambdax:booking_handler(x[request][request])),info:RunnablePassthrough.assign(outputlambdax:info_handler(x[request][request])),unclear:RunnablePassthrough.assign(outputlambdax:unclear_handler(x[request][request])),}delegation_branchRunnableBranch((lambdax:x[decision].strip()booker,branches[booker]),(lambdax:x[decision].strip()info,branches[info]),branches[unclear]# 默认分支)coordinator_agent({decision:coordinator_router_chain,request:RunnablePassthrough()}|delegation_branch|(lambdax:x[output]))# --- 示例用法 ---defmain():ifnotllm:print(\n因 LLM 初始化失败跳过执行。)returnprint(--- 预订请求示例 ---)request_a帮我预订飞往伦敦的机票。result_acoordinator_agent.invoke({request:request_a})print(f最终结果 A:{result_a})print(\n--- 信息请求示例 ---)request_b意大利的首都是哪里result_bcoordinator_agent.invoke({request:request_b})print(f最终结果 B:{result_b})print(\n--- 不明确请求示例 ---)request_c讲讲量子物理。result_ccoordinator_agent.invoke({request:request_c})print(f最终结果 C:{result_c})if__name____main__:main()使用 LangChain OpenAI GPT 构建路由系统协调者coordinator通过 LLM 将请求分类为booker/info/unclear子处理器三个模拟函数分别处理预订、信息查询、不明确请求路由机制RunnableBranch根据分类结果将请求委托给对应处理器用户请求 → [LLM 分类] → booker / info / unclear → [对应处理器] → 结果代码利用 LangChain 和 GPT 构建了一个简单智能体系统。定义了booking_handler、info_handler、unclear_handler三个模拟子智能体处理器分别处理不同类型请求。核心组件coordinator_router_chain通过ChatPromptTemplate指示语言模型将用户请求分类为booker、info或unclear。RunnableBranch根据分类结果将原始请求委托给对应处理函数。coordinator_agent组合上述组件先路由请求再交由选定处理器最终输出处理结果。示例 2Google ADK 实现importuuidfromtypingimportDict,Any,Optionalfromdotenvimportload_dotenvfromgoogle.adk.agentsimportAgentfromgoogle.adk.runnersimportInMemoryRunnerfromgoogle.adk.toolsimportFunctionToolfromgoogle.genaiimporttypesfromgoogle.adk.eventsimportEvent load_dotenv()# --- 定义工具函数 ---defbooking_handler(request:str)-str: 处理机票和酒店预订请求。 Args: request: 用户的预订请求。 Returns: 预订处理确认信息。 print(-------------------------- 预订处理器已调用 ----------------------------)returnf已模拟处理预订请求{request}。definfo_handler(request:str)-str: 处理一般信息请求。 Args: request: 用户问题。 Returns: 信息检索处理结果。 print(-------------------------- 信息处理器已调用 ----------------------------)returnf信息请求{request}。结果模拟信息检索。defunclear_handler(request:str)-str:处理无法委托的请求。returnf协调者无法委托请求{request}。请补充说明。# --- 创建工具 ---booking_toolFunctionTool(booking_handler)info_toolFunctionTool(info_handler)# 定义配备工具的专用子智能体booking_agentAgent(nameBooker,modelgemini-2.0-flash,description专门处理机票和酒店预订请求通过 booking tool 实现。,tools[booking_tool])info_agentAgent(nameInfo,modelgemini-2.0-flash,description专门提供一般信息和答疑通过 info tool 实现。,tools[info_tool])# 定义父智能体协调者包含委托指令coordinatorAgent(nameCoordinator,modelgemini-2.0-flash,instruction(你是主协调者只负责分析用户请求并委托给合适的专用智能体。不要直接回答用户。\n- 任何涉及机票或酒店预订的请求委托给 Booker 智能体。\n- 其他一般信息问题委托给 Info 智能体。),description负责将用户请求路由到正确专用智能体的协调者。,sub_agents[booking_agent,info_agent])# --- 执行逻辑 ---asyncdefrun_coordinator(runner:InMemoryRunner,request:str):用给定请求运行协调者智能体并委托。print(f\n--- 协调者运行请求{request} ---)final_resulttry:user_iduser_123session_idstr(uuid.uuid4())awaitrunner.session_service.create_session(app_namerunner.app_name,user_iduser_id,session_idsession_id)foreventinrunner.run(user_iduser_id,session_idsession_id,new_messagetypes.Content(roleuser,parts[types.Part(textrequest)]),):ifevent.is_final_response()andevent.content:ifhasattr(event.content,text)andevent.content.text:final_resultevent.content.textelifevent.content.parts:text_parts[part.textforpartinevent.content.partsifpart.text]final_result.join(text_parts)breakprint(f协调者最终响应{final_result})returnfinal_resultexceptExceptionase:print(f处理请求时发生错误{e})returnf处理请求时发生错误{e}asyncdefmain():主函数运行 ADK 示例。print(--- Google ADK 路由示例ADK Auto-Flow 风格---)print(注意需安装并认证 Google ADK。)runnerInMemoryRunner(coordinator)result_aawaitrun_coordinator(runner,帮我预订巴黎的酒店。)print(f最终输出 A:{result_a})result_bawaitrun_coordinator(runner,世界最高的山峰是什么)print(f最终输出 B:{result_b})result_cawaitrun_coordinator(runner,说一个随机的事实。)print(f最终输出 C:{result_c})result_dawaitrun_coordinator(runner,查找下个月飞往东京的航班。)print(f最终输出 D:{result_d})if__name____main__:importnest_asyncioimportasyncio nest_asyncio.apply()asyncio.run(main())Agent Development KitADK是用于工程化智能体系统的框架提供结构化环境定义智能体能力与行为。与显式计算图架构不同ADK 路由通常通过定义一组代表智能体功能的工具实现。用户查询由底层模型匹配到合适工具框架内部自动完成路由。使用 Google ADK 构建多智能体路由系统协调者智能体Coordinator分析请求并自动委托子智能体Booker预订和 Info信息各自配备FunctionTool路由机制ADK 的 Auto-Flow 根据sub_agents的描述自动完成委托无需显式编写分支逻辑脚本包含一个主协调者智能体和两个专用子智能体。每个子智能体配备FunctionTool分别模拟预订和信息检索。协调者智能体的主要职责是分析用户消息并自动委托给 Booker 或 InfoADK 的 Auto-Flow 机制会根据sub_agents自动完成委托。run_coordinator函数设置InMemoryRunner创建用户和会话 ID通过 runner 处理请求并提取最终响应文本。两种实现的核心区别LangChain 需要显式编写路由分支逻辑RunnableBranch而 ADK 通过智能体描述 Auto-Flow 自动路由。局限性分类错误路由器判断失误会导致请求进入错误的处理路径维护成本路径增多时路由规则和处理器的维护复杂度上升单层限制简单路由只做一次分发复杂场景可能需要多层路由或与其他模式结合

相关新闻

单片机毕设项目:基于 STM32 的环境监测与消毒设备自动启停装置开发 基于 DHT11 的消毒箱温湿度检测与定时控制系统设计(011301)

单片机毕设项目:基于 STM32 的环境监测与消毒设备自动启停装置开发 基于 DHT11 的消毒箱温湿度检测与定时控制系统设计(011301)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/10/15 16:08:32 阅读更多 →
Linux驱动-在用户态控制I2C-两种方案ioctl和文件控制

Linux驱动-在用户态控制I2C-两种方案ioctl和文件控制

提示:Linux驱动-在用户态控制I2C 文章目录前言一、参考资料二、关联代码关联源码关联源码解析核心定位核心数据结构struct i2c_dev结构体open 时创建匿名 struct i2c_client文件操作接口 i2cdev_fops(重中之重)i2cdev_write ()i2cdev_read ()…

2026/10/15 16:08:31 阅读更多 →
3分钟掌握:如何高效获取国家中小学智慧教育平台电子课本PDF文件

3分钟掌握:如何高效获取国家中小学智慧教育平台电子课本PDF文件

3分钟掌握:如何高效获取国家中小学智慧教育平台电子课本PDF文件 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具,帮助您从智慧教育平台中获取电子课本的 PDF 文件网址并进行下载,让您更方便地获取课本内容。 …

2026/10/15 7:11:39 阅读更多 →

最新新闻

VSCode配置Anaconda全指南:解决Python解释器与conda环境问题

VSCode配置Anaconda全指南:解决Python解释器与conda环境问题

配过的人都有体会——Anaconda装了,VSCode也装了,结果新建一个Python文件,import numpy直接给你飘红,运行的时候又说找不到模块。这时候大多数人第一个想法是“Anaconda没装好”“VSCode坏了”,但真正的原因往往是VSCo…

2026/10/16 17:55:24 阅读更多 →
分布式存储选型与落地:Ceph、HDFS、GlusterFS、MinIO对比与避坑指南

分布式存储选型与落地:Ceph、HDFS、GlusterFS、MinIO对比与避坑指南

简介:一份关于主流分布式存储技术的综述文档,适合大数据处理、云计算及后端存储方向的开发者与架构师阅读。内容以架构与演化两条主线展开,系统梳理了谷歌文件系统、Hadoop分布式文件系统、Minio对象存储等经典方案的设计思想与适用场景。压缩…

2026/10/16 17:55:24 阅读更多 →
Matlab图像拼接实战:SIFT特征匹配+RANSAC单应估计+多频带融合

Matlab图像拼接实战:SIFT特征匹配+RANSAC单应估计+多频带融合

简介:本资源是一套基于Matlab实现的SIFT特征匹配与RANSAC鲁棒估计相结合的图像拼接与融合完整方案,面向计算机视觉初学者、图像处理课程学习者及科研入门人员,解决多视角图像自动对齐、宽视场全景图生成等典型问题。压缩包共20个文件&#xf…

2026/10/16 17:55:24 阅读更多 →
用Python爬虫打造自动化SEO巡检工具:从TDK提取到反爬避坑

用Python爬虫打造自动化SEO巡检工具:从TDK提取到反爬避坑

简介:面向网站优化人员与Python学习者的SEO数据采集与分析工具,以“SEO网络蜘蛛侠”命名,通过自动化爬虫帮助用户完成关键词挖掘、元信息检查、链接结构分析、内容质量与加载速度检测、死链排查等高频SEO任务。程序内置可执行版本&#xff0c…

2026/10/16 17:55:24 阅读更多 →
Python快速可视化SEG-Y地震数据:三步实现剖面绘制与批量抽检

Python快速可视化SEG-Y地震数据:三步实现剖面绘制与批量抽检

简介:这份资源面向地质勘探、地震预测与环境监测领域的技术人员及Qt开发者,提供一套基于Qt3.3框架的地震数据快速可视化实现方案,重点解决大规模地震记录的读取、处理与图形化展示问题。压缩包共77个文件,约2.07MB,以h…

2026/10/16 17:55:23 阅读更多 →
Android应用目录结构全解析:从Gradle配置到资源文件管理

Android应用目录结构全解析:从Gradle配置到资源文件管理

很多刚接触Android开发的朋友,第一次用Android Studio新建项目时,看到左侧那一大坨目录树往往会有点懵。我当年也是从一个个文件夹点开、再关掉,折腾了好几天才搞清楚哪个目录是存代码的、哪个目录是放图片的、哪个文件是注册Activity的。这篇…

2026/10/16 17:54:23 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →