当前位置: 首页 > news >正文

LangGraph 那点事

1. 概述

1.1 什么是LangGraph

LangGraph是由LangChain公司开发的一个库,用于构建基于大型语言模型(LLM)的有状态多主体应用程序,特别适用于创建智能体(Agent)和多智能体工作流。LangGraph能够让开发者构建具有循环功能的计算图,这在传统的链式结构(Chain)或有向无环图(DAG)中是无法实现的。通过LangGraph,开发者可以创建更加灵活、动态的智能体系统,能够处理更复杂的任务流程。

1.2 核心概念

1.2.1 状态图(StateGraph)

LangGraph的核心是StateGraph类,用于表示整个图结构。初始化时需要定义一个状态对象,这个状态对象会随着图的执行而更新。

1.2.2 节点(Nodes)

节点是图中的处理单元,可以是函数或LangChain的可运行组件。节点接收状态对象作为输入,并返回要更新的状态属性。

1.2.3 边(Edges)

边定义了节点之间的执行流程和数据流向。有两种类型的边:

  • 普通边:固定的流向

  • 条件边:基于节点输出的条件决定下一步去向

1.2.4 状态(State)

状态是在图执行过程中维护的中央数据对象。状态的属性可以通过两种方式更新:

  • 完全覆盖:节点返回一个新值来替换原属性

  • 添加:节点返回值会被添加到现有属性(适用于列表等)

1.2.5 循环(Cycles)

LangGraph的一个重要特性是能够创建循环流程,允许LLM在循环中进行推理决策,这对于构建智能体系统至关重要。

1.3 为什么需要LangGraph?

随着企业逐渐向更智能、数据驱动的组织发展,对于不仅仅能回答简单问题的系统需求正在迅速增加。企业不再满足于只能响应提示的AI系统,他们需要能够思考、计划和行动的系统。这些下一代系统必须能够:

  • 在多步骤过程中进行协调
  • 选择最合适的技术或数据源
  • 检索和推理上下文信息
  • 在无需持续人工干预的情况下自主执行决策

img

2. 技术架构

2.1 工作流类型

  • 顺序工作流
  • 条件分支工作流
  • 循环工作流
  • 并行工作流

2.2 LangGraph 与 LangChain 对比

特性LangChain(Chain)LangGraph(Graph)
控制流程线性可分支、循环、并行
复杂度管理较难模块化、清晰可控
多 Agent 协作较难实现易于设计多个节点交互
适合任务类型单步/固定任务多步骤、有状态流程
智能体开发不适合 ❌适合 ✅

2.3 图结构的三大要素

LangGraph的核心构建在三个关键要素之上:

节点(Node):代表一个独立单元,可以是:

  • Agent节点:封装独立Agent能力
  • Tool节点:调用具体工具
  • END节点:流程结束的标识

边(Edge):标注状态流转的决策路径,决定下一步跳转到哪个节点:

  • 顺序执行(线性流程)
  • 条件跳转(基于状态的动态路由)

状态(State):贯穿整个流程,记录数据或交互状态,驱动节点间的流转

这种设计使得LangGraph高度模块化和直观,特别适合需要遵循程序逻辑和条件分支的企业系统。

img

3.LangGraph的状态管理与工作流构建

状态管理是LangGraph的核心特性之一,它通过Pydantic模型来定义和维护整个工作流的共享状态。

3.1状态定义与管理

LangGraph使用TypedDict或Pydantic来定义状态结构,每个节点都可以访问和修改这个共享状态:

class AgentState(TypedDict):messages: List[BaseMessage]  # 对话历史agent_outcome: str    # 下一步决策      tool_response: str    # 工具调用结果   

   

img

3.2节点的实现

节点是执行具体功能的处理单元,它们接收当前状态并返回更新后的状态:

def agent_decision_node(state: AgentState) -> dict:# 分析用户意图并做出决策last_message = state["messages"][-1].content# 基于意图返回下一步行动return {"agent_outcome": decision}

img

3.3工作流的组装

通过StateGraph类,我们可以将节点和边组装成完整的工作流:

workflow = StateGraph(AgentState)
workflow.add_node("agent", agent_decision_node)
workflow.add_edge("agent", "tool")
workflow.set_entry_point("agent")

img

4. LangGraph的高级特性与最佳实践

LangGraph提供了许多高级特性,使其能够处理更复杂的场景。

4.1条件路由与动态决策

LangGraph支持条件边,可以根据状态动态决定执行路径:

def router(state):if state["intent"] == "technical":return "expert_agent"else:return "review_agent"
​
workflow.add_conditional_edges("intent_agent", router)

4.2 循环控制与迭代优化

与传统的DAG(有向无环图)不同,LangGraph支持循环结构,这使得实现多轮决策和重试机制成为可能:

  • 验证-修正循环:不断改进输出直到满足质量标准

  • 自我反思模式:通过反馈循环持续优化结果

  • 树搜索决策:支持深度优先或广度优先的搜索策略

img

4.3可视化与调试

LangGraph提供了强大的可视化功能,可以直观地展示工作流结构:

# 生成Mermaid图表
mermaid_code = graph.get_graph().draw_mermaid()
# 保存为PNG图片
app.get_graph().draw_mermaid_png(output_file_path="workflow_graph.png")

img

6. demo代码

