当前位置: 首页 > news >正文

前端大模型入门:实战篇之Vue3+Antdv+transformers+本地模型实现增强搜索

本文将之前的文章,实现一个场景的实战应用,包含代码等内容。利用纯前端实现增强的列表搜索,抛弃字符串匹配,目标是使用番茄关键字可以搜索到西红柿

1 准备工作

1.1 了解llm和web开发

web端的ai开发参考 前端大模型入门:使用Transformers.js手搓纯网页版RAG(二)前端大模型入门:使用Transformers.js实现纯网页版RAG(一)

前端框架使用的vue3+antdv,最好是懂相关代码,读懂即可。 

1.2 开发环境和工具

  • node20+
  • vite

1.3 工程准备

// init.sh
// 创建vite vue-ts项目
yarn create vite test-ra-list --template vue-ts
// 进入工程目录
cd test-ra-list
// 安装依赖
yarn add ant-design-vue @xenova/transformers

1.4 本地模型目录准备

在public下面创建一个models目录,然后创建各个模型的子目录,以便后续将模型文件放入其中

1.5 下载模型文件 

在hf-mirror找到想用模型,本文用到的在Xenova/bge-base-zh-v1.5 at main (hf-mirror.com),点击各个文件的下载图标,然后存储在对应目录下

下载模型文件,默认是quantized,除非你配置加载高精模型,也可以三个都下载,记得在1.4模型名的目录下新建一个onnx目录

最后public目录如下图所示

1.6  创建模拟数据

在public目录下创建一个data.json

[{"name":"PC1","id":"5F62AD98-9BAF-0B46-A506-D8EF3749D325"},{"name":"PC2","id":"58CE02BF-6F95-3F4C-9BF6-450E355BBD94"},{"name":"西红柿","id":"8FF8BC68-6BF3-0A4C-AD87-668C1CED3234"},{"name":"aaa11","id":"E6B61EFC-9730-4945-84C8-0C1FCF068AB6"},{"name":"地瓜-0","id":"3B26D363-6720-B241-AB1A-AE7C3BB1A989"},{"name":"地瓜-1","id":"A79DE23B-6A53-354A-90EA-3BAF90E43629"},{"name":"西红柿-10","id":"E3C781BF-F6ED-364E-923C-B9CA3C38BEA1"},{"name":"洋芋-100","id":"81E42720-3C18-9C4F-A302-D86C6AF51989"},{"name":"西红柿-101","id":"A98E902D-3ECB-A748-A3E6-2F4C2D36FD55"},{"name":"洋芋-102","id":"6B02AC77-55D4-7C40-98A3-383D52D72929"},{"name":"番茄-103","id":"D6E45494-BD47-5848-8492-287437155A3D"},{"name":"马铃薯-104","id":"7C4CB80B-6C0D-EC4A-A5BD-52E65D8EC2FF"},{"name":"土豆-104","id":"1C3829C0-8356-024E-AF90-9BC456A78E29"},{"name":"马铃薯-105","id":"5560C41C-46B2-BC44-9141-92E83B62D5C8"},{"name":"地瓜-106","id":"20598CEC-5E31-3F49-A578-A6F026018CC0"},{"name":"红薯-107","id":"E1061811-0886-0840-B387-A1321DA5212D"},{"name":"马铃薯-108","id":"D302EF74-0402-1F43-A4FD-FBF2CE852B5E"},{"name":"红薯-109","id":"608D7A1C-C265-9A4B-99D6-A08EBBDD08EF"},{"name":"番茄-11","id":"A19882CE-2B37-D64C-95E2-A8BC769D9A06"},{"name":"洋芋-110","id":"6D80D92B-540B-2A4D-AF2F-A15C8B04EB3F"},{"name":"番茄-111","id":"6F229077-AF25-D241-BEB4-0E53852EAF61"},{"name":"马铃薯-12","id":"A108EDCD-42D0-0B4E-9691-62FB8572ECF8"},{"name":"地瓜-13","id":"FB31B7D1-4CD3-F44C-9ED4-C659EDB58B25"}]

2 实现方法

首先分析和分解任务:1 列表呈现数据;2 高级搜索功能

2.1 数据加载和列表数据展示

这部分使用antdv的table可以很快速的展示数据,数据加载就使用fetch即可

type RawInfo = {name: string;id: string;
};
const loading = ref(false);
const items = ref<RawInfo[]>([]);
onMounted(() => {fetch("data.json").then((res) => res.json()).then((list) => (items.value = list));
});
const columns = [{title: "序号",dataIndex: "index",key: "index",customRender: (e: { index: number }) => {return h("span", {}, e.index + 1);},width: 84,},{title: "名称",dataIndex: "name",key: "name",}
] as ColumnsType<any>;
<Table :loading="loading" :dataSource="items" :columns="columns" />

