乌市泽哥 发表于 4 天前

LangGraph代理架构及Router Agent介绍

LangGraph代理模式

一、LangGraph代理模式总览

(一)围绕State的焦点机制

LangGraph集成多种代理模式以适配差别AI agent应用场景,这些代理模式均围绕state状态睁开。在前后节点间,中心流程及状态信息依靠state进行传递,state是整个代理模式运作的关键枢纽。
(二)代理架构的控制与类型

随着应用程序需求复杂度的提升,大模子在其中的操作和控制权限也相应增长。LangGraph官方对代理架构的控制水平有清楚界定,从路由代理到全主动接管,大模子介入工作和决策动作徐徐增多。主要的四类代理架构如下:

[*]路由代理(Router Agent):控制水平相对较低,其运作方式类似编程中的if - else判断语句,大模子根据预设条件选择实行路径。
[*]工具调用代理(Tool - calling Agent ):大模子具备自主决策调用外部工具(如数据库查询、文本编辑、计算工具等)并实行的本领,根据工具返回结果进一步处理任务。
[*]自主循环代理(Autonomous Loop Agent ):大模子自主决策并循环实行任务,控制水平较高。它使用预界说步调(包含实行函数、工具调用等)集合不断循环决策,自主判断任务完成环境,直至输出结果。
[*]多代理(Multi - Agent ):由多个单代理相互协作构成,Agent间可相互输入输出,自主循环交互,能够灵活应对复杂场景。这四类代理架构构成了LangGraph构建AI Agent应用的基础框架,开辟者可在此基础上进行自主研发扩展,以适配更复杂的任务需求。
二、路由代理(Router Agent)详解

(一)原理与场景

路由代理基于条件边概念工作。在LangGraph中,Start节点负责吸取用户输入,大模子借助Router函数,依据输入内容及中心过程进行决策,引导输入走向相应的处理流程。比方,当输入布局化查询哀求时,大概导向数据库操作节点;若输入简朴问候语,则直接返反响应。每个决策路径最终都指向End节点。
(二)代码实现


[*]基础构建:使用dict界说图状态,作为共享状态数据类型。添加由函数构成的节点,在函数内部编写具体逻辑。通过add_edge方法构建节点之间的关联关系,明白数据的流向。比方:
from langgraph.graph import START, StateGraph, END
from langgraph.graph import StateGraph

def node_a(state):
    return {"x": state["x"] + 1}

def node_b(state):
    return {"x": state["x"] - 2}

builder = StateGraph(dict)
builder.add_node("node_a", node_a)
builder.add_node("node_b", node_b)
builder.add_edge(START, "node_a")
builder.add_edge("node_a", "node_b")
builder.add_edge("node_b", END)
graph = builder.compile()
在这段代码里,首先从langgraph.graph导入所需对象。接着界说node_a和node_b两个节点函数,分别对共享状态中的x进行加1和减2操作。然后创建StateGraph对象builder,使用add_node方法添加节点,再用add_edge方法构建从START经node_a、node_b到END的路径,完成图的基本构建后,通过compile方法进行编译。
2. 条件边构建:焦点是使用Graph基类中的add_conditional_edges方法,该方法吸取多个重要参数:


[*]source:指定分支起始节点,确定从哪个节点开始进行分支决策。
[*]path:是一个可调用函数,它吸取全局共享状态,返回节点名称或布尔值来决定路由方向。可以是普通函数、异步函数或可运行对象。
[*]path_map(可选):用于节点名称映射。当path返回的不是直接的节点名称(如布尔值)时,可通过path_map将其映射到具体的节点名称。
[*]then:用于指定在path选择的节点之后实行的节点名称。
class Graph:
    def __init__(self) -> None:
      self.nodes: dict
      self.edges = set]()
      self.branches: defaultdict] = defaultdict(dict)
      self.support_multiple_edges = False
      self.compiled = False

    def add_conditional_edges(
      self,
      source: str,
      path: Union[
            Callable[..., Union]],
            Callable[..., Awaitable]]],
            Runnable]],
      ],
      path_map: Optional, list]] = None,
      then: Optional = None,
    ) -> Self:
      pass

[*]示例操作:界说路由函数,根据状态值判断返回相应的节点名。添加节点并设置起始节点,使用add_conditional_edges方法添加条件边,传入起始节点和路由函数,完成图的构建、编译及可视化。也可以结合path_map,根据路由函数返回的布尔值映射到差别节点,构建更灵活的路由逻辑。
from langgraph.graph import START, StateGraph, END
from langgraph.graph import StateGraph
from IPython.display import Image, display

def node_a(state):
    return {"x": state["x"] + 1}

def node_b(state):
    return {"x": state["x"] - 2}

def node_c(state):
    return {"x": state["x"] + 1}

def routing_function(state):
    if state["x"] == 10:
      return "node_b"
    else:
      return "node_c"

builder = StateGraph(dict)
builder.add_node("node_a", node_a)
builder.add_node("node_b", node_b)
builder.add_node("node_c", node_c)
builder.set_entry_point("node_a")
# 重点关注
builder.add_conditional_edges("node_a", routing_function)
graph = builder.compile()
display(Image(graph.get_graph(xray=True).draw_mermaid_png()))
https://i-blog.csdnimg.cn/direct/191138c11f6d4707aae5c0127bbf5476.png#pic_center
在该示例中,界说了node_a、node_b、node_c节点函数和routing_function路由函数。routing_function根据共享状态中x的值决定返回node_b或node_c。创建StateGraph对象builder后,添加节点并设node_a为起始节点,通过add_conditional_edges方法添加条件边,编译图后使用display和Image展示可视化图布局,直观呈现路由分支效果。
from langgraph.graph import START, StateGraph, END
from langgraph.graph import StateGraph
from IPython.display import Image, display

