AI创想

标题: LangGraph系列教程:基于状态构建上下文感知的AI系统 [打印本页]

作者: 创想小编    时间: 昨天 22:44
标题: LangGraph系列教程:基于状态构建上下文感知的AI系统
作者:CSDN博客
本文深入探讨LangGraph中的“状态”概念及其在AI工作流中的核心作用。通过基础状态(如计数器)和复杂状态(含消息历史)的定义,结合代码示例,演示如何通过函数式编程实现状态的不可变修改。然后进一步解析了如何构建简单和复杂的工作流图(Workflow),并以实际案例(如设备预测性维护、对话机器人)说明状态管理的实际应用。附带的完整Python代码提供了可落地的操作模板,适合开发者快速掌握LangGraph的状态管理机制。
LangGraph的状态是什么?

LangGraph 已成为创建循环代理式人工智能工作流的强大工具。LangGraph 中的一个关键概念是“状态”这一理念——它是基本的构建模块,使我们的 AI 系统能够在整个流程中保持和处理信息。
在AI系统处理数据时,LangGraph中的状态是一种维护和跟踪信息的方法。可以把它想象成系统的内存,允许它在工作流或图形的不同阶段移动时记住和更新信息。

(, 下载次数: 0)


基本状态定义

让我们从LangGraph中最简单的状态形式开始:
  1. from typing import TypedDict
  2. classBasicState(TypedDict):
  3.     count:int
复制代码
这个基本状态定义创建了一个简单的结构,它可以保存单个整数值,也可以是任何值。虽然看起来很简单,但这种类型的状态在许多情况下都非常有用,例如:
复杂状态结构

当我们进入更现实的应用程序时,我们通常需要更复杂的状态结构。LangGraph允许我们创建可以保存各种类型信息的复杂状态:
  1. from typing import TypedDict, Annotated
  2. from langchain_core.messages import HumanMessage, AIMessage
  3. classComplexState(TypedDict):
  4.     count:int
  5.     messages: Annotated[list[HumanMessage | AIMessage], add_messages]
复制代码
这个复杂的状态不仅跟踪计数,而且还维护消息列表。Annotated类型提供了LangGraph用于特殊处理消息列表(元组)的附加元数据。这个结构特别适用于:
状态修改函数

一旦我们定义了状态结构,我们就需要修改它们的方法。在LangGraph中,我们通常创建新的状态对象,而不是修改现有的状态对象,并遵循不变性原则:
  1. defincrement_count(state: BasicState)-> BasicState:return BasicState(count=state["count"]+1)defadd_message(state: ComplexState, message:str, is_human:bool=True)-> ComplexState:
  2.     new_message = HumanMessage(content=message)if is_human else AIMessage(content=message)return ComplexState(
  3.         count=state["count"],
  4.         messages=state["messages"]+[new_message])
复制代码
这些函数演示了我们如何:
简单图状态

现在我们已经了解了state的基础知识以及如何修改它,让我们看看如何在LangGraph中使用state:
  1. from langgraph.graph import StateGraph, END
  2. defcreate_simple_graph():
  3.     workflow = StateGraph(BasicState)defincrement_node(state: BasicState):return{"count": state["count"]+1}
  4.    
  5.     workflow.add_node("increment", increment_node)
  6.     workflow.set_entry_point("increment")
  7.     workflow.add_edge("increment", END)return workflow.compile()
复制代码
这个简单的图表展示了LangGraph工作流的基本结构:
虽然这个图看起来很基本,但它可以作为更复杂工作流的基础。
复杂图状态

基于我们对简单图形的理解,让我们创建一个更高级的工作流:
  1. defcreate_complex_graph():
  2.     workflow = StateGraph(ComplexState)defprocess_message(state: ComplexState):
  3.         last_message = state["messages"][-1].content if state["messages"]else"No messages yet"
  4.         response =f"Received: {last_message}. Count is now {state['count']+1}"return{"count": state["count"]+1,"messages": state["messages"]+[AIMessage(content=response)]}
  5.    
  6.     workflow.add_node("process", process_message)
  7.     workflow.set_entry_point("process")
  8.     workflow.add_edge("process", END)return workflow.compile()
