基于text2vec和faiss开发实现文档查询系统初体验

news2024/12/24 9:57:56

最近接触到了一些文本向量化的预训练模型,感觉相比较自己去基于gensim去训练词向量来说,使用预训练模型可能是更高效的方式了,正好有一个想法一直在想能够以什么样的形式间接的实现问答,说白了这里的问答跟我们理解的chatGPT类型的问答是不一样的,这里的考虑是想有一堆知识语料或者是文本文档数据,对于专业人士来说查询使用起来肯定是很简单的,但是对于一些刚从业或者是缺乏专业培训的人员来说是比较困难的,如何能高效地利用本地的知识语料数据来为我们产生对应的问答回答结果呢?或者说是让对应的问题产出更聚焦更准确呢?

这两天在查阅资料的时候结合自己最近两天的亲身实践有一个粗糙的方案,整体流程如下所示:

 核心的思想就是想要基于text2vec模型提供文本句级或者是段落级别的向量化计算,之后将问答生成的任务转化为了文本相似度匹配任务,而原始的文本已经转化为了标准的向量,那么相似度匹配的任务又变成了向量查询检测任务,这个任务场景下faiss是比较好用的工具了。

faiss官方项目在这里,如下所示:

 Faiss是一个用于高效相似性搜索和密集向量聚类的库。它包含在任何大小的向量集中搜索的算法,最多可以搜索可能不适合RAM的向量集。它还包含用于评估和参数调整的支持代码。Faiss是用C++编写的,带有完整的Python/numpy包装器。一些最有用的算法是在GPU上实现的。它主要由Meta的基础人工智能研究小组开发。

Faiss包含几种相似性搜索方法。它假设实例被表示为向量,并由整数标识,并且向量可以与L2(欧几里得)距离或点积进行比较。类似于查询向量的向量是与查询向量具有最低L2距离或最高点积的向量。它还支持余弦相似性,因为这是归一化向量上的点积。

一些方法,如基于二进制矢量和紧凑量化码的方法,仅使用矢量的压缩表示,不需要保留原始矢量。这通常是以不太精确的搜索为代价的,但这些方法可以在单个服务器的主存中扩展到数十亿个向量。其他方法,如HNSW和NSG,在原始向量上添加索引结构,以提高搜索效率。

GPU实现可以接受来自CPU或GPU存储器的输入。在具有GPU的服务器上,GPU索引可以用于替换CPU索引(例如,用GpuIndexFlatL2替换IndexFlatL2),并且自动处理到GPU存储器的拷贝/从GPU存储器的复制。然而,如果输入和输出都保持在GPU上,结果将更快。支持单GPU和多GPU使用。

想要进一步了解faiss详情的可以自行移步官方项目即可。

这里因为目前只是一个初步的粗糙想法,本文的主要目的就是想要去基于真实的实践去尝试这个流程的可行性,这里从网上找了一个文本对相似度计算的数据集,实例如下所示:

