LangGraph:构建基于大语言模型智能代理指南

95 阅读3分钟

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 构建复杂、有状态的应用程序。通过了解其核心概念并完成简单示例,初学者可以开始利用其功能开展项目。请记住注意状态管理、条件边,并确保图中没有死节点。