概念介绍:LangChain 是什么
概念介绍:LangChain 是什么
LangChain 是一个面向大模型(LLM)应用的开发框架。它本身不训练模型,也不托管模型,而是在「模型 API」和「你的业务代码」之间做一层标准化封装:把提示词、模型、输出解析、检索、工具调用、对话记忆这些环节,各自抽象成独立的组件,再用统一的接口把它们串起来。你用 Python 写的一条链,可以在几行之内从 OpenAI 换到本地 Ollama,从 FAISS 换到 pgvector,而业务逻辑一行都不用动。
它解决的核心问题可以归纳为四点:
- 胶水代码重复:直接调 API 时,每个项目都要重写一遍「拼提示词 → 发请求 → 重试 → 解析 JSON → 处理流式」的样板代码,LangChain 把这些收进组件里。
- 组件不可替换:模型、向量库、文档加载器一旦写死在业务逻辑里,换供应商就要大改;LangChain 把它们变成可替换的插槽。
- 多步骤编排困难:真实需求往往是「先检索,再判断,再调工具,再回填」,纯函数式调用越写越乱;LCEL 与 LangGraph 分别提供了链式与图式的编排方式。
- 可观测性缺失:一次回答经过了哪些提示词、检索到哪些片段、花了多少 token,直接调 API 时全靠自己打日志;LangChain 用回调机制与 LangSmith 补齐了这一环。
与「直接调 API」「LlamaIndex」「Dify」的区别
直接调官方 SDK 是最轻的路径:没有额外依赖,行为完全透明,适合单轮、逻辑简单、只用一家模型的场景。代价是每加一个数据源、每换一次模型、每引入一次工具调用,都要自己写一层适配。LangChain 的价值在应用变复杂之后才显现——尤其是需要多轮检索、工具调用、带分支的状态流转的时候。
| 方案 | 定位 | 优势 | 局限 |
|---|---|---|---|
| 直接调用模型 SDK | 最薄的客户端封装 | 无依赖、行为透明、调试直接 | 组件要自己抽象,多步骤编排全靠手写 |
| LangChain / LangGraph | 通用 LLM 应用开发框架 | 组件生态齐全,链式与状态图两种编排范式,模型与存储可自由替换 | 抽象层级多,版本迭代快,出问题常常要读源码 |
| LlamaIndex | 偏 RAG 与数据接入的框架 | 索引结构、节点解析、检索策略做得更细 | 超出检索范畴的流程编排能力弱于 LangGraph |
| Dify / Coze 等低代码平台 | 可视化拖拽的应用平台 | 不写代码就能上线,自带界面、审计、多租户 | 逻辑复杂后受平台能力限制,深度定制与本地调优困难 |
一句话选择建议:只做一次问答,直接调 SDK;主体是「把文档喂进去做问答」,用 LangChain 的检索组件或 LlamaIndex;要做多步骤、带分支和循环的智能体,用 LangGraph;完全不打算写代码,选低代码平台。
核心术语表
| 术语 | 含义 | 典型类 / 函数 |
|---|---|---|
| Chain(链) | 把若干组件按顺序组合成一个可调用对象,是 LangChain 最基础的组织单位 | chain = prompt | llm | parser |
| Runnable | 统一的可调用协议,所有组件都实现它,因此天然支持 invoke / batch / stream / ainvoke | RunnablePassthrough、RunnableLambda |
| LCEL | LangChain Expression Language,用管道符 | 声明式拼接 Runnable 的表达式语言 | prompt | model | parser |
| Retriever(检索器) | 输入一个问题字符串,输出一组相关文档片段,是 RAG 的入口 | vectorstore.as_retriever() |
| Tool(工具) | 暴露给模型调用的函数,带名称、描述与参数结构,模型据此判断是否调用 | @tool 装饰器 |
| Agent(智能体) | 由模型自主决定调用哪个工具、调用几次、何时结束的循环 | create_react_agent |
| Memory(记忆) | 跨轮次保存对话历史,使模型在下一轮能看到之前的上下文 | RunnableWithMessageHistory |

