免费POC, 零成本试错
AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


我要投稿

被 LangChain 全家桶搞晕了?LangGraph、LangSmith、LangFlow 一文读懂

发布日期:2025-11-25 09:36:26 浏览次数: 1571
作者:龙丽坤

微信搜一搜,关注“龙丽坤”

推荐语

LangChain生态工具太多分不清?一文帮你理清LangGraph、LangSmith、LangFlow的核心定位与使用场景。

核心内容:
1. LangChain基础框架的模块化设计与LCEL粘合机制
2. LangGraph对复杂业务流程的图结构编排能力
3. LangSmith的可观测性与LangFlow可视化开发的价值定位

杨芳贤
53AI创始人/腾讯云(TVP)最具价值专家

 

如果你正开发大模型应用,那你肯定绕不开 LangChain。但很快,你就会发现它的生态里冒出了 LangGraph、LangSmith、LangFlow 等一堆“亲戚”,让人有点摸不着头脑。它们之间到底是什么关系?我的项目究竟该用哪个?

这篇文章就是为了把这事儿说清楚。我们会逐一拆解这四个工具,帮你理解它们各自是干什么的,解决了什么问题,以及什么时候该轮到谁上场。

简单来说,这是一个开发者从原型到生产的典型路径:

  • • LangChain: 基础框架,用来快速搭建应用原型。它提供了模块化的组件(Prompts, Models, Tools)和一套名为 LCEL 的粘合剂。适合构建线性的、一步接一步的工作流。
  • • LangGraph: 流程编排器,当你的应用逻辑变得复杂,需要循环、分支、重试时,就该它出场了。它把应用看作一个图,让你能精细控制状态和流程。这是构建生产级、有韧性的 Agent 的关键。
  • • LangSmith: 可观测性平台,你的“调试器”和“监控眼”。它能帮你追踪应用每一步的运行细节,评估效果,监控线上问题。它独立于框架,无论你用不用 LangChain 都能集成。
  • • LangFlow: 可视化构建器,一个拖拽式的画布,让你快速实验和搭建流程。非常适合团队协作、教学演示,或者是不熟悉代码的同事参与进来。

一个经验之谈:通常我们用 LangChain 起步,随着业务逻辑复杂化,迁移到 LangGraph,同时用 LangSmith 监控全程,而 LangFlow 则在需要快速验证想法或与团队沟通时发挥价值。

LangChain:构建工作流的基础

LLM 本身一次只能处理一个 Prompt,但实际应用往往是一系列操作的组合:获取数据、调用工具、总结思考、甚至向用户追问。LangChain 的核心价值就是把这些零散的步骤串联起来。

我喜欢把它看作一套用于 LLM 应用的“乐高积木”,提供了诸如 Prompts、Models、Memory、Tools、Retrievers 这些标准件。而将这些积木粘合起来的,就是 LCEL(LangChain Expression Language)

LCEL:用管道符 | 串联一切

LCEL 的设计哲学非常直观,就是用管道符 | 把不同的组件连接成一个可执行的链(Chain)。每个组件都是一个 Runnable 对象,可以无缝拼接。

来看个最简单的例子:

from langchain_openai import ChatOpenAI
from
 langchain_core.prompts import ChatPromptTemplate
from
 langchain_core.output_parsers import StrOutputParser

llm = ChatOpenAI(model="gpt-4o-mini")
prompt = ChatPromptTemplate.from_messages([
    ("system", "You are concise."),
    ("human", "{question}")
])
# 这就是 LCEL 的魔力:像搭管道一样把组件连起来

chain = prompt | llm | StrOutputParser()

# 单次调用

print
(chain.invoke({"question": "Give me 3 focus tips."}))

# 批量调用

qs = [{"question": q} for q in ["One tactic for RAG?", "Explain LCEL in 1 line."]]
print
(chain.batch(qs))

代码里,promptllm 和 StrOutputParser 三个部分通过 | 组合成一个 chain。这个 chain 不仅可以通过 invoke() 执行单次任务,还能用 batch() 并行处理多个输入,效率很高。这种声明式的写法让代码非常清晰。

结构化输出与工具调用

真实场景中,我们很少只需要纯文本回复。我们更希望 LLM 能返回格式化的数据(比如 JSON),或者调用外部工具(比如 API 查询)。

LangChain 结合 Pydantic 可以轻松实现结构化输出。通过 .with_structured_output() 方法,你可以告诉模型必须按照指定的 Pydantic 模型格式返回结果。

from pydantic import BaseModel, Field
from
 typing import List
from
 langchain_openai import ChatOpenAI

