LangChain:让大模型开发像搭积木一样简单
2022年,ChatGPT 的横空出世引爆了全球对生成式人工智能(AIGC)的关注。然而很多人可能不知道,在 ChatGPT 爆火之前,一个名为 LangChain 的开源框架就已经悄然诞生,并在 2023 年发布了 1.0+ 正式版本。LangChain 并不是大模型本身,而是一个面向大语言模型(LLM)应用开发的工程化框架,其核心理念是“Lang + Chain”——用自然语言驱动、通过可组合的链(Chain)构建复杂 AI 应用。
本文将从基础概念出发,结合实战代码,带你深入理解 LangChain 的设计哲学与使用方式,尤其适合前端工程师快速上手 AI 应用开发。
一、为什么需要 LangChain?
大模型如 DeepSeek、GPT、Claude 等虽然强大,但直接调用 API 存在几个痛点:
- 模型接口不统一:不同厂商的 API 参数、格式、认证方式各异;
- 提示词(Prompt)管理混乱:硬编码字符串难以维护和复用;
- 业务逻辑复杂:真实场景往往需要多步推理、工具调用、记忆上下文等;
- 模型迭代快:今天用 DeepSeek,明天可能换 Qwen,代码耦合度高。
LangChain 正是为解决这些问题而生。它通过适配器模式统一了 LLM 接口,通过模块化组件(如 PromptTemplate、RunnableSequence)让开发者像搭积木一样构建 AI 工作流。
二、LangChain 核心概念解析
1. lang:统一的大模型抽象层
LangChain 提供了对主流 LLM 的封装,例如 @langchain/deepseek、@langchain/openai 等。你只需安装对应包,即可用完全一致的接口调用不同模型。
// main.js
import 'dotenv/config'; // 加载 .env 文件中的环境变量到 process.env
import { ChatDeepSeek } from '@langchain/deepseek';
const model = new ChatDeepSeek({
model: 'deepseek-reasoner',
temperature: 0,
});
const res = await model.invoke('用一句话解释什么是RAG?');
console.log(res.content);
注意:LangChain 会自动从环境变量(如 DEEPSEEK_API_KEY)读取密钥,无需手动传入 apiKey 或 baseURL。这种设计极大简化了配置,也便于切换模型——只需改一行 import 和构造函数。
💡 关于
dotenv:dotenv是一个轻量级 Node.js 工具,用于将项目根目录下的.env文件中的键值对自动加载到process.env中。这样我们就能安全地管理敏感信息(如 API Key),避免硬编码或提交到 Git。例如,在.env中写入DEEPSEEK_API_KEY=sk-xxx,代码中即可通过process.env.DEEPSEEK_API_KEY访问,而 LangChain 会自动读取该变量,无需手动传参。
2. chain:可组合的工作流
真实 AI 应用很少是“问一句答一句”。比如面试系统可能需要:
- 生成结构化问题;
- 调用模型回答;
- 对答案打分总结。
LangChain 的 Chain 机制允许我们将多个步骤串联成流水线。这类似于低代码平台(如 n8n、Coze)中的节点连接,但以代码形式实现,更灵活可控。
三、LangChain 实战:从简单到复杂
示例 1:动态提示词 —— PromptTemplate
硬编码提示词难以复用。LangChain 提供 PromptTemplate,支持变量插值:
// 1.js
import 'dotenv/config';
import { PromptTemplate } from '@langchain/core/prompts';
const prompt = PromptTemplate.fromTemplate(`
你是一个{role}。
请用不超过{limit}字回答以下问题:
{question}
`);
const promptStr = await prompt.format({
role: '前端面试官',
limit: '50',
question: '什么是闭包?'
});
const res = await model.invoke(promptStr);
console.log(res.content);
通过模板,我们实现了提示词的参数化与复用,这是工程化的第一步。
示例 2:构建简单链 —— RunnableSequence
当提示词和模型调用频繁配对时,可以将其封装为一个“链”:
// 2.js
import { RunnableSequence } from '@langchain/core/runnables';
const prompt = PromptTemplate.fromTemplate(`你是一个前端专家,用一句话解释:{topic}`);
const chain = prompt.pipe(model); // 使用 pipe 连接
const response = await chain.invoke({ topic: '闭包' });
console.log(response.text);
这里,prompt.pipe(model) 创建了一个 RunnableSequence 实例。它代表一个顺序执行的工作流:输入 → 提示词渲染 → 模型调用 → 输出。这种声明式写法清晰表达了数据流向。
示例 3:多步复杂链 —— 组合多个 Runnable
更复杂的场景需要多阶段处理。例如:先详细解释概念,再提炼要点。
// 3.js
const explainPrompt = PromptTemplate.fromTemplate(`
你是一个前端专家,请详细介绍以下概念:{topic}
要求:覆盖定义、原理、使用方式、不超过300字。
`);
const summaryPrompt = PromptTemplate.fromTemplate(`
请将以下前端概念解释总结为3个核心要点(每点不超过20字):
{explanation}
`);
const explainChain = explainPrompt.pipe(model);
const summaryChain = summaryPrompt.pipe(model);
const fullChain = RunnableSequence.from([
(input) => explainChain.invoke({ topic: input.topic }).then(res => res.text),
(explanation) => summaryChain.invoke({ explanation }).then(res =>
`知识点:${explanation}\n总结:${res.text}`
),
]);
const res = await fullChain.invoke({ topic: '闭包' });
console.log(res);
这个例子展示了 LangChain 的强大之处:
- 分阶段处理:解释 → 总结;
- 中间结果传递:前一步的输出作为后一步的输入;
- 自定义逻辑嵌入:可在链中插入任意 JavaScript 函数。
这种模式非常适合构建Agent、RAG 系统、智能客服等复杂 AI 应用。
四、LangChain vs 传统做法:一场工程化革命
为了更直观地理解 LangChain 的价值,我们将其与“传统裸调 API”的方式做对比:
| 维度 | 传统做法(裸调 API) | LangChain 方式 |
|---|---|---|
| 模型切换 | 需重写整个请求逻辑(URL、headers、body 结构都不同) | 只需更换 import 和构造函数,接口完全一致 |
| 提示词管理 | 字符串拼接,易出错、难测试、无法复用 | 使用 PromptTemplate,支持变量、版本控制、单元测试 |
| 多步流程 | 手动嵌套 async/await,逻辑耦合严重 | 用 RunnableSequence 声明式编排,清晰可读 |
| 错误处理 & 重试 | 需自行封装 try-catch、指数退避等逻辑 | 内置 retry、fallback、streaming 等高级能力 |
| 可测试性 | 黑盒调用,难以 mock | 每个组件(prompt、model、chain)均可独立测试 |
| 扩展性 | 添加新功能(如记忆、工具调用)需大量重构 | 通过 LangChain 的 Memory、Tools、Agents 模块无缝集成 |
举个具体例子:
传统写法(伪代码) :
const response = await fetch('https://api.deepseek.com/chat', {
method: 'POST',
headers: { 'Authorization': `Bearer ${process.env.DEEPSEEK_API_KEY}` },
body: JSON.stringify({
model: 'deepseek-reasoner',
messages: [{ role: 'user', content: `你是一个前端专家...` }]
})
});
const data = await response.json();
console.log(data.choices[0].message.content);
一旦要换成 OpenAI,几乎整段都要重写。
而 LangChain 写法:
// 只需改这一行
// import { ChatDeepSeek } from '@langchain/deepseek';
import { ChatOpenAI } from '@langchain/openai';
const model = new ChatOpenAI({ model: 'gpt-4o' });
// 后续代码完全不变!
这种“插件化模型接入”正是 LangChain 的核心优势——它把 LLM 变成了可拔插的“服务组件”,而非绑定死的基础设施。
五、结语:LangChain 是 AI 应用的“React”
如果说 React 让 UI 开发组件化,那么 LangChain 就是让 AI 开发工作流化。它不生产模型,而是让模型更好用;它不替代 Prompt Engineering,而是让 Prompt 可管理、可复用、可组合。
随着 AIGC 从“玩具”走向“生产力工具”,LangChain 这类工程化框架将成为连接大模型与真实业务的桥梁。无论你是前端、后端还是全栈工程师,掌握 LangChain 都将为你打开 AI 应用开发的新大门。
小贴士:本文所有代码基于
@langchain/deepseek,你也可以轻松替换为@langchain/openai、@langchain/anthropic等,体验真正的“模型无关”开发。别忘了在项目根目录创建
.env文件并填入你的 API Key,例如:text 编辑 DEEPSEEK_API_KEY=your-api-key-here并确保
.gitignore中包含.env,防止密钥泄露。
这样,读者不仅能理解 LangChain 的强大,还能掌握安全使用 API 密钥的最佳实践。。
参考资源:
- LangChain 官网:www.langchain.com/
- LangChain.js GitHub:github.com/langchain-a…
- DeepSeek API 文档:platform.deepseek.com/