序言
本文将介绍一个名为 LangGraph 的工具链,它是一个支持利用大规模语言模型(LLM)开发应用程序的框架 LangChain 中的一部分。
如果您想了解 LangChain 是什么,欢迎您阅读一下。
※ LangGraph 是一个可以与 LangChain 无缝连接的库,但本文将重点介绍 LangGraph 本身的入门内容,因此不会详细讨论 LangChain,请您谅解。
LangGraph 是什么
LangGraph是LangChain工具集中的一个工具,用于将各LLM代理的步骤等图形化,以进行状态管理。
LangGraph 旨在简化状态机的创建,使多个代理能够协同工作,构建“多代理”系统。
LangChain 的博客详细介绍了 LangGraph 开发的动机和具体案例,欢迎您查看。
LangGraphhttps://blog.langchain.dev/langgraph/https://blog.langchain.dev/langgraph/LangGraph: Multi-Agent Workflowshttps://blog.langchain.dev/langgraph-multi-agent-workflows/
https://blog.langchain.dev/langgraph-multi-agent-workflows/
LangGraph 是一个在利用 LangChain 的前提下的工具,但它独立于LLM模型和其他工具,可以作为构建状态机的简单库使用。
接下来将主要介绍 LangGraph 这个状态机构建库的基本用法。
环境
本文使用如下环境
特别是 LangChain 周围的开发速度非常快,请确认当前的最新版本
- langgraph: 0.1.5
- Python: 3.10.12
LangGraph 的基本组件
LangGraph 通过使用接下来介绍的一些主要组件来构建图形。
组件 | 説明 |
---|---|
图表 | LangGraph 的核心组成部分,是各个 Node 和 Edge 的集合体。 |
状态 | 在节点间迁移时保持的信息,各节点进行引用和更新。 |
节点 | 图中表示个别步骤或状态的元素,作为特定的动作或检查点发挥作用。 |
边缘 | 表示节点之间的连接,并定义转换的条件和动作。可以根据特定逻辑控制转换,例如条件边。 |
图表
Graph是 LangGraph 的核心组件,用于管理整个图。基本用法是使用StateGraph
类,并与后面提到的 State 一起初始化。
(StateGraph 的声明示例)
from typing_extensions import TypedDict
from langgraph.graph import StateGraph
# 定义State
class State(TypedDict):
value: str
# 以 State 作为参数初始化 Graph
graph = StateGraph(State)
State
State是传递给图中节点和边的状态对象。
State 可以使用 typing 模块的“TypeDict”或“Pydantic 的 BaseModel”。
以下是继承了 TypeDict 的 State 的例子。
from typing_extensions import TypedDict
# 名为 “value” 的 str 类型的 State
class State(TypedDict):
value: str
Reducers
State 可以与称为 reducer 的函数一起使用。reducer 是用于更新状态的函数,具有(当前值,添加的值) -> 更新状态的值
的签名。
from typing import TypedDict, Annotated
def reducer(a: list, b: int | None) -> int:
# 当传入 b 时,将其添加到 a 中
if b is not None:
return a + [b]
return a
class State(TypedDict):
# 使用 Annotated 指定用于更新状态的 reducer
bar: Annotated[list[str], reducer]
通过使用 reducer,可以在状态更新时通过特定的逻辑进行处理。
节点
Node是一个在图上执行实际步骤的组件。例如,实际使用 LangChain 调用LLM模型的过程是在 Node 上进行的。
在 Node 中,可以使用具有(State、Config) -> 変更するState
签名的函数。
from typing import Annotated
from typing_extensions import TypedDict
from langchain_core.runnables import RunnableConfig
from langgraph.graph import StateGraph
# State定义
class State(TypedDict):
value: str
# Node定义
def node(state: State, config: RunnableConfig):
return {"value": "hoge"}
graph = StateGraph(State)
# 向Graph添加Node
graph.add_node("node", node)
对图形使用 add_node
方法来关联节点。第一个参数可以为节点指定任意的路径名字符串。
边缘
Edge是定义各个 Node 和 Graph 如何运作(路由、起点定义等)的组件。
from typing import Annotated
from typing_extensions import TypedDict
from langchain_core.runnables import RunnableConfig
from langgraph.graph import StateGraph
# 声明 State
class State(TypedDict):
value: str
# 声明 Node
def node(state: State, config: RunnableConfig):
return {"value": "hoge"}
def node2(state: State, config: RunnableConfig):
return {"value": "fuga"}
graph_builder = StateGraph(State)
graph_builder.add_node("node", node)
graph_builder.add_node("node2", node2)
# 将节点的关联添加为边
graph_builder.add_edge("node", "node2")
# 声明图的起点
graph_builder.set_entry_point("node")
# 声明图的终点
graph_builder.set_finish_point("node2")
可以使用 add_edge(<from path>, <to path>)
来表示处理从哪个 Node 移到下一个 Node。
此外,您可以使用set_entry_point
和set_finish_point
来指定图形的起点和终点。
最后
在开发基于大规模语言模型(LLM)的应用程序时,LangGraph 作为 LangChain 框架中的重要工具,为开发者提供了高效构建和管理复杂工作流的能力。
掌握 LangGraph:从零开始的超实用指南(下)里我会介绍Graph 的基本制作方法。