内容来自Antonio Gullí的Agentic Design Patterns: A Hands-On Guide to Building Intelligent Systems一书。

一、路由模式概述

虽然通过Prompt Chaining进行顺序处理是使用语言模型执行确定性、线性工作流程的基础技术,但在需要适应性响应的场景中,Prompt Chaining的适用性会受到限制。现实世界中的智能系统往往需要根据环境状态、用户输入或前一个操作等不确定因素,在多种可能的行动方案之间做出选择。这种动态决策能力决定了控制流程应流向哪些特定的功能模块、工具或子流程,而这种能力正是通过一种称为“路由”的机制实现的。

路由机制为Agent的运行框架引入了条件逻辑,使得系统从传统的固定执行路径模式转变为一种新的模式:在这种模式下,Agent会动态评估各种具体条件,从而从一系列可能的后续行动中做出选择。这种机制使得系统行为变得更加灵活,并且能够更好地适应不同的环境背景。

例如,一个为客户咨询设计的智能体,在配备了路由功能后,能够首先对收到的查询进行分类,以确定用户的意图。基于这种分类,它可以将查询转交给专门的智能体进行直接问答,转交给数据库检索工具获取账户信息,或者在遇到复杂问题时启动升级流程,而不是默认采用单一的、预先设定的响应路径。因此,采用这种Agent机制的系统能够提供更加灵活、高效的相应服务:

1.分析用户的查询内容。

2.根据查询的意图来决定执行路径:

  • 如果用户的意图是“查询订单状态”,则应将其引导至能够与订单数据库交互的子Agent或工具链。
  • 如果用户的意图是“获取产品信息”,则应将其引导至能够搜索产品目录的子Agent或相关系统。
  • 如果用户的意图是“寻求支持”,则应将其引导能够提供故障排除指南或协助用户联系人工客服的另一个系统或流程。
  • 如果用户的意图不明确,则应将其引导至专门用于帮助用户澄清需求的子Agent或相关系统。

路由模式的核心组件是一种用于执行评估并指导数据流方向的机制。这种机制可以通过多种方式来实现:

  • 基于LLM的路由机制:该LLM本身可以被指令用来分析输入内容,并输出一个特定的标识符或指令,以指示下一步该执行什么操作或前往哪个目标。例如,一个Prompt可以要求LLM“分析以下用户查询并给仅输出以下类别的信息:“订单状态”、“产品信息”、“技术支持”或“其他”。” 随后,Agent系统会读取这些输出结果,并据此调整工作流程。
  • 基于嵌入的路由:输入的查询可以被转换成向量嵌入形式(详见14章中的RAG内容)。随后,这个嵌入向量会与代表不同路由或功能的嵌入向量进行比较。查询时会被路由到那些嵌入向量与输入查询最为相似的路由路径上。这种机制在语义路由中非常有用,因为决策过程是基于输入内容的含义,而不仅仅是基于关键词。
  • 基于规则的路由:这种方法依赖于预先预定义的规则或逻辑(例如,if-else语句、switch case结构),这些规则或逻辑是根据从输入数据中提取出的关键词、模式或结构化数据来制定的。与基于LLM的路由方法相比,这种方法通常更快且更具确定性,但在处理复杂或新颖的输入时灵活性较低。
  • 基于机器学习模型的路由:这种方法采用了一种经过专门训练的分类器等判别模型,该模型在少量标记数据集上进行过训练,以执行路由任务。虽然这种方法在概念上与基于嵌入的方法有相似之处,但其核心特点是采用了监督式微调过程,通过调整模型参数来构建专门的路由功能。这种技术与基于LLM的路由方法不同,因为其决策机制并非由在推理时执行指令的生产模型来实现,而是将路由逻辑直接编码到经过微调的模型参数中。虽然LLM可以在预处理阶段被用来生成合成数据以扩充训练集,但它们本身并不参与实时的工具集中选择最合适的工具。