class
 TaskPlan(BaseModel):
    title: str
    steps: List[str] = Field(..., min_items=3, description="actionable steps")

structured_llm = ChatOpenAI(model="gpt-4o-mini").with_structured_output(TaskPlan)
plan = structured_llm.invoke("Plan a 20-minute deep-work session for AI Agent notes.")
print
(plan.model_dump())

这样一来,你得到的 plan 就是一个可以直接操作的 Python 对象,而不是一堆需要手动解析的字符串。

工具调用也同样简单。你可以用 @tool 装饰器把任何 Python 函数包装成一个 LLM 可以调用的工具,然后通过 .bind_tools() 方法“告诉”模型它有哪些工具可用。

from langchain_core.tools import tool
from
 langchain_openai import ChatOpenAI

@tool

def
 multiply(a: int, b: int) -> int:
    """This tool multiplies two numbers."""

    return
 a * b

llm = ChatOpenAI(model="gpt-4o-mini")
# 把工具“绑定”给模型

llm_with_tools = llm.bind_tools([multiply])

resp = llm_with_tools.invoke("What is 9*5? If needed, use a tool.")
print
(resp.tool_calls or resp.content)

当模型判断需要使用工具时,它的返回结果中就会包含工具调用的信息,包括工具名称和参数。

LangChain 在处理线性、简单的应用时非常得心应手。但如果你的逻辑开始出现“如果...那么...”、“重试 N 次”、“等待用户输入”这类情况,单纯的链式结构就显得力不从心了。这时候,就轮到 LangGraph 登场。

LangGraph:为复杂 Agent 打造的流程引擎

可以把 LangGraph 理解为构建在 LangChain 组件之上的、更强大的流程编排引擎。它不再把应用看作一条直线,而是一个状态图(State Graph)

这个概念听起来有点抽象,我用一个比喻来解释:

想象一下,你的应用是一个机器人,它背着一个**背包(State)一张流程图(Graph)上移动。图上的每个站点(Node)**都是一个具体的操作(比如调用 LLM、执行工具)。机器人每到一个站点,就会从背包里拿出当前的信息,完成任务,再把新的信息放回背包。**箭头(Edge)**则决定了机器人下一步该去哪个站点。

这种模式天然适合处理复杂的逻辑:

  • • 分支:可以根据背包里的状态,决定走不同的箭头。
  • • 循环:可以让箭头指回之前的站点,实现循环追问或重试。
  • • 持久化:可以随时把背包里的状态存起来,下次接着用。

一个基础的 Graph

我们来看一个最基础的 LangGraph 应用,它只有一个调用模型的节点。

from typing import TypedDict, Annotated, List
from
 langgraph.graph import StateGraph, START, END
from
 langgraph.graph.message import add_messages
from
 langchain_openai import ChatOpenAI
from
 langchain_core.messages import HumanMessage

# 这就是那个“背包”,定义了应用的状态

class
 State(TypedDict):
    # messages 会自动累积聊天记录

    messages: Annotated[List, add_messages]

llm = ChatOpenAI(model="gpt-4o")

# 这是一个“站点”,接收当前状态,调用模型,并返回要更新的状态

def
 model_node(state: State):
    reply = llm.invoke(state["messages"])
    return
 {"messages": [reply]}

# 开始构建图

graph_builder = StateGraph(State)
graph_builder.add_node("model", model_node) # 添加一个名为 "model" 的节点
graph_builder.add_edge(START, "model")      # 从起点连接到 "model" 节点
graph_builder.add_edge("model", END)        # 从 "model" 节点连接到终点

# 编译图,得到一个可执行的应用

app = graph_builder.compile()

# 运行

initial_state = {"messages": [HumanMessage(content="Explain LangGraph in one sentence.")]}
result = app.invoke(initial_state)
print
(result["messages"][-1].content)

这段代码的核心是 StateGraph。我们定义了状态 State,然后添加节点和边,最后 compile() 得到一个可运行的 app

引入分支逻辑

LangGraph 真正的威力体现在处理分支上。我们可以定义一个“路由”函数,它根据当前状态决定下一步该走向哪个节点。

# ... (省略 State, llm 的定义)

def
 answer_node(state: State):
    return
 {"messages": [llm.invoke(state["messages"])]}

def
 clarify_node(state: State):
    return
 {"messages": [AIMessage(content="Could you share a bit more so I can be precise?")]}

# 这是一个路由函数

def
 route(state: State):
    last_human_message = next((m for m in reversed(state["messages"]) if m.type == "human"), None)
    if
 not last_human_message or len(str(last_human_message.content).split()) < 3:
        return
 "clarify" # 如果问题太短,就去 clarify 节点
    else
