直接调 OpenAI 的 SDK 写个回声机器人,二十行就完事。可真实需求往往不是回声:要读一份 PDF 再回答、要查数据库、要调天气接口、要记住上一句说了什么。每加一样,你就得手写拼接逻辑,代码很快缠成一团乱麻。
LangChain 不是又一个模型 API。它是一套围绕"调模型"这件事的抽象层,把那些重复出现的脏活(拼提示词、接外部数据、管上下文、决定调哪个工具)拆成边界清晰的模块。你关心的业务流用几条管道拼起来,剩下的交给它。
这篇先把全景摊开,后面四篇再逐个拆开实战。
为什么需要这一层
模型本身只干一件事:吃一段文本,吐一段文本。可工程里你想要的是"带上下文的回答""能查资料的回答""会调工具的回答"。这些都不是模型原生能力,是你在外面套的逻辑。
没有框架时,这些逻辑散落在业务代码里:提示词在字符串里、检索结果在临时变量里、历史消息在数组里。功能一多,三者互相引用,改一处崩一片。LangChain 的思路是给每类逻辑一个统一接口,再用一套组合语法把它们接起来。
五个核心抽象
整个库可以粗略切成五层,从内到外:
- Model I/O:模型、提示词、输出解析。这是最底层,对应"怎么把输入变成输出"。
- Retrieval(检索):文档加载、切分、向量化、检索。对应"怎么把外部知识喂给模型"。
- Memory(记忆):多轮对话的上下文管理。对应"怎么让模型记得之前聊过什么"。
- Chains(链):把上面任意几层用 LCEL 管道串成一段流程。对应"怎么把步骤拼起来"。
- Agents(智能体):让模型自己决定下一步调哪个工具。对应"怎么把控制权部分交给模型"。
还有一层横切的 Callbacks,负责把每次调用的输入输出、耗时、token 数往外抛,做日志和观测用。它不在这五层里,但贯穿全程。
包是怎么分的
早期 LangChain 是个大单体包,装完几百个依赖。现在拆成了几个:
langchain-core:只放最基础的抽象(Runnable 接口、ChatModel 基类、Document),不绑任何具体实现。langchain:把上面的模块组合成高级用法(各种 chain、agent 构造器)。langchain-community:社区贡献的几百个集成(各类向量库、加载器)。langchain-openai/langchain-<provider>:各家模型的官方适配。
实战里你通常装 langchain 加上具体 provider 包就够了。
pip install langchain langchain-openai
一个最小例子
先不接任何外部数据,只看"提示词 + 模型 + 解析"这条最短链路:
from langchain_openai import ChatOpenAI from langchain_core.prompts import ChatPromptTemplate from langchain_core.output_parsers import StrOutputParser model = ChatOpenAI(model="gpt-4o-mini") prompt = ChatPromptTemplate.from_messages([ ("system", "你是一个把技术概念讲给工程师听的助手,只用中文。"), ("human", "用一句话解释 {concept}"), ]) chain = prompt | model | StrOutputParser() print(chain.invoke({"concept": "向量数据库"}))
prompt | model | StrOutputParser() 里的竖线就是 LCEL(LangChain Expression Language),后面会专门讲。它表达的是"提示词生成、模型推理、文本解析"三段顺序执行。
这里有个坑得提前说:模型不是必须的。LCEL 里每个节点只要实现了 Runnable 接口就能接,所以你后面会看到"不调模型、纯做字符串处理的链"也完全合法。
后四篇怎么排
- 第二篇:用 LCEL 把链写顺,覆盖 PromptTemplate、消息模板、输出解析、并行与分支。
- 第三篇:RAG,把"读文档再回答"跑通,覆盖加载、切分、向量化、检索。
- 第四篇:Tool 与 Agent,让模型自己挑工具调用。
- 第五篇:综合实战,把 RAG 和工具拼成一个能查资料、能调接口的知识库问答 Agent。
先记住一句话:LangChain 的价值不在"调模型",在于"把调模型前后的脏活标准化"。后面 progressively 加东西时,你会对这句话越来越有体感。
环境说明:示例基于 langchain 0.3.x / langchain-core 0.3,模型以 OpenAI 为例。换 DeepSeek、智谱等兼容端点,只需换 provider 包和 model 名,管道写法不变。