{"text1":"一个女人在跳舞。","text2":"这个男人在跳舞。","label":2}
{"text1":"你好,请问你这个借款有免息期吗","text2":"一次七天免息机会领取","label":1}
{"text1":"明年他成为左后卫和右截锋的先发球员。","text2":"第二年,他成为左后卫和右截锋的先发球员。","label":4}
{"text1":"同年,他被任命为密西西比州和伊利诺伊州教区魁北克地区的牧师将军。","text2":"同年,他被任命为密西西比州和伊利诺伊州教区魁北克地区的牧师。","label":4}
label":5}
{"text1": "埃摩森丨职场遇难题?找不到对象?做好这3步,人生就会像开了挂一样", "text2": "春节后开工已经一个星期了 各位小伙伴们还适应吗? 上班的时候,是不是一边摸鱼 一边还在回味放假的快乐?  再过几天又到周末了 如果一周能多休息半天,该有多好 近年来,多地区开始试行 4.5天弹性工作制 今后会在东莞推广吗? 人社部答复来了 ↓↓↓ 人社部明确回复:“四天半工作制” 不宜在企业中广泛推行 近日,人社部在回复全国人大代表的建议中 明确指出“4.5天弹性工作制” 不宜在企业中广泛推行  图源:人社局 进一步缩短工时标准尚不具备现实基础 不宜在企业中广泛推行 进一步缩短我国的法定工作时间标准 需要以经济发展、科技进步 和生产力水平的提高为基础 充分考虑我国社会经济发展水平和企业承受能力  图源:摄图网 在当前经济形势下 缩短工时会加大企业生产经营压力 带来较高的用人成本 和负担影响经济发展  图源:摄图网 人社部:现行工时制度符合现实 劳动者每年有120-130天休息休假 人社部指出,现行工时制度和标准 是综合考虑我国人口、就业、经济发展水平 和人民生活习惯等因素制定的 有利于实现劳动者身体健康权 休息权以及就业权之间的平衡  图源:摄图网 同时该标准符合国际劳工组织 1935年通过的《40小时工作周公约》 和1962年《缩短工时建议书》提出的 逐步缩短工作时间至每周40小时的要求 与多数经济发达国家或地区的工时水平基本一致 是一种比较先进和科学的劳动标准  图源:摄图网 此外,劳动者每年可依法享受: ▷11天法定节假日 ▷最长15天的带薪年休假 ▷每周2天休息日  图源:摄图网 每年固定的休息休假在120-130天 约占全年时间1/3 现行休息休假制度 已为职工探亲访友、消费休闲等 创造了较好的前提条件  图源:摄图网 弹性休假落地难,或成为特有福利 此前对于弹性休假 大家争议最多的是 “2.5天弹性休假” 究竟是福利,还是口号? 多出半天假,是否意味着延长法定工作时间? 能否落实、如何落实……  图源:摄图网 此次,人社部尤其强调: 近年的相关调查显示 我国能够严格执行目前 工时标准的企业比例不高,加班情况较多 目前有的地方推行的2.5天假期 也可能成为行政机关、事业单位 工作人员的特有福利,社会影响也不好  图源:摄图网 消息一出,网友们纷纷表示 先把我们的双休落实好吧 ▽    图源:微博  图源:南方都市报 还有脑洞大开的网友表示 各种办事处周六日应该上班 ▽  图源:微博 一看就是我们东莞搞钱人 ▽  图源:微博 凡尔赛大师也出现了 ▽  图源:微博 网友:说多了都是泪 ▽    图源:微博 实际上,“4.5天弹性工作制”并非新规 早在2015年8月,国务院办公厅就曾印发 《关于进一步促进旅游投资和消费的若干意见》 鼓励弹性作息  图源:摄图网 有条件的地方和单位可根据实际情况 依法优化调整夏季作息安排 为职工周五下午与周末结合 外出休闲度假创造有利条件  图源:摄图网 目前已有河北、江西、重庆、甘肃 辽宁、安徽、陕西、贵州、福建等 10多个省份出台了鼓励2.5天休假的意见  图源:人民日报 不管是过去还是现在 各地关于弹性休假的政策多为鼓励性文件 并非强制措施 因此此前2.5天为代表的弹性休假政策 是否能够真正落实颇受关注 如今人社部正式回复也算是尘埃落地了  图源:摄图网 各位搬砖人们还是安心打工吧 信息:摄图网、微博、人社局、人民日报、深圳全接触 编辑:全妹 如有侵权请联系删除", "label": 0}

一共包含三个字段text1、text2和label,这个不同字段的含义猜一下就知道是什么意思了。

首先来加载本地的数据集,如下所示:

def loadData():
    """
    加载数据集
    """
    with open("data.jsonl",encoding="utf-8") as f:
        data_list=[eval(one.strip()) for one in f.readlines() if one.strip()]
    print("data_list_length: ", len(data_list))
    return data_list

接下来需要对原始的数据集进行解析计算,提取所需要的字段数据,如下所示:

def parseData(data_list):
    """
    解析数据集
    """
    result=[]
    data_list=data_list[:1000]
    for one_dict in data_list:
        try:
            text1=one_dict["text1"]
            text2=one_dict["text2"]
            label=one_dict["label"]
            result+=[text1,text2]
        except Exception as e:
            print("Exception: ", e)
    return result

接下来是需要对整个语料数据集进行向量化计算处理,如下所示:

def toVector(sentences):
    """
    向量化
    """
    embeddings = model.encode(sentences)
    print("embeddings_shape: ", embeddings.shape)
    vector={}
    embeddings=embeddings.tolist()
    for i in range(len(sentences)):
        one_sen=sentences[i]
        one_vec=embeddings[i]
        vector[one_sen]=one_vec
    with open("vector.json","w",encoding="utf-8") as f:
        f.write(json.dumps(vector))