复制代码
这个更复杂的图表展示了我们如何:
这种类型的图形可以构成一个简单的聊天机器人或人工智能助手的基础,展示了LangGraph中状态的强大和灵活性。
在LangGraph中理解和有效地使用状态为创建复杂的、上下文感知的人工智能系统开辟了一个可能性的世界。从简单的计数器到复杂的会话代理,状态的概念允许我们构建可以轻松处理多步骤流程的人工智能工作流。
完整实战案例

改示例是使用 LangGraph实现状态管理的完整教学示例,包含 状态定义状态修改函数图(workflow)构建 的核心逻辑。
  1. from typing import TypedDict, Annotated
  2. from langgraph.graph import StateGraph, END
  3. from langgraph.graph.message import add_messages
  4. from langchain_core.messages import HumanMessage, AIMessage
  5. # Step 1: Basic State DefinitionclassBasicState(TypedDict):
  6.     count:int# Step 2: More Complex StateclassComplexState(TypedDict):
  7.     count:int
  8.     messages: Annotated[list[HumanMessage | AIMessage], add_messages]# Step 3: State Modification Functionsdefincrement_count(state: BasicState)-> BasicState:return BasicState(count=state["count"]+1)defadd_message(state: ComplexState, message:str, is_human:bool=True)-> ComplexState:
  9.     new_message = HumanMessage(content=message)if is_human else AIMessage(content=message)return ComplexState(
  10.         count=state["count"],
  11.         messages=state["messages"]+[new_message])# Step 4: Simple Graph with Statedefcreate_simple_graph():
  12.     workflow = StateGraph(BasicState)defincrement_node(state: BasicState):return{"count": state["count"]+1}
  13.    
  14.     workflow.add_node("increment", increment_node)
  15.     workflow.set_entry_point("increment")
  16.     workflow.add_edge("increment", END)return workflow.compile()# Step 5: More Complex Graph with Statedefcreate_complex_graph():
  17.     workflow = StateGraph(ComplexState)defprocess_message(state: ComplexState):
  18.         last_message = state["messages"][-1].content if state["messages"]else"No messages yet"
  19.         response =f"Received: {last_message}. Count is now {state['count']+1}"return{"count": state["count"]+1,"messages": state["messages"]+[AIMessage(content=response)]}
  20.    
  21.     workflow.add_node("process", process_message)
  22.     workflow.set_entry_point("process")
  23.     workflow.add_edge("process", END)return workflow.compile()# Interactive Sessiondefrun_interactive_session():print("Welcome to the Interactive LangGraph State Lesson!")print("\nStep 1: Basic State")
  24.     basic_state = BasicState(count=0)print(f"Initial basic state: {basic_state}")print("\nStep 2: More Complex State")
  25.     complex_state = ComplexState(count=0, messages=[])print(f"Initial complex state: {complex_state}")print("\nStep 3: State Modification")
  26.     modified_basic = increment_count(basic_state)print(f"Modified basic state: {modified_basic}")
  27.    
  28.     modified_complex = add_message(complex_state,"Hello, LangGraph!")print(f"Modified complex state: {modified_complex}")print("\nStep 4: Simple Graph with State")
  29.     simple_graph = create_simple_graph()
  30.     result = simple_graph.invoke(BasicState(count=0))print(f"Simple graph result: {result}")print("\nStep 5: Complex Graph with State")
  31.     complex_graph = create_complex_graph()
  32.     initial_state = ComplexState(count=0, messages=[HumanMessage(content="Hello, LangGraph!")])
  33.     result = complex_graph.invoke(initial_state)print(f"Complex graph result: {result}")if __name__ =="__main__":
  34.     run_interactive_session()
复制代码
这段代码是使用 LangGraph(一个开源框架)实现状态管理的完整教学示例,包含 状态定义状态修改函数图(workflow)构建 的核心逻辑。以下是逐段详细解释:
(, 下载次数: 0)


