LangChain 初探:用链式调用构建 AI 应用
为什么需要 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 | from langchain_openai import ChatOpenAI |
除了 invoke 调用,LangChain 还支持 batch(批量)、stream(流式)等调用模式,以及对异步(ainvoke)的一等支持。
Prompt 模板(Prompt Templates)
直接在代码里拼接 Prompt 字符串是脆弱的。LangChain 提供了类型化的 Prompt 模板:
1 | from langchain_core.prompts import ChatPromptTemplate |
ChatPromptTemplate 支持 MessagesPlaceholder,可以灵活地将历史对话插入到模板中的指定位置——这是实现对话上下文的关键机制。此外,FewShotChatMessagePromptTemplate 支持 Few-shot 示例的动态注入,PipelinePromptTemplate 允许将多个模板组装成流水线。
链(Chains)
Chain 是 LangChain 的招牌抽象——将多个组件串联成一个可执行单元。最基础的是 LLMChain(现在推荐使用 LCEL 管道语法替代),它将 Prompt 模板与模型组合:
1 | from langchain_core.output_parsers import StrOutputParser |
更复杂的链式结构包括:
- SequentialChain:将多个链按顺序执行,前一个链的输出作为后一个链的输入。适合流水线式任务,如”生成大纲→展开章节→润色输出”。
- RouterChain:根据输入内容动态选择下游链。例如,根据用户提问是”编程问题”还是”文学问题”,路由到不同的专业链进行处理。
- TransformChain:在链中插入纯 Python 处理逻辑,实现字符串截断、格式转换等非 LLM 操作。
记忆系统(Memory)
LLM 本身是无状态的——每次调用都是独立的。LangChain 通过 Memory 组件为对话提供上下文持久化:
- ConversationBufferMemory:最简单的实现,将完整对话历史保存在内存中。优点是信息完整,缺点是 token 消耗随对话增长线性增加,长对话会撑爆上下文窗口。
- ConversationSummaryMemory:对历史对话进行摘要压缩,只保留摘要信息。长对话时 token 消耗可控,但可能丢失细节。
- ConversationTokenBufferMemory:保留最近的 N 个 token 的对话记录,兼顾了信息保真度和 token 限制。
1 | from langchain.memory import ConversationSummaryMemory |
索引与检索(Indexes & Retrievers)
RAG(Retrieval-Augmented Generation)是 LangChain 最广泛的应用场景之一,涉及以下核心组件:
- Document Loaders:从 PDF、网页、数据库、Notion 等上百种数据源加载文档。
- Text Splitters:
RecursiveCharacterTextSplitter是使用最广泛的分割器,它按段落、换行、句子、字符的优先级递归分割,尽可能保持语义完整性。
1 | from langchain_text_splitters import RecursiveCharacterTextSplitter |
- Embeddings:将文本块向量化,支持 OpenAI、HuggingFace、Cohere 等多种嵌入模型。
- Vector Stores:存储和检索向量,如 Chroma、Pinecone、Milvus、Qdrant 等。
完整的 RAG 流程通常被封装为 RetrievalQA 链,在 2026 年更推荐直接使用 LCEL 或 LangGraph 手动组装,以获得更精细的控制。
Agent:模型的自主行为
如果说 Chain 是”预设好流程的脚本”,那么 Agent 就是”让模型自己决定做什么”。LangChain 的 Agent 实现了经典的 ReAct(Reasoning + Acting) 模式:
- Thought(思考):模型分析当前状态,决定下一步要做什么。
- Action(行动):模型选择一个工具并生成工具调用的参数。
- Observation(观察):工具执行并返回结果。
- 重复,直到模型认为可以给出最终答案。
1 | from langchain.agents import create_openai_functions_agent, AgentExecutor |
AgentExecutor 负责管理 Agent 的执行循环,包括错误重试、最大步数限制、early stopping 等策略。LangChain 支持 OpenAI Functions、ReAct、Structured Chat 等多种 Agent 类型,以及自定义工具的灵活注册。
LCEL:更优雅的链式编排
LCEL(LangChain Expression Language)是 LangChain 在 2023 年推出的声明式组合语法,使用管道操作符 | 连接组件:
1 | from langchain_core.runnables import RunnablePassthrough, RunnableLambda |
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 所要解决的问题——这将在后续文章中深入探讨。