嗨,同学!欢迎来到 AIGC 的奇妙世界。
如果你还在纠结怎么用代码去调各个大模型的 API,如果你被各种复杂的提示词(Prompt)搞得头大,那么今天这篇文章就是为你准备的。我们要聊的是 AI 应用开发界的“瑞士军刀”——LangChain。
2022 年底 ChatGPT 横空出世,Transformer 架构彻底改变了 AI 的格局。但很多人不知道,LangChain 其实比 ChatGPT 发布的 1.0 版本还要早一点。它不是一个模型,而是一个开发框架。
一、 什么是 LangChain?为什么新手必学?
简单来说:LangChain = Lang(Language 模型) + Chain(链条) 。
- Lang:代表大语言模型(LLM)。
- Chain:就是把一个个“节点”(比如提示词、模型、数据处理逻辑)像 n8n 或 Coze 那样链接起来,形成一个自动化的工作流。
为什么不用官方 SDK,非要用 LangChain?
想象一下,今天你想用 DeepSeek(性价比之王!),明天你想换成 GPT-4o,后天你又想试试 Claude。如果你用官方 SDK,每次都要改一堆接口代码。
LangChain 最大的好处就是:适配器模式(Provider)。
它统一了市面上几乎所有主流 LLM 的接口。你只需要换一个包名,逻辑一行都不用动。这种“可拔插”的特性,在 LLM 更新换代极快的今天,简直是开发者的救命稻草。
二、 环境搭建:从 ESM 开始
现在的 Node.js 开发推荐使用 ESM (ES Modules) 模式,这样我们可以直接使用顶层的 await。
-
初始化项目:
在 package.json 中添加 "type": "module"。
-
安装依赖:
Bash
pnpm i @langchain/deepseek dotenv这里我们选择了
@langchain/deepseek。LangChain 已经帮我们把复杂的模型适配工作做好了。
三、 实战演练:从单点调用到复杂工作流
先看看大模型调用传统写法
import "dotenv/config";
import OpenAI from "openai";
// 1. 手动实例化客户端
const openai = new OpenAI({
// SDK 默认会去请求 https://api.openai.com/v1
baseURL: 'https://api.deepseek.com',
apiKey: process.env.DEEPSEEK_API_KEY
});
async function main() {
const response = await openai.chat.completions.create({
messages: [{ role: "user", content: "用一句话解释什么是RAG?" }],
model: "deepseek-reasoner",
temperature: 0,
});
// 原生返回结构很深:choices -> [0] -> message -> content
console.log(response.choices[0].message.content);
}
main();
💡 关键点
- 必须手动配置 baseURL
- 必须手动传入 API Key
- 调用 复杂的
chat.completions接口- 传入复杂的
message- 层层解析返回对象才能获得目标信息
重复的工作并且流程复杂,让许多新手头疼,这个时候就该langchain闪亮登场了!!!
1. 初试化:一行代码调用 DeepSeek
我们先看最基础的调用。注意看代码里的注释:
JavaScript
import "dotenv/config"; // 自动读取环境变量中的 API KEY
import { ChatDeepSeek } from "@langchain/deepseek";
const model = new ChatDeepSeek({
model: 'deepseek-reasoner', // 使用 DeepSeek 的推理模型
temperature: 0,
})
// invoke 是 LangChain 的标准执行方法
const res = await model.invoke('用一句话解释什么是RAG?');
console.log(res.content);
💡 关键点:
- LangChain 内部实现了适配器模式。
- 我们不需要手动配置 baseURL(除非你用代理),
- 它会自动识别环境变量中的 DEEPSEEK_API_KEY。
- 返回的
res中content就是目标结果
2. 提示词工程:PromptTemplate 的妙用
在实际业务中,我们不可能手写所有的提示词。我们需要“模板”。PromptTemplate 类可以帮我们实现提示词的参数化。
JavaScript
import { PromptTemplate } from "@langchain/core/prompts";
const prompt = PromptTemplate.fromTemplate(`
你是一个{role}.
请用不超过 {limit} 字回答以下问题:
{question}
`);
// 格式化模板,生成具体的字符串
const promptStr = await prompt.format({
role: '前端面试官',
limit: '50',
question: '什么是闭包'
});
console.log(promptStr); // 打印出来的就是一段完整的提示词
💡 关键点:
- 使用 static 方法 fromTemplate 快速创建模板
- {role}、{limit} 是占位符,后续动态填充
PromptTemplate 的核心好处在于实现了提示词的“逻辑与内容分离”: 它将原本硬编码在代码里的乱麻字符串,转变成了可复用的“函数模板”,让你能像填充 Excel 表格一样动态注入变量(如用户输入、背景角色等),不仅避免了手动拼接字符串的低级错误,还让提示词版本管理和多场景适配变得像换个插件一样简单。
四、 核心黑科技:构建工作流(Chain)
这是 LangChain 的灵魂。AI 应用通常很复杂,需要分步处理。比如:先搜索 -> 再总结 -> 最后翻译。
简单链:Pipe 管道操作
LangChain 提供了一个类似 Unix 管道的语法:.pipe()。
JavaScript
import { ChatDeepSeek } from "@langchain/deepseek";
import { PromptTemplate } from "@langchain/core/prompts";
const model = new ChatDeepSeek({ model: 'deepseek-reasoner' });
const prompt = PromptTemplate.fromTemplate(`你是一个专家,用一句话解释:{topic}`);
const chain = prompt.pipe(model);
// invoke 时直接传入模板变量即可
const response = await chain.invoke({ topic: '闭包' });
console.log(response.content);
💡 关键点:
- pipe 就像接水管,把 prompt 节点生成的 prompt提示词 像水一样流入 model 节点形成工作流(workflow)。
- 任务的顺序是:输入 -> 格式化 Prompt -> 调用大模型 -> 输出结果
在这里打印chain会发现chain是一个RunnableSequence对象(可执行序列),那么RunnableSequence到底是什么呢?
复杂链:RunnableSequence 顺序流
当你的业务需要“环环相扣”时,RunnableSequence 就派上用场了。它可以把多个 Chain 组合成一个大的工作流。
场景:先让 AI 详细解释一个概念,再让 AI 对这个解释做三个要点的总结。
JavaScript
import { RunnableSequence } from "@langchain/core/runnables";
// 节点1:详细解释
const explainPrompt = PromptTemplate.fromTemplate(`请详细介绍概念:{topic}`);
const explainChain = explainPrompt.pipe(model);
// 节点2:核心总结
const summaryPrompt = PromptTemplate.fromTemplate(`请将以下内容总结为3个要点:{explanation}`);
const summaryChain = summaryPrompt.pipe(model);
const fullChain = RunnableSequence.from([
// 第一步:执行解释链,并提取 text
(input) => explainChain.invoke({ topic: input.topic }).then(res => res.content),
// 第二步:将第一步的 text 传给总结链
async (explanation) => {
const summary = await summaryChain.invoke({ explanation });
return `【详细解释】:${explanation}\n【核心总结】:${summary.content}`;
}
]);
const result = await fullChain.invoke({ topic: 'MVC 架构' });
console.log(result);
💡 关键点:
- 使用 RunnableSequence.from 将多个逻辑串联。
- 上一个节点的输出会作为下一个节点的输入。
五、 总结:LangChain 到底帮我们解决了什么?
对于新手来说,你只需要记住这三点:
- 解耦(Adapter) :模型随便换,接口全统一。
@langchain/deepseek这种包让你几秒钟就能适配新模型。 - 工程化(Prompt Engineering) :不再是凌乱的字符串拼接,而是通过
PromptTemplate进行模版管理。 - 流式处理(Workflow) :通过
pipe和RunnableSequence,你可以把复杂的 AI 逻辑像搭积木一样组装起来,这就是所谓的 Agent(智能体) 的雏形。
AI 应用的开发不仅仅是“调接口”,更是一场工程化的变革。LangChain 就是那个帮你把“黑盒”变成“生产线”的神器。