LangChain 还是 LangGraph?一个是编排一个是工具包

简介: 本文对比LangChain与LangGraph在真实代码审查流水线中的实践:二者API、Agent逻辑与Gemini 2.5 Flash调用完全一致。LangChain适合线性流程,简洁高效;LangGraph则以状态机支持条件分支、循环重试与人工干预,是复杂编排的唯一解。二者非替代关系,而是抽象层级互补——LangChain v1.0的Agent已构建于LangGraph之上。

现在介绍LangGraph 和 LangChain 的文章。每一篇的结论都差不多:简单流程用 LangChain,复杂的用 LangGraph。

但是简单和复杂都是相对的,如果是具体问题呢,比如说一个做代码分析、三个 Agent 串起来的流水线,到底该拿哪一个上线?

所以本文用同一个需求分别用两个框架实现,Agent、逻辑、Gemini 2.5 Flash 调用全部一致,一遍 LangChain,一遍 LangGraph。

两个框架到底在做什么

LangChain 是一个模块化工具包,提供 prompt 模板、文档加载器、retriever、输出解析器、memory 抽象这些零件,再把它们按线性顺序 A → B → C 串起来。像一条传送带:定义步骤,数据往前流,结束。

LangGraph 是一层编排。它把工作流建模成状态机 —— 节点是函数,边是转换 —— 而边可以是条件的。流水线可以循环、分支、重试,也能暂停等待人工输入。就是一张流程图。

不过从 LangChain v1.0(2025)开始,LangChain 自己的 Agent 抽象就是建在 LangGraph 之上的。所以这两个不是两个互相竞争的框架,而是同一个系统不同的抽象层级。

实验:同一条流水线,两个框架

测试用例是一条三阶段的代码审查流水线:

  1. Context agent —— 抓 PR diff 和仓库历史
  2. Analysis agent —— 在改动代码中定位问题
  3. Review agent —— 输出带严重程度评分的结构化反馈

BugLens 线上的 analysis agent 有时需要回头再去拉一轮 context 才能给出有把握的判断。正是这个条件回跳把我逼到了决策点。

LangChain 版本

 from langchain_core.prompts import ChatPromptTemplate  
from langchain_google_genai import ChatGoogleGenerativeAI  
from langchain_core.output_parsers import StrOutputParser  

llm = ChatGoogleGenerativeAI(model="gemini-2.5-flash")  
context_chain = (  
    ChatPromptTemplate.from_template("Analyze this PR diff: {diff}")  
    | llm  
    | StrOutputParser()  
)  
analysis_chain = (  
    ChatPromptTemplate.from_template("Find issues in: {context}")  
    | llm  
    | StrOutputParser()  
)  
review_chain = (  
    ChatPromptTemplate.from_template("Write review for: {analysis}")  
    | llm  
    | StrOutputParser()  
)  
# 线性执行  
def run_pipeline(diff: str):  
    context = context_chain.invoke({"diff": diff})  
    analysis = analysis_chain.invoke({"context": context})  
    review = review_chain.invoke({"analysis": analysis})  
     return review

干净、可读,五分钟能写完。问题在于:analysis 返回的置信度一旦偏低,整条链就会有问题 —— 得在链外面加 if/else,手动 re-invoke,再自己把状态拼回去。

LangGraph 版本

 from langgraph.graph import StateGraph, END  
from typing import TypedDict  

class ReviewState(TypedDict):  
    diff: str  
    context: str  
    analysis: str  
    review: str  
    confidence: float  
    iterations: int  
def context_node(state: ReviewState) -> ReviewState:  
    # 根据 diff 和仓库历史获取 context  
    context = fetch_context(state["diff"])  
    return {**state, "context": context}  
def analysis_node(state: ReviewState) -> ReviewState:  
    result = run_analysis(state["context"])  
    return {  
        **state,  
        "analysis": result["content"],  
        "confidence": result["confidence"],  
        "iterations": state.get("iterations", 0) + 1  
    }  
def review_node(state: ReviewState) -> ReviewState:  
    review = write_review(state["analysis"])  
    return {**state, "review": review}  
