本文较长,建议点赞收藏。更多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))
代码里,prompt、llm 和 StrOutputParser 三个部分通过 | 组合成一个 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。