整体pipeline实现如下所示:

def main():
    """
    主函数
    """
    data_list=loadData()
    sentences=parseData(data_list)
    toVector(sentences)

到这里我们就得到了上图DB数据库的向量数据了。

接下来就可以基于faiss来实现向量的查询检索计算了,核心实现如下所示:

index = faiss.IndexFlatL2(dimision)          
print("index.is_trained: ", index.is_trained)
index.add(vectors)
print("index.ntotal: ", index.ntotal)             
query = np.array([vector[ind]])                
distances, indexs = index.search(query, topK)
print("distances_shape: ", distances.shape)
print("indexs_shape: ", indexs.shape)
print("原始文本: ", text[ind])
print("indexs: ", indexs)
for one_ind in indexs.tolist():
    for one in one_ind:
        print(text[one])

结果输出如下所示:

 初步实践感觉结果还是可以的,另外检索计算的速度也是挺快的。

后续就考虑基于上述的流程来开发第一个demo项目。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/827595.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

iOS——Block one

块类似于匿名函数或闭包,在许多其他编程语言中也存在类似的概念。 可以访问上下文,运行效率高 Block 以下是块的一些基本知识: 块的定义:块是由一对花括号 {} 包围的代码片段,可以包含一段可执行的代码。块的定义使…

125.验证回文串

目录 一、题目 二、代码 一、题目 125. 验证回文串 - 力扣&#xff08;LeetCode&#xff09; 二、代码 class Solution { public: bool ABC(char& s) {if (s > 65 && s < 90){s 32;return true;}if (s > 97 && s < 122){return true;}if …

FPGA开发:音乐播放器

FPGA开发板上的蜂鸣器可以用来播放音乐&#xff0c;只需要控制蜂鸣器信号的方波频率、占空比和持续时间即可。 1、简谱原理 简谱上的4/4表示该简谱以4分音符为一拍&#xff0c;每小节4拍&#xff0c;简谱上应该也会标注每分钟多少拍。音符时值对照表如下图所示&#xff0c;这表…

无涯教程-Lua - while语句函数

只要给定条件为真&#xff0c;Lua编程语言中的 while 循环语句就会重复执行目标语句。 while loop - 语法 Lua编程语言中 while 循环的语法如下- while(condition) dostatement(s) end while loop - 流程图 在这里&#xff0c;需要注意的关键是 while 循环可能根本不执行。…

Go语音介绍

Go语言介绍 Go 即Golang&#xff0c;是Google公司2009年11月正式对外公开的一门编程语言。 Go是静态强类型语言&#xff0c;是区别于解析型语言的编译型语言。 解析型语言——源代码是先翻译为中间代码&#xff0c;然后由解析器对代码进行解释执行。 编译型语言——源代码编…

【树形DP+换根思想】2022牛客多校加赛 H

登录—专业IT笔试面试备考平台_牛客网 题意&#xff1a; 思路&#xff1a; 这个虽然是树形DP&#xff0c;却用了换根的思想.... 首先&#xff0c;后缀0的个数可以转化成min(cnt2,cnt5)&#xff0c;其中cnt2为2的因子个数&#xff0c;cnt5为5的因子个数 然后进行DP 设dp[u]…

面试之多线程(三)

1.进程和线程的区别 根本区别&#xff1a;进程是操作系统分配资源的最小单位&#xff1b;线程是CPU调度的最小单位所属关系&#xff1a;一个进程包含了多个线程&#xff0c;至少拥有一个主线程&#xff1b;线程所属于进程开销不同&#xff1a;进程的创建&#xff0c;销毁&…

基于Vue+ElementUI+Echarts+G2Plot的仪表盘设计器,代码完全开源

简介 &#x1f525;DashBoard基于SpringBoot、MyBatisPlus、ElementUI、G2Plot、Echarts等技术栈的仪表盘设计器&#xff0c;具备仪表盘设计、预览、资源管理、组件管理等能力&#xff0c;支持JSON、MySQL、Oracle、PostgreSQL、HTTP、JavaScript、Groovy等数据集接入&#xf…

类加载器的双亲委派机制和源码分析

双亲委派机制 双亲委派就是一个从子到父的过程,然后还有一个从父到子的状态。具体如下: 如果一个类加载器收到了类加载的请求,它会首先去自己的缓存中查找是否加载过这个类(findLoadedClass),如果有,那么直接加载。如果没有就会让父加载器加载,父加载器会先去自己的缓…

