LangChain 是什么?

简单来说,LangChain 是一个开发 Agent 的框架,它大大简化了程序员开发 Agent 的难度。

我们先来看 LangChain1.0 官方文档中的一句话,它道出了 AI Agent(智能体)的工程本质,也是当前大模型应用开发的核心方法论:

Agent = Model + Harness

这个公式打破了很多人对 Agent 的神秘感,我们可以拆解一下:

  • Model(模型/大脑):指底层的 LLM。它负责提供基础的语义理解、逻辑推理、长文本上下文和生成能力。Model 决定了 Agent 的智商上限,但是它本身是静态的、被动的,你给 llm 一个 prompt,它回一个 response。
  • Harness(马具/控制外壳):Harness原意是马具或汽车的线束。在软件工程里,它指“测试台”或“运行外壳”。Harness 是动态的、主动的,它把 Model 包裹起来,让 Model 可以跟真实世界发生交互。

用一个通俗的比喻来讲,可以说 Model 是一台性能强劲的发动机,但是只有发动机你哪儿也去不了,而 Harness 是方向盘、离合器、仪表盘和底盘。两者结合,才是一辆能跑起来的汽车(Agent)。

LangChain 官方还有一句话:

The harness is everything around the model loop: the prompt, the tools, and any middleware that shapes behavior. Start with the primitives and compose exactly what your use case needs.(Harness 是模型循环周围的一切:提示词、工具、以及任何塑造行为的中间件,从原语开始,完全根据你的业务场景来组合)

它告诉我们在做 Agent 时,具体的 Harness 应该是什么,包括提示词、工具以及其他任何控制模型循环的中间件,并且告诉开发者按需组合 Harness,应该根据自己的业务场景来拼装,而非一股脑全上。

明白了以上概念,你也就知道 LangChain 是什么了。没错,LangChain 就是用来组装 Agent 的一个框架,下面来看一个 LangChain 官方给出的示例:

// First install: npm install langchain zod @langchain/openai
import { createAgent, tool } from "langchain";
import * as z from "zod";

const getWeather = tool(
  (input) => `It's always sunny in ${input.city}!`,
  {
    name: "get_weather",
    description: "Get the weather for a given city",
    schema: z.object({
      city: z.string().describe("The city to get the weather for"),
    }),
  }
);

const agent = createAgent({
  model: "gpt-5.5",
  tools: [getWeather],
});

console.log(
  await agent.invoke({
    messages: [{ role: "user", content: "What's the weather in San Francisco?" }],
  })
);

这段代码中引入了两个最核心的工程原语,tool 和 model。如果把 tool 和 model 拆开,它们都只是孤立的组件,tool 仅仅是一个函数,model 也只是一个纯粹的、静态的、等待被驱动识别的模型实例。

而有了 createAgent,我们可以把 model 和 tool 组装起来,这里的 createAgent 扮演的就是将 Harness (tool、prompt 等)包裹在 model 的中间角色,我们可以通过改变 createAgent 中的参数(组件),从而控制模型决策循环的行为。可以看出 LangChain 底层为我们做了很多事,我们不需要自己手写底层的模型决策循环,只需要根据具体的业务场景,将用到的 Harness 进行拼接即可。


LangChain 的核心组件

正如前面所讨论的 Agent = Model + Harness,LangChain 的核心组件基本是围绕大模型本身(Model)以及如何控制大模型(Harness)来设计的。这里简要介绍 LangChain 体系的主要核心组件,在入门 LangChain 时,建议直接按照以下核心组件来学习,然而在 LangChain 最新的官方文档 https://docs.langchain.com/oss/python/langchain/overview 中,并没有直接按照这些核心组件划分,个人以为官方文档对于初学者入门 LangChain 并不友好,这里我参考了 https://inferloop.dev/langchain-agent/introduction/ 的学习文档。

简而言之,LangChain 的核心组件可以清晰地分为以下6大支柱

1.I/O 路由与基础原语(Model I/O)

这是让大模型“听懂人话并规范回答的基石”,主要解决模型的输入和输出问题。

  • Prompot Templates(提示词模板):将用户的数据动态组装成大模型能理解的系统提示词。支持动态变量、Few-shot(少样本提示)等高级组合。
  • Chat Models(聊天模型包装器):LangChain 并没有自己的大模型,而是将市面上所有的主流模型(OpenAI,Claude,LLaMA等)统一封装成标准接口,让你可以通过修改一行配置就能无缝切换底层大脑。
  • Output Parsers(输出解析器):大模型默认吐出的是纯文本(String)。解析器负责强行把这些文本转换成结构化数据(如 JSON、TypeScript 对象、Markdown 表格等),这是程序能够读取大模型返回结果的关键。

2.工具和动作(Tools/Tool Calling)

这是模型的“手和脚”,让原本与世隔绝的大模型能够对真实世界产生影响。

  • Tools(工具):任何一个 Python 函数或 TypeScript 函数,只要通过 LangChain 的 tool 装饰器包装,并用 ZodPydantic 声明了参数结构,就变成了大模型可见的“工具”。
  • Toolkit(工具包):针对特定场景封装的一组工具(例如:Office 办公工具包、SQL 数据库操作工具包、GitHub 代码管理工具包等)。

3.数据连接与检索增强(Retrieval / RAG)

