Langgraph底层源码解析

一、LangGraph的Graph基类解析

  1. Graph基类的核心作用:Graph基类是LangGraph框架中管理和定义图结构的关键部分,负责对图进行整体构建与管理,包括添加节点、边以及设定节点间的动态流转逻辑等。
  2. __init__函数中的关键属性
    • self.nodes:以字典形式存储图中的节点。在构建图时,每个节点如同一个个独立的圆圈,self.nodes仅将节点放置其中,尚未建立它们之间的连接关系。
    • self.edges:用于记录节点之间的连接关系,形象地说,就是存储节点间连接箭头所代表的信息。
    • self.branches:对应着条件分支(router),保存着在特定条件下不同路由节点的相关信息,即满足特定条件时,如何选择不同的路由节点。
    • support_multi_edges:是一个指示标志,用于表明图是否允许一个节点连接多条边。
    • compiled:表示图是否已经被编译。编译操作可激活图,使其能够接收输入,并按照内部定义的逻辑生成回复,就像将一个构建好的图准备好投入使用。
  3. Graph基类的关键方法
    • get_all_edges:该方法用于获取图中所有边的数据。
    • add_node:实现向图中添加新节点的功能。
    • add_edge(start_key, end_key):在图中添加边,通过start_keyend_key明确边的起始节点和结束节点。
    • add_conditional_edge:添加条件边,它允许在执行过程中,依据特定条件从一个节点动态地转移到一个或多个节点,增加了图的灵活性。
    • set_entry_point:用于设置图的入口点,即确定当图接收用户输入时,以哪个节点作为第一个初始节点。
    • set_conditional_entry_point:设置条件入口节点,意味着可以设置多个节点,根据不同的用户输入条件来选择不同的起始节点,实现更灵活的图执行路径选择。
    • set_finish_point:设置图的结束点,当图执行到该节点时,无论中间过程多么复杂,都将停止执行,并把结果返回给用户。
    • validate:对图的结构进行验证,检查节点和边的定义是否符合LangGraph的逻辑规范,确保图的正确性。
    • compile:编译图,使图进入可接收用户输入并生成相应响应的激活状态,为图的实际运行做好准备。

二、LangGraph的GraphState类解析

Langgraph底层源码解析_第1张图片

  1. GraphState类的功能与实现:GraphState类的主要作用是管理状态,通过状态图StateGraph类来实现。在图的计算过程中,它确保每个节点都能共享全局状态信息,并且该状态会随着计算的进行不断维护和更新。
  2. __init__函数中的关键属性
    • state_schema:用于定义图的结构(也称为模式)。默认情况下,StateGraph采用单模式运行,即所有节点通过同一个共享的全局state进行通信,各个阶段的输入输出都记录在这个state中。此外,LangGraph支持多种图模式,可通过state_schema进行灵活指定。Langgraph底层源码解析_第2张图片

    • config_schema:用于定义和验证图的配置参数,为Graph基类中的validate方法提供更细致的访问控制。

    • nodesedgesbranches:与Graph基类中的同名属性类似,分别用于存储图状态中的节点、边和条件分支信息。

  3. GraphState类的关键方法与图模式
    • 关键方法:主要包括添加节点、添加边和编译图等方法,用于构建和操作图的状态。
    • 图模式:默认的单模式规定,图在任意阶段都读取和写入相同的状态通道,所有节点都利用这个状态通道进行通信。在LangGraph中,通过TypedDict工具来限定这种模式下输入输出的结构。Langgraph底层源码解析_第3张图片
      例如,在定义发送邮件的函数时,使用TypedDict规定传入参数必须包含特定字段且类型符合要求,这是为了保证图中节点间数据传递的准确性和稳定性,避免因数据类型或参数传递问题导致链路报错。
  4. 单输入输出模式的定义与实践:使用LangGraph时,需要先安装第三方依赖包(如0.2.35版本)。定义单输入输出模式的步骤如下:
    • langgraph.graph导入StateGraph,从typing_extensions导入TypedDict
    • 定义输入状态(如InputState,包含question字段)和输出状态(如OutputState,包含answer字段),并通过OverallState将两者合并。
    • 创建StateGraph对象,传入OverallState以及明确的输入输出类型(InputStateOutputState),以此搭建起图结构的框架,规定图接收question字段作为输入,并返回answer字段作为输出。Langgraph底层源码解析_第4张图片
from langgraph.graph import StateGraph
from typing_extensions import TypedDict


# 定义输入状态
class InputState(TypedDict):
    question: str


# 定义输出状态
class OutputState(TypedDict):
    answer: str


# 将输入状态和输出状态合并
class OverallState(InputState, OutputState):
    pass


# 创建StateGraph对象,搭建图结构框架
builder = StateGraph(OverallState, input=InputState, output=OutputState)

你可能感兴趣的:(大模型Agent开发,人工智能,Agent,大模型)