路由机制可以在Agent的操作周期中的多个环节得到应用。这些机制可以在任务开始时被用来对主要任务进行分类;在处理流程的中间阶段,它们可以用来觉得后续应执行的操作;而在子程序执行过程中,它们则可以用于从给定的工具中选择最合适的工具。

比如LangChain、LangGraph以及谷歌的Agent Developer Kit(ADK)等计算框架,为定义和管理这类条件逻辑提供了明确的工具。凭借其基于状态的图结构,LangGraph特别适合处理那些决策结果取决于整个系统累计状态的复杂路由场景。同样,谷歌的ADK也为构建Agent的功能和交互模型提供了基础组件,这些组件是实现路由逻辑的基础。在这些框架所提供的执行环境中,开发人员可以定义各种可能的操作路径和功能或者基于模型的评估机制。

路由机制的实现使得系统能够超越传统的确定性顺序处理方式。它促进了更具适应性的执行流程的发展,这些流程能够动态且恰当地应对各种不同的输入和状态变化。

二、实际应用与用例

路由机制是自适应Agent系统设计中的关键控制机制,它使这些系统能够根据变化的输入和内部状态动态地调整自身的执行路径。这一机制的实用性体现在多个领域中,因为它为系统提供了必要的条件逻辑支持。

在人机交互中,无论是与虚拟助手还是由人工智能驱动的辅助提供进行交互,都会使用“路由机制”来理解用户的意图。通过对自然语言查询的初步分析,系统能够确定最合适的后续操作方式——无论是调用特定的信息检索工具、将问题转交给人工操作员,还是根据用户的表现来选择课程中的下一个学习模块。这种机制使得系统能够超越传统的线性对话流程,实现更加灵活、基于上下文的响应。

在自动化的数据和文档处理流程中,路由功能起到了分类和分配数据的作用。系统会根据数据的内容、元数据或格式对其进行分析,然后将这些数据分配到相应的处理流程中——例如,将收到的电子邮件、支持工单或API请求数据导入相应的销售线索管理系统;或者对JSON或CSV格式的数据进行特定的转换处理;又或者将紧急问题上报给相应的处理部门。

在涉及多种专业工具或Agent的复杂系统中,路由系统起到了“高级调度器”的作用。例如,一个由专门用于信息搜索、汇总和分析的Agent组成的研究系统,会利用路由机制根据当前任务需求,将相关任务分配给最合适的代理来执行。同样地,智能编程助手也会通过路由系统来判断用户需要使用哪种编程语言,以及用户的具体意图(是调试代码、解释代码内容,还是进行代码翻译),之后才会将代码片段传递给相应的专业工具进行处理。

从根本上说,路由机制为实现逻辑仲裁提供了必要的支持,而这种仲裁能力对于构建功能多样且具备上下文感知能力的系统至关重要。通过路由机制,一个原本只是按照预定义流程执行任务的Agent,可以被转化为一个能够在不断变化的环境中做出自主动态决策的动态系统。

三、代码示例(LangChain)

在代码中实现路由功能,需要定义所有可能的路径以及决定应选择哪条路径的逻辑机制。像 LangChain 和 LangGraph 这样的框架为此提供了专门的组件和结构。LangGraph 基于状态的图结构在可视化及实现路由逻辑方面尤为直观易懂。

这段代码演示了一个基于 LangChain 和谷歌的生成式人工智能技术的简单代理系统。该系统设置了一个“协调器”,根据用户的请求意图(如预订、查询信息或请求内容不明确等),将请求路由到不同的模拟“子Agent”处理程序。系统利用LLM对请求内容进行分类,然后将其转发给相应的处理函数,从而实现了多Agent架构中常见的基本任务分配机制。

