一年前,我的一个开发伙伴接到一个需求:给公司的客服系统加一个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 费用。
2. Transformers.js — 把 ML 模型装进浏览器
场景:你需要在浏览器或 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 = 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 的优势:
✅ 跨框架部署(一套工具链,无缝衔接)
✅ 支持各种硬件(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 }); forawait (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?
选一个,开始折腾,然后你就会找到自己的风格。
深度阅读资源
LangChain 官方文档:https://js.langchain.com/docs
Transformers.js:https://xenova.github.io/transformers.js
TensorFlow.js:https://www.tensorflow.org/js
ONNX Runtime:https://onnxruntime.ai
OpenAI Node SDK:https://github.com/openai/node-sdk
结尾互动
这 7 个库中,你最可能在项目中用到哪一个?
或者更直接的问题是:你现在正在做的功能需求里,哪个最适合用 AI 来解决?
如果你已经用过其中某个库,欢迎在评论区分享:
你用它做了什么
遇到的坑是什么
效果怎么样
这样的一线经验,往往比我这篇文章更有价值。咱们一起探索。👇