LangChain 是当前使用最广泛的开源 LLM 应用编排框架,提供 Python 与 JS/TS 双语言实现。它解决的核心问题是:LLM 应用开发中模型调用、提示词管理、文档检索、外部工具调用、记忆状态等一系列环节的碎片化与耦合。LangChain 将这些能力抽象为统一的 Runnable 组件协议,允许开发者用 | 运算符将多个组件串成管道(LCEL),同一套代码可同步、异步、流式、批量运行,并在不重写业务逻辑的前提下切换不同模型厂商。截至 2025 年年中,LangChain 生态已形成三层结构:langchain-core 提供核心协议,langchain 与 langchain-community 提供常见组件,配套 LangGraph 负责复杂 Agent 状态编排、LangSmith 负责可观测性与评测。本篇按「速览 → 安装 → 上手 → 能力 → 生产」的顺序展开,并附同类工具对比、版本迭代记录、面试题与官方资源清单。
掌握 LangChain,意味着你能用标准化的组件协议快速搭建 RAG、Agent 与对话应用,这是 LLM 应用工程岗最核心的入门技能之一。
目录
速览卡是工具类内容的固定首屏模块:30 秒判断「这工具是什么、能不能商用、适不适合我」。
为什么需要 LangChain:从命令式粘合脚本到标准化组件管道
直接调用各家模型 API 开发应用时,代码里混着 prompt 字符串拼接、HTTP 重试与超时处理、输出解析、向量库读写等琐碎逻辑。一旦涉及模型商切换,整套调用层要重写;当应用同时包含文档加载、切分、检索、生成、工具调用等 6 个以上环节,命令式的「粘合脚本」维护成本会快速超过业务逻辑本身,组件也无法在项目间复用。
LangChain 把 LLM 应用拆成边界清晰的组件:模型(ChatModel)、提示模板(PromptTemplate)、输出解析器、文档加载器与分割器、向量存储、检索器、记忆、工具与 Agent。所有组件实现同一个 Runnable 接口,用竖线运算符即可组合成管道,管道本身仍是 Runnable,可以继续嵌套。一次学习,同步、异步、流式、批量四种调用方式全部获得。切换模型厂商时只替换模型对象与其集成包,其余管道代码不动。
与 LlamaIndex 聚焦数据检索、Haystack 强调生产级 Pipeline 不同,LangChain 的定位是覆盖面最广的通用编排层:既能做 RAG,也能做 Agent、多轮对话与工具调用。代价是抽象层更多、接口演进更快,选型时需要评估团队的跟进能力。
安装与环境配置:3 步就绪
步骤一:准备 Python 3.9+,创建虚拟环境,安装 langchain 主包与 langchain-openai 集成包。模型实现不在主包内,这是 0.2 模块拆分后的重要变化。
步骤二:获取 OpenAI API Key,写入项目根目录的 .env 文件。不要把 .env 提交进 Git,在 .gitignore 中排除。
步骤三:运行验证命令,能打印版本号即安装成功。若导入 ChatOpenAI 报错,说明缺少 langchain-openai 包。
# 创建并激活虚拟环境(Python 3.9+)python -m venv .venvsource .venv/bin/activate # Windows: .venv\Scripts\activate # 安装核心包、OpenAI 集成包与 dotenvpip install langchain langchain-openai python-dotenv # 配置环境变量(sk-xxx 替换为真实密钥)echo "OPENAI_API_KEY=sk-xxx" > .env # 验证安装python -c "import langchain; print(langchain.__version__)"
快速上手:5 分钟跑通第一个问答链
最小闭环是「模板 + 模型 + 管道 + 调用」四件套:先用 ChatPromptTemplate 定义带占位符的提示模板,再创建 ChatOpenAI 模型对象,用 | 组合成 LCEL 管道,最后调用 invoke 并传入模板需要的变量字典。
1. 在项目根目录创建 .env 文件,写入 OPENAI_API_KEY=sk-xxx。
2. 新建 main.py,写入下方代码。模板中的 {question} 是运行时填充的变量,invoke 传入字典的键必须与之一致。
3. 执行 python main.py。若输出模型回答,说明链路打通;若报错提示缺少密钥,检查 .env 路径与 load_dotenv() 调用。
进阶技巧:把 chain.invoke(...) 换成 for chunk in chain.stream({...}): print(chunk.content, end="") 即可实现流式输出;在链尾追加 | StrOutputParser() 可让 invoke 直接返回字符串而非 AIMessage 对象。
# main.pyfrom dotenv import load_dotenvfrom langchain_openai import ChatOpenAIfrom langchain_core.prompts import ChatPromptTemplate load_dotenv() # 1. 模型对象:temperature 控制随机性,0 为最确定llm = ChatOpenAI(model="gpt-4o-mini", temperature=0) # 2. 提示模板:{question} 是运行时填充的占位符prompt = ChatPromptTemplate.from_messages([ ("system", "你是一名技术写作助手,回答要简洁、准确。"), ("user", "{question}"),]) # 3. 用 | 组合成 LCEL 管道:先填模板,再交给模型chain = prompt | llm # 4. 调用:传入模板需要的变量字典resp = chain.invoke({"question": "用一句话解释什么是 RAG"})print(resp.content) # .content 才是文本,resp 是 AIMessage 对象
核心能力详解:5 大支柱
支柱一·LCEL 与 Runnable 协议。LCEL(LangChain Expression Language)是 0.1 之后的一等公民。任何实现了 Runnable 接口的对象——模型、模板、解析器、自定义函数——都可以用 | 组合,组合结果自动继承 invoke/ainvoke/batch/abatch/stream/astream 六种调用入口。这使链的构建从「继承 Chain 类」转向「函数式管道组合」,代码量通常减少一半以上。RunnableParallel 可并行执行多个组件,RunnablePassthrough 可透传输入并采集中间变量,RunnableLambda 能把任意 Python 函数包装进管道。
支柱二·模型 I/O 三件套。模型 I/O 由提示模板、对话模型、输出解析器组成。ChatPromptTemplate 支持 system/user/assistant 多消息结构;ChatModel 是统一的模型抽象,各家模型通过独立集成包接入;输出解析器把模型返回的 AIMessage 转为字符串、结构化 JSON 或 Pydantic 对象,解决了「模型输出格式不稳定」这一工程痛点。
支柱三·RAG 组件链。RAG(检索增强生成:先从外部知识库检索相关文本,再作为上下文交给模型生成)的完整链路在 LangChain 中都有对应组件:文档加载器(Loader)支持 PDF、网页、数据库等数十种来源;文本分割器(Splitter)按语义或固定块切分;向量存储(VectorStore)支持 Chroma、FAISS、Pinecone 等;检索器(Retriever)负责相似度查询与重排。整个流程可拆成加载、索引、检索、生成四个可独立替换的阶段。
支柱四·Agent 与自定义工具。Agent(智能体:根据目标自主决定调用哪些工具并循环执行)是 LangChain 的重头戏。用 @tool 装饰器即可把任意函数注册为工具,模型在推理循环中自行决定调用哪个工具、传什么参数。内置了 ReAct、OpenAI Functions 等多种 Agent 类型,并支持工具结果回传后的多轮迭代。0.3 之后官方把复杂的 Agent 状态管理收敛到 LangGraph 中,主包保留轻量 AgentExecutor 供简单场景使用。
支柱五·LangGraph 与 LangSmith。LangGraph 是官方推荐的状态化编排引擎,把 Agent 流程建模为带状态转移的图,支持循环、条件分支、人工介入与检查点持久化,解决了普通 LCEL 难以表达复杂流程的问题。LangSmith 是官方可观测平台,记录每次运行的输入输出、token 消耗与延迟,支持构建评测数据集做回归测试,是生产环境排查问题的关键工具。
生产部署与监控:从上线到运维
部署方式一:LangServe 转 REST 服务。安装独立包 langserve,用 add_routes 把任意 LCEL 链暴露为 /invoke、/stream、/batch 等 HTTP 端点,自动附带 OpenAPI 文档,适合微服务架构。生产环境需在应用层补充鉴权、限流与超时控制。
部署方式二:容器化与 LangGraph 平台。生产环境建议将链与依赖打包进 Docker 镜像,用 poetry 或 uv 锁定依赖版本,避免 0.1/0.2/0.3 的 API 差异引发线上事故。需要状态持久化的多 Agent 场景使用 LangGraph 的检查点机制,或直接采用 LangGraph Platform 托管,由平台处理负载均衡与存储。
可观测性。LangSmith 是首选方案:每次调用自动生成 trace,可查看管道每一步的输入输出、耗时与 token 消耗;平台支持将线上错误样本加入评测数据集,持续回归。不使用 LangSmith 时,可基于 OpenTelemetry 手动埋点,记录链路的各节点耗时与模型调用参数。
<p class="para-label">避坑清单:</p>
<ul class=“dash-list“><li>版本不匹配:0.1 之前教材中直接调用 llm(”……”) 或 .run() 的写法在 0.2/0.3 已移除,先确认 pip 版本再抄代码。</li><li>包名混淆:模型实现不在 langchain 主包内,按厂商装 langchain-openai、langchain-anthropic 等,否则 import 直接报错。</li><li>变量缺失:LCEL 中 invoke 字典缺模板占位符会在运行时抛 KeyError,用 RunnableParallel 时键名必须与下游模板变量一致。</li><li>密钥不生效:.env 路径不对或未调用 load_dotenv 导致模型实例化失败,部署时改用环境变量显式注入。</li></ul>
# serve.py:把 LCEL 链发布为 REST 服务from fastapi import FastAPIfrom langserve import add_routesfrom main import chain # 复用上一节定义的链 app = FastAPI(title="QA Service")add_routes(app, chain, path="/qa")# 运行:uvicorn serve:app --host 0.0.0.0 --port 8000
| 维度 | LangChain | LlamaIndex | Haystack | AutoGen |
|---|---|---|---|---|
| 定位 | 通用 LLM 应用编排框架 | 数据框架,RAG 优先 | 生产级 NLP 管道框架 | 多智能体对话框架 |
| 编排范式 | LCEL 管道 + Agent 循环 | 索引 + 查询引擎 | 节点式 Pipeline | 对话式多 Agent 会话 |
| 类型约束 | 中(Runnable 接口有约束) | 低 | 高(管道有类型检查) | 低 |
| 学习曲线 | 中等偏陡,抽象层多 | 较低,聚焦检索 | 中等 | 中等 |
| 生态集成 | 700+ 第三方集成 | 数据源与向量库丰富 | 聚焦检索增强的精选集成 | 以各家 LLM API 为主 |
| 生产部署 | LangSmith + LangGraph / Docker | 组件嵌入 FastAPI | 官方提供日志与评测组件 | 需自行封装服务 |
| License | MIT | MIT | Apache 2.0 | MIT |
| 适合谁 | 需要覆盖 RAG、Agent、记忆等多种形态的团队 | 以文档问答和知识库检索为核心的团队 | 已有管道规范、寻求生产可控性的企业 | 研究多智能体协作与任务分解的团队 |
选型建议:想覆盖「通用 LLM 应用 + Agent + 全链路可观测」,LangChain 生态最完整,LangSmith 是独有优势;纯知识库 RAG 可优先 LlamaIndex,更轻、更聚焦;企业已有成熟管道规范选 Haystack,约束更强、更稳;多智能体研究场景选 AutoGen。
版本迭代
LangChain 自 2022 年 10 月开源后经历三个阶段:0.0.x 快速试错,API 月月变;2024 年初 0.1 冻结核心 API,转向接口稳定;2024 年中 0.2 完成模块拆分,把模型实现、社区集成与核心协议解耦,生态分层成型;0.3 起官方重心转向 LangGraph 与 LangSmith 的企业级能力(截至训练数据,0.3.x 系列可能已有更新补丁,以官方 Changelog 为准)。
| 版本 | 时间 | 变化 | 提升 |
|---|---|---|---|
| 0.0.x | 2022-10 ~ 2023-12 | 快速试错期 | 确立 Chain/Agent/Tool/VectorStore 基础抽象,API 频繁破坏性变更 |
| 0.1.0 | 2024-01 | 首个稳定 API 冻结 | 统一 .invoke/.batch/.stream 入口,LCEL 成为一等公民 |
| 0.2.0 | 2024-05 | 模块拆分与版本解耦 | langchain-core 独立版本,模型实现迁至 langchain-openai 等厂商包 |
| 0.3.0 | 2024-10 | 兼容性收敛与清理 | 移除大量 deprecated 别名,兼容 Python 3.13,Agent 能力收敛至 LangGraph |
LangChain 无公开基准分数,选型重点看两条:一是 API 稳定性,0.1 之后 .invoke 入口已成标准,可用此判断新旧教程;二是生产重心已从主包转移至 LangGraph/LangSmith,新项目建议把「LCEL 做管道 + LangGraph 做 Agent + LangSmith 做观测」作为默认组合。
AI 应用场景
企业知识库 RAG 问答机器人
阶段:RAG 管道构建
解决的问题:企业内部文档分散在 PDF、网页、Wiki 中,传统搜索只能做关键词匹配,无法理解语义化提问。LangChain 提供「加载 → 切分 → 向量化 → 检索 → 生成」的标准化流水线,一套代码适配多种数据源,换向量库只改一行配置。
具体案例:某客服团队用 LangChain 处理 5000 余份产品文档,用户在对话框提问即可获得带引用的回答,端到端响应约 2-5 秒,首答时间从人工平均 5 分钟降至秒级,人工转接率下降约 30%。
企业工具调用助手(Agent)
阶段:Agent 编排
解决的问题:LLM 自身无法操作内部系统,每次查询都要人工复制粘贴。LangChain 用 @tool 将内部 API 注册为工具,模型在推理循环中自主决定调用顺序,实现跨系统操作。
具体案例:某运维团队将工单查询、状态更新、通知发送封装为 3 个工具,Agent 根据用户描述自动完成「查单 → 改状态 → 发通知」全流程,行业实践普遍报告工单处理自动化率可达 50%-60%,重复性录入基本消除。
长文档智能摘要
阶段:文档智能
解决的问题:上百页合同、研报超出模型上下文窗口,直接塞入会导致截断或注意力分散。LangChain 内置 Map-Reduce 与 Refine 等长文本链,先分块总结再逐层聚合。
具体案例:用 Map-Reduce 链对百页级 PDF 合同做摘要,按章节切分、分块总结后汇总,生成一份 10 条要点的概述,耗时从人工约 1 小时降至 3-5 分钟,要点召回率在人工复核中达到可用水平。
常见误区
误区LangChain 是不是类似 ChatGPT 那样的产品?我安装之后为什么不能直接生成文本?感觉它应该自带一个对话入口。
正解LangChain 是开源框架/代码库,本身不包含任何模型权重,也不提供云端推理能力。它通过统一接口调用各厂商模型——OpenAI、Anthropic、谷歌,以及本地部署的 Ollama 等。安装包里没有任何模型,必须配置模型提供商的 API Key 或本地模型地址才能工作。
为何常见:LangChain 名字像一个产品,教程又常把它和具体模型混在一起演示,初学者容易误以为它自带模型能力。
误区我执行了 pip install langchain,为什么 from langchain_openai import ChatOpenAI 还是报 ModuleNotFoundError?明明官方文档就是这么写的。
正解0.2 模块拆分后,模型厂商的实现不在主包内。OpenAI 集成在独立包 langchain-openai 中,Anthropic、谷歌、Ollama 也各有独立包。langchain-community 包含社区贡献的第三方集成,但官方约定的做法是优先安装厂商自己的包。
为何常见:大量教程写于 0.1 之前,当时所有代码都在一个仓库里;0.2 的拆分是生态最大的结构性变更,旧认知未更新。
误区我照一篇 2023 年的教程写了 llm(“你好”),运行报 TypeError: 'ChatOpenAI' object is not callable。教程应该不会错吧?
正解0.1 起调用入口统一为 .invoke(),旧 API(直接对模型对象加括号调用、.run() 方法)在 0.2/0.3 中已废弃或移除。判断教程是否过时:出现 .run()、llm()、from langchain.llms import OpenAI 的写法即为 0.0.x 时代代码。
为何常见:LangChain 在 2023 年迭代极快,当时大量教程基于 0.0.x;框架 2024 年完成 API 标准化后,旧教程与新版本差异巨大。
误区invoke 时多传一个键、少传一个键应该没事吧?或者把键名改成大写应该也能识别?反正都是字典。
正解LCEL 的变量绑定是严格的键值匹配:缺键会在运行时抛错(模板占位符未填充),多余键会被忽略,键名区分大小写。使用 RunnableParallel 时,下游组件要从并行结果的键名中取数,键名不匹配同样是高频报错点。
为何常见:LangChain 抽象层较多,输入输出类型流转对新手不透明,报错信息又常指向内部实现,容易让人误以为是「魔法」而非严格的契约。
面试题
Q1. 在 LangChain 0.2 及以后版本中,调用 OpenAI 模型需要安装哪些包?
- A.安装 langchain 主包
- B.主包加 langchain-openai← 正确答案
- C.安装 community 集成包
- D.安装 langchain-core
答案:B。0.2 起模块拆分,langchain 主包只含核心组件与抽象,OpenAI 实现在独立包 langchain-openai 中。community 包含社区贡献的第三方集成,但官方模型接入走厂商自己的包;langchain-core 只是核心协议层,不包含任何模型。
Q2. LCEL 中竖线运算符的作用是什么?
- A.位或运算
- B.组合两个 Runnable← 正确答案
- C.字符串拼接
- D.并行执行节点
答案:B。在 LCEL 中 | 表示管道组合,前一组件的输出自动成为后一组件的输入,组合结果仍是一个 Runnable,可继续调用或继续组合。位运算、拼接、并行都不是 LangChain 管道语义。
Q3. LangChain 0.3 中推荐如何调用 OpenAI 模型?
- A.用 langchain.llms 的 OpenAI 类
- B.从 langchain_openai 导入 ChatOpenAI← 正确答案
- C.直接 import openai 后封装
- D.使用全局默认的 ChatModel 实例
答案:B。0.3 时代官方推荐 langchain-openai 包的 ChatOpenAI。langchain.llms 中的 OpenAI 类已废弃,chat_models 模块已移出主包,直接封装 openai SDK 则丧失了 LangChain 的组件协议能力。
Q4. 执行 chain = prompt | llm 后,chain.invoke({"question": "x"}) 的返回类型是?
- A.纯文本字符串
- B.AIMessage 对象← 正确答案
- C.Python 字典
- D.原始 HTTP 响应
答案:B。管道末端是 ChatModel 时,invoke 返回 AIMessage 对象,正文字符串在 .content 属性上。若希望直接拿字符串,需要在链尾追加 | StrOutputParser() 做输出解析。
Q5. RAG(检索增强生成)的核心流程是?
- A.检索数据库并统计特征
- B.检索相关文档加进上下文后生成← 正确答案
- C.对模型输出做相关性排序
- D.用生成模型对数据做增强
答案:B。RAG 先从外部知识库检索与问题相关的文本片段,再与用户问题共同组装进 prompt,让模型基于这些材料生成回答,从而减少幻觉并引入外部知识。统计特征、结果重排、数据增强都不是 RAG 的定义。
Q6. LangSmith 的主要定位是什么?
- A.模型微调平台
- B.LLM 应用可观测与评测← 正确答案
- C.向量数据库托管
- D.提示词交易市场
答案:B。LangSmith 是 LangChain 官方可观测平台,记录每次运行的输入输出、中间步骤、token 消耗与延迟,并提供数据集评测与回归告警。它不参与模型推理,也不是微调或向量库工具。
Q7. langchain-core 中提供的基础能力包括哪些?
- A.Runnable 统一调用接口← 正确答案
- B.PromptTemplate 模板类← 正确答案
- C.各厂商模型的具体实现
- D.ChatModel 抽象基类← 正确答案
答案:ABD。langchain-core 是核心协议层,包含 Runnable 接口、PromptTemplate、ChatModel 抽象基类与消息结构。各厂商模型的具体实现属于独立的厂商集成包,不在 core 中。
Q8. 0.2 模块拆分后,包含社区贡献的第三方集成的包是?
- A.langchain-core
- B.langchain-community← 正确答案
- C.langchain-openai
- D.langchain-text-splitters
答案:B。langchain-community 汇聚了社区维护的第三方集成,涵盖文档加载器、向量库、检索器等。langchain-openai 是官方厂商包,langchain-text-splitters 是文本分割专用包,langchain-core 只含核心协议。
Q9. 关于 LCEL 管道的输入变量绑定,正确的说法有?
- A.缺少模板占位符键时运行会抛错← 正确答案
- B.多余的键会被默认忽略← 正确答案
- C.大小写不同的键视为相同
- D.无变量的模板可传空字典调用← 正确答案
答案:ABD。LangChain 模板基于键值填充,缺键在 invoke 时抛 KeyError,多余键被忽略,键名区分大小写。模板没有占位符时,invoke({}) 可以正常执行。C 选项所述的大小写不敏感在 LangChain 中不存在。
Q10. Runnable 接口统一了哪些调用形式?
- A.同步 invoke 与异步 ainvoke← 正确答案
- B.batch 批量与 stream 流式← 正确答案
- C.Passthrough 不透传任何输入
- D.Parallel 输出按分支键命名← 正确答案
答案:ABD。Runnable 统一了六类调用入口:invoke/ainvoke、batch/abatch、stream/astream。RunnablePassthrough 的作用是透传输入并可附加字段,并非拒绝输入。RunnableParallel 的输出是字典,键为子组件名,因此 D 正确。