一年前,我的一个开发伙伴接到一个需求:给公司的客服系统加一个AI助手。
他的第一反应是什么?
“咱们自己训练一个模型吧。拿一些历史对话数据,微调一个 BERT 或者 LLaMA...”
两周过去了。
他还在读论文,还在调整数据集的格式,还在查 PyTorch 和 Hugging Face 的文档。项目经理开始不耐烦了。
然后,团队里另一个工程师接手了这个任务。
他装了一个库,写了大概 50 行代码,下午就有了一个能跑的原型。
同样的需求,同样的技术栈,同样的时间限制。
差别在哪?不是智力。是工具意识。
资深工程师和中级工程师最大的区别,往往不在于谁更聪明,而在于谁懂得 选对工具,然后快速落地。
所以,我梳理了 7 个库的故事,希望能帮你少走弯路。

为什么现在是做 AI 功能的最好时机
十年前,要给软件加上“智能”功能,你需要一个专门的 ML 团队。
今年?一个 JavaScript 开发者就行。
这个转变的核心原因是:抽象层的进步。
之前,开发者需要理解:
- 神经网络的数学原理
- 如何设计和训练模型
- 如何处理 GPU、显存、批处理
- 如何优化推理性能
现在呢?
所有这些复杂性都被封装到了库里。你只需要:调用函数 → 传入数据 → 得到结果。
而且,这些库都是 为 JavaScript 生态定制的。不需要 Python,不需要命令行工具链,不需要额外的服务。
┌─────────────────────────────────────────┐
│ AI 功能的复杂度演变 │
├─────────────────────────────────────────┤
│ │
│ 10年前:需要 ML 专家团队 │
│ ├─ 数学、算法理解 │
│ ├─ 模型设计、训练 │
│ ├─ 基础设施(GPU、显存) │
│ └─ 性能优化、部署 │
│ │
│ 今年:一个 JS 开发者足够 │
│ ├─ 调用 API 或库函数 │
│ ├─ 选择合适的模型参数 │
│ ├─ 在浏览器或 Node.js 中运行 │
│ └─ 根据业务需求做提示词优化 │
│ │
└─────────────────────────────────────────┘
关键转变:AI 不再是研究问题,它成了工程问题。而工程问题,就是工具的事儿。
7 个库,3 种选择路线
在深入每个库之前,先理解选择的逻辑。
一个 JavaScript 开发者做 AI 功能,大概有 3 条路:
路线 1:用别人的大脑(LLM API)
你不训练模型,你用最好的现成模型。直接调 API。
代表库:OpenAI Node SDK
最快,成本最低(某种意义上),但依赖网络和 API 供应商。
路线 2:本地智能(浏览器/Node.js 推理)
模型完全在你的环境跑,没有网络依赖,没有隐私泄露。
代表库:Transformers.js、TensorFlow.js、Brain.js、ONNX Runtime Web
需要一点算力(尤其是大模型),但自主性高。
路线 3:专业编排(多库联动)
把多个工具(LLM、向量数据库、RAG、记忆管理)组织成复杂工作流。
代表库:LangChain.js
最灵活,但需要理解各个组件的协作。
你的 AI 需求
│
┌───────────┼───────────┐
│ │ │
需要快速上线 需要本地推理 需要复杂流程
│ │ │
路线1 路线2 路线3
│ │ │
OpenAI SDK │ Transformers.js LangChain
+ │ TensorFlow.js + 向量库
其他API │ ONNX/Brain.js + 存储
7 个库详解:选型、原理、实战
1. LangChain.js — AI 应用的“脚手架”
场景 :你需要连接多个 AI 组件,用提示词驱动复杂业务流程。
LangChain 解决的核心问题是:AI 应用里的杂活太多。
你需要管理:
- 提示词版本和模板
- 对话历史(Memory)
- 多轮交互的状态
- 工具调用和外部 API 集成
- 向量检索和 RAG 管道
每个公司都自己写一遍这些东西,就太浪费了。
LangChain 相当于说:“这些通用的‘管道’,我都给你写好了,你只需要组装。”
核心概念 :
- Chain :把多个组件串联起来的管道
- Agent :能独立做决策的 AI,可以选择用哪些工具
- RAG :从知识库检索信息,然后给 LLM 做参考
实战例子 :做一个“文档问答助手”
import { ChatOpenAI } from "langchain/chat_models/openai";
import { VectorStoreIndex } from "langchain/indexes";
import { PineconeStore } from "langchain/vectorstores/pinecone";
import { PromptTemplate } from "langchain/prompts";
// 1. 初始化模型
const model = new ChatOpenAI({
temperature: 0.7,
modelName: "gpt-4",
apiKey: process.env.OPENAI_API_KEY,
});
// 2. 连接向量数据库(比如 Pinecone)
const vectorStore = await PineconeStore.fromExistingIndex(
new OpenAIEmbeddings(),
{ pineconeIndex: "doc-index" }
);
// 3. 创建 RAG 链
const qaPrompt = new PromptTemplate({
template: `根据以下背景信息回答问题。
背景:{context}
问题:{question}`,
inputVariables: ["context", "question"],
});
const chain = new RetrievalQAChain.fromLLMAndRetriever(
model,
vectorStore.asRetriever(),
{ prompt: qaPrompt }
);
// 4. 问问题
const answer = await chain.call({
query: "我们的产品支持哪些支付方式?",
});
为什么资深工程师喜欢它:
- 把“脏活”(提示词管理、历史维护、工具集成)都抽象了
- RAG 模式几乎解决了 90% 的“知识问答”问题,不需要微调
- 代码清晰,业务逻辑容易测试
成本 :依赖 LLM API(比如 OpenAI),会产生 token 费用。
场景 :你需要在浏览器或 Node.js 里运行 ML 模型,不想依赖后端服务。
Transformers.js 是由 Hugging Face 开源的库,让你可以直接在 JavaScript 环境中加载和运行预训练模型。
核心价值 :
- 零后端依赖(完全在浏览器跑)
- 零隐私泄露(数据不离开用户设备)
- 零 API 成本(一次加载,多次使用)
支持的任务 :
- 文本分类(情感分析、垃圾邮件检测、主题分类)
- 文本生成(总结、翻译)
- 命名实体识别(提取人名、公司名、地点)
- 嵌入和相似度计算(用于向量检索)
- 视觉模型(图像分类、物体检测)
实战例子 :情感分析
import { pipeline } from "@xenova/transformers";
// 创建分类器(第一次会下载模型,约 100MB)
const classifier = await pipeline(
"sentiment-analysis",
"Xenova/bert-base-multilingual-uncased-sentiment" // 支持中文!
);
// 分析中文评论
const result = await classifier("这个功能太棒了!");
// 输出:[{ label: 'POSITIVE', score: 0.998 }]
// 批量分析
const reviews = [
"产品质量不错,值得推荐",
"客服态度很差,体验很不好",
"一般般,没什么特色",
];
for (const review of reviews) {
const [result] = await classifier(review);
console.log(`"${review}" → ${result.label}`);
}
重要的实现细节 :
- 首次加载模型会下载到浏览器的 IndexedDB 中,之后离线也能用
- 推理在 CPU 上进行,速度取决于 CPU 性能(通常 100ms ~ 1s)
- 适合做客户端的 实时反馈 (比如打字时自动分类、自动标签)
什么时候用 Transformers.js :
- ✅ 你需要隐私性(数据不上传)
- ✅ 你想省 API 成本(不用调用付费 API)
- ✅ 你需要离线可用
- ❌ 你需要超高速度(GPU 推理)
- ❌ 你需要非常大的模型(超过几 GB)
3. TensorFlow.js — 真正的浏览器 ML 平台
场景 :你不只想运行模型,还想在浏览器里 训练 或 微调 模型。
TensorFlow.js 是 TensorFlow 的 JavaScript 绑定,允许你用 JS 写完整的 ML 管道:数据加载 → 模型定义 → 训练 → 推理。
相比 Transformers.js 的优势 :
- 更灵活:你可以自己定义网络结构、损失函数、优化器
- 更强大:支持复杂的 ML 任务(不仅是预测,还有聚类、降维等)
- GPU 加速:可以用 WebGL(浏览器)或 Node.js 的 GPU 支持
实战例子 :训练一个简单的房价预测模型
import * as tf from "@tensorflow/tfjs";
// 训练数据:[房间数, 面积] -> 价格(单位:万元)
const trainingData = {
inputs: [[2, 50], [3, 70], [4, 100], [5, 120]],
outputs: [[50], [80], [150], [180]]
};
// 创建模型:简单的神经网络
const model = tf.sequential({
layers: [
// 输入层:2 个特征
tf.layers.dense({ units: 32, activation: "relu", inputShape: [2] }),
// 隐藏层:32 个神经元
tf.layers.dense({ units: 16, activation: "relu" }),
// 输出层:1 个输出(价格)
tf.layers.dense({ units: 1 })
]
});
// 编译模型
model.compile({
optimizer: tf.train.adam(0.01),
loss: "meanSquaredError"
});
// 准备数据
const xs = tf.tensor2d(trainingData.inputs);
const ys = tf.tensor2d(trainingData.outputs);
// 训练
await model.fit(xs, ys, {
epochs: 100,
verbose: 1,
batchSize: 2
});
// 预测:5 房间,150 平米的房子要多少钱?
const prediction = model.predict(tf.tensor2d([[5, 150]]));
prediction.print(); // 输出约 [180] ~ [200] 万元
// 清理张量(释放内存)
xs.dispose();
ys.dispose();
prediction.dispose();
什么时候选 TensorFlow.js :
- ✅ 你需要在浏览器进行 增量学习 (用户交互数据持续优化)
- ✅ 你有定制的神经网络需求
- ✅ 你的项目需要支持 WebGL GPU 加速
- ❌ 你只是想快速用现成模型(用 Transformers.js 更简洁)
4. Brain.js — 最简单的神经网络库
场景 :你需要一个 轻量级的、易学的 ML 库,不想被 TensorFlow 的复杂性吓住。
Brain.js 是为 JavaScript 开发者专门设计的,优先考虑 简洁性而非灵活性 。
如果说 TensorFlow.js 是“完整的 ML 平台”,那 Brain.js 就是“开箱即用的神经网络”。
特点 :
- 代码非常简洁(通常 10-20 行就能训练一个模型)
- 没有张量、维度、GPU 等复杂概念
- 适合学习 ML 基础和快速原型
实战例子 :欺诈检测
const brain = require("brain.js");
// 创建神经网络
const net = new brain.NeuralNetwork({
hiddenLayers: [8] // 1 个隐藏层,8 个神经元
});
// 训练数据:[登录尝试次数, IP地址是否异常] -> [是否欺诈]
net.train([
{ input: { attempts: 1, ipAnomaly: 0 }, output: { fraud: 0 } },
{ input: { attempts: 1, ipAnomaly: 1 }, output: { fraud: 0.3 } },
{ input: { attempts: 10, ipAnomaly: 0 }, output: { fraud: 0.7 } },
{ input: { attempts: 15, ipAnomaly: 1 }, output: { fraud: 1 } }
], {
iterations: 1000,
errorThresh: 0.005
});
// 预测:8 次尝试,IP 异常 -> 欺诈概率?
const result = net.run({ attempts: 8, ipAnomaly: 1 });
console.log(`欺诈概率:${(result.fraud * 100).toFixed(0)}%`);
// 输出:欺诈概率:85%
Brain.js 的局限 :
- 不支持深度学习(超过 3-4 层的网络通常不靠谱)
- 没有卷积、递归等特殊层
- 性能不如 TensorFlow
什么时候用 Brain.js :
- ✅ 你在学习神经网络基础
- ✅ 你需要快速原型一个简单分类器
- ✅ 你项目很小,不想引入沉重的依赖
- ❌ 你需要处理图像、序列数据(NLP)
- ❌ 你需要高性能
5. Natural — 不需要 LLM 的文本处理
场景 :你需要做文本处理,但 不一定需要深度学习 。
有时候,问题不需要 AI。很多文本处理问题用传统的 NLP 技术就能解决。
Natural 是一个成熟的 JavaScript NLP 库,处理分词、词干提取、TF-IDF 等经典 NLP 任务。
为什么要用它而不是 LLM :
- 确定性 :输入相同,输出永远相同(LLM 有随机性)
- 成本 :零 API 费用
- 速度 :毫秒级(LLM 通常 500ms+)
- 简洁 :代码短,逻辑清晰
实战例子 :搜索引擎关键词提取
const natural = require("natural");
// 分词
const tokenizer = new natural.WordTokenizer();
const text = "React 是一个 JavaScript 库,用于构建用户界面。React 还支持 TypeScript。";
const tokens = tokenizer.tokenize(text);
console.log(tokens);
// 输出:["React", "是", "一个", "JavaScript", "库", ...]
// 词干提取(English 和中文支持都有)
const stemmer = natural.PorterStemmer;
console.log(stemmer.stem("running")); // "run"
console.log(stemmer.stem("developer")); // "develop"
// TF-IDF:计算词语的重要性
const tfidf = new natural.TfIdf();
tfidf.addDocument("React Vue Angular 前端框架对比");
tfidf.addDocument("Vue 是渐进式框架,易学易用");
tfidf.addDocument("Angular 是企业级框架,功能完整");
// "Vue" 在第 2 和 3 个文档中都出现了,但在第 1 个没有
// TF-IDF 会给 "Vue" 一个较低的分数(因为它出现在多个文档)
// 而 "React" 只在第 1 个出现,分数会更高
tfidf.tfidfs("React", (i, score) => {
console.log(`文档 ${i}: React 的 TF-IDF = ${score.toFixed(3)}`);
});
Natural 的应用场景 :
- ✅ 搜索相关性排序
- ✅ 自动标签提取
- ✅ 文本相似度计算(不需要 LLM)
- ✅ 垃圾邮件检测(基于词频)
- ❌ 复杂的语义理解(需要 LLM)
- ❌ 多语言支持很弱(主要是英文)
资深工程师的经验 :
“不要过度设计。很多看起来需要 AI 的问题,用传统 NLP 就能解决,而且更快、更便宜、更可靠。”
6. ONNX Runtime Web — 跨框架的模型部署
场景 :你有一个用 Python + PyTorch 训练的模型,想在 JavaScript 中运行。
ONNX(Open Neural Network Exchange)是一个 模型格式标准 ,允许你在任何框架中训练,然后在任何环境中推理。
工作流 :
Python 环境:
PyTorch / TensorFlow / scikit-learn
↓
导出为 ONNX 格式
↓
JavaScript 环境:
ONNX Runtime Web
↓
在浏览器或 Node.js 推理
为什么这很强大 :
- 你的 ML 工程师用他们熟悉的 Python 工具训练
- 你的前端工程师用 JavaScript 直接部署(不需要学 Python)
- 模型一次训练,各处使用
实战例子 :部署一个 PyTorch 图像分类模型
import * as ort from "onnxruntime-web";
// 1. 加载 ONNX 模型
const session = await ort.InferenceSession.create("./mobilenet.onnx");
// 2. 准备输入(图像转张量)
const canvas = document.getElementById("imageCanvas");
const ctx = canvas.getContext("2d");
const imageData = ctx.getImageData(0, 0, 224, 224);
const pixels = new Float32Array(224 * 224 * 3);
// 归一化像素值到 [-1, 1]
for (let i = 0; i < imageData.data.length; i += 4) {
pixels[i / 4] = (imageData.data[i] - 127.5) / 127.5;
// R, G, B 通道
}
// 3. 创建输入张量
const input = new ort.Tensor("float32", pixels, [1, 3, 224, 224]);
// 4. 运行推理
const feeds = { input };
const results = await session.run(feeds);
// 5. 获取输出(概率分布)
const output = results.output.data;
const topClass = Array.from(output).indexOf(Math.max(...output));
console.log(`识别的对象:${classNames[topClass]}`);
ONNX 的优势 :
- ✅ 跨框架部署(一套工具链,无缝衔接)
- ✅ 支持各种硬件(CPU、GPU、TPU)
- ✅ 工业界标准(被微软、Google、Meta 等支持)
- ✅ 模型优化工具成熟
- ❌ 学习曲线:需要理解 ONNX 模型转换过程
7. OpenAI Node SDK — 最直接的方式
场景 :你需要最强的模型能力,不想维护任何推理基础设施。
OpenAI Node SDK 就是直接调 API。
这听起来很“低级”,但 对大多数业务来说,这其实是最聪明的选择 。
为什么 :
- 模型最新 :OpenAI 持续优化 GPT-4,你自动获得更好的能力
- 成本可控 :按 token 计费,小量使用很便宜
- 无需运维 :不需要自己管理 GPU、显存、扩容
- 快速迭代 :API 参数调整可以立即生效
实战例子 :AI 客服助手
import OpenAI from "openai";
const openai = new OpenAI({
apiKey: process.env.OPENAI_API_KEY
});
// 单次对话
const response = await openai.chat.completions.create({
model: "gpt-4-turbo",
messages: [
{
role: "system",
content: "你是一个友善的电商客服,用中文回答问题"
},
{
role: "user",
content: "我买的东西还没收到,什么时候能到?"
}
],
temperature: 0.7,
max_tokens: 500
});
console.log(response.choices[0].message.content);
// 流式对话(实时返回结果)
const stream = await openai.chat.completions.create({
model: "gpt-4-turbo",
messages: [
{ role: "user", content: "给我讲个笑话" }
],
stream: true
});
for await (const chunk of stream) {
process.stdout.write(
chunk.choices[0]?.delta?.content || ""
);
}
OpenAI API 的成本 :
- GPT-4 Turbo:输入 $0.03 / 1K tokens
- 一个普通对话(500 tokens):约 $0.02
- 月 10,000 条对话:约 $200
什么时候用 OpenAI SDK :
- ✅ 你需要最强的模型能力
- ✅ 你的业务对成本敏感但能承受(不是免费)
- ✅ 你想快速上线,不想等模型训练
- ❌ 你有 super strict 隐私要求(数据上传到 OpenAI)
- ❌ 你的用户量超大(API 成本会很高)
选型的 5 个常见误区
误区 1:过度工程化
很多开发者看到 AI 就想“从零开始训练一个模型”。
实际上,99% 的场景下,用现成的模型(API 或预训练模型)就够了。
现实 :
- RAG(向量检索 + LLM) = 解决 80% 的知识问题
- 微调(fine-tuning) = 比从零训练便宜 100 倍,效果更好
- API 调用 = 最快、最省心
误区 2:忽视提示词工程
一个烂提示词,即使用最强的模型也会输出垃圾。
// ❌ 烂提示词
"总结这个文本"
// ✅ 好提示词
`请用中文、100字以内总结以下文本,突出关键业务价值:
[文本内容]
总结应该包括:
1. 主要内容
2. 关键数字/指标
3. 行动建议`
提示词设计现在是一个 真正的工程技能 。好的提示词能让 ChatGPT 3.5 的表现接近 GPT-4。
误区 3:忽视延迟
AI API 调用通常需要 500ms ~ 2s。
如果你的用户界面每个操作都要等 AI 回应,用户会很烦。
解决方案 :
- 提前预测可能的问题,后台并发调用
- 用流式响应(用户看到逐字输出而不是等待)
- 做本地缓存(相同的问题不重复调用 API)
误区 4:遗漏可观测性
AI 系统有随机性。线上出问题很难调试。
// 关键:记录所有 AI 交互
logger.info({
prompt: userInput,
response: aiOutput,
tokens: usage.total_tokens,
latency: endTime - startTime,
timestamp: new Date()
});
误区 5:不考虑成本
API 调用会持续产生费用。
假设:
- 月活 10 万用户
- 每用户月均 5 次 AI 交互
- 每次调用平均 500 tokens
成本 = 50 万次 × 500 tokens × $0.00001 ≈ $2500/月
这在早期可能是 showstopper,必须考虑。
如何选择:决策树
你的需求是什么?
│
├─ "我需要快速原型"
│ └─ → 用 OpenAI SDK(最快)
│
├─ "我需要本地运行,不上传数据"
│ ├─ 是小模型任务(分类、摘要)
│ │ └─ → Transformers.js
│ │
│ └─ 我想自己训练模型
│ └─ → TensorFlow.js 或 Brain.js
│
├─ "我需要连接多个工具(向量库、工具调用等)"
│ └─ → LangChain.js
│
├─ "我有 Python 训练的模型,想在 JS 中用"
│ └─ → ONNX Runtime Web
│
└─ "我只需要文本处理,不需要深度学习"
└─ → Natural
最后:这个时代的竞争力
十年前,懂机器学习的人很稀缺。
今年,懂 如何用 AI 工具快速解决问题 的人稀缺。
这两种能力不一样。
前者需要数学、算法、大量论文阅读。
后者需要 工程直觉和工具意识 ——知道什么场景用什么库,怎么快速组合,怎么识别瓶颈。
这是资深工程师的超能力。
所以,挑一个库,用一个小项目试试 。不是所有理论都学完了才能用,而是边用边学。
从 LangChain 开始?还是 Transformers.js?还是干脆调 OpenAI API?
选一个,开始折腾,然后你就会找到自己的风格。
深度阅读资源
这 7 个库中,你最可能在项目中用到哪一个?
或者更直接的问题是:你现在正在做的功能需求里,哪个最适合用 AI 来解决?
如果你已经用过其中某个库,欢迎在评论区分享:
这样的一线经验,往往比我这篇文章更有价值。咱们一起探索。