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

LangGraph解析

随着大语言模型(LLM)技术的快速发展,AI应用的需求已经从简单的问答扩展到了复杂的多步骤任务处理、多智能体协作等场景。传统的线性链式开发方式在面对这些复杂需求时显得力不从心。LangGraph应运而生,它是一个用于构建有状态、多智能体AI应用的开源框架,采用图(Graph)结构来编排复杂工作流,为开发者提供了更强大和灵活的工具。

本文将基于LangGraph的官方文档和实践经验,从基础概念到核心机制,再到实际应用案例,全面深入地解析LangGraph的技术原理和应用方法,帮助开发者掌握这一强大的AI应用开发框架。

一、LangGraph基础概览

1.1 核心理念:图驱动的工作流

LangGraph将AI应用的逻辑抽象为一张由"节点"(Nodes)和"边"(Edges)构成的状态图。下图清晰展示了这种结构与执行方式:

在LangGraph的图结构中,每个组件都有明确的职责:

组件定义功能示例
节点(Nodes)独立的执行单元处理数据,执行操作调用LLM、执行工具函数、查询数据库
边(Edges)流程控制逻辑决定下一步执行哪个节点固定连接、条件分支、动态路由
状态(State)共享的数据结构保存上下文信息消息历史、查询结果、中间状态

1.2 主要特点与优势

LangGraph相比传统的AI应用开发框架,具有以下显著特点:

特性说明应用场景
循环与条件分支支持智能体的"思考-行动"循环,动态改变执行路径需要多轮决策的任务
内置状态管理通过检查点自动持久化状态,支持断点续执行长时间运行的应用
人机协同可在流程中暂停并等待人工输入或审批高风险或需要把关的场景
多智能体协作原生支持定义多个智能体,编排协同工作复杂的团队协作任务
可观测性与LangSmith集成,提供可视化调试开发和调试阶段

1.3 生态系统与使用方式

LangGraph提供了灵活的集成路径,开发者可以根据需求选择不同的使用方式:

使用方式特点适用场景
独立使用作为底层框架,自定义智能体系统有特殊需求的开发者
与LangChain集成无缝兼容LangChain生态中的模型、工具已熟悉LangChain的开发者
高级组件使用预构建的智能体模式快速开发常见应用
商业平台提供部署、托管、监控等生产级功能企业用户

1.4 LangGraph与LangChain的区别

特性LangChainLangGraph
核心抽象链(Chain),线性编排状态图(Stateful Graph),带循环和分支
适用场景RAG、文档处理、一次性问答智能体、多轮对话、自动化流程、多智能体系统
状态管理通过Memory组件传递上下文内置的、中心化的状态管理

二、LangGraph图的关键概念

2.1 智能体(Agent)

智能体是LangGraph中最基础也是最重要的概念之一。

工作原理
特性说明
核心机制LLM基于环境反馈循环使用工具
实现复杂度相对简单,但需要清晰的工具集设计
适用场景开放性问题,无法预测所需步骤数量
关键要求需要良好的工具集和文档设计

2.2 工作流(Workflow)

2.2.1 并行化(Parallelization)

并行化是指让多个LLMs同时处理一个任务,并通过编程方式对它们的输出结果进行聚合。

两种主要变体

类型说明示例
分段(Sectioning)将任务分解成多个相互独立的子任务生成报告的不同部分(摘要、方法、结果)
投票(Voting)对同一个任务运行多次,综合多个结果多个LLMs进行情感分析,投票确定结果

并行化的适用场景

场景优势
提高速度显著缩短处理时间
提高置信度综合多个结果,提高可靠性
复杂任务处理每个LLM专注于特定方面

2.2.2 路由(Router)

路由的工作是将输入进行分类,并将其导向到相应的后续任务。

路由的作用说明
输入分类与任务导向根据输入内容导向合适的处理流程
分离关注点每个任务专注于特定领域
避免性能受损不同输入类型分配给最适合的处理任务

2.2.3 协调者(Orchestrator)

在协调者-工作者模式中,一个协调者将任务分解并将每个子任务分配给工作者。

组件职责
协调者动态分解任务,分配子任务,综合结果
工作者处理分配的特定子任务

与并行化模式的区别

特性并行化模式协调者-工作者模式
子任务定义预先定义好的动态生成的
灵活性相对固定高度灵活
适用场景已知结构的任务无法预测子任务的复杂任务

2.2.4 评估者-优化器(Evaluator-optimizer)

适用场景说明
明确的评估标准存在清晰的质量衡量标准
迭代改进的价值每次调整都能显著提升结果
人类反馈有效LLM能够理解并应用人类反馈
LLM反馈能力LLM能够提供有效的评估和改进建议

三、深度理解LangGraph核心:Graph

3.1 Graph的基本组成

Graph是LangGraph的基本构建模块,它是一个有向无环图(DAG),用于描述任务之间的依赖关系。

元素定义说明
State(状态)共享的数据结构在整个应用当中共享,包含所有节点的状态
Node(节点)处理数据的单元Python函数,以State为输入,返回更新后的State
Edge(边)依赖关系Python函数,根据当前State决定下一步执行哪个Node

