LangGraph 是一款功能强大的工具,可用于使用大型语言模型 (LLM) 构建有状态、多参与者应用程序。它扩展了 LangChain 库,允许您以循环方式协调跨多个计算步骤的多个链(或参与者)。在本文中,我们将介绍 LangGraph,带您了解其基本概念,并分享一些见解和初学者常见的困惑点。
什么是 LangGraph?
LangGraph 是一个基于 LangChain 构建的库,旨在为您的 LLM 应用程序添加循环计算功能。虽然 LangChain 允许您定义计算链(有向无环图或 DAG),但 LangGraph 引入了添加循环的功能,从而实现更复杂的类似代理的行为,您可以在循环中调用 LLM,询问它下一步要采取什么操作。
关键概念
- 状态图: LangGraph 围绕状态图的概念展开,图中的每个节点代表计算中的一个步骤,并且图维持着随着计算的进展而传递和更新的状态。
- 节点: 节点是 LangGraph 的构建块。每个节点代表函数或计算步骤。您可以定义节点来执行特定任务,例如处理输入、做出决策或与外部 API 交互。
- 边: 边连接图中的节点,定义计算流程。LangGraph 支持条件边,允许您根据图的当前状态动态确定要执行的下一个节点。
一个简单的例子
让我们看一个简单的例子,我们使用 LangGraph 将用户输入分类为“问候”或“搜索”查询并做出相应的响应。
步骤 1:定义图形状态
首先,我们定义图的状态结构。在此示例中,我们的状态包括用户的问题、问题的分类和答案。
from typing import Dict, TypedDict, Optional
class GraphState(TypedDict):
question: Optional[str] = None
classification: Optional[str] = None
response: Optional[str] = None
步骤 2:创建图表
StateGraph
接下来,我们用我们的结构创建一个新的实例GraphState
。
from langgraph.graph import StateGraph
workflow = StateGraph(GraphState)
步骤 3:定义节点
我们定义用于对输入进行分类、处理问候语和处理搜索查询的节点。
def classify_input_node(state):
question = state.get('question', '').strip()
classification = classify(question) # Assume a function that classifies the input
return {"classification": classification}
def handle_greeting_node(state):
return {"response": "Hello! How can I help you today?"}
def handle_search_node(state):
question = state.get('question', '').strip()
search_result = f"Search result for '{question}'"
return {"response": search_result}
步骤 4:向图中添加节点
我们将节点添加到图中,并使用边和条件边定义流。
workflow.add_node("classify_input", classify_input_node)
workflow.add_node("handle_greeting", handle_greeting_node)
workflow.add_node("handle_search", handle_search_node)
def decide_next_node(state):
return "handle_greeting" if state.get('classification') == "greeting" else "handle_search"
workflow.add_conditional_edges(
"classify_input",
decide_next_node,
{
"handle_greeting": "handle_greeting",
"handle_search": "handle_search"
}
)
步骤 5:设置入口点和终点
我们设置图表的入口点并定义终点。
workflow.set_entry_point("classify_input")
workflow.add_edge('handle_greeting', END)
workflow.add_edge('handle_search', END)
步骤 6:编译并运行图表
最后,我们编译我们的图表并使用一些输入来运行它。
app = workflow.compile()
inputs = {"question": "Hello, how are you?"}
result = app.invoke(inputs)
print(result)
常见混淆
- 状态管理: 了解状态如何在图中传递和更新可能比较困难。请记住,每个节点都会接收当前状态,可以对其进行修改,并将其传递给下一个节点。
- 条件边: 设置条件边需要仔细考虑条件以及结果到下一个节点的映射。确保条件函数返回的键与条件边映射中的键匹配。
- 死端节点: 图中的每个节点都应有一条通向另一个节点或该
END
节点的路径。如果节点没有出边,则将其视为死端,您需要添加一条边以避免错误。
结论
LangGraph 是一款多功能工具,可使用 LLM 构建复杂、有状态的应用程序。通过了解其核心概念并完成简单示例,初学者可以开始利用其功能开展项目。请记住注意状态管理、条件边,并确保图中没有死节点。