def should_loop(state: ReviewState) -> str:  
    # 置信度低则回头再取一轮 context  
    if state["confidence"] < 0.75 and state["iterations"] < 3:  
        return "fetch_more_context"  
    return "write_review"  
graph = StateGraph(ReviewState)  
graph.add_node("get_context", context_node)  
graph.add_node("analyze", analysis_node)  
graph.add_node("review", review_node)  
graph.set_entry_point("get_context")  
graph.add_edge("get_context", "analyze")  
graph.add_conditional_edges("analyze", should_loop, {  
    "fetch_more_context": "get_context",  
    "write_review": "review"  
})  
graph.add_edge("review", END)  
 pipeline = graph.compile()

前置代码多了不少,但是置信度阈值触发自动回跳;状态在节点之间自动流转,不用人工维护;后续要加 human-in-the-loop 审核时,一行

interrupt()

就够了 —— LangGraph 原生支持。

LangChain 依然占优的场景


LangChain 的 pipe 语法

chain1 | chain2 | chain3

用在线性流程上是真的漂亮。BugLens 里不需要分支的那些环节我还是用它:总结单个文件、从 diff 里抽结构化数据、给最终输出做格式化。不该分支的地方没必要背上 LangGraph 的开销。

更现实的一点是生态:LangChain 有 600+ 开箱即用的集成。要快速接一个向量库、PDF 加载器、外部 API,这套生态目前没有对手。LangGraph 并不是要替代它们,而是叠在上面。

反转:LangChain 1.0 内部跑的就是 LangGraph

大多数对比文章漏掉了这一条:从 LangChain v1.0 起,

AgentExecutor

事实上已经废弃,LangChain 新的 Agent 抽象在底层直接构建在 LangGraph 上。

现在调用

create_react_agent()

,跑的就是 LangGraph 状态机。真正的问题不是 LangChain 还是 LangGraph,而是想要 LangChain 那层更高的封装,还是想直接控制这张图。

先用 LangChain 的高层 API;撞到墙(循环、重试、条件分支、持久化)再往下落到 LangGraph。二者可以共存,不少生产系统同时用两套。

决策框架


其实可以两个都用。外层编排 —— GitHub webhook 事件路由、决定调用哪条 Agent 流水线、API 失败后的重试管理 —— 全部走 LangGraph;内层链 —— 格式化 diff、总结文件、解析结构化输出 —— 交给 LangChain LCEL。

总结

构建一条简单的 RAG 流水线或单步 LLM 工作流,LangChain 更快也更干净,没必要让 LangGraph 把复杂度压上去。

一旦涉及到多 Agent、条件逻辑、重试行为或需要持久化的状态,LangGraph 就不只是“更好”而已,它是唯一的选项;想在纯 LangChain 里复刻这套控制流,最后拼出来的正是 LangGraph 被造出来要替掉的那种缝合式状态管理。

https://avoid.overfit.cn/post/ecb8b4a277b0443ea312fe4c100aead6

by Satyabrata Mohanty

