前言
TensorFlow的发布已经具有相当长的一段时间了,对于前端而言,本质上你可以理解它为一个集成工具------将机器学习、深度学习、模型、训练等概念集成到一个box当中,使其能够在浏览器、node等本机环境中去实现宽泛概念上的AI模型。作为前端而言,除非你有深入了解其原理的想法,否则停留在应用层面的任一端,仅需要去学会怎么用、如何用,其实就已经足够了。所以本次我们将略过阐述具体的原理,而讲述一个单纯问答助手的搭建过程。
应用背景
业务管理平台------每个前端老生常态都接触过的业务需求,充满了各种table、form及各类crud功能的实现。作为开发者而言,平台的每个功能、串联的逻辑及并行的功能业务大多熟悉并理解,但是对于新的用户、交付的客户等使用者而言,你所熟悉的平台对他们而言是完全陌生的,这也就催生出了平台使用培训、平台帮助中心、平台使用手册等帮助新用户快速上手的功能需求。(比如我们可能在右下角加一个平台小助手,点击以后输入你的问题,后端在预设的问题库里模糊搜索并返回列表,然后给出答案。这种方式需要你预设大量的问答,算是取巧的方式。)
实现
- 本地新建一个项目,配置自己设置即可,也可以在已有的项目继续:
csharp
npm init
- 安装对应的依赖
perl
npm i @tensorflow/tfjs @tensorflow-models/qna @tensorflow-models/universal-sentence-encoder readline
或者
perl
yarn add @tensorflow/tfjs @tensorflow-models/qna @tensorflow-models/universal-sentence-encoder readline
或者直接在package.json粘贴:
perl
{
"name": "tensorflow-demo",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"dev": "node index.js"
},
"author": "",
"license": "ISC",
"dependencies": {
"@tensorflow-models/qna": "^1.0.2",
"@tensorflow-models/universal-sentence-encoder": "^1.3.3",
"@tensorflow/tfjs": "^4.12.0"
},
"devDependencies": {
"readline": "^1.3.0"
}
}
我们将使用tensorflow基于BERT预训练好的qna模型实现文本理解和问答,使用readline完成简单的对话。
- 根目录下新建index.js与article.txt文件,引入tensorflow与qna模型
javascript
// index.js
require("@tensorflow/tfjs");
const qna = require("@tensorflow-models/qna");
为了避免文章内容过长,所以我们单独将文章内容隔离出来并放入article.txt文件中,同时利用fs直接读取文本内容,在后续也可利用fs循环读取固定文章文件夹下各类使用说明文件,同时定义相关变量。
ini
const fs = require("fs");
let passage = ""; // 文章内容
let model = null; // 模型实例
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
fs.readFile("./article.txt", "utf8", (err, data) => {
if (err) {
console.error("读取文件出错:", err);
return;
}
passage = data;
});
- 定义基础问答模块、加载模型
ini
// 问答
const qa = () => {
rl.question("please input the question>:", async (str) => {
if (!str) {
qa();
return;
}
const answers = await model.findAnswers(str, passage);
console.log(answers);
qa();
});
};
//加载模型
const init = async () => {
model = await qna.load({
fromTFHub: false,
modelUrl: "http://youraddress/mobilebert_1/model.json",
});
qa();
};
init();
这里有几个点需要注意,modelUrl代表存放模型的链接,fromTFHub字段表示是否来自于TensorFlow Hub社区,这个社区主要存放各类模型的集合,而我在实际使用过程中,发现默认的modelUrl在实际加载过程中会报错无法载入,怀疑一可能是我网络问题,怀疑二可能是TensorFlow Hub迁移至kaggle网站有关,包括官网的TensorFlow Hub地址链接也已经改到了kaggle处。同时查看qna的源码,如果你不主动配置modelUrl这些字段的话,也会默认去访问旧地址的资源,同样的我本地还是会fetch failed
解决办法:手动下载模型至本地
首先需要了解TensorFlow的qna模型是基于BERT训练的NLP模型,而这里用的正是其精简过的版本mobilebert,于是我们手动在kaggle搜索mobilebert模型手动下载到本地即可。(也可以在qna的源码里找到模型地址)
记得选择TFjs格式的进行下载,下载后会会获得一个tar.gz的压缩包,敲过基本linux的都能认识这是标准的压缩文件格式,放到自己的linux服务器(本地开虚拟机也行)上解压即可,解压后会得到模型、标注文件以及训练数据。
将modelUrl配置为你存放模型的地址,指向model.json文件即可。 5. 验证
终端运行以下命令:
node index.js
针对你article文章的内容,进行提问即可,模型会输出排名前列的答案和权重
相关源码包含下载的模型文件都放在这了→这里,目前仅有英文可识别,中文的话是无法识别的,所以这里还缺了一步,针对问答的中英翻译,思路是借助百度翻译的API翻译一遍再返回结果,完成后即可植入任一平台项目,如果对你有帮助的话,欢迎给个star~๐•ᴗ•๐