大模型的知识是有截止日期的,且无法直接读取企业私有数据。这一组件负责把外部知识(本地文档、数据库)“喂”给模型。

  • Document Loaders(文档加载器): 负责读取各种格式的外部数据(PDF、Word、Notion、网页、YouTube 字幕等)。
  • Text Splitters(文本分割器): 大模型的上下文有限。分割器负责将几十万字的长文按照语义、Token 数量精细地切成一个个“小碎块”(Chunks)。
  • Embeddings(向量嵌入模型): 将文本小碎块转化为计算机能听懂的数学向量。
  • Vector Stores(向量数据库): 专门用来存储和快速检索这些向量的数据库(如 Chroma, Pinecone, Milvus)。当用户提问时,Harness 会先去向量数据库里“捞出”最相关的背景知识,再一起丢给大模型。

4.记忆管理(Memory / Persistence)

大模型底层的 API 是无状态(Stateless)的,它记不住你上一句说了什么,因此需要把记忆保存起来。

  • Chat Message History(对话历史): 负责自动在后台帮大模型把过去几轮的聊天记录持久化(可以存在内存里,也可以存在 Redis 或 MongoDB 等其他数据库里)。
  • Memory Summarization(记忆摘要): 当对话轮次太多、Token 快要爆掉时,该组件会自动触发,把早期的对话压缩成一两句摘要,从而让大模型拥有“长期记忆”的同时不超额消耗 Token。

5. 统一表达式语言(LCEL - LangChain Expression Language)

这是 LangChain 的灵魂纽带(强力胶水)

在早期的 LangChain 中,把上述组件串联起来需要写非常臃肿的代码。现在,LangChain 推出了 LCEL 语法。它允许你使用类似于 Linux 管道符 | 的方式,把 Prompt、Model、Parser 像连连看一样串在一起:

// LCEL 声明式语法:数据像流水一样自上而下流动
const chain = promptTemplate.pipe(model).pipe(outputParser);
const response = await chain.invoke({ topic: "AI" });

LCEL 带来的工程红利: 它在底层自动为你实现了流式传输(Streaming)、异步支持(Async)、并行执行(Parallel)和自动重试(Retry)。

6.核心运行时与图编排(LangGraph)

在现代 LangChain 体系中,复杂的 Agent 循环已经不再用普通的“链(Chains)”来写了,而是交给了 LangGraph。

  • State Management(状态管理): 整个 Agent 在执行过程中,它的内存、临时变量被维护在一个全局的 State(状态)中。
  • Nodes & Edges(节点与边): 把大模型、工具、人工审批环节定义为“节点”,把它们之间的逻辑跳转定义为“边”。这让你能够用控制流图(State Graph)的方式,精确地编写出带有条件分支、死循环纠错、多智能体协同(Multi-Agent)的复杂工业级系统。

什么时候该用 LangChain?

坚决不用的场景(走向自研 Harness)

  1. 像素级控价与长文本高频交互(如:本地代码助手、智能 IDE)

原因: 像 Claude Code 这样需要分析大量本地文件、频繁计算 Diff 的产品,对 Token 极其敏感。LangChain 的组件会在后台隐式拼接大量冗余的提示词和包裹格式。如果你需要对输入模型的每一个 Token、每一行上下文压缩算法进行像素级的极致优化,框架的封装只会成为你的绊脚石。

  1. 追求 100% 行为确定性与极易调试的商用级产品

原因: 大模型本身就是个随机黑盒,如果你的控制外壳(Harness)又是 LangChain 这种充满了异步回调和黑盒 Runnable 管道的框架,双重黑盒叠加会导致调试成为灾难。当你需要对每一次 API 重试、每一次异常捕获、每一个 Tool 报错拥有绝对的修改和拦截权时,请直接用原生 SDK + Zod 手写 while 循环。

  1. 单轮次的、固定的确定性任务

原因: 业务如果只是单纯的“输入、翻译文本”或“输入、提取结构化 JSON”,直接调用 OpenAI / Anthropic 的原生官方 SDK 最为清爽。
引入 LangChain 纯属高炮打蚊子,不仅增加依赖负担,还容易因为框架版本激进迭代而报错。

强烈推荐使用 LangChain 的场景

  1. 宏观业务流程极其复杂、涉及标准作业程序(SOP)的系统

原因: 比如你要做一个“多租户的企业 ERP 智能助理”或“多阶段自动化审计系统”。这类系统需要调几十个不同的工具,根据工具返回的结果走复杂的条件分支,甚至需要人工审批(Human-in-the-loop)按下暂停键。

做法: 别去手写状态机。直接用 LangChain 旗下的 LangGraph。它把底层的状态持久化、会话重放、节点跳转原语全部做好了,你只需要像拼乐高一样画出宏观的流程图即可。

  1. 处于“敏捷开发、快速验证”阶段的创新项目(跑 Demo 抢市场)

原因: 大模型生态变化太快,今天流行这个向量数据库,明天那个新模型降价。LangChain 拥有全网最恐怖的生态连接力(Integrations)。

做法: 在项目早期,你需要今天试 Notion、明天试 PDF、后天换 Claude 引擎。用 LangChain 可以让你只改一行配置就完成底层基础设施的解耦,以极低的研发成本快速交付 MVP(最小可行性产品)。

  1. 离线数据清洗与重度 RAG(检索增强生成)管道

原因: 处理几十万字的企业私有文档、加载各种乱七八糟的 PDF/Word 格式、切分文本(Text Splitting)、入向量库。

做法: 这一套离线流水线(Pipeline)用 LangChain 的生态组件(Document Loaders / Text Splitters)效率极高,没必要自己手写。