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

本文较长,建议点赞收藏。更多AI大模型应用开发学习视频及资料,在智泊AI

如果你正开发大模型应用,那你肯定绕不开 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 对象,可以无缝拼接。

来看个最简单的例子:

python 复制代码
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))

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

结构化输出与工具调用

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

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

python 复制代码
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() 方法"告诉"模型它有哪些工具可用。

python 复制代码
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 应用,它只有一个调用模型的节点。

python 复制代码
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 真正的威力体现在处理分支上。我们可以定义一个"路由"函数,它根据当前状态决定下一步该走向哪个节点。

python 复制代码
# ... (省略 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 应用的构建中来。当流程稳定后,可以一键导出为可部署的代码,交给工程师去完善。将想法快速得转化为代码,这点非常棒。

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

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

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

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

学习资源推荐

如果你想更深入地学习大模型,以下是一些非常有价值的学习资源,这些资源将帮助你从不同角度学习大模型,提升你的实践能力。

本文较长,建议点赞收藏。更多AI大模型应用开发学习视频及资料,在智泊AI

相关推荐
烟袅2 小时前
5 分钟把 Coze 智能体嵌入网页:原生 JS + Vite 极简方案
前端·javascript·llm
智泊AI4 小时前
API是什么?为什么需要API?如何调用API(Python示例)
llm
雨中飘荡的记忆8 小时前
LangChain4j 实战指南
java·langchain
mwq301231 天前
Anthropic 机械可解释性学习路线
llm
AI-智能1 天前
RAG 系统架构设计模式介绍
人工智能·langchain·llm·agent·知识库·rag·大模型应用
deephub1 天前
从零开始:用Python和Gemini 3四步搭建你自己的AI Agent
人工智能·python·大语言模型·agent
智泊AI1 天前
模型蒸馏的核心是什么?蒸馏过程是怎样的?为什么要做模型蒸馏?
llm
腾讯云开发者1 天前
从 RAG 到 KAG :结构化思考范式下的复杂推理
llm
16324015411 天前
回顾-DeepSeekMoE[1]
llm