你有没有这种感觉:用 ChatGPT API 写个 demo 只要 10 行代码,但要把这个 demo 变成一个能用的产品,你需要处理 prompt 管理、上下文窗口、工具调用、记忆存储、错误重试、流式输出、多模型切换……每一项单独看都不复杂,但堆在一起就是一个工程问题。

LangChain 就是为了解决这个问题而生的。它不是模型,不是数据库,而是一个把 LLM 从 API 变成应用的工程框架。142K 的 Star 数说明了一件事:这个痛点是真实的,而且大多数人选择了同一条路。

LangChain 到底解决了什么问题

直接调用 OpenAI API,你能做的就是一个 completion 请求。但真正的 LLM 应用需要这些东西:

LangChain 最初的设计思路是"链"(Chain)——把 prompt、model、output parser 串成一条链。但随着 Agent 需求爆发,链式调用已经不够了。于是 LangGraph 来了。

核心架构:三层体系

现在的 LangChain 已经不是一个包了,而是一个平台级生态,由三个核心组件构成:

LangChain Core:基础抽象层

定义了 LLM 应用的底层接口:ChatModel、PromptTemplate、OutputParser、Retriever、Tool 等。所有具体的模型集成(OpenAI、Anthropic、Google)都通过统一接口暴露能力。这意味着你写的 chain.invoke() 调用,换一个 model 参数就能换模型,不用改业务逻辑。

from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI

prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个代码审查专家。"),
    ("human", "请审查以下代码并给出改进建议:\n{code}")
])

model = ChatOpenAI(model="gpt-4o")
chain = prompt | model
result = chain.invoke({"code": "def add(a, b): return a + b"})

这里的 | 操作符是 LangChain 的"管道语法",把 prompt、model 这些 Runnable 串联起来。它看起来简洁,但实际上背后做了大量的序列化、流式处理、错误处理的封装。

LangGraph:Agent 编排引擎

LangGraph 是 LangChain 生态里最重要的组件,也是最值得深入理解的部分。它用有向图(StateGraph)来描述 Agent 的执行逻辑,节点是函数,边是条件跳转。

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

class AgentState(TypedDict):
    messages: list
    next_action: str

def think(state: AgentState) -> AgentState:
    # LLM 思考下一步
    response = model.invoke(state["messages"])
    return {"messages": [*state["messages"], response], "next_action": "act"}

def act(state: AgentState) -> AgentState:
    # 执行工具调用
    ...

def route(state: AgentState) -> Literal["act", "__end__"]:
    if state["next_action"] == "act":
        return "act"
    return "__end__"

graph = StateGraph(AgentState)
graph.add_node("think", think)
graph.add_node("act", act)
graph.add_edge(START, "think")
graph.add_conditional_edges("think", route)
graph.add_edge("act", "think")
app = graph.compile()

这种设计的好处是:Agent 的行为完全由图结构决定,你可以精确控制它在什么时候调用工具、什么时候结束、什么时候重试。这比 ReAct 的自由循环可控得多。

LangSmith:可观测性平台

LangSmith 是 LangChain 的商业化部分,提供 Trace 查看、评测、数据集管理。在生产环境中,你能看到每次 Agent 执行的完整调用链、每个节点的输入输出、token 消耗。这个东西在调试阶段价值巨大——因为 Agent 的失败往往是"看起来正常但结果不对",没有 trace 你根本不知道哪一步出了问题。

RAG 集成:LangChain 的杀手场景

Retrieval-Augmented Generation 是 LangChain 最成熟的使用场景。它提供了完整的 RAG 工具链:

一个完整的 RAG pipeline 可能长这样:

from langchain_community.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import FAISS
from langchain.chains import RetrievalQA

loader = PyPDFLoader("docs/whitepaper.pdf")
docs = loader.load()
splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
chunks = splitter.split_documents(docs)
vectorstore = FAISS.from_documents(chunks, OpenAIEmbeddings())
retriever = vectorstore.as_retriever(search_kwargs={"k": 4})
qa_chain = RetrievalQA.from_chain_type(llm=model, retriever=retriever)
answer = qa_chain.invoke("这个协议的核心条款是什么?")

这段代码包含了加载文档、切分、向量化、存储、检索、生成的完整流程。LangChain 的价值在于,每一步你都可以换一个实现——比如把 FAISS 换成 Pinecone,或者把 OpenAI embeddings 换成 Cohere——业务代码不用动。

跟竞品对比

LlamaIndex(55K Star)

LlamaIndex 专注于数据索引和检索。如果你的核心需求是"把私有文档变成可查询的知识库",LlamaIndex 的 RAG 能力其实比 LangChain 更深更细。但 LlamaIndex 在 Agent 编排方面远不如 LangGraph 成熟。简单说:数据工程选 LlamaIndex,Agent 编排选 LangChain

Dify(60K Star)

Dify 是一个低代码 LLM 应用平台,提供了可视化的工作流编排、Prompt IDE、RAG pipeline。它的优势是上手快、UI 友好,适合非开发者快速搭建原型。但 Dify 的灵活性不如 LangChain——当你需要自定义 Agent 行为、接入私有模型、或者处理复杂的多步推理时,LangChain 的代码优先模式更强大。

AutoGen(35K Star)

AutoGen 走的是多 Agent 对话路线,让多个 Agent 互相讨论来完成任务。LangChain/LangGraph 也支持多 Agent,但更侧重于确定性的编排流程。AutoGen 在探索性任务(如研究、头脑风暴)上更有优势,但生产环境的可控性不如 LangGraph。

实际使用体验和踩坑

我用 LangChain 做了 3 个生产项目,说说真实感受:

坑一:版本变更太快

LangChain 的版本更新非常频繁,而且经常有破坏性变更。我 2024 年写的代码,到 2025 年就有大量 deprecated API。社区也对此有大量吐槽。不过从 0.2 版本开始,他们把 langchain-core 的稳定性作为重点,情况好了很多。

坑二:过度抽象

LangChain 有时候抽象得太厚了。一个简单的 LLM 调用,经过 Runnable、Chain、LCEL 层层封装,调试的时候你不知道到底哪一层出了问题。我的建议是:理解 LangChain 的抽象,但不要恐惧在必要时绕过它直接调用 API。

坑三:文档质量参差不齐

核心模块的文档质量不错,但很多社区集成(社区贡献的第三方接入)的文档要么过时要么缺失。你可能需要直接读源码来理解某个集成的用法。

体验好的地方

LangGraph 确实好用。用状态图描述 Agent 行为,比自己手写 ReAct 循环清晰太多。而且 LangGraph 内置了 checkpoint 机制——Agent 执行到一半挂了,可以从断点恢复。这在长时间运行的任务中非常实用。

LangSmith 也值得一试。当你在调试一个复杂的多步 Agent 时,能在一个 UI 里看到每一步的完整输入输出、耗时、token 数,这种体验比自己加 log 优雅得多。

适合谁用

适合用 LangChain 的场景:

不太适合的场景:

LangChain 不完美,版本迭代快、抽象层厚、文档偶尔掉链子。但它确实是目前最完整的 LLM 应用工程框架。如果你要认真做一个 Agent 产品,而不是一个 demo,LangChain 依然是第一选择。