Skip to content

状态管理

在 LangGraph 中,状态(State)是连接所有节点的核心。有效的状态管理是构建复杂、可靠的智能体的关键。

📊 状态的核心作用

  • 数据传递: 在图的不同节点之间传递数据。
  • 上下文保持: 记录对话历史、中间结果和智能体上下文。
  • 流程控制: 状态中的值可以用于条件分支,控制执行流程。
  • 持久化: 状态可以被持久化,实现可中断和恢复的工作流。

🏗️ 定义状态

LangGraph 使用 TypedDict 来定义状态,这提供了类型提示和静态分析的好处。

python
from typing import TypedDict, List, Optional
from langchain_core.messages import BaseMessage

class AgentState(TypedDict):
    # 必需字段
    messages: List[BaseMessage]
    
    # 可选字段
    user_info: Optional[dict]
    
    # 中间结果
    search_results: List[str]
    
    # 流程控制
    next_action: str

最佳实践

  • 明确类型: 尽可能使用明确的类型,避免使用 Any
  • 可选字段: 对非必需字段使用 Optional
  • 逻辑分组: 将相关的字段组织在一起。

🔄 更新状态

节点函数通过返回一个字典来更新状态。LangGraph 会将返回的字典与当前状态合并。

python
def search_node(state: AgentState) -> dict:
    query = state["messages"][-1].content
    # 模拟搜索
    results = [f"Result for {query}"]
    
    # 只返回需要更新的字段
    return {"search_results": results}

更新机制

  • 覆盖: 如果返回的键已存在,其值将被覆盖。
  • 追加: 对于列表,默认是覆盖。如果需要追加,需要手动处理。

列表追加示例

python
from typing import List
from langgraph.graph import StateGraph, END

class ListState(TypedDict):
    items: List[int]

def add_item(state: ListState) -> dict:
    new_item = len(state["items"]) + 1
    # 手动追加
    return {"items": state["items"] + [new_item]}

workflow = StateGraph(ListState)
# ...

📦 MessageGraph

对于聊天机器人等以消息为中心的应用,MessageGraph 简化了状态管理。

  • 自动管理 messages: MessageGraph 的状态隐式包含一个 messages 列表。
  • 自动追加: 节点返回的消息会自动追加到 messages 列表中。
python
from langgraph.graph import MessageGraph
from langchain_core.messages import HumanMessage, AIMessage

def chatbot_node(state: List[HumanMessage]) -> AIMessage:
    # state 直接是消息列表
    user_message = state[-1].content
    return AIMessage(content=f"你说了: {user_message}")

graph = MessageGraph()
graph.add_node("chatbot", chatbot_node)
graph.set_entry_point("chatbot")
graph.add_edge("chatbot", END)

app = graph.compile()
app.invoke(HumanMessage("你好"))
# 返回: [HumanMessage(...), AIMessage(...)]

🔗 状态与流程控制

状态中的值是实现条件路由的关键。

python
def check_results(state: AgentState) -> str:
    if state["search_results"]:
        return "process_results"
    else:
        return "ask_for_clarification"

workflow.add_conditional_edges(
    "search_node",
    check_results,
    {
        "process_results": "process_node",
        "ask_for_clarification": "clarify_node",
    },
)

💾 持久化

LangGraph 支持状态的持久化,这对于长时间运行或可中断的工作流至关重要。

配置检查点

python
from langgraph.checkpoint.sqlite import SqliteSaver

# 使用 SQLite 作为后端
memory = SqliteSaver.from_conn_string(":memory:")

app = workflow.compile(checkpointer=memory)

调用可恢复的图

python
# 定义会话 ID
config = {"configurable": {"thread_id": "my-session-1"}}

# 第一次调用
app.invoke({"messages": [("user", "你好")]}, config)

# 第二次调用,状态会自动恢复
app.invoke({"messages": [("user", "今天天气怎么样")]}, config)

支持的后端

  • MemorySaver: 内存中,用于测试。
  • SqliteSaver: SQLite 数据库。
  • PostgresSaver: PostgreSQL 数据库。
  • RedisSaver: Redis 缓存。

🎯 总结

  • TypedDict: 定义清晰、类型安全的状态。
  • 节点返回: 节点通过返回字典来更新状态。
  • MessageGraph: 简化聊天应用的状态管理。
  • 条件路由: 使用状态值来控制流程。
  • 持久化: 使用检查点实现可恢复的工作流。

💡 下一步: 学习 工具集成,了解如何让智能体调用外部工具并管理相关状态。

Released under the MIT License.