import os
from typing import TypedDict
​
from langchain_community.chat_models import ChatOpenAI
from langgraph.constants import START
from langgraph.graph import StateGraph, END
​
# 设置OpenAI API密钥
os.environ["OPENAI_API_KEY"] = "mykey"
​
# 初始化LLM
llm = ChatOpenAI(model="gpt-3.5-turbo")
​
​
# 定义状态类型
class State(TypedDict):user_input: strquery_type: stranswer: str
​
​
# 定义节点函数
def classify_query(state: State) -> dict:"""分类节点:判断用户输入的问题类型"""prompt = f"""你是一个智能客服助手,需要判断用户的问题属于以下哪种类型:1. 产品咨询2. 技术支持3. 售后服务4. 其他问题用户输入:{state['user_input']}请只返回类型名称,不要其他内容。"""res = llm.invoke(prompt)
​if "产品咨询" in res.content:return {"query_type": "product"}elif "技术支持" in res.content:return {"query_type": "technical"}elif "售后服务" in res.content:return {"query_type": "service"}else:return {"query_type": "other"}
​
​
def handle_product_query(state: State) -> dict:"""处理产品咨询"""prompt = f"""你是一个专业的产品顾问,请回答用户关于产品的咨询。用户问题:{state['user_input']}"""res = llm.invoke(prompt)return {"answer": res.content}
​
​
def handle_technical_query(state: State) -> dict:"""处理技术支持"""prompt = f"""你是一个专业的技术支持工程师,请回答用户的技术问题。用户问题:{state['user_input']}"""res = llm.invoke(prompt)return {"answer": res.content}
​
​
def handle_service_query(state: State) -> dict:"""处理售后服务"""prompt = f"""你是一个专业的售后服务顾问,请回答用户关于售后服务的问题。用户问题:{state['user_input']}"""res = llm.invoke(prompt)return {"answer": res.content}
​
​
def handle_other_query(state: State) -> dict:"""处理其他问题"""return {"answer": "抱歉,您的问题超出了我的服务范围,请稍后联系人工客服。"}
​
​
# 创建图
graph = StateGraph(State)
​
# 添加节点
graph.add_node("classify", classify_query)
graph.add_node("product", handle_product_query)
graph.add_node("technical", handle_technical_query)
graph.add_node("service", handle_service_query)
graph.add_node("other", handle_other_query)
​
# 添加边
graph.add_edge(START, "classify")
​
​
# 定义路由函数
def router(state: State):if state["query_type"] == "product":return "product"elif state["query_type"] == "technical":return "technical"elif state["query_type"] == "service":return "service"else:return "other"
​
​
# 添加条件边
graph.add_conditional_edges("classify",router,{"product": "product","technical": "technical","service": "service","other": "other"}
)
​
# 添加结束边
graph.add_edge("product", END)
graph.add_edge("technical", END)
graph.add_edge("service", END)
graph.add_edge("other", END)
​
# 编译图
app = graph.compile()
​
if __name__ == "__main__":# 测试不同的问题test_questions = ["这个产品的保修期是多久?","我的电脑无法开机怎么办?","如何申请退货?","今天天气怎么样?"]
​for question in test_questions:print(f"\n用户问题: {question}")result = app.invoke({"user_input": question})print(f"回答: {result['answer']}")

6. 总结

LangGraph作为一个新兴的AI应用开发框架,为构建复杂的AI工作流提供了强大的支持。它的出现大大简化了AI应用的开发过程,特别适合需要复杂逻辑处理的场景。随着AI技术的不断发展,LangGraph有望在更多领域发挥重要作用。

http://www.dtcms.com/a/349104.html

相关文章:

  • 自定义SpringBoot的自动配置
  • 从零到精通:如何用 Python 高效查找数组中出现频率最高的元素
  • leetcode刷题记录04——top100题里的7道中等题
  • 网络编程-创建TCP协议服务器
  • 后端Web实战-Java代码操作数据库
  • 跨摄像头追踪精度↑79%!陌讯动态决策模型在智慧园区的落地实践
  • 跨摄像头追踪准确率↑18%!陌讯时空感知算法在智慧安防的实战解析
  • 复杂场景鲁棒性突破!陌讯自适应融合算法在厂区越界检测的实战优化​
  • 使用Localtunnel搭建与外网交互简单的https本地服务器
  • 时序数据库选型“下半场”:从性能竞赛到生态博弈,四大主流架构深度横评
  • Windows 系统下 Android SDK 配置教程
  • 【数据结构与算法】并查集
  • 对象作为HashMap的key的注意事项
  • kubernetes集群搭建
  • 【贪心算法】day2
  • Golang云端编程入门指南:前沿框架与技术全景解析
  • 初探机器学习:从概念定义到前沿应用
  • 湖南(源点咨询)市场调研如何在行业研究中快速有效介入(尾篇)
  • mpv - write_video 流程解析
  • 从技术精英到“芯”途末路:一位工程师的沉沦与救赎
  • 暖色调街头人像摄影照片Lr调色教程,手机滤镜PS+Lightroom预设下载!
  • OpenHarmony Audio子系统全栈解码:从HDI驱动到DSP算法的低延迟高保真之路
  • SQL Server缩小日志文件.ldf的方法(适用于开发环境)
  • 复杂水域场景识别率↑89%!陌讯多模态融合算法在岸边垃圾检测的落地实践
  • Python学习笔记之(二)变量和简单的数据类型
  • 鸿蒙中Image白块问题分析与解决方案
  • Java:HashMap的使用
  • 2025/8/24 DockerDesktop安装使用
  • 云原生俱乐部-RH294知识点归纳(3)
  • Python内置函数全解析:30个核心函数语法、案例与最佳实践指南