3.2 State状态

3.2.1 State的定义方式

使用TypedDict定义

from typing import TypedDict ​ class OverallState(TypedDict): foo: str user_input: str graph_output: str

使用Pydantic BaseModel定义

from pydantic import BaseModel ​ class OverallState(BaseModel): a: str
定义方式特点适用场景
TypedDict轻量级,类型提示简单状态结构
Pydantic BaseModel支持验证、序列化需要数据验证的场景

3.2.2 State的更新机制

更新策略说明示例
默认替换直接替换字段值return {"a": "goodbye"}
合并操作使用add_messages、add等操作messages: Annotated[list[AnyMessage], add_messages]

MessagesState便捷使用

from langgraph.graph import MessagesState ​ # 直接使用,无需手动定义 state = MessagesState()

3.3 Node节点

3.3.1 Node的基本定义

def node_1(state: InputState) -> OverallState: return {"foo": state["user_input"] + "> 长沙市"}
特性说明
输入State对象(必选)+ config(可选)
输出更新后的State对象
命名唯一字符串,未指定时使用函数名

3.3.2 Node的高级特性

特性说明示例
缓存机制相同输入优先从缓存获取结果cache_policy=CachePolicy(ttl=5)
重试机制失败时自动重试retry=RetryPolicy(max_attempts=4)

缓存示例

from langgraph.types import CachePolicy from langgraph.cache.memory import InMemoryCache ​ builder.add_node("node1", node_1, cache_policy=CachePolicy(ttl=5)) graph = builder.compile(cache=InMemoryCache()) ​ # 第一次调用:执行节点逻辑 graph.invoke({"number": 5}, config={"configurable": {"user_id": "123"}}) ​ # 第二次调用:从缓存获取 graph.invoke({"number": 5}, config={"configurable": {"user_id": "456"}})

3.4 Edge边

3.4.1 边的类型

边类型说明示例
普通边固定连接两个节点builder.add_edge("node_1", "node_2")
条件边根据状态动态选择下一个节点builder.add_conditional_edges(START, routing_func)
Send动态路由一个节点同时路由到多个节点Send("node1", {"msg": message})

3.4.2 普通边和EntryPoint

from langgraph.constants import START, END ​ builder.add_edge(START, "node_1") builder.add_edge("node_1", "node_2") builder.add_edge("node_2", END)

3.4.3 条件边

def routing_func(state: State) -> str: if state["number"] > 5: return "node1" else: return END ​ builder.add_conditional_edges(START, routing_func)

使用映射的方式

def routing_func(state: State) -> bool: return state["number"] > 5 ​ builder.add_conditional_edges( START, routing_func, {True: "node_a", False: "node_b"} )

3.4.4 Send动态路由

from langgraph.types import Send ​ def routing_func(state: State): result = [] for message in state["messages"]: result.append(Send("node1", {"msg": message})) return result ​ builder.add_conditional_edges(START, routing_func)

3.5 子图的使用

创建子图

# 子图构建 subgraph_builder = StateGraph(State) subgraph_builder.add_node("sub_node", sub_node_function) subgraph_builder.add_edge(START, "sub_node") subgraph_builder.add_edge("sub_node", END) subgraph = subgraph_builder.compile() ​ # 父图构建 builder = StateGraph(State) builder.add_node("subgraph_node", subgraph) builder.add_edge(START, "subgraph_node") builder.add_edge("subgraph_node", END) graph = builder.compile()

3.6 图的Stream支持

Stream模式说明适用场景
values流式传输状态的完整值需要查看每步的完整状态
updates流式传输更新内容只关心状态变化
custom流式传输自定义数据调试和监控
messages流式传输LLM的Token实时显示LLM响应
debug传输尽可能多的信息深度调试

Custom Stream示例

from langgraph.config import get_stream_writer ​ def node(state: State): writer = get_stream_writer() writer({"自定义key": "在节点内返回自定义信息"}) return {"answer": "some data"} ​ for chunk in graph.stream(inputs, stream_mode="custom"): print(chunk)

四、LangGraph实战:SQLAgent实现

4.1 SQL应用场景

场景说明
自然语言查询用户用自然语言查询数据库
数据分析自动生成SQL并执行分析
报表生成根据需求自动生成报表

4.2 langchain_community的使用

4.2.1 安装

pip install langchain-community pip install langchain-community[sql]

4.2.2 基本使用

from langchain_community.utilities import SQLDatabase from langchain_community.agent_toolkits import SQLDatabaseToolkit ​ db = SQLDatabase.from_uri("sqlite:///Chinook.db") toolkit = SQLDatabaseToolkit(db=db, llm=llm) tools = toolkit.get_tools()

4.2.3 主要功能模块

模块功能
utilities实用工具类,如SQLDatabase
agent_toolkits智能体工具包,如SQLDatabaseToolkit
llms各种LLM集成
chat_models聊天模型集成

4.3 SQL智能体的创建

完整示例

