前言
自 2022 年 ChatGPT 引爆 AIGC 热潮以来,大语言模型(LLM)能力飞速迭代,开发者迫切需要一套成熟的框架来工程化地构建 AI 应用。LangChain 正是为此而生——它最早于 ChatGPT 发布前就已启动,目前 JavaScript 版(LangChain.js)已推出 1.0+ 稳定版本,成为 Node.js 和前端项目中最流行的 AI 应用开发框架。
LangChain 的核心理念可以用公式概括:LangChain = Lang + Chain。
- Lang:指 Language Model,即各种大语言模型。
- Chain:指将多个可执行步骤(Prompt、LLM、工具、输出解析等)链接起来的工作流,类似于 Coze 或 n8n 的可视化节点连接。
LangChain.js 采用 ESM 模块规范,生态完善,支持数十种主流 LLM 提供商(如 OpenAI、DeepSeek、Anthropic、Groq 等),通过统一的适配器接口,让开发者可以轻松切换底层模型,而无需改动业务代码。
本文通过四个逐步递进的实战 Demo,带你从零开始掌握 LangChain.js 的核心用法:
- 直接调用 LLM + PromptTemplate 基础使用
- 使用 pipe 构建简单 Chain
- 使用 RunnableSequence 组合多个 Chain 实现复杂流程
- 基础环境配置与最佳实践
环境准备
项目使用 ESM 模式,确保 package.json 中包含:
JSON
{
"type": "module"
}
安装必要的包(以 DeepSeek 为例,性价比高且支持中文优秀):
Bash
pnpm i @langchain/deepseek @langchain/core dotenv
创建 .env 文件存放 API Key:
text
DEEPSEEK_API_KEY=sk-xxxxxxxxxxxxxxxxxxxx
LangChain 会自动从环境变量读取对应的 Key,无需手动传入。
Demo1:基础调用与 PromptTemplate
最简单的 AI 应用就是“问答”。我们先直接调用模型,再引入 PromptTemplate 实现提示词复用。
JavaScript
import 'dotenv/config';
import { ChatDeepSeek } from '@langchain/deepseek';
import { PromptTemplate } from '@langchain/core/prompts';
const model = new ChatDeepSeek({
model: 'deepseek-reasoner',
temperature: 0.7,
});
// 先定义可复用的提示词模板
const prompt = PromptTemplate.fromTemplate(`
你是一个{role},
请用不超过 {limit} 字回答以下问题:
{question}
`);
// 复用模板生成不同场景的提示词
const prompt1 = await prompt.format({
role: '前端面试官',
limit: '50',
question: '什么是闭包',
});
const prompt2 = await prompt.format({
role: '后端面试官',
limit: '50',
question: '什么是MVC?',
});
const prompt3 = await prompt.format({
role: '熊二',
limit: '50',
question: '光头强为什么要砍树?',
});
// 调用模型
const res = await model.invoke(prompt3);
console.log(res.content);
核心要点:
- PromptTemplate.fromTemplate 是静态方法,直接在类上调用。
- format 方法返回格式化后的字符串,可多次复用。
- ChatDeepSeek 继承自统一的 chat model 接口,未来切换到其他模型只需改一行。
这个例子展示了 Prompt 工程的基础:通过角色扮演(role)和字数限制(limit)控制输出风格和长度。
Demo2:使用 pipe 构建简单 Chain
实际 AI 应用往往不止“提示 + 调用”这么简单。我们希望将 Prompt 和 LLM 封装成一个可复用的“链”(Chain)。
LangChain.js 提供了 pipe 方法,将多个 Runnable(可运行对象)连接起来。
JavaScript
import 'dotenv/config';
import { ChatDeepSeek } from '@langchain/deepseek';
import { PromptTemplate } from '@langchain/core/prompts';
const model = new ChatDeepSeek({
model: 'deepseek-reasoner',
temperature: 0.7,
});
const prompt = PromptTemplate.fromTemplate(`
你是一个前端专家,用一句话解释:{topic}
`);
// prompt.pipe(model) 形成一个 RunnableSequence(顺序链)
const chain = prompt.pipe(model);
const response = await chain.invoke({
topic: '什么是闭包?',
});
console.log(response.content); // 注意:chat model 返回 AIMessage,内容在 .content
关键理解:
- prompt.pipe(model) 等价于:输入 → 格式化提示词 → 调用 LLM → 输出。
- 返回的 chain 是一个 RunnableSequence 实例,具备 invoke、stream 等统一方法。
- 整个链作为一个整体可以被再次组合,体现了 LangChain 的“可组合性”。
这种方式让代码更清晰,也便于单元测试和复用。
Demo3:组合多个 Chain 实现复杂流程
真实场景中,我们常常需要多步处理。例如:先让模型详细解释一个概念,再将解释总结为几个要点。
这就需要将多个 Chain 串联起来。
JavaScript
import 'dotenv/config';
import { ChatDeepSeek } from '@langchain/deepseek';
import { PromptTemplate } from '@langchain/core/prompts';
import { RunnableSequence } from '@langchain/core/runnables';
const model = new ChatDeepSeek({
model: 'deepseek-reasoner',
temperature: 0.7,
});
const explainPrompt = PromptTemplate.fromTemplate(`
你是一个前端专家,请详细介绍以下概念:{topic}
要求:覆盖定义、原理、使用方式,不超过300字
`);
const summaryPrompt = PromptTemplate.fromTemplate(`
请将以下前端概念解释总结为3个核心要点(每点不超过20字):
{explanation}
`);
const explainChain = explainPrompt.pipe(model);
const summaryChain = summaryPrompt.pipe(model);
// 使用 RunnableSequence.from 显式构建完整链
const fullChain = RunnableSequence.from([
// 第一步:解释概念
async (input) => {
const res = await explainChain.invoke({ topic: input.topic });
return res.content; // 返回纯文本给下一步
},
// 第二步:基于解释文本进行总结
async (explanation) => {
const res = await summaryChain.invoke({ explanation });
return `【详细解释】\n${explanation}\n\n【核心要点】\n${res.content}`;
}
]);
const response = await fullChain.invoke({
topic: '闭包',
});
console.log(response);
输出示例:
text
【详细解释】
闭包是指函数与其周围的词法环境(变量)组合形成的实体...
...
【核心要点】
1. 函数嵌套定义
2. 内部函数引用外部变量
3. 外部函数执行后变量仍存活
进阶技巧:
- 中间步骤返回纯文本而不是完整 AIMessage,避免后续模板注入对象导致错误。
- 使用 RunnableSequence.from 可以精确控制每一步的输入输出转换。
- 未来可轻松扩展为三步、四步链(如解释 → 总结 → 生成面试题)。
这种多步 Chain 是 LangChain 最强大的特性之一,完美对应了 Agent、RAG、工具调用等复杂场景。
Demo4:最简调用方式(适合快速测试)
如果你只是想快速验证模型效果,最简方式如下:
JavaScript
import 'dotenv/config';
import { ChatDeepSeek } from '@langchain/deepseek';
const model = new ChatDeepSeek({
model: 'deepseek-reasoner',
temperature: 0,
});
const res = await model.invoke('用一句话解释什么是RAG?');
console.log(res.content);
无需任何 PromptTemplate,直接传入字符串即可。LangChain 内部会自动包装成合适的聊天消息格式。
最佳实践总结
- 优先使用 ESM:享受现代 JS 特性,生态支持更好。
- 模型可拔插:通过 @langchain/* 系列包切换不同提供商(如 @langchain/openai、@langchain/anthropic)。
- Prompt 模板化:所有提示词都用 PromptTemplate 管理,便于维护和测试。
- Chain 组合优先:即使简单逻辑也建议封装成 Chain,方便后续扩展。
- 注意输出类型:Chat Model 返回 AIMessage,内容在 .content;Completion Model 返回字符串。
- 环境变量管理:敏感 Key 全部放在 .env,LangChain 自动识别。
结语
LangChain.js 把复杂的 AI 应用开发拆解为“提示词 + 模型 + 链”三个清晰层次,让开发者可以像搭积木一样构建智能应用。无论是快速原型、RAG 系统、Agent 工具调用,还是企业级 AI 工作流,LangChain 都提供了统一的、工程化的解决方案。
从本文的四个 Demo 你可以看到:入门门槛极低,只需几行代码就能调用最先进的模型;同时上层能力极强,支持任意复杂流程编排。
推荐大家立即动手搭建一个自己的 AI 知识问答助手、代码解释工具或内容生成器。AI 应用开发已不再是少数大厂的专利——有了 LangChain,每一个前端、Node.js 开发者都能轻松玩转大模型。
行动起来,开启你的 AI 应用开发之旅吧!