2.2 搜索数据显示

为了动态显示搜索结果和原始结果,使用一个searchKey来切换显示的数据源。

const searchKey = ref("");
const showItems = computed(() => {return searchKey.value ? result.value : items.value;
});
const search = async (e: string) => {searchKey.value = e || "";if (!e) {return;}// 待完成搜索
};
<InputSearch placeholder="请输入搜索内容" @search="search" />
<Table :loading="loading" :dataSource="showItems" :columns="columns" />

 2.3 模型参数准备

  • 模型加载路径即为之前创建的public下的/models目录
  • topK表示结果最多显示10个
  • 使用minScore指定最低的相似度
import { cos_sim, env, pipeline } from "@xenova/transformers";
env.remoteHost = "/models/";
const topK = 10;
const minScore = 0.6;
const pipe = pipeline("feature-extraction", "bge-base-zh-v1.5", {progress_callback: (d: any) => {console.log(d);},
});

2.4 向量数组构建

深度搜索的核心就是高位空间的相似度(距离)匹配,所以需要将数据全部进行Emebdding

const buildVector = async () => {if (!items.value.length) return;const list = items.value;loading.value = true;vectors.length = list.length;await nextTick();const embedding = await pipe;const questions = list.map((item) => item.name);const output = (await embedding(questions, {pooling: "mean",normalize: true,})) as any;console.log(output);questions.forEach((q, i) => {vectors[i] = output[i];});loading.value = false;
};

2.5 相似度计算

将关键词/字进行向量化,然后依次计算相似度,而不是使用子字符串/包含关系的匹配。

  const embedding = await pipe;const [vector] = await embedding([e], {pooling: "mean",normalize: true,});if (!vectors.length) {await buildVector();}const scores = vectors.map((q, i) => {return {score: cos_sim(vector.data, vectors[i].data),index: i,};});

2.6 结果筛选

最后,根据匹配度排序,过滤掉相似度过低的,再取相似度最高的topK项

  scores.sort((a, b) => b.score - a.score);console.log(scores);result.value = scores.filter((e) => e.score > minScore).slice(0, topK).map((s) => items.value[s.index]);console.log(`搜索到${result.value.length}条记录:topK=${topK} minScore=${minScore}`);

 3 实际效果

3.1 番茄 - 可搜索到西红柿

3.2 红薯-可搜索到地瓜 

4 待改进点

 4.1 模型精度

目前使用的是最小的模型,以便于都能体验,效果会有一点差,但整体结果还算理想

4.2 最低相似度和topK控制

这两个参数对结果的影响也不小,实际上我想去掉相似度过滤,而是直接选出topK可能好一点

4.3 嵌入改进 - 非阻塞

目前在初次计算向量组(列表元素向量)是比较耗资源的,会造成页面卡顿,这部分可考虑在worker或者做成单条异步运算,而不是一次性计算出所有条目的嵌入向量 

 项目开源地址,欢迎评论、点赞收藏、fork:vue3-antdv-transformer-advc-search-demo:使用vue3+Andtv+Transformer构建的一个增强表格搜索示例,使用ML取代字符串匹配搜索 - GitCodeicon-default.png?t=O83Ahttps://gitcode.com/m0_38015699/vue3-antdv-transformer-advc-search-demo/overview

相关文章:

前端大模型入门:实战篇之Vue3+Antdv+transformers+本地模型实现增强搜索

本文将之前的文章&#xff0c;实现一个场景的实战应用&#xff0c;包含代码等内容。利用纯前端实现增强的列表搜索&#xff0c;抛弃字符串匹配&#xff0c;目标是使用番茄关键字可以搜索到西红柿 1 准备工作 1.1 了解llm和web开发 web端的ai开发参考 前端大模型入门&#xff…...

《向量数据库指南》——Fivetran 的 Partner SDK:构建自定义连接器和目标

哈哈,说到 Fivetran 的 Partner SDK,这可真是个好东西啊!作为向量数据库领域的“老司机”,我今天就来给大家详细讲讲这个 SDK 的厉害之处,以及如何用它来构建自定义连接器和目标,实现与 Fivetran 自动化数据移动平台的无缝集成。 一、Fivetran Partner SDK:开启自定义连…...

微信小程序的 button 标签的边框如何去除?