1. 导入必要的模块
  1. from typing import TypedDict, Annotated
  2. from langgraph.graph import StateGraph, END
  3. from langgraph.graph.message import add_messages
  4. from langchain_core.messages import HumanMessage, AIMessage
复制代码
2. 定义基本状态(BasicState)
  1. classBasicState(TypedDict):
  2.     count:int
复制代码
3. 定义复杂状态(ComplexState)
  1. classComplexState(TypedDict):
  2.     count:int
  3.     messages: Annotated[list[HumanMessage | AIMessage], add_messages]
复制代码
4. 状态修改函数

(1) increment_count 函数
  1. defincrement_count(state: BasicState)-> BasicState:return BasicState(count=state["count"]+1)
复制代码
(2) add_message 函数
  1. defadd_message(state: ComplexState, message:str, is_human:bool=True)-> ComplexState:
  2.     new_message = HumanMessage(content=message)if is_human else AIMessage(content=message)return ComplexState(
  3.         count=state["count"],
  4.         messages=state["messages"]+[new_message])
复制代码
5. 构建简单状态图(create_simple_graph)
  1. defcreate_simple_graph():
  2.     workflow = StateGraph(BasicState)defincrement_node(state: BasicState):return{"count": state["count"]+1}
  3.    
  4.     workflow.add_node("increment", increment_node)
  5.     workflow.set_entry_point("increment")
  6.     workflow.add_edge("increment", END)return workflow.compile()
复制代码
6. 构建复杂状态图(create_complex_graph)
  1. defcreate_complex_graph():
  2.     workflow = StateGraph(ComplexState)defprocess_message(state: ComplexState):
  3.         last_message = state["messages"][-1].content if state["messages"]else"No messages yet"
  4.         response =f"Received: {last_message}. Count is now {state['count']+1}"return{"count": state["count"]+1,"messages": state["messages"]+[AIMessage(content=response)]}
  5.    
  6.     workflow.add_node("process", process_message)
  7.     workflow.set_entry_point("process")
  8.     workflow.add_edge("process", END)return workflow.compile()
复制代码
7. 交互式会话运行
  1. defrun_interactive_session():print("Welcome to the Interactive LangGraph State Lesson!")# 分步骤演示 BasicState 和 ComplexState 的操作# ...(省略中间打印语句)# 调用简单图和复杂图
  2.     simple_result = simple_graph.invoke(BasicState(count=0))
  3.     complex_result = complex_graph.invoke(ComplexState(count=0, messages=[HumanMessage(content="Hello, LangGraph!")]))print(f"Simple graph result: {simple_result}")print(f"Complex graph result: {complex_result}")
复制代码
最后总结

LangGraph的状态管理是其构建上下文感知AI系统的核心机制。状态作为系统“内存”,贯穿工作流始终,确保信息在不同阶段间连贯传递。通过TypedDict定义结构化状态(如BasicState追踪计数、ComplexState维护消息历史),开发者能够灵活处理简单数值统计与多模态交互场景。状态的修改遵循函数式编程原则——每次操作均生成新状态对象而非直接修改旧状态,保障数据一致性与可追溯性。
实际应用中,开发者可通过构建简单图(如计数器递增)验证基础逻辑,再进阶到复杂图(如消息处理与动态响应),模拟对话机器人或自动化流程。例如,制造业中的设备预测性维护场景中,状态可整合设备运行数据与历史故障记录,驱动智能决策;而政务服务领域的政策咨询机器人则依赖状态维护用户提问轨迹与政策匹配结果。代码实践部分通过完整的Python示例(包括基础/复杂状态定义、工作流构建与交互式运行),为开发者提供了可直接复用的模板,降低了从理论到落地的门槛。
LangGraph的状态管理不仅解决了多步骤流程中的上下文丢失问题,还通过类型注解、不可变状态等设计,增强了系统的可靠性与扩展性,是构建高效AI代理的关键支撑。

原文地址:https://blog.csdn.net/neweastsun/article/details/145861114




欢迎光临 AI创想 (https://www.llms-ai.com/) Powered by Discuz! X3.4