import os
from langchain_core.prompts import PromptTemplate
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough, RunnableBranch
from langchain_deepseek import ChatDeepSeek
from dotenv import load_dotenv
load_dotenv()
llm = ChatDeepSeek(
model="deepseek-chat",
temperature=0,
max_tokens=None,
timeout=None,
max_retries=2,
# other params...
)
def booking_handler(request:str)->str:
"""
模拟预订Agent处理请求。
Args:
request (str): The booking request.
Returns:
str: The booking response.
"""
print("\n---将请求委托给预订Agent处理程序---")
return f"预订Agent处理了请求: {request}。结果:模拟的预订操作。"
def info_handler(request:str)->str:
"""
模拟信息Agent处理请求。
Args:
request (str): The information request.
Returns:
str: The information response.
"""
print("\n---将请求委托给信息Agent处理程序---")
return f"信息Agent处理了请求: {request}。结果:模拟的信息检索结果。"
def unclear_handler(request:str)->str:
"""
模拟不清晰Agent处理请求。
Args:
request (str): The unclear request.
Returns:
str: The unclear response.
"""
print("\n---将请求委托给不清晰Agent处理程序---")
return f"路由无法将请求委托给其他Agent: {request}。请重新说明您的请求。"
coordinator_router_prompt = ChatPromptTemplate.from_messages([
("system", """分析用户请求,确定应该由哪个专业处理程序来处理它。
-如果请求与预订航班或酒店相关,输出"booker"。
-对于所有其他一般性信息查询,输出"info"。
-如果请求不清晰或无法理解,输出"unclear"。
只输出一个单词,“booker”、“info”或“unclear”。
"""),
("user", "{request}"),
])
if llm :
coordinator_router_chain = coordinator_router_prompt | llm | StrOutputParser()
#基于子Agent进行路由处理
#使用RunnableBranch根据路由器链的输出结果来决定路由路径。
#为RunnableBranch定义不同的路由分支:
branches = {
"booker": RunnablePassthrough.assign(output=lambda x: booking_handler(x["request"]["request"])),
"info": RunnablePassthrough.assign(output=lambda x: info_handler(x["request"]["request"])),
"unclear": RunnablePassthrough.assign(output=lambda x: unclear_handler(x["request"]["request"])),
}
#创建RunnableBranch类型。该类型会接收路由器链的处理结果,然后将原始输入数据传递给对应的分支。
delegation_branch = RunnableBranch(
(lambda x: x["decision"].strip() == "booker", branches["booker"]),
(lambda x: x["decision"].strip() == "info", branches["info"]),
branches["unclear"]  # 用于处理 “unclear” 类型的输出,或任何其他无法明确分类的输出
)
#将路由器链和委托分支合并为一个可执行的整体
#路由器链的输出结果会与原始数据一起被传递给委托分支。
coordinator_agent = {
"decision": coordinator_router_chain,
"request": RunnablePassthrough(),
} | delegation_branch | (lambda x: x["output"])
def main():
if not llm:
print("请先配置DeepSeek API密钥和基础URL。")
return
print("正在处理预订请求")
request_a = "我想预订一个航班到纽约"
response_a = coordinator_agent.invoke({"request": request_a})
print(response_a)
print("正在处理信息请求")
request_b = "纽约的天气怎么样"
response_b = coordinator_agent.invoke({"request": request_b})
print(response_b)
print("正在处理不清晰请求")
request_c = "你好"
response_c = coordinator_agent.invoke({"request": request_c})
print(response_c)
if __name__ == "__main__":
main()
--输出结果:
(AgenticDesignPattens) Chapter2-Routing % python example.py
正在处理预订请求
---将请求委托给预订Agent处理程序---
预订Agent处理了请求: 我想预订一个航班到纽约。结果:模拟的预订操作。
正在处理信息请求
---将请求委托给信息Agent处理程序---
信息Agent处理了请求: 纽约的天气怎么样。结果:模拟的信息检索结果。
正在处理不清晰请求
---将请求委托给信息Agent处理程序---
信息Agent处理了请求: 你好。结果:模拟的信息检索结果。

其中一个核心组件是 coordinator_router_chain,它利用 ChatPromptTemplate 来指导语言模型将用户发送的请求分为三类:‘booker’、‘info’ 或 ‘unclear’。这个路由组件的处理结果随后会被 RunnableBranch 使用,以便将原始请求转发给相应的处理函数。RunnableBranch 会根据语言模型的判断结果,将请求数据分别发送给 booking_handler、info_handler 或 unclear_handler。 coordinator_agent 负责整合这些组件:首先对请求进行分类处理,然后再将请求传递给相应的处理函数。最终的输出结果是从处理函数的响应中提取出来的。