目录
相关文章
|
5月前
|
开发框架 人工智能 机器人
LangChain vs LangGraph:大模型应用开发的双子星框架
LangChain是大模型应用的“乐高积木”,提供标准化组件,助力快速构建简单应用;LangGraph则是“交通控制系统”,通过图结构支持复杂、有状态的工作流。两者互补,构成从原型到生产的一体化解决方案。
|
2月前
|
人工智能 Linux API
OpenClaw多Agent协作系统实操:本地+阿里云部署与千问/Coding Plan API配置全指南
2026年OpenClaw(原Clawdbot)推出的多Agent协作系统,彻底打破了单一AI智能体的能力边界,让多个AI Agent像人类团队一样实现智能分工、实时信息同步与灵活角色配置,可高效完成内容创作、软件开发、数据分析等复杂复合型任务。在实际落地过程中,开发者不仅需要掌握多Agent协作系统的基础使用逻辑,更需要完成OpenClaw在本地多系统(MacOS/Linux/Windows11)与阿里云的稳定部署,同时实现与阿里云千问大模型API、免费Coding Plan API的无缝对接,才能真正发挥多Agent协作的核心价值。本文将深度解析OpenClaw多Agent协作系统的核心
1022 10
|
3月前
|
人工智能 NoSQL Redis
LangGraph 入门:用图结构构建你的第一个多智能体工作流
LangGraph 是面向多智能体系统的图编排框架,以有向状态图替代线性链式调用。通过节点(智能体)、边(条件/静态跳转)和类型化共享状态三者解耦,天然支持分支、循环、并行与汇合;内置检查点、原子状态更新与Reducer机制,保障一致性、可调试性与容错恢复能力。
3048 1
|
24天前
|
存储 设计模式 缓存
为生产级 AI Agent 构建持久化记忆:五阶段流水线与四种设计模式
LLM Agent需持久化记忆以支撑连续对话、用户画像、知识沉淀与崩溃恢复。但满上下文方案成本高、延迟大、易出错。本文提出五阶段流水线(抽取→整合→存储→检索→遗忘)与四种记忆类型(工作/情景/语义/过程记忆),结合结构化状态+向量搜索等设计模式,实现高效、可控、可审计的生产级记忆系统。
468 9
为生产级 AI Agent 构建持久化记忆:五阶段流水线与四种设计模式
|
25天前
|
存储 人工智能 自然语言处理
Claude Opus 4.7 系统 Prompt 泄露:其中的10 个核心设计决策解读
刚发布的Claude 4.7 Prompt遭泄露,揭示其核心设计哲学:不只追求“更聪明”,更强调“自我约束”。它将心理重构、过度礼貌、工具犹豫等常见AI倾向视为风险信号,通过情感化规则、动态安全升级、隐式上下文记忆等10项机制,系统性抑制自身失败模式——真正目标是让模型清醒认知并管控自身的不可靠性。
176 2
Claude Opus 4.7 系统 Prompt 泄露:其中的10 个核心设计决策解读
|
21天前
|
Kubernetes Cloud Native 微服务
【微服务与云原生架构】 云原生核心:Docker、K8s架构、核心资源(Pod/Deployment/Service/Ingress)、Pod生命周期、健康检查、滚动更新、自动扩缩容HPA
本文系统梳理微服务与云原生架构的知识体系:以Docker实现环境一致与轻量交付,K8s提供容器编排底座;涵盖Pod、Deployment、Service、Ingress四大核心资源,以及健康检查、滚动更新、HPA自动扩缩容等关键能力,构建高可用、可弹性、可观测的现代分布式应用架构闭环。
|
16天前
|
机器学习/深度学习 人工智能 自然语言处理
大模型应用:TextRank+大模型:轻量化算法与大模型协同的文本摘要实践.99
本文提出“TextRank粗摘+大模型精摘”融合方案:用轻量TextRank快速提取核心句与关键词,再借大模型润色生成流畅、精准、场景适配的摘要。兼顾效率与质量,降低门槛与成本,适合论文、会议、内容等高频场景。
139 3
|
17天前
|
JSON 前端开发 API
【LangGraph新手村系列】(1)LangGraph 入门:StateGraph 与带记忆的 ReAct 循环
介绍 LangGraph 核心思想:用 StateGraph 把单次 LLM 调用串成可循环的 ReAct 工作流。通过节点、边与公共状态黑板,实现模型思考、工具调用、条件跳转的闭环,并引入检查点让 Agent 拥有跨轮次记忆。
251 0
【LangGraph新手村系列】(1)LangGraph 入门:StateGraph 与带记忆的 ReAct 循环
|
20天前
|
消息中间件 存储 Cloud Native
【消息队列MQ】主流消息队列MQ全方位对比:Kafka、RocketMQ、RabbitMQ、Pulsar
本文系统梳理Kafka、RocketMQ、RabbitMQ、Pulsar四大主流MQ的核心定位、架构差异、性能特性、运维生态及精准选型逻辑,覆盖从金融级可靠、高吞吐流处理到云原生多租户等全场景,助你构建结构化MQ知识体系,实现科学决策。