网站建设的毕业设计成果,广告sem是什么意思,如何做网站的主页,谷歌浏览器手机版谈不上理解多深#xff0c;langgraph他是一个框架#xff0c;定义什么样的输入输出数据#xff0c;交给了我们自己#xff0c;框架不会去做#xff0c;当然也有框架的一些参数#xff0c;这些参数我们直接使用即可#xff0c;因此该框架的核心就是你是需要做什么事… 谈不上理解多深langgraph他是一个框架定义什么样的输入输出数据交给了我们自己框架不会去做当然也有框架的一些参数这些参数我们直接使用即可因此该框架的核心就是你是需要做什么事把这些事拆开成一步步的工作节点这就是节点工作节点之间肯定有数据交互和选择这就是边了也就是说整体工作步骤你是设计好的只是在调用工具时大模型自主决策我们不用关系但是整个系统的工作节点和边的选择是我们需要定义的因此深入理解节点和边就很重要了对于数据流怎么参数其实就是State我们自己定义的参数数据这个参数将贯穿整个agent的节点都是通过定义的参数结构体进行交互的但是还需要理解langgarph他是怎么执行的他是按照层或者回合进行执行具体如下
先定义一个数据流结构体State
import operator
from typing import Annotated,Any
from typing_extensions import TypedDict
from langgraph.graph import StateGraph, START,ENDclass State(TypedDict):aggregate:Annotated[list, operator.add] # 只添加不覆盖
该数据流就是一个字典只有一个键aggregate值是一个list该list只添加不覆盖数据
定义节点
# 定义多个节点
def a(state:State):print(f把 A 添加到{state[aggregate]})return {aggregate:[A]}
def b(state:State):print(f把 B 添加到{state[aggregate]})return {aggregate:[B]}
def c(state:State):print(f把 C 添加到{state[aggregate]})return {aggregate:[C]}
def d(state:State):print(f把 D 添加到{state[aggregate]})return {aggregate:[D]}builder StateGraph(State)
builder.add_node(a)
builder.add_node(b)
builder.add_node(c)
builder.add_node(d)
builder.add_edge(START,a)
builder.add_edge(a,b)
builder.add_edge(a,c)
builder.add_edge(b,d)
builder.add_edge(c,d)
builder.add_edge(d,END)
graph builder.compile()from IPython.display import Image,display
display(Image(graph.get_graph().draw_mermaid_png()))
分别定义了a\b\c\d 四个节点每个几点把自己的数据添加总体数据字典中的列表了然后把节点连接起来图如下 这里我们解释一些langgraph是怎么执行a节点是一层b和c是一层 d是一层那么添加数据顺序一个是先添加a在添加b和c最后添加d
result graph.invoke({aggregate:[]}, {configurable:{thread_id:foo}})
result
把 A 添加到[]
把 B 添加到[A]
把 C 添加到[A]
把 D 添加到[A, B, C]
{aggregate: [A, B, C, D]}
从结果可以看到和我们理解的是一样的A是一层b和c是一层他是等到A添加进去以后该开始是空列表在然后把b和c添加进去。加入我们的图是怎样的 这样的图langgraph 是怎么运行的呢
还是按照层来考虑a是一层b个c是一层b_2和d是单独一层这里的d是来源c下面d是单独一层这里的d是来源b_2下面的langgraph执行不管这些还是一层一层的执行了所以执行结果应该是
AA\B\C;A\B\C\B_2\D这个D是从C这里来的;A\B\C\B_2\D\D (这个d就是最后一个节点了即从B_2过来的)
代码
def b_2(state:State):print(f把 B_2 添加到{state[aggregate]})return {aggregate:[B_2]}builder StateGraph(State)
builder.add_node(a)
builder.add_node(b)
builder.add_node(b_2)
builder.add_node(c)
builder.add_node(d)
builder.add_edge(START,a)
builder.add_edge(a,b)
builder.add_edge(a,c)
builder.add_edge(b,b_2)
builder.add_edge(b_2,d)
builder.add_edge(c,d)
builder.add_edge(d,END)
graph builder.compile()from IPython.display import Image,display
display(Image(graph.get_graph().draw_mermaid_png()))
result graph.invoke({aggregate:[]}, {configurable:{thread_id:foo}})
result 结果如下
把 A 添加到[]
把 B 添加到[A]
把 C 添加到[A]
把 B_2 添加到[A, B, C]
把 D 添加到[A, B, C]
把 D 添加到[A, B, C, B_2, D]
{aggregate: [A, B, C, B_2, D, D]}
从上面可以发现和上面分析是一样的但是我们最终希望要的是 [A, B, C, B_2, D]就可以了能否实现呢当然可以我们可以想想怎么实现如果让你写langgraph框架代码你会怎么实现呢其实很简单我们只需要把c和b_2作为同级即可怎么实现呢使用列表在边那边同时连即可具体如下
builder StateGraph(State)
builder.add_node(a)
builder.add_node(b)
builder.add_node(b_2)
builder.add_node(c)
builder.add_node(d)
builder.add_edge(START,a)
builder.add_edge(a,b)
builder.add_edge(a,c)
builder.add_edge(b,b_2)
builder.add_edge([b_2, c],d)
# builder.add_edge(b_2,d)
# builder.add_edge(c,d)
builder.add_edge(d,END)
graph builder.compile()from IPython.display import Image,display
display(Image(graph.get_graph().draw_mermaid_png()))
result graph.invoke({aggregate:[]}, {configurable:{thread_id:foo}})
result 把 A 添加到[]
把 B 添加到[A]
把 C 添加到[A]
把 B_2 添加到[A, B, C]
把 D 添加到[A, B, C, B_2]
{aggregate: [A, B, C, B_2, D]}
从上面可以看出输出的图都是一样的只是层级关系改变了因为我们通过边把b_2和c强制为同一节点了这样就可以按照我们的预期工作了。
同时我们可以发现整个过程我们只处理了我们定义的参数流然后定义节点和边即可每个节点你都可以定位很复杂的功能或者智能体这样就可以完成很复杂的功能的智能体了