你有没有这种感觉:用 ChatGPT API 写个 demo 只要 10 行代码,但要把这个 demo 变成一个能用的产品,你需要处理 prompt 管理、上下文窗口、工具调用、记忆存储、错误重试、流式输出、多模型切换……每一项单独看都不复杂,但堆在一起就是一个工程问题。
LangChain 就是为了解决这个问题而生的。它不是模型,不是数据库,而是一个把 LLM 从 API 变成应用的工程框架。142K 的 Star 数说明了一件事:这个痛点是真实的,而且大多数人选择了同一条路。
LangChain 到底解决了什么问题
直接调用 OpenAI API,你能做的就是一个 completion 请求。但真正的 LLM 应用需要这些东西:
- Prompt 模板管理:不同任务用不同 prompt,需要版本化、可复用
- 输出解析:从 LLM 返回的自然语言中提取结构化数据
- 工具调用:让 LLM 能查数据库、调 API、执行代码
- 记忆管理:维护对话历史、压缩长上下文
- 链式编排:多个 LLM 调用 + 工具调用组合成复杂流程
- 多模型抽象:今天用 OpenAI,明天换 Claude,代码要能无缝切换
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 工具链:
- DocumentLoader:支持 PDF、HTML、Notion、S3 等 100+ 数据源
- TextSplitter:按 token 数、语义边界、递归分割等多种策略切分文档
- VectorStore:统一接口对接 FAISS、Chroma、Pinecone、Weaviate 等向量库
- Retriever:支持相似度搜索、MMR、多查询、自查询等检索策略
- Reranker:集成 Cohere Rerank、交叉编码器等重排序方案
一个完整的 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 的场景:
- 需要构建生产级 Agent 应用,且团队有 Python 工程师
- 需要复杂的 RAG pipeline,涉及多数据源、多检索策略
- 需要多模型切换和统一抽象
- 需要 Agent 可观测性和调试工具(LangSmith)
不太适合的场景:
- 简单的单次 LLM 调用,不需要任何编排——直接用 SDK
- 需要低代码/无代码方案——考虑 Dify 或 Coze
- 团队对 Python 生态不熟悉——LangChain 的学习曲线比看起来陡峭
LangChain 不完美,版本迭代快、抽象层厚、文档偶尔掉链子。但它确实是目前最完整的 LLM 应用工程框架。如果你要认真做一个 Agent 产品,而不是一个 demo,LangChain 依然是第一选择。