import asyncio from langchain.agents import create_agent from langchain.chat_models import init_chat_model from langchain_community.utilities import SQLDatabase from langchain_community.agent_toolkits import SQLDatabaseToolkit ​ llm = init_chat_model("deepseek:deepseek-chat") db = SQLDatabase.from_uri("sqlite:///Chinook.db") toolkit = SQLDatabaseToolkit(db=db, llm=llm) tools = toolkit.get_tools() ​ system_prompt = """ 你是SQL数据库智能体,根据问题生成正确的{dialect}查询语句。 限制查询结果最多{top_k}条,只查询相关列。 严禁执行INSERT、UPDATE、DELETE等操作。 开始时必须查看表结构。 """.format(dialect=db.dialect, top_k=10) ​ agent = create_agent(llm, tools, system_prompt=system_prompt) ​ async def main(): async for step in agent.astream( {"messages": [{"role": "user", "content": "哪种音乐类型的曲目平均时长最长?"}]}, stream_mode="values" ): step["messages"][-1].pretty_print() ​ asyncio.run(main())

4.4 SQL工具介绍

工具功能
sql_db_query执行SQL查询语句
sql_db_schema获取数据库表结构信息
sql_db_list_tables获取所有可用表名
sql_db_query_checker安全验证SQL查询

4.5 MCP Server Chart集成

集成示例

import asyncio from langchain_mcp_adapters.client import MultiServerMCPClient ​ mcp_client = MultiServerMCPClient({ "mcp-server-chart": { "command": "npx", "args": ["-y", "@antv/mcp-server-chart"], "transport": "stdio" } }) ​ mcp_tools = asyncio.run(mcp_client.get_tools()) agent = create_agent(llm, tools + mcp_tools, system_prompt=system_prompt)

MCP特点

特性说明
MCP协议支持提供MCP适配器功能
多服务器连接支持连接多个MCP服务器
工具集成将外部工具集成到智能体
图表生成支持数据可视化

五、LangGraph本地服务器与UI界面

5.1 配置langgraph.json

{ "$schema": "https://langgra.ph/schema.json", "dependencies": ["."], "graphs": { "agent": "./main.py:agent", "sql_agent": "./example/pro2/sql_agent.py:agent" }, "env": ".env", "image_distro": "wolfi" }
配置项说明
$schemaSchema定义
dependencies依赖关系
graphs图的入口点
env环境变量文件
image_distro镜像发行版

5.2 启动服务器

langgraph dev

5.3 UI界面功能

功能说明
实时聊天交互与智能体实时对话
工具调用可视化显示工具调用过程
状态追踪追踪状态变化
调试功能详细的调试信息
http://www.cnnetsun.cn/news/688986.html

相关文章:

  • Z-Image-Turbo_UI界面批量处理实战:自动化生成系列风格图像
  • 文档矫正实战案例:处理弯曲变形文档的高级技巧
  • SenseVoice Small性能测试:不同语言识别准确率对比
  • ComfyUI图文教程:一步步教你点击【运行】生成第一张图
  • 无需公网IP:麦橘超然内网穿透部署完整操作手册
  • GPEN人像增强实战:批量处理多张照片的自动化脚本
  • Sambert多情感TTS应用:智能窗帘控制语音
  • MGeo + Jupyter Notebook实战:可视化调试地址匹配模型教程
  • bert-base-chinese优化指南:中文分词器定制
  • ModbusPoll下载用于多设备RTU网络调试的操作指南
  • 零基础入门ES搜索原理:倒排索引通俗解释
  • cv_unet_image-matting如何避免重复命名冲突?输出管理策略
  • 零基础搭建语音转文字系统:Paraformer+Gradio实战教程
  • 通义千问2.5-7B模型解析:70亿参数的全能型设计
  • 从零打造个性化语音|基于Voice Sculptor镜像的细粒度声音控制全指南
  • 电商搜索实战:用BGE-Reranker-v2-m3打造精准商品推荐
  • PaddlePaddle-v3.3优化实践:Early Stopping防止过拟合策略
  • Qwen3-4B-Instruct-2507依赖管理:Python包冲突解决方案
  • 数据中台中的数据资产管理:元数据管理与数据血缘
  • L298N驱动直流电机的PCB布线深度剖析
  • HY-MT1.5端侧优化秘籍:云端训练+本地部署全流程
  • LangChain LCEL 工具调用实战:从确定性链到动态 Agent
  • ACE-Step前端集成:Web页面交互式音乐生成器开发
  • 新手友好!Qwen-Image-Layered Docker部署全流程
  • Qwen3-4B-Instruct部署扩展性设计:未来升级路径规划
  • 精确制导——运用系统思维定义问题的真正边界
  • [特殊字符] AI 印象派艺术工坊快速部署:HTTP按钮点击即用实战指南
  • LangFlow ROI分析:企业AI开发效率提升300%的真实案例
  • 测评SenseVoiceSmall镜像能力,真实语音场景下表现亮眼
  • 亲测BERT智能语义填空:中文文本补全效果超预期