该示例的主要功能是通过三个具体的请求示例来展示该系统的使用方法,展示了不同的输入数据是如何被模拟中的各个Agent节点接收并处理的。代码中还包含了针对语言模型初始化过程的错误处理机制,以确保系统的稳定性。整个代码结构遵循了一个基本的多Agent框架模型:其中,一个中央协调器会根据Agent节点的特定功能,将相应的任务分配给这些Agent节点来执行。

What:Agent系统通常需要应对各种复杂的输入及各种不同的情况,而这些情况无法通过单一的线性处理流程来应对。简单的顺序处理流程缺乏根据具体情境做出决策的能力;如果没有相应的机制来为特定任务选择合适的工具或子流程,系统就会变得僵化且无法适应变化。正是这种局限性,使得开发能够有效处理现实世界中用户请求的复杂性与多样性的复杂应用程序变得十分困难。

Why:路由模式通过将条件逻辑引入代理的运行框架,从而提供了一种标准化的解决方案。该模式使系统能够首先分析传入的请求,以确定其意图或性质;根据分析结果,系统会动态地将控制权导向最合适的工具、功能或子Agent。做出这一决策的方法多种多样,包括提示大型语言模型、应用预定义的规则,或利用基于嵌入的技术来判断请求的语义相似性。最终,路由模式将原本静态且预先确定的执行路径转变为一种灵活且能够根据上下文做出判断的工作流程,从而确保系统能够选择最合适的处理方式。

经验法则:当Agent需要根据用户的输入或当前系统状态,在多种不同的工作流程、工具或子Agent之间做出选择时,应使用路由模式。这种模式对于那些需要对传入的请求进行分类或分级的应用程序来说至关重要,例如客户支持机器人——它需要区分销售咨询、技术支持以及账户管理相关的请求。

关键要点

  • 路由功能使Agent能够根据当前条件动态决定工作流程中的下一步该做什么。
  • 它使Agent能够处理各种不同的输入,并根据实际情况调整自己的行为,从而摆脱了线性执行的限制。
  • 路由逻辑可以通过LLM、基于规则的系统或基于相似性的算法来实现。
  • 像LangGraph和Google ADK这样的框架为在代理工作流程中定义和管理路由提供了结构化的方法,尽管它们的架构实现方式有所不同。

四、结论

路由模式是构建真正具有动态性及良好响应能力的智能系统的重要环节。通过实施路由机制,我们能够摆脱简单的线性执行流程,从而实现更复杂、更灵活的系统架构。让我们的Agent能够自主做出明智的决策,从而决定如何处理信息、如何响应用户的请求,以及如何使用现有的工具或子Agent来完成相关工作。

我们已经看到,路由技术可以应用于各种领域,从客户服务聊天机器人到复杂的数据处理流程。能够分析输入数据并根据具体情况调整工作流程,是开发能够应对现实世界中各种不确定性的智能系统的关键所在。

使用 LangChain 和 Google ADK 的代码示例展示了两种不同的、但同样有效的路由实现方法。LangGraph 基于图的结构为定义状态及状态转换提供了直观明了的方式,因此非常适合处理那些具有复杂路由逻辑的多步骤工作流程。而 Google ADK 则更侧重于定义各种不同的功能模块,它依靠该框架将用户请求路由到相应的功能处理模块;对于那些拥有明确、固定操作流程的Agent来说,这种实现方式显然更为简单易用。

掌握路由机制对于开发能够智能应对各种场景的智能Agent至关重要,这些Agent能够根据具体环境提供相应的响应或执行相应的操作。这是构建功能齐全、性能稳定的智能应用系统的重要基础。

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

在这里插入图片描述

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范

第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署

第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建

第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

在这里插入图片描述

Logo

更多推荐