为什么需要 LangChain

2022 年底 ChatGPT 横空出世,大语言模型(LLM)的能力让整个行业为之一振。然而,当开发者试图将 LLM 集成到实际应用中时,很快便遇到了各种工程化难题:如何管理 Prompt 模板?如何把多次 LLM 调用串联起来?如何让模型记住对话历史?如何让模型访问外部数据和工具?

LangChain 正是在这样的背景下诞生的。它由 Harrison Chase 于 2022 年底创建,定位为 LLM 应用开发的编排框架。用一句话概括:LangChain 将 LLM 应用中的常见模式抽象为可组合的组件,让开发者能够用声明式的方式组装复杂的 AI 工作流。

截至 2026 年,LangChain 已经发展为一个庞大的生态系统:核心库 langchain 提供基础抽象,langchain-core 定义了核心接口,langchain-community 包含社区贡献的集成。而 LCEL(LangChain Expression Language)和 LangGraph 则代表了框架迈向更灵活、更有状态编排方向的演进。

核心抽象

模型(Models)

LangChain 将模型抽象为两类:

  • LLM:接受字符串输入,返回字符串输出。例如 OpenAI 的 gpt-3.5-turbo-instruct(早期的补全模型)。
  • ChatModel:接受消息列表输入,返回消息输出。这是目前最常用的模型类型,支持 system、human、assistant 等角色的结构化消息。
1
2
3
4
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model="gpt-4o", temperature=0)
response = llm.invoke("什么是 LangChain?")

除了 invoke 调用,LangChain 还支持 batch(批量)、stream(流式)等调用模式,以及对异步(ainvoke)的一等支持。

Prompt 模板(Prompt Templates)

直接在代码里拼接 Prompt 字符串是脆弱的。LangChain 提供了类型化的 Prompt 模板:

1
2
3
4
5
6
7
8
from langchain_core.prompts import ChatPromptTemplate

prompt = ChatPromptTemplate.from_messages([
("system", "你是一位{role}专家。"),
("human", "请解释{concept}。")
])

messages = prompt.format_messages(role="量子计算", concept="量子纠缠")

ChatPromptTemplate 支持 MessagesPlaceholder,可以灵活地将历史对话插入到模板中的指定位置——这是实现对话上下文的关键机制。此外,FewShotChatMessagePromptTemplate 支持 Few-shot 示例的动态注入,PipelinePromptTemplate 允许将多个模板组装成流水线。

链(Chains)

Chain 是 LangChain 的招牌抽象——将多个组件串联成一个可执行单元。最基础的是 LLMChain(现在推荐使用 LCEL 管道语法替代),它将 Prompt 模板与模型组合:

1
2
3
4
from langchain_core.output_parsers import StrOutputParser

chain = prompt | llm | StrOutputParser()
result = chain.invoke({"role": "量子计算", "concept": "量子纠缠"})

更复杂的链式结构包括:

  • SequentialChain:将多个链按顺序执行,前一个链的输出作为后一个链的输入。适合流水线式任务,如”生成大纲→展开章节→润色输出”。
  • RouterChain:根据输入内容动态选择下游链。例如,根据用户提问是”编程问题”还是”文学问题”,路由到不同的专业链进行处理。
  • TransformChain:在链中插入纯 Python 处理逻辑,实现字符串截断、格式转换等非 LLM 操作。

记忆系统(Memory)

LLM 本身是无状态的——每次调用都是独立的。LangChain 通过 Memory 组件为对话提供上下文持久化:

  • ConversationBufferMemory:最简单的实现,将完整对话历史保存在内存中。优点是信息完整,缺点是 token 消耗随对话增长线性增加,长对话会撑爆上下文窗口。
  • ConversationSummaryMemory:对历史对话进行摘要压缩,只保留摘要信息。长对话时 token 消耗可控,但可能丢失细节。
  • ConversationTokenBufferMemory:保留最近的 N 个 token 的对话记录,兼顾了信息保真度和 token 限制。
1
2
3
4
5
6
7
from langchain.memory import ConversationSummaryMemory

memory = ConversationSummaryMemory(
llm=llm,
return_messages=True,
max_token_limit=2000
)

索引与检索(Indexes & Retrievers)

RAG(Retrieval-Augmented Generation)是 LangChain 最广泛的应用场景之一,涉及以下核心组件:

  • Document Loaders:从 PDF、网页、数据库、Notion 等上百种数据源加载文档。
  • Text SplittersRecursiveCharacterTextSplitter 是使用最广泛的分割器,它按段落、换行、句子、字符的优先级递归分割,尽可能保持语义完整性。