目录 问题描述&#xff1a; 问题原因&#xff1a; 解决办法&#xff1a; 方案一 方案二 问题描述&#xff1a; 实际开发中会发现这个 button 自带有样式&#xff0c;当背景颜色设置为白色的时候还有一个黑色的边框&#xff0c;刚开始那个边框怎么都去不掉 无法去除的边框…...

20240926 关于Goland处理wsl-GOROOT原理猜测

GOROOT的原理 go sdk与java jdk类似&#xff0c;是go的编译工具链的集合。 在windows上&#xff0c;我们通过在系统环境变量中添加GOROOT并设置为go sdk地址&#xff0c;使得命令行可以访问到go sdk并执行go test、build等命令&#xff0c;这样设置的变量是全局生效的&#x…...

Anki 学习日记 - 卡片模版 - 单选ABCD(纯操作)

摘要&#xff1a;在不懂前端语言的情况下自定义卡片模版&#xff0c;卡片模版的字段 安装&#xff08;官网&#xff09;&#xff1a;Anki - powerful, intelligent flashcards (ankiweb.net) 一、在哪能修改卡片模版 管理笔记模板 - > 添加 -> 问答题 -> 设置名称 二…...

钉钉x昇腾:用AI一体机撬动企业数字资产智能化

“走红”近两年后&#xff0c;大模型正在加速走进千行万业。 由于大模型的主要模态是文字和图片&#xff0c;恰好是数字化办公最基础的内容要素&#xff0c;办公于是成了离AI最近的场景。 公文写作、表格生成、提炼大纲、文本翻译、代码润色、数据统计、智能问答……越来越多…...

【C/C++】 秋招常考面试题最全总结(让你有一种相见恨晚的感觉)

目录 1.C程序编译链接过程 2.浅拷贝和move有区别吗 3.深拷贝和浅拷贝的区别 4.空类的大小 5.类的继承有几种方式&#xff0c;区别是什么&#xff1f; 六、extern 关键字的作用 七、static关键字的作用 八、指针和引用的区别 九、C内存分配方式 十、结构体对齐…...

CSS面试真题 part1

CSS面试真题 part1 1、说说你对盒子模型的理解2、谈谈你对BFC的理解3、什么是响应式设计&#xff1f;响应式设计的基本原理是什么&#xff1f;如何做&#xff1f;4、元素水平垂直居中的方法有哪些&#xff1f;如果元素不定宽高呢&#xff1f;5、如何实现两栏布局&#xff0c;右…...

针对考研的C语言学习(定制化快速掌握重点5)

顺序表 特点&#xff1a; 写代码主要就是增删改查&#xff01;&#xff01;&#xff01; 写代码的边界性非常重要以及考研插入和删除的位置都是从1开始&#xff0c;而数组下标是从0开始 【注】下标和位置的关系 线性表最重要的是插入和删除会涉及边界问题以及判断是否合法 …...

构建高效房屋租赁系统:Spring Boot应用

1 绪论 1.1 研究背景 中国的科技的不断进步&#xff0c;计算机发展也慢慢的越来越成熟&#xff0c;人们对计算机也是越来越更加的依赖&#xff0c;科研、教育慢慢用于计算机进行管理。从第一台计算机的产生&#xff0c;到现在计算机已经发展到我们无法想象。给我们的生活改变很…...

学习单片机编程和硬件设计步骤

学习单片机编程和硬件设计可以分为几个步骤&#xff1a; 理解基本概念&#xff1a;首先需要了解单片机的基本概念、硬件结构和工作原理 。 选择开发平台&#xff1a;选择一个合适的单片机系列作为起点&#xff0c;如Arduino、ESP8266/ESP32或STM32系列 。 准备工具和环境&…...

.net Framework 4.6 WebAPI 使用Hangfire

C# 使用 Hangfire 第一章 .net Framework 4.6 WebAPI 使用Hangfire 文章目录 C# 使用 Hangfire前言一、hangfire是什么?二、hangfire的特点三、.net Framework 中hangfire的使用方法第一步:创建WebAPI控制器第二步:添加nuget包第三步 创建startup类新建项目startup类Startu…...

两个向量所在平面的法线,外积,叉积,行列式

偶尔在一个数学题里面看到求两向量所在平面的法线&#xff0c;常规方法可以通过法线与两向量垂直这一特点&#xff0c;列两个方程求解&#xff1b;另外一种方法可以通过求解两个向量的叉积&#xff0c;用矩阵行列式 (determinant) 的方式&#xff0c;之前还没见过&#xff0c;在…...

C++之 友元重载 以及最常用的几种友元函数

