
一年前,我的一个开发伙伴接到一个需求:给公司的客服系统加一个AI助手。
他的第一反应是什么?
"咱们自己训练一个模型吧。拿一些历史对话数据,微调一个 BERT 或者 LLaMA..."
两周过去了。
他还在读论文,还在调整数据集的格式,还在查 PyTorch 和 Hugging Face 的文档。项目经理开始不耐烦了。
然后,团队里另一个工程师接手了这个任务。
他装了一个库,写了大概 50 行代码,下午就有了一个能跑的原型。
同样的需求,同样的技术栈,同样的时间限制。
差别在哪?不是智力。是工具意识。
资深工程师和中级工程师最大的区别,往往不在于谁更聪明,而在于谁懂得选对工具,然后快速落地。
这篇文章,就是讲这 7 个库的故事。
十年前,要给软件加上"智能"功能,你需要一个专门的 ML 团队。
今年?一个 JavaScript 开发者就行。
这个转变的核心原因是:抽象层的进步。
之前,开发者需要理解:
现在呢?
所有这些复杂性都被封装到了库里。你只需要:调用函数 → 传入数据 → 得到结果。
而且,这些库都是为 JavaScript 生态定制的。不需要 Python,不需要命令行工具链,不需要额外的服务。
┌─────────────────────────────────────────┐
│ AI 功能的复杂度演变 │
├─────────────────────────────────────────┤
│ │
│ 10年前:需要 ML 专家团队 │
│ ├─ 数学、算法理解 │
│ ├─ 模型设计、训练 │
│ ├─ 基础设施(GPU、显存) │
│ └─ 性能优化、部署 │
│ │
│ 今年:一个 JS 开发者足够 │
│ ├─ 调用 API 或库函数 │
│ ├─ 选择合适的模型参数 │
│ ├─ 在浏览器或 Node.js 中运行 │
│ └─ 根据业务需求做提示词优化 │
│ │
└─────────────────────────────────────────┘
关键转变:AI 不再是研究问题,它成了工程问题。而工程问题,就是工具的事儿。
在深入每个库之前,先理解选择的逻辑。
一个 JavaScript 开发者做 AI 功能,大概有 3 条路:
你不训练模型,你用最好的现成模型。直接调 API。
代表库:OpenAI Node SDK
最快,成本最低(某种意义上),但依赖网络和 API 供应商。
模型完全在你的环境跑,没有网络依赖,没有隐私泄露。
代表库:Transformers.js、TensorFlow.js、Brain.js、ONNX Runtime Web
需要一点算力(尤其是大模型),但自主性高。
把多个工具(LLM、向量数据库、RAG、记忆管理)组织成复杂工作流。
代表库:LangChain.js
最灵活,但需要理解各个组件的协作。
你的 AI 需求
│
┌───────────┼───────────┐
│ │ │
需要快速上线 需要本地推理 需要复杂流程
│ │ │
路线1 路线2 路线3
│ │ │
OpenAI SDK │ Transformers.js LangChain
+ │ TensorFlow.js + 向量库
其他API │ ONNX/Brain.js + 存储
场景:你需要连接多个 AI 组件,用提示词驱动复杂业务流程。
LangChain 解决的核心问题是:AI 应用里的杂活太多。
你需要管理:
每个公司都自己写一遍这些东西,就太浪费了。
LangChain 相当于说:"这些通用的'管道',我都给你写好了,你只需要组装。"
核心概念:
实战例子:做一个"文档问答助手"
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: "我们的产品支持哪些支付方式?"
});
为什么资深工程师喜欢它:
成本:依赖 LLM API(比如 OpenAI),会产生 token 费用。
场景:你需要在浏览器或 Node.js 里运行 ML 模型,不想依赖后端服务。
Transformers.js 是由 Hugging Face 开源的库,让你可以直接在 JavaScript 环境中加载和运行预训练模型。
核心价值:
支持的任务:
实战例子:情感分析
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}`);
}
重要的实现细节:
什么时候用 Transformers.js:
场景:你不只想运行模型,还想在浏览器里训练或微调模型。
TensorFlow.js 是 TensorFlow 的 JavaScript 绑定,允许你用 JS 写完整的 ML 管道:数据加载 → 模型定义 → 训练 → 推理。
相比 Transformers.js 的优势:
实战例子:训练一个简单的房价预测模型
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:
场景:你需要一个轻量级的、易学的 ML 库,不想被 TensorFlow 的复杂性吓住。
Brain.js 是为 JavaScript 开发者专门设计的,优先考虑简洁性而非灵活性。
如果说 TensorFlow.js 是"完整的 ML 平台",那 Brain.js 就是"开箱即用的神经网络"。
特点:
实战例子:欺诈检测
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 的局限:
什么时候用 Brain.js:
场景:你需要做文本处理,但不一定需要深度学习。
有时候,问题不需要 AI。很多文本处理问题用传统的 NLP 技术就能解决。
Natural 是一个成熟的 JavaScript NLP 库,处理分词、词干提取、TF-IDF 等经典 NLP 任务。
为什么要用它而不是 LLM:
实战例子:搜索引擎关键词提取
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 的应用场景:
资深工程师的经验:
"不要过度设计。很多看起来需要 AI 的问题,用传统 NLP 就能解决,而且更快、更便宜、更可靠。"
场景:你有一个用 Python + PyTorch 训练的模型,想在 JavaScript 中运行。
ONNX(Open Neural Network Exchange)是一个模型格式标准,允许你在任何框架中训练,然后在任何环境中推理。
工作流:
Python 环境:
PyTorch / TensorFlow / scikit-learn
↓
导出为 ONNX 格式
↓
JavaScript 环境:
ONNX Runtime Web
↓
在浏览器或 Node.js 推理
为什么这很强大:
实战例子:部署一个 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 = newFloat32Array(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 的优势:
场景:你需要最强的模型能力,不想维护任何推理基础设施。
OpenAI Node SDK 就是直接调 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
});
forawait (const chunk of stream) {
process.stdout.write(
chunk.choices[0]?.delta?.content || ""
);
}
OpenAI API 的成本:
什么时候用 OpenAI SDK:
很多开发者看到 AI 就想"从零开始训练一个模型"。
实际上,99% 的场景下,用现成的模型(API 或预训练模型)就够了。
现实:
一个烂提示词,即使用最强的模型也会输出垃圾。
// ❌ 烂提示词
"总结这个文本"
// ✅ 好提示词
`请用中文、100字以内总结以下文本,突出关键业务价值:
[文本内容]
总结应该包括:
1. 主要内容
2. 关键数字/指标
3. 行动建议`
提示词设计现在是一个真正的工程技能。好的提示词能让 ChatGPT 3.5 的表现接近 GPT-4。
AI API 调用通常需要 500ms ~ 2s。
如果你的用户界面每个操作都要等 AI 回应,用户会很烦。
解决方案:
AI 系统有随机性。线上出问题很难调试。
// 关键:记录所有 AI 交互
logger.info({
prompt: userInput,
response: aiOutput,
tokens: usage.total_tokens,
latency: endTime - startTime,
timestamp: new Date()
});
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 来解决?
如果你已经用过其中某个库,欢迎在评论区分享:
这样的一线经验,往往比我这篇文章更有价值。咱们一起探索。👇