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~๐•ᴗ•๐

相关推荐
一心赚狗粮的宇叔10 小时前
03.Node.js依赖包补充说明及React&Node.Js项目
前端·react.js·node.js
子春一10 小时前
Flutter for OpenHarmony:音律尺 - 基于Flutter的Web友好型节拍器开发与节奏可视化实现
前端·flutter
JarvanMo10 小时前
150万开发者“被偷家”!这两款浓眉大眼的 VS Code 插件竟然是间谍
前端
亿元程序员10 小时前
大佬,现在AI游戏开发教程那么多,你不搞点卖给大学生吗?
前端
未来龙皇小蓝10 小时前
RBAC前端架构-02:集成Vue Router、Vuex和Axios实现基本认证实现
前端·vue.js·架构
晓得迷路了10 小时前
栗子前端技术周刊第 116 期 - 2025 JS 状态调查结果、Babel 7.29.0、Vue Router 5...
前端·javascript·vue.js
顾北1211 小时前
AI对话应用接口开发全解析:同步接口+SSE流式+智能体+前端对接
前端·人工智能
摸鱼的春哥11 小时前
春哥的Agent通关秘籍07:5分钟实现文件归类助手【实战】
前端·javascript·后端
念念不忘 必有回响11 小时前
viepress:vue组件展示和源码功能
前端·javascript·vue.js
C澒11 小时前
多场景多角色前端架构方案:基于页面协议化与模块标准化的通用能力沉淀
前端·架构·系统架构·前端框架