自定义elementui的主题

通常情况下&#xff0c;我们使用elementui框架的时候默认组件的主题都是白色的&#xff0c;比如&#xff1a; 但是如果想自定义主题&#xff0c;改变主题颜色&#xff0c;以及各种默认颜色&#xff0c;其实也不难&#xff1a; 配置默认主题&#xff0c;选好后点击下载 在vu…

软件外包开发的PHP开发框架

PHP有许多流行的开发框架&#xff0c;每个框架都有其独特的特点和优势。下面列举的只是一部分PHP开发框架&#xff0c;还有其他一些框架如Slim、Zend Framework等也值得一提。选择合适的框架取决于项目的需求和开发团队的偏好&#xff0c;您可以根据项目规模、复杂性和功能需求…

Golang之路---02 基础语法——异常机制:panic 和 recover

Golang的异常处理 Go 没有像 Java 和 .NET 那样的 try/catch 异常机制&#xff1a;不能执行抛异常操作。 在 Golang 中&#xff0c;有不少常规错误&#xff0c;在编译阶段就能提前告警&#xff0c;比如语法错误或类型错误等&#xff0c;但是有些错误仅能在程序运行后才能发生&…

【推荐】通用全面的APP测试用例设计

1、安装卸载 用例编号 测试内容 操作步骤 预期结果 测试次数 测试结果 备注 安装 1 通过第三方软件协助安装是否正常 第三方软件搜索app&#xff0c;安装 目标:支持360、豌豆荚、应用宝等主流辅助工具 1 Pass 2 在不同操作系统下安装是否正常 1、使用测试手机安装 …

面试总被问高并发负载测试,你真的会么?

本文将介绍使用50K并发用户测试轻松运行负载测试所需的步骤&#xff08;以及最多200万用户的更大测试&#xff09;。 ❶ 写你的剧本 ❷ 使用JMeter在本地测试 ❸ BlazeMeter SandBox测试 ❹ 使用一个控制台和一个引擎设置每引擎用户数量 ❺ 设置和测试群集&#xff08;一个…

【环形链表(带环链表)超详细总结】

题目一 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 使用快慢指针&#xff0c;如果慢指针等于快指针&#xff0c;就说明是带环链表链表的中间结点 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;…

什么是 webpack?

Webpack 介绍 什么是 webpack&#xff1f; :::tip 官方描述 webpack 是一个用于现代 JavaScript 应用程序的静态模块打包工具。当 webpack 处理应用程序时&#xff0c;它会在内部从一个或多个入口点构建一个 依赖图(dependency graph)&#xff0c;然后将你项目中所需的每一个…

Zookeeper基础操作

搭建Zookeeper服务器 windows下部署 下载地址: https://mirrors.cloud.tencent.com/apache/zookeeper/zookeeper-3.7.1/ 修改配置文件 打开conf目录&#xff0c;将 zoo_sample.cfg复制一份&#xff0c;命名为 zoo.cfg打开 zoo.cfg&#xff0c;修改 dataDir路径&#xff0c…

0802|IO进程线程day5 作业(打印时钟在终端上,若终端输入quit,结束时钟)

作业1&#xff1a;守护进程 守护进程的创建&#xff08;5步&#xff09;&#xff1a; 创建孤儿进程&#xff1a;所有工作都在子进程中执行&#xff0c;从形式上脱离终端控制。 fork(), 退出父进程 创建新的会话组&#xff1a;使子进程完全独立出来&#xff0c;防止兄弟进程对其…

蓝桥杯上岸必背!!!(并查集补更)

蓝桥杯上岸必背&#xff01;&#xff01;&#xff01;(并查集补更) 大家好 我是寸铁&#x1f4aa; 冲刺蓝桥杯省一模板大全来啦 &#x1f525; 蓝桥杯4月8号就要开始了 &#x1f64f; 距离蓝桥杯省赛倒数第3天 ❗️ ❗️ ❗️ 还没背熟模板的伙伴们背起来 &#x1f4aa; &…

git 常用命令有哪些

Git 是我们开发工作中使用频率极高的工具&#xff0c;下面总结下他的基本指令有哪些&#xff0c;顺便温习一下。 前言 一般项目中长存2个分支&#xff1a; 主分支&#xff08;master&#xff09; 和开发分支&#xff08;develp&#xff09; 项目存在三种短期分支 &#xff1a…