在之前的友元中就曾经讲过&#xff0c;我们为了去访问修改私有成员中的数据时&#xff0c;只能通过公有的办法去进行访问操作&#xff0c;非常的局限。所以C引用了友元函数&#xff0c;只要加上friend关键字&#xff0c;C的这个类&#xff0c;会自动把这个函数的权限拉到类内&a…...

动态规划(3)——dp多状态问题Ⅰ

题一.按摩师&#xff08;LeetCode&#xff09; 题目描述 一个有名的按摩师会收到源源不断的预约请求&#xff0c;每个预约都可以选择接或不接。在每次预约服务之间要有休息时间&#xff0c;因此她不能接受相邻的预约。给定一个预约请求序列&#xff0c;替按摩师找到最优的预约集…...

在Mac电脑上安装adb环境

当你在命令行输入 adb version 或adb devices, 报错&#xff1a;zsh: command not found: adb &#xff0c;那么说明你的 Mac 上没有安装 ADB&#xff08;Android Debug Bridge&#xff09;&#xff0c;或者它没有添加到你的路径中。你可以按照以下步骤安装和配置 ADB&#xff…...

分糖果C++

题目&#xff1a; 样例解释&#xff1a; 样例1解释 拿 k20 块糖放入篮子里。 篮子里现在糖果数 20≥n7&#xff0c;因此所有小朋友获得一块糖&#xff1b; 篮子里现在糖果数变成 13≥n7&#xff0c;因此所有小朋友获得一块糖&#xff1b; 篮子里现在糖果数变成 6<n7&#xf…...

Spring中如何为静态变量注入值

在 Spring 中&#xff0c;如果使用 Value 注解注入值&#xff0c;不能将其应用于 static 字段。Spring 只能为实例变量注入值&#xff0c;不能直接对静态变量进行注入。 使用 PostConstruct 初始化&#xff1a; 如果确实需要在静态上下文中使用该值&#xff0c;可以使用 Post…...

HTML5实现唐朝服饰网站模板源码

文章目录 1.设计来源1.1 网站首页-界面效果1.2 唐装演变-界面效果1.3 唐装配色-界面效果1.4 唐装花纹-界面效果1.5 唐装文化-界面效果 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作者&#xff1a;xcL…...

ESXI识别USB设备

步骤&#xff1a; 插入usb设备到服务器。关闭虚拟机&#xff0c;添加USB控制器&#xff0c;根据U盘选择usb 3.0控制器&#xff0c;再添加usb设备如果usb设备灰色&#xff0c;进入主机打开SSH。使用xshell进行连接&#xff0c;运行以下命令&#xff1a; ESXI识别USB设备 - 插入…...

视频美颜SDK与直播美颜工具API是什么?计算机视觉技术详解

今天&#xff0c;小编将深入探讨视频美颜SDK与直播美颜工具API的概念及其背后的计算机视觉技术。 一、视频美颜SDK的概念 视频美颜SDK是一套用于开发实时美颜效果的工具集&#xff0c;开发者可以利用它在视频流中实现面部特征的优化。这些SDK通常提供了一系列功能&#xff0c…...

not exist 解决一对多 场景 条件过滤问题

场景&#xff1a; 现在存在一对多关系&#xff0c;蓝色的盒子装的篮球&#xff0c;黄的的盒子装的黄球&#xff0c; 黑色的盒子 &#xff08;模拟工作类似场景&#xff09; boxIdballId蓝盒ID-15蓝盒ID-16蓝盒ID-17黄盒ID-212黄盒ID-215黄盒ID-216黑盒ID-38黑盒ID-39 需求&a…...

解决$‘r‘ command not found或者文件夹显示’tvsf 33‘$‘r‘

问题现象: 某客户反馈在执行脚本的时候文件夹显示存在问题,如下图: 但是脚本文件中的内容并没有\r字符,如下图: 也有客户反馈如下: 问题分析: $\r’是回车符的转义表示。在Unix和Linux系统中,回车符是一个不可见的控制字符,它通常用于文本文件中的行结尾。以上…...

linux:详解nohup命令

在 UNIX 和类 UNIX 操作系统&#xff08;如 Linux 和 macOS&#xff09;中&#xff0c;nohup 意图为后台运行且免疫挂断信号的命令&#xff0c;用于在用户注销&#xff08;logout&#xff09;或终端关闭后继续运行相应的进程。 基本语法 启动进程 nohup [COMMAND] [ARG...] …...

负载箱:充电桩测试利器

RCD负载箱是用于测试和验证电气设备在故障状态下的性能的设备。它可以模拟真实的负载情况&#xff0c;从而帮助工程师和技术人员对设备进行准确的检测和维护。此外&#xff0c;RCD负载箱也是一种重要的安全保护设备&#xff0c;主要用于防止电路中的漏电现象引发的事故。它通常…...

