从脚本到系统:用 LangChain.js 构建真正可维护的 AI 应用
2024 年起,大模型(LLM)开发正式告别“玩具阶段”。当企业开始将 AI 能力嵌入核心业务流程时,一个现实问题浮出水面:仅靠几行 fetch 调用 API 的方式,根本无法支撑生产级系统的稳定性、可维护性与扩展性。
我们很快发现,真正的挑战不在于“能不能调通”,而在于:
- 提示词散落在代码各处,修改一次要改十处;
- 想换模型?光是调整请求格式就得重写半套逻辑;
- 复杂任务需要多轮交互,但上下文管理一团乱麻;
- 业务逻辑和 AI 调用深度耦合,测试与调试举步维艰。
正是在这样的背景下,LangChain 应运而生——它不是另一个大模型,而是一个面向 LLM 应用的工程框架,目标是把 AI 能力封装为像函数、组件一样可组合、可复用、可测试的单元。
本文将以 LangChain.js 与国产高性能模型 DeepSeek(深度求索) 为例,通过四个层层递进的实践阶段,带你完成从“能跑就行”到“工业级交付”的思维跃迁。
阶段一:统一接口 —— 用适配器终结 API 碎片化
在没有框架的时代,调用不同厂商的 LLM 就像在不同国家开车:方向盘位置、油门刹车布局、交通规则全都不一样。
LangChain 的第一步,就是提供统一驾驶舱。
// main.js
import 'dotenv/config';
import { ChatDeepSeek } from '@langchain/deepseek';
const model = new ChatDeepSeek({
model: 'deepseek-reasoner',
temperature: 0, // 确定性输出,适合逻辑推理
});
const response = await model.invoke('用一句话解释什么是 RAG?');
console.log(response.content);
为什么这很重要?
ChatDeepSeek 是一个典型的适配器(Adapter)。它屏蔽了底层细节:
- 自动读取
DEEPSEEK_API_KEY环境变量; - 正确构造请求头与 JSON Body;
- 统一响应解析逻辑。
最关键的是:所有模型在 LangChain 中都暴露相同的 .invoke() 接口。未来若要切换至 OpenAI 或 Claude,只需更换类名,业务逻辑纹丝不动。
💡 温度(temperature)是控制输出风格的“旋钮”:0 表示最严谨(适合代码、推理),0.7+ 则更富创造性(适合文案、故事)。
阶段二:提示词工程化 —— 让 Prompt 成为可管理的资产
直接在代码里拼接字符串式提示词,就像在 HTML 里硬编码样式——短期快,长期痛。
LangChain 提供了 PromptTemplate,让提示词变成“带参数的模板”:
// prompt.js
import { PromptTemplate } from '@langchain/core/prompts';
import { ChatDeepSeek } from '@langchain/deepseek';
const template = PromptTemplate.fromTemplate(`
你是一位{role}。
请用不超过{limit}字回答以下问题:
{question}
`);
const formatted = await template.format({
role: '前端面试官',
limit: '50',
question: '什么是闭包?'
});
const model = new ChatDeepSeek({ model: 'deepseek-reasoner', temperature: 0.7 });
const res = await model.invoke(formatted);
console.log(res.content);
工程价值何在?
- 复用:同一模板可用于“后端工程师”、“产品经理”等角色;
- 集中维护:优化提示逻辑(如增加“用中文回答”)只需改一处;
- 类型安全:在 TypeScript 项目中,模板变量可被静态校验,避免运行时错误。
但注意:这段代码仍是“命令式”的——先格式化,再调用。有没有更优雅的方式?
阶段三:声明式流水线 —— 用 LCEL 实现自动流转
LangChain 的灵魂在于 Chain(链)。通过 LCEL(LangChain Expression Language),我们可以像 Unix 管道一样,将组件串联成自动化流水线。
// chain.js
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}`);
// 关键:用 .pipe() 连接
const workflow = prompt.pipe(model);
const result = await workflow.invoke({ topic: '闭包' });
console.log(result.content);
声明式编程的威力
我们不再写“怎么做”,而是定义“数据流是什么”:
- 输入
{ topic: '闭包' }进入 Prompt; - Prompt 生成完整提示字符串;
- 字符串自动流入 Model;
- 返回最终结果。
所有组件(Prompt、Model、Parser)都实现了 Runnable 接口,支持 .invoke()、.stream()、.batch() 等统一操作。这种设计,是构建智能体(Agent)的基石。
阶段四:复杂任务编排 —— 拆解问题,分而治之
现实需求往往不止一步。比如:“先详细解释闭包原理,再提炼三个核心要点”。
如果塞进一个 Prompt,模型容易顾此失彼。更好的做法是:任务分解 + 顺序执行。
// workflow.js
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 explain = PromptTemplate.fromTemplate(`
请详细介绍:{topic}(含定义、原理、用法,≤300字)
`);
const summarize = PromptTemplate.fromTemplate(`
将以下内容总结为3个要点(每点≤20字):
{explanation}
`);
const explainChain = explain.pipe(model);
const summaryChain = summarize.pipe(model);
const fullWorkflow = RunnableSequence.from([
async (input) => {
const detail = await explainChain.invoke({ topic: input.topic });
return detail.content;
},
async (detail) => {
const summary = await summaryChain.invoke({ explanation: detail });
return `【详解】\n${detail}\n\n【摘要】\n${summary.content}`;
}
]);
console.log(await fullWorkflow.invoke({ topic: '闭包' }));
为什么拆解更有效?
- 专注力提升:每个子任务目标单一,模型输出更精准;
- 可观测性增强:可单独测试“解释”是否准确,无需重跑整个流程;
- 发挥模型优势:
deepseek-reasoner在逻辑推理与归纳总结上表现卓越,任务拆解能最大化其能力。
总结:AI 开发的工程化进化路径
| 阶段 | 核心思想 | 解决的问题 |
|---|---|---|
| 1. 适配器 | 统一模型接口 | API 格式碎片化,切换成本高 |
| 2. 模板化 | 提示词参数化 | Hardcoding 导致维护困难 |
| 3. 链式化 | 声明式数据流 | 手动串联逻辑冗余 |
| 4. 编排化 | 任务分解执行 | 单 Prompt 无法处理复杂逻辑 |
LangChain.js + DeepSeek 的组合,不只是让你“调用一个大模型”,而是为你提供了一套构建可扩展、可维护、可测试的 AI 应用脚手架。
✅ 别忘了:在项目根目录创建
.env文件,并设置DEEPSEEK_API_KEY=your_key_here。
在这个 AI 原生时代,前端或全栈开发者的真正竞争力,已不再是“会不会调 API”,而是能否用软件工程的方法,将概率性的 AI 能力转化为确定性的产品价值。
掌握这种“搭积木式”的 AI 开发范式,你就能在浪潮中,不仅站稳脚跟,更能引领架构。
共同学习,写下你的评论
评论加载中...
作者其他优质文章