1
2
3
4
5
6
7
8
from langchain_text_splitters import RecursiveCharacterTextSplitter

splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200,
separators=["\n\n", "\n", "。", "!", ".", " ", ""]
)
chunks = splitter.split_documents(documents)
  • Embeddings:将文本块向量化,支持 OpenAI、HuggingFace、Cohere 等多种嵌入模型。
  • Vector Stores:存储和检索向量,如 Chroma、Pinecone、Milvus、Qdrant 等。

完整的 RAG 流程通常被封装为 RetrievalQA 链,在 2026 年更推荐直接使用 LCEL 或 LangGraph 手动组装,以获得更精细的控制。

Agent:模型的自主行为

如果说 Chain 是”预设好流程的脚本”,那么 Agent 就是”让模型自己决定做什么”。LangChain 的 Agent 实现了经典的 ReAct(Reasoning + Acting) 模式:

  1. Thought(思考):模型分析当前状态,决定下一步要做什么。
  2. Action(行动):模型选择一个工具并生成工具调用的参数。
  3. Observation(观察):工具执行并返回结果。
  4. 重复,直到模型认为可以给出最终答案。
1
2
3
4
5
6
7
8
9
10
11
12
from langchain.agents import create_openai_functions_agent, AgentExecutor
from langchain.tools import tool

@tool
def get_weather(city: str) -> str:
"""获取指定城市的天气信息"""
# 实际实现调用天气 API
return f"{city}:晴,25°C"

agent = create_openai_functions_agent(llm, [get_weather], prompt)
executor = AgentExecutor(agent=agent, tools=[get_weather])
result = executor.invoke({"input": "北京今天天气怎么样?"})

AgentExecutor 负责管理 Agent 的执行循环,包括错误重试、最大步数限制、early stopping 等策略。LangChain 支持 OpenAI Functions、ReAct、Structured Chat 等多种 Agent 类型,以及自定义工具的灵活注册。

LCEL:更优雅的链式编排

LCEL(LangChain Expression Language)是 LangChain 在 2023 年推出的声明式组合语法,使用管道操作符 | 连接组件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from langchain_core.runnables import RunnablePassthrough, RunnableLambda

# LCEL 管道
enhanced_chain = (
{"context": retriever, "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)

# 可以在管道中插入任意 Python 逻辑
def format_context(docs):
return "\n\n".join(doc.page_content for doc in docs)

chain_with_transform = (
{"context": retriever | RunnableLambda(format_context),
"question": RunnablePassthrough()}
| prompt | llm | StrOutputParser()
)

LCEL 的核心优势在于:自动提供 invoke/batch/stream/ainvoke 等调用接口;支持 RunnableParallel 实现并行执行;可与 LangSmith 无缝集成实现可观测性。重要的是,LCEL 创建的链可以原生编译为 LangGraph 的图,为后续升级到有状态 Agent 铺平了道路。

什么时候用 LangChain,什么时候不用

适合使用 LangChain 的场景

  • 快速原型开发:内置的模板和链可以让你在几分钟内搭起一个 RAG 问答系统。
  • 多组件编排:需要 Prompt 管理、检索、工具调用、对话记忆等多组件协调的复杂应用。
  • 团队协作:标准化的抽象让团队成员更容易理解和维护代码。
  • 生态集成:不需要自己对接各种模型提供商、向量数据库、文档加载器。

不适合使用 LangChain 的场景

  • 简单的单次 LLM 调用:直接使用 OpenAI SDK 或 Anthropic SDK 更为轻量。
  • 对性能和延迟有极致要求的场景:LangChain 的抽象层会带来额外开销。
  • 需要深度定制 Agent 行为:此时直接使用 LangGraph,或者直接调用模型 API 配合自定义循环,可能更加灵活。
  • 学习成本考量:LangChain 的抽象层次深、文档长期存在滞后问题,小型团队需要评估投入产出比。

结语

LangChain 为 LLM 应用开发提供了一套成熟的抽象体系。理解它的核心组件——Models、Prompts、Chains、Memory、Retrievers、Agents——是进入 AI 应用开发领域的必修课。然而,框架并非银弹:当应用复杂度上升到需要复杂的多 Agent 协调和状态管理时,LangChain 的局限性就会显现,而这正是 LangGraph 所要解决的问题——这将在后续文章中深入探讨。