:
        return
 "answer"  # 否则去 answer 节点

graph_builder = StateGraph(State)
graph_builder.add_node("answer", answer_node)
graph_builder.add_node("clarify", clarify_node)

# 添加一个条件边,由 route 函数决定走向

graph_builder.add_conditional_edges(
    START,
    route,
    {"answer": "answer", "clarify": "clarify"}
)

graph_builder.add_edge("answer", END)
graph_builder.add_edge("clarify", END)
app = graph_builder.compile()

通过 add_conditional_edges,我们实现了一个简单的智能路由:如果用户的问题太简短,就先追问一句;否则直接回答。这正是构建健壮 Agent 所需的控制能力。再我看来,这是 LangGraph 比 Langchian 强大的地方。

LangSmith:让你的应用不再是黑盒

开发 LLM 应用一个很大的痛点是调试。当应用出问题时,你很难知道是哪个环节的 Prompt 写得不好,还是工具调用失败了。LangSmith 就是解决这个问题的。

它是一个**可观测性(Observability)**平台,可以捕获你的应用每一次运行的完整轨迹(Trace),包括:

  • • 每个节点的输入和输出。
  • • LLM 调用的具体 Token 数和耗时。
  • • 工具调用的参数和返回结果。
  • • 发生的任何错误。

集成 LangSmith 非常简单,通常只需要设置几个环境变量。一旦启用,你就可以在它的 Web UI 上看到详尽的运行日志,对于定位问题和优化性能非常有帮助。

更重要的是,LangSmith 还提供了一套**评估(Evaluation)**框架。你可以创建数据集,针对应用的每次修改跑回归测试,或者通过人工标注、模型打分等方式来量化应用的表现。这对于保证应用质量、防止效果退化至关重要。

它的一个巨大优势是框架不可知(Framework-Agnostic),无论你的应用是不是用 LangChain 或 LangGraph 写的,都可以接入 LangSmith 进行监控。

LangFlow:拖拽式搭建 AI 应用

LangFlow 提供了一个可视化的画布,让你通过拖拽组件和连接线的方式来构建 LangChain 应用。

这对于以下场景特别有用:

  • • 快速原型:当你有一个想法,想快速验证它是否可行时,用 LangFlow 拖拽几下就能搭出原型,比写代码快得多。
  • • 团队协作:可以让不写代码的产品经理或设计师在画布上设计应用逻辑,然后导出成 JSON 文件或 Python 代码交给工程师实现。
  • • 教学演示:在工作坊或教学中,用图形化界面来解释 LangChain 的概念会非常直观。

你可以把 LangFlow 理解为一个“AI 应用的 Visio”。它降低了上手的门槛,让更多人能参与到 AI 应用的构建中来。当流程稳定后,可以一键导出为可部署的代码,交给工程师去完善。将想法快速得转化为代码,这点非常棒。

四者对比:一张图看懂如何选择

为了让你更清晰地了解它们的分工,我整理了下面这张表格:

类别LangChainLangGraphLangSmithLangFlow
一句话定位
LLM 应用的模块化构建基础框架
复杂、有状态的流程编排引擎
应用的可观测性与评估平台
可视化
的拖拽式应用构建器。
核心组件
Chains, Runnables, LCEL
Nodes, Edges, State, Routers
Traces, Datasets, Evaluators
画布、组件、连接线
工作流结构
线性或有向无环图 (DAG),主要是单向流动。
完整的图结构,支持循环、分支和暂停。
它不执行工作流,而是记录和评估工作流。
可视化的图,最终导出为 LangChain 代码。
状态管理
通常是隐式或组件内部局部管理。
中心化、显式
的状态对象,贯穿整个图,支持持久化。
存储运行的元数据、输入输出和评估指标。
组件的配置保存在流程的 JSON 文件中。
适用场景
快速原型验证、逻辑简单的线性应用(如简单 RAG)。
生产级的 Agent、多智能体协作、需要重试和容错的复杂应用。
调试、回归测试、线上监控、A/B 测试。
教学、团队协作、快速搭建原型、与非技术人员沟通。
学习曲线
简单,API 直观。
较陡峭,需要理解图和状态的概念。
非常简单,通常只需配置环境变量。
最简单,几乎没有代码门槛。


希望这篇文章能帮你理清 LangChain 生态中这些工具的关系。记住,它们不是相互竞争,而是一个从简单到复杂、从开发到生产的完整工具链。选择合适的工具,才能事半功倍。

 


53AI,企业落地大模型首选服务商

产品:场景落地咨询+大模型应用平台+行业解决方案

承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

添加专属顾问

回到顶部

加载中...

扫码咨询