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

相关推荐
清水白石00813 分钟前
Python 类定义阶段自动注册子类:从 `__init_subclass__` 到插件系统实战
linux·前端·python
用户69371750013841 小时前
Kimi K3 综合能力处于全球第一梯队
android·前端·后端
anno1 小时前
Agent 新手 Skill 优先级指南:从第一套必装工作流,到专业能力补全
前端·后端
Liora_Yvonne1 小时前
前端请求层到底怎么封?为什么全局 axios 单例越用越难维护
前端
anno2 小时前
别再把文档“一刀切”:用 LangChain.js 做好 RAG 的第一公里
前端·后端
皮卡穆2 小时前
React 中使用 react-org-tree 实现组织结构树
前端·react.js·前端框架
MariaH2 小时前
费曼学习法与effort-learning理论
前端
qiaofugui2 小时前
如何用 Codex 做一次可靠的项目重构:方法、节奏和可复用提示词
前端
涛涛ing2 小时前
前端圈7月大地震:TS 7发布、Bun 11天从Zig迁Rust、Kimi K3登顶、大厂裁员50%
前端
遇乐的果园2 小时前
前端学习笔记-vue列表处理
前端·vue.js·学习