Ubuntu 开机自启动 .py / .sh 脚本,可通过脚本启动 roslaunch/roscore等

前言 项目中要求上电自启动定位程序&#xff0c;所以摸索了一种 Ubuntu 系统下开机自启动的方法&#xff0c;开机自启动 .sh 脚本&#xff0c;加载 ROS 环境的同时启动 .py 脚本。在 . py 脚本中启动一系列 ROS 节点。 一、 .sh 脚本的编写 #!/bin/bash # gnome-terminal -- …...

RabbitMQ 消息队列:生产者与消费者实现详解

在分布式系统中&#xff0c;消息队列&#xff08;Message Queue, MQ&#xff09;是一种重要的组件&#xff0c;用于解耦系统、异步处理任务以及实现系统间的通信。RabbitMQ 是一个流行的开源消息代理软件&#xff0c;它实现了高级消息队列协议&#xff08;AMQP&#xff09;。在…...

vue3项目中组件切换不起作用

以下这种方式写页面中组件切换&#xff0c;不起作用。 <component :is"steps[compIndex].comp" />解决&#xff1a;使用shallowReactive或者shallowRef把对应的组件名称重新定义下。 <component :is"compNames[steps[compIndex].comp]" /> &…...

YOLOv11改进策略【损失函数篇】| Slide Loss,解决简单样本和困难样本之间的不平衡问题

一、本文介绍 本文记录的是改进YOLOv11的损失函数&#xff0c;将其替换成Slide Loss&#xff0c;并详细说明了优化原因&#xff0c;注意事项等。Slide Loss函数可以有效地解决样本不平衡问题&#xff0c;为困难样本赋予更高的权重&#xff0c;使模型在训练过程中更加关注困难样…...

动静态库(Linux)

文章目录 前言一、静态库二、动态库三、深入理解动态库总结 前言 我们之前用过c语言的库.Linux中默认的都是使用动态库&#xff0c;如果想要使用静态库&#xff0c;就必须加上-static选项。默认都是安装的动态库&#xff0c;系统中一般没有静态库&#xff0c;如果要使用&#…...

徐州专业网站建设公司/营销型网站外包

前言递归是一种非常重要的算法思想&#xff0c;无论你是前端开发&#xff0c;还是后端开发&#xff0c;都需要掌握它。在日常工作中&#xff0c;统计文件夹大小&#xff0c;解析xml文件等等&#xff0c;都需要用到递归算法。它太基础太重要了&#xff0c;这也是为什么面试的时候…...

公司网站建设安全的风险/seo公司网站推广

Cisco 3550 端口限速一、网络说明 PC&#xff11;接在Cisco3550 F0/1上&#xff0c;速率为1&#xff2d;&#xff1b; PC&#xff11;接在Cisco3550 F0/2上&#xff0c;速率为2&#xff2d;&#xff1b; Cisco3550的G0/1为出口。 二、详细配置过程 注&#xff1a;每个接口每个方…...

免费网站服务器/广州网络推广专员

传送门:bzoj4012 这题码调试就花了一中午和一下午。。。最后发现问题都是有地方没开longlonglong \ longlong longTAT。。。 法2的代码比较有技巧性(还不太熟。 题解 法1(点分树)&#xff1a; 首先点分治处理出v:v:v:每个重心到其所管辖子树中每个点的距离&#xff0c;压进…...

h5case是什么网站/网络服务主要包括

为什么80%的码农都做不了架构师&#xff1f;>>> 一个小型的网站&#xff0c;可以使用最简单的html静态页面就实现了&#xff0c;配合一些图片达到美化效果&#xff0c;所有的页面均存放在一个目录下&#xff0c;这样的网站对系统架构、性能的要求都很简单。随着互联…...

企业搭建网站的必要性/广州seo优化推广

安静的早餐Scala学习手册(Learning Scala)第二章1、值与变量定义2、命名3、数据类型及其转换(toType)4、字符串和内插5、元组1、值与变量定义值的定义值&#xff0c;即为常量&#xff0c;不可变&#xff0c;基本语法定义&#xff1a;val : ​创建一个名为a&#xff0c;类型为I…...

网站建设用户调查问卷/杭州seo中心

题型: 编程题 语言: G;GCC Description “丑数”是指除了质因子2,3&#xff0c;5&#xff0c;不含其它质因子的正整数&#xff0c;例如由小到大前10个“丑数”为 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, ... 非“丑数”的前10个数为 7, 11, 13, 14, 17, 19, 21, 22, 23, 26, ... 现…...