def node_a(state):
    return {"x": state["x"] + 1}

def node_b(state):
    return {"x": state["x"] - 2}

def node_c(state):
    return {"x": state["x"] + 1}

def routing_function(state):
    if state["x"] == 10:
      return True
    else:
      return False

builder = StateGraph(dict)
builder.add_node("node_a", node_a)
builder.add_node("node_b", node_b)
builder.add_node("node_c", node_c)
builder.set_entry_point("node_a")
# 重点关注
builder.add_conditional_edges("node_a", routing_function, {True: "node_b", False: "node_c"})
builder.add_edge("node_b", END)
builder.add_edge("node_c", END)
graph = builder.compile()
display(Image(graph.get_graph(xray=True).draw_mermaid_png()))
此示例进一步展示了结合path_map的用法。routing_function返回布尔值,通过add_conditional_edges的path_map参数,将True映射到node_b,False映射到node_c,并添加从node_b和node_c到END的边,构建出更灵活的路由逻辑。
https://i-blog.csdnimg.cn/direct/07fbef9709a24af48b1b576a10426613.png#pic_center
(三)优势与劣势


[*]优势:开辟者能够基于业务逻辑预先规划整个流程,对中心过程实现高度可控。其逻辑清楚明了,便于理解和维护,在处理简朴规则的任务时优势明显。
[*]劣势:灵活性方面存在欠缺,面对构建图时未考虑到的边缘环境,难以做出合适的响应。当业务变得复杂时,拓展性受到限制,图布局轻易变得复杂,增长维护本钱。
(四)应用场景

适用于业务逻辑固定明白的场景。比方在电商系统中,可根据订单类型(普通订单、退换货订单等)进行差别的流程处理;在客服问答系统里,依据用户问题类型(产品信息咨询、售后投诉等)转接至差别的处理模块。
三、构建路由代理的关键要点

(一)优势与局限

在构建图布局时,开辟者可以基于业务逻辑和个人需求,对中心过程实现高度可控,预先明白大概出现的问题和分支走向,这使得整个流程具有较好的可管理性。然而,当出现构建图时未考虑到的边缘条件时,路由代理大概无法做出正确响应,其顺应性相对较弱。
(二)路由函数设计

构建路由代理的关键在于公道设计router function。它必要准确判断用户意图,从而确定后续分支路径。在现实业务场景中,判断逻辑往往较为复杂,并非简朴的条件判断。比方上述示例中判断“x = 10”的逻辑,在现实应用中会被更复杂的业务逻辑取代,必要开辟者根据具体需求进行精致化设计。这一过程依靠大模子布局化输出本领,以辨认差别输入模式,做出准确决策。
https://i-blog.csdnimg.cn/direct/fcd741fcfa9d402680d6d11d21e50eed.png#pic_center
https://i-blog.csdnimg.cn/direct/0c9f0b6294de4da3b7e606232488ce1d.png#pic_center
四、其他代理模式简介

(一)工具调用代理(Tool - calling Agent )


[*]原理:大模子能够自主决策调用外部工具(如数据库查询工具、文本编辑工具、计算工具等)并实行操作,然后依据工具返回的结果进一步处理任务,以此来完成更复杂的功能。
[*]优势与劣势:借助外部丰富的工具,大大拓展了大模子的本领界限,使其能够灵活应对各种差别类型的任务。然而,该代理模式对工具的稳定性有较强依靠,一旦工具出现故障、接口变动等问题,会影响代理的正常工作。同时,公道选择和组合工具必要准确的判断和规划,否则大概导致资源浪费或任务处理失误。
[*]应用场景:广泛应用于必要多种专业工具协同工作的场景。好比科研数据处理,大概必要调用数据采集工具、数据分析工具、画图工具等;在智能写作场景中,会调用语法查抄工具、素材检索工具等辅助创作。
(二)自主循环代理(Autonomous Loop Agent )


[*]原理:Start节点吸取输入后,大模子使用预界说的步调(包括实行函数、工具调用等)集合不断进行循环决策。在这个过程中,大模子自主判断任务是否完成,若未完成则连续实验,直至认为结果能够输出给用户。
[*]优势与劣势:自主性极高,无需人工过多干预中心过程,能够充分发挥大模子的智能决策本领,尤其擅长处理复杂、实现路径不清楚的任务。但由于模子自主决策过程复杂,导致结果难以预知,调试和优化工作困难,并且决策过程的可表明性较差,不利于对结果进行公道性验证。
[*]应用场景:适用于复杂问题求解场景,如科学研究中的创新算法探索、复杂系统故障诊断等,这些场景必要模子自主实验多种方法找到解决方案。
(三)多代理(Multi - Agent )


[*]原理:基于LangGraph底层图的构建思绪,由多个单代理(如路由代理、工具调用代理等)相互协作构成。Agent之间可以相互输入输出,实现自主循环交互,共同完成复杂任务。
[*]优势与劣势:差别类型的代剃头挥各自优势,协同处理任务,能够显著提升任务处理的效率和效果,并且扩展性精良,可根据任务需求灵活添加或调整代理。但多个代理之间的通信、协作和任务分配必要精致设计和管理,否则轻易出现冲突或任务衔接不畅的问题。随着代理数量和交互逻辑的增长,整个系统的复杂度会呈指数级上升,维护和调试本钱高昂。
[*]应用场景:适用于大型复杂系统和分布式任务场景。如智能城市管理中,涉及交通管理、能源调度、公共服务等多个范畴的任务必要多代理协作完成;在大型企业的业务流程管理中,采购、生产、销售等多个环节的协同工作也可借助多代理实现高效运作。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: LangGraph代理架构及Router Agent介绍