AI创想

标题: 【LangGraph】什么是 StateGraph [打印本页]

作者: AI小编    时间: 8 小时前
标题: 【LangGraph】什么是 StateGraph
作者:彬彬侠
目录


1. 什么是 StateGraph?

langgraph.graph.StateGraph 是 LangGraph 库中的核心类,用于定义和管理基于状态的有向图工作流。它是 LangGraph 的主要构建块,允许开发者通过节点(Nodes)、边(Edges)和状态(State)构造复杂的工作流,特别适合与大型语言模型(LLM)结合的场景。
StateGraph 的设计目标是提供一个灵活、可扩展的框架,让开发者可以:

2. StateGraph 的核心功能

StateGraph 提供了以下主要功能:

3. StateGraph 的关键组件

StateGraph 的工作流由以下核心组件组成:

4. 如何使用 StateGraph

以下是使用 StateGraph 构建工作流的标准步骤:

5. 代码示例

以下是三个不同复杂度的 StateGraph 示例,展示其灵活性。
5.1 简单线性工作流

一个简单的线性工作流,包含两个节点。
  1. from langgraph.graph import StateGraph, START, END
  2. from typing import TypedDict
  3. # 定义状态classState(TypedDict):input:str
  4.     output:str# 定义节点defprocess_input(state: State)-> State:
  5.     state["output"]=f"处理输入: {state['input']}"return state
  6. deffinalize_output(state: State)-> State:
  7.     state["output"]+=" -> 已完成"return state
  8. # 创建图
  9. workflow = StateGraph(State)
  10. workflow.add_node("process_input", process_input)
  11. workflow.add_node("finalize_output", finalize_output)
  12. workflow.add_edge(START,"process_input")
  13. workflow.add_edge("process_input","finalize_output")
  14. workflow.add_edge("finalize_output", END)# 编译和运行
  15. graph = workflow.compile()
  16. result = graph.invoke({"input":"Hello, LangGraph!","output":""})print(result)
复制代码
输出
  1. {'input':'Hello, LangGraph!','output':'处理输入: Hello, LangGraph! -> 已完成'}
复制代码
5.2 带条件边的工作流

一个工作流,根据输入长度决定是否处理。
  1. from langgraph.graph import StateGraph, START, END
  2. from typing import TypedDict
  3. # 定义状态classState(TypedDict):input:str
  4.     output:str
  5.     needs_processing:bool# 定义节点defcheck_input(state: State)-> State:
  6.     state["needs_processing"]=len(state["input"])>5return state
  7. defprocess_input(state: State)-> State:
  8.     state["output"]=f"处理输入: {state['input']}"return state
  9. defskip_processing(state: State)-> State:
  10.     state["output"]="输入太短,无需处理"return state
  11. # 条件函数defroute(state: State)->str:return"process_input"if state["needs_processing"]else"skip_processing"# 创建图
  12. workflow = StateGraph(State)
  13. workflow.add_node("check_input", check_input)
  14. workflow.add_node("process_input", process_input)
  15. workflow.add_node("skip_processing", skip_processing)
  16. workflow.add_edge(START,"check_input")
  17. workflow.add_conditional_edges("check_input", route,{"process_input":"process_input","skip_processing":"skip_processing"})
  18. workflow.add_edge("process_input", END)
  19. workflow.add_edge("skip_processing", END)# 编译和运行
  20. graph = workflow.compile()
  21. result = graph.invoke({"input":"Hi","output":"","needs_processing":False})print(result)
复制代码
输出
  1. {'input':'Hi','output':'输入太短,无需处理','needs_processing':False}
复制代码
5.3 支持循环和工具调用的复杂工作流

一个智能 Agent 工作流,结合 LLM 和工具调用,支持循环。
  1. from langchain_openai import ChatOpenAI
  2. from langchain_core.tools import tool
  3. from langchain_core.runnables import RunnableConfig
  4. from langgraph.graph import StateGraph, START, END
  5. from typing import TypedDict, Optional
  6. # 定义工具@tooldefsearch(query:str, config: RunnableConfig)->str:"""模拟从网络上搜获相关的数据进行汇总"""returnf"搜索结果: {query} 的信息"# 定义状态classState(TypedDict):input:str
  7.     output:str
  8.     needs_search:bool
  9.     search_count:int# 定义节点defdecide_action(state: State, config: RunnableConfig)-> State:
  10.     llm = ChatOpenAI(model="gpt-4o-mini")
  11.     prompt =f"用户问题: {state['input']}\n回答 'yes' 如果需要搜索,'no' 如果可以直接回答。"
  12.     response = llm.invoke(prompt, config=config).content
  13.     state["needs_search"]= response.lower()=="yes"return state
  14. defsearch_node(state: State, config: RunnableConfig)-> State:
  15.     state["search_count"]+=1
  16.     result = search.invoke({"query": state["input"]}, config=config)
  17.     state["output"]= result
  18.     return state
  19. defanswer_node(state: State, config: RunnableConfig)-> State:
  20.     llm = ChatOpenAI(model="gpt-4o-mini")
  21.     prompt =f"直接回答用户问题: {state['input']}"
  22.     response = llm.invoke(prompt, config=config).content
  23.     state["output"]= response
  24.     return state
  25. # 条件函数defroute(state: State)->str:if state["needs_search"]and state["search_count"]<2:return"search_node"return"answer_node"# 创建图
  26. workflow = StateGraph(State)
  27. workflow.add_node("decide_action", decide_action)
  28. workflow.add_node("search_node", search_node)
  29. workflow.add_node("answer_node", answer_node)
  30. workflow.add_edge(START,"decide_action")
  31. workflow.add_conditional_edges("decide_action", route,{"search_node":"search_node","answer_node":"answer_node"})
  32. workflow.add_conditional_edges("search_node", route,{"search_node":"search_node","answer_node":"answer_node"})
  33. workflow.add_edge("answer_node", END)# 编译和运行
  34. graph = workflow.compile()
  35. result = graph.invoke({"input":"什么是 LangGraph?","output":"","needs_search":False,"search_count":0},
  36.     config={"configurable":{"user_id":"user123"}})print(result)
复制代码
输出(假设 LLM 认为需要搜索):
  1. {'input':'什么是 LangGraph?','output':'搜索结果: 什么是 LangGraph? 的信息','needs_search':True,'search_count':1}
复制代码

6. 高级功能和注意事项

6.1 高级功能

6.2 注意事项


7. 与其他 LangGraph 类的关系


8. 常见问题和调试技巧

8.1 常见问题

8.2 调试技巧


9. 总结和学习资源

9.1 总结

langgraph.graph.StateGraph 是 LangGraph 的核心类,用于构建和管理有状态的有向图工作流。它通过状态、节点和边提供了一个灵活的框架,适合复杂的 LLM 应用场景,如智能 Agent、对话系统和自动化工作流。关键点包括:
通过代码示例,可以看到 StateGraph 如何从简单线性工作流扩展到复杂的工具调用和循环逻辑。结合 LangChain 和 LangSmith,可以进一步增强开发效率和调试能力。
9.2 学习资源


原文地址:https://blog.csdn.net/u013172930/article/details/147962997




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