TensorFlow - 制作一个简单的问答小助手

前言

TensorFlow的发布已经具有相当长的一段时间了,对于前端而言,本质上你可以理解它为一个集成工具------将机器学习、深度学习、模型、训练等概念集成到一个box当中,使其能够在浏览器、node等本机环境中去实现宽泛概念上的AI模型。作为前端而言,除非你有深入了解其原理的想法,否则停留在应用层面的任一端,仅需要去学会怎么用、如何用,其实就已经足够了。所以本次我们将略过阐述具体的原理,而讲述一个单纯问答助手的搭建过程。

应用背景

业务管理平台------每个前端老生常态都接触过的业务需求,充满了各种table、form及各类crud功能的实现。作为开发者而言,平台的每个功能、串联的逻辑及并行的功能业务大多熟悉并理解,但是对于新的用户、交付的客户等使用者而言,你所熟悉的平台对他们而言是完全陌生的,这也就催生出了平台使用培训、平台帮助中心、平台使用手册等帮助新用户快速上手的功能需求。(比如我们可能在右下角加一个平台小助手,点击以后输入你的问题,后端在预设的问题库里模糊搜索并返回列表,然后给出答案。这种方式需要你预设大量的问答,算是取巧的方式。)

实现

  1. 本地新建一个项目,配置自己设置即可,也可以在已有的项目继续:
csharp 复制代码
npm init
  1. 安装对应的依赖
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完成简单的对话。

  1. 根目录下新建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;
});
  1. 定义基础问答模块、加载模型
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~๐•ᴗ•๐

相关推荐
曈欣28 分钟前
vue 中属性值上变量和字符串怎么拼接
前端·javascript·vue.js
QGC二次开发1 小时前
Vue3:v-model实现组件通信
前端·javascript·vue.js·前端框架·vue·html
努力的小雨2 小时前
从设计到代码:探索高效的前端开发工具与实践
前端
小鼠米奇2 小时前
详解Ajax与axios的区别
前端·javascript·ajax
Bunury3 小时前
Vue3新组件transition(动画过渡)
前端·javascript·vue.js
zero.cyx3 小时前
JS函数部分
开发语言·前端·javascript
超级小的大杯柠檬水3 小时前
SpringBoot lombok(注解@Getter @Setter)
java·前端·spring
AvatarGiser3 小时前
《ElementUI/Plus 踩坑》el-table + sortablejs 拖拽顺序错乱(Vue2/3适用)
前端·vue.js·elementui
蓝染-惣右介3 小时前
【若依RuoYi-Vue | 项目实战】帝可得后台管理系统(二)
java·前端·后端·vue·springboot
哈哈哈哈cwl3 小时前
秒懂Vue.jsDiff算法与虚拟DOM
前端·javascript·vue.js