
文章目录理论概述是什么能干嘛怎么玩应用场景入门案例案例一案例二案例三理论概述是什么基于LangChain构建的、面向智能体多轮交互/状态持久化/分支并行执行的**图结构工作流框架。**LangGraph LangChain 图编排 状态机LangGraph是LangChain工作流的高级编排工县其中“高级”之处就是LangGraph能按照图结构来编排工作流。背景LangChain就像一条工作流水线原料 - A处理 - B处理 … - 最终产品上述模式清晰且高效比如先总结文本再翻译成英文”这种一步接一步的线性任务用Chain简直完美。但是现实世界是复杂的很多任务不是一条直线比如你让一个员工编写写一份小米su7跑车市场分析报告他的工作流程可能是这样的上网搜索相关资料。根据资料写出第一版草稿。他自己审阅草稿觉得哎呀数据不够支撑论点.于是他返回第一步进行新一轮的搜索补充更多数据。重写/修改草稿。他又觉得嗯结构有点乱.是他不搜索了而是直接对现有内容进行重新组织。最后他觉得ok,差不多了,才把报告交给你。分析这个过程充满了循环、判断和分支如果用LangChain来模拟上述过程会变得极其痛苦因为Chain天生就是一条单行线它很难实现”返回上一步”或者”根据条件跳转到某一步这种灵活的控制流。开发者需要写大量的、非常不优雅的”胶水代码”来强行实现循环整个逻辑会变得一团糟。总结一下LangChain的困境:Chain太流水线无法优雅地处理循环和条件分支不适合复杂任务。Agent太自由像个黑箱难以控制、调试和保证稳定性。解决方案LangGraph 提供了强大的的状态管理机制允许Agent在不同节点之间传递和维护信息从而实现长期的记忆和多轮对话能力。通过定义节点和边可以精确控制Agent的执行逻辑包括条件分支循环和并行执行等。Langgraph能够无缝集成各种外部工具如搜索引擎数据库、API等,让Agent能够获取实时信息执行特定操作极大地扩展了LLM的能力边界。图结构使得Agent的运行路径清晰可见便于理解Agent的决策过程并在出现问题时进行快速定位和调试。模块化与可复用性。每个节点都可以是一个独立的可复用的组件维护性高且易于扩展。通过于图机制复杂的工作流可以被分解为多个可独立开发和测试的模块提高了开发和测试效率适用场景不适用场景多步复杂推理简单的一次性查询建议使用 LangChain Chains长时间运行任务数小时、数天快速原型验证建议使用更高层级的工具需要人在环Human-in-the-loop追求生产级稳定性能干嘛彻底打破了“链”的束缚引入了“图”的结构提升构建复杂AI应用的可能性从一条直线变成了一张网怎么玩LangGraph灵魂State(状态) Node (节点) Edges (边) Graph(图)应用场景如果你只是想做一个简单的文档总结、RAG知识库检索问答或固定的表单抽取直接用LangChain LCEL会更轻量高效。但如果你的项目属于以下类型建议直接上LangGraph智能编程助手需要“生成代码 - 运行测试 - 报错反思 - 重新修改”的闭环。复杂自主 Agent目标模糊需要 Agent 自己规划多步、频繁调用不同工具且步骤无法预期的场景。审批流/工作流自动化需要人工介入Click to approve的企业级业务流程。入门案例案例一from typingimportTypedDictfrom langgraph.constantsimportSTART,ENDfrom langgraph.graphimportStateGraph#1.定义State可选但推荐classHelloState(TypedDict):name:str greeting:str #2.定义节点Node1# 节点就是函数负责具体业务功能 defadd_greeting(hello_state:HelloState)-dict:namehello_state[name]return{greeting:fHello, {name}!}# 因为返回的key和hello_state中的key相同会更新hello_state中的greeting字段 #3.定义节点Node2defadd_emoji(hello_state:HelloState)-dict:greetinghello_state[greeting]return{greeting:greeting }#4.构建图GraphgraphStateGraph(HelloState)#4.1添加节点 graph.add_node(add_greeting,add_greeting)graph.add_node(add_emoji,add_emoji)#4.1添加边 graph.add_edge(START,add_greeting)graph.add_edge(add_greeting,add_emoji)graph.add_edge(add_emoji,END)#5.编译 appgraph.compile()#6.运行 resultapp.invoke({name:朱鹏})print(result)print(fresult[name]:{result[name]})print(fresult[greeting]:{result[greeting]})#7.打印print(app.get_graph().print_ascii())#print(app.get_graph().draw_mermaid())案例二from langgraph.constantsimportSTART,ENDfrom langgraph.graphimportStateGraph# 需求在不接入LLM的情况下构建一个加减法图工作流 # 节点1:x1# 节点2:x-2#1.定义State【非必须】 #2.定义节点Node1defaddition(state):print(faddition节点{state})return{x:state[x]1}#3.定义节点Node2defsubtraction(state):print(fsubtraction节点{state})return{x:state[x]-2}#4.构建图GraphgraphStateGraph(dict)#4.1添加节点 graph.add_node(addition,addition)graph.add_node(subtraction,subtraction)#4.1添加边 graph.add_edge(START,addition)graph.add_edge(addition,subtraction)graph.add_edge(subtraction,END)#5.编译 appgraph.compile()#6.运行 resultapp.invoke({x:20})print(result)print(fresult[x]:{result[x]})案例三from typingimportTypedDict,Annotated,Listfrom langchain.chat_modelsimportinit_chat_modelfrom langgraph.constantsimportSTART,ENDfrom langgraph.graphimportStateGraph,add_messages from lang_chain.configimportOPENAI_API_KEY# 需求接入LLMSTART-大模型节点-END#1.定义StateclassMyState(TypedDict):# messages消息列表 #Annotated[List,add_messages]表示支持自动追加消息 messages:Annotated[List,add_messages]#2.定义节点Node1支持大模型 llminit_chat_model(modeldeepseek-chat,model_providerdeepseek,api_keyOPENAI_API_KEY,base_urlhttps://api.deepseek.com)defmodel_node(my_state:MyState):replyllm.invoke(my_state[messages])return{messages:reply}# 返回信息自动添加到消息列表 #3.构建图GraphgraphStateGraph(MyState)#4.1添加节点 graph.add_node(model_node,model_node)#4.1添加边 graph.add_edge(START,model_node)graph.add_edge(model_node,END)#5.编译 appgraph.compile()#6.运行 resultapp.invoke({messages:[LangGraph简介]})print(result)# result[messages][-1]取出状态中的 messages 字段的最后一条消息即最新的一条通常是AI的回复 #.content 取该消息对象的文本内容print(fresult[messages]:{result[messages][-1].content})