Faiss简单使用

news2024/11/17 15:32:14

Faiss是Facebook AI Research开发的快速相似性搜索(similarity search)计算库,为稠密向量提供高效相似度搜索和聚类,支持十亿级别向量的搜索。

Faiss 的核心原理是基于向量索引和近似最近邻搜索。它通过构建索引结构来加速相似性搜索,以在大规模数据集中快速找到最相似的向量。

本节不介绍Faiss的原理,只介绍使用方法。

1. 安装

# Faiss分为cpu和gpu两个版本,按需进行安装
#cpu版,faiss-cpu仅支持cpu
conda install -c pytorch faiss-cpu 

#gpu版,faiss-gpu支持cpu和gpu
conda install -c pytorch faiss-gpu

2. Faiss使用

Faiss使用较为简单,主要分为三部分,构建数据集、建立索引并添加向量、检索。

2.1 构建数据集

首先拥有数据集,然后转化为向量。文本向量化可以使用向量模型,比如m3e,ernie-base,text2vec等等。

注意,在 Python 中,矩阵始终表示为 numpy 数组。数据类型dtype必须是float32.

#例一,官方代码
import numpy as np
d = 64                           # dimension
nb = 100000                      # database size
nq = 10000                       # nb of queries
np.random.seed(1234)             # make reproducible
xb = np.random.random((nb, d)).astype('float32')
xb[:, 0] += np.arange(nb) / 1000.
xq = np.random.random((nq, d)).astype('float32')
xq[:, 0] += np.arange(nq) / 1000.
print(xb,xb.shape,xb.dtype)
print("*"*80)
print(xq,xq.shape,xq.dtype)

在这里插入图片描述

# 例二,使用text2vec-large-chinese模型演示
from text2vec import SentenceModel
sentences = ['如何更换花呗绑定银行卡', '花呗更改绑定银行卡','怎么换银行卡', '银行卡毁坏如何补办', '花呗如何打开']

model = SentenceModel('GanymedeNil/text2vec-large-chinese')
embeddings = model.encode(sentences)
if embeddings.dtype!='float32':
    embeddings = embeddings.astype('float32')
else:
    pass

print(embeddings,embeddings.shape,embeddings.dtype)

在这里插入图片描述

2.2 构建索引并添加向量

Faiss的核心是索引,建立索引可以提高搜索效率。Faiss含有多种索引,如IndexFlatL2,IndexFlatIP,IndexIVFFlat等。建立索引之前需要明确向量的维数。大多数索引需要进行训练,以分析向量的分布。

当索引建立并训练后,可以对索引执行两个操作:addsearch

#例一,跟2.1例一承接
import faiss                   # make faiss available
index = faiss.IndexFlatL2(d)   # build the index,d is dimension
print(index.is_trained)        # 指示索引是否需要训练,输出为True,代表该类index不需要训练,只需要add向量进去即可
index.add(xb)                  # add vectors to the index
print(index.ntotal)            # 索引向量的数量

在这里插入图片描述

#例二,跟2.1例二承接

import faiss
num,d = embeddings.shape
index = faiss.IndexFlatL2(d)  
print(index.is_trained) 
index.add(embeddings) 
print(index.ntotal)

在这里插入图片描述

2.3 检索

Faiss在索引上进行的基本搜索操作是k-近邻搜索,即对于每个查询向量,在数据库中找到其k个近邻。

k = 4                          # we want to see 4 nearest neighbors
D, I = index.search(xb[:5], k) # sanity check
print(I)                       # I是每个待检索query最相似TopK的索引列表
print(D)                       # D是每个待检索query最相似TopK的索引对应的距离
D, I = index.search(xq, k)     # actual search
print(I[:5])                   # neighbors of the 5 first queries
print(I[-5:])                  # neighbors of the 5 last queries

在这里插入图片描述

k = 4
query = ['花呗如何更换银行卡呢']
query_embedding = model.encode(query)
if query_embedding.dtype!='float32':
    query_embedding = query_embedding.astype('float32')
else:
    pass
D, I = index.search(query_embedding, k)
print(I)
print(D)
#结果解读:I是检索返回结果排序,相对来说检索结果还算准确,但是分数有点大,说明文本向量化不够准确。

在这里插入图片描述

2.4 总结

在本节中使用的索引类型不需要训练,大家可以使用IndexIVFFlat(倒排索引)试试,倒排索引需要进行索引训练,而且检索效率更高。

3. 小结

Faiss检索使用简单,主要在于如何进行准确的文本向量化,才能确保返回正确的检索结果。目前大模型外接知识库中,其中一步就是文本检索,文本检索不准确就会导致“garbage in, garbage out“。

参考

  • https://www.writebug.com/article/1c571b48-1b41-11ee-8711-0242ac14000f

  • https://github.com/facebookresearch/faiss

  • https://zhuanlan.zhihu.com/p/357414033

  • https://zhuanlan.zhihu.com/p/133210698

  • https://blog.csdn.net/weixin_43791511/article/details/122513786

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

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

相关文章

android9-android13 AMS演进初窥

目录 一:概览 WindowManagerService 基本介绍 ActivityManagerService 基本介绍 二:AMS及其关联的WMS中主要组件的类图和对像图 一:android 9中AMS/WMS的类图和对像图 二:android 10中AMS/WMS的类图和对像图 三&#xff1a…

怎么给图片去底色?这几个方法一定要知道

如果你是一位设计师或者是需要制作图片的人,那么你一定知道去除图片底色的重要性。无论是制作海报、广告、产品图片还是网站页面,去除图片底色可以让你的设计更加精细、美观、专业。在本文中,我们将介绍三种常见的图片去底色方法,…

p7付费课程笔记5:串行gc以及并行gc

前言 前段时间我们学习jvm的基础结构和gc相关的基础知识,今天我们详细讲讲几大gc。 串行gc 串行 GC 对年轻代使用 mark-copy (标记-复制) 算法,对老年代使用 mark-sweep-compact (标记-清除-整理) 算法。 两者都是单线程的垃圾收集器,不能…

百度AI成为移动生态强者的真相

移动互联网的发展,让移动生态成为了互联网企业竞争的重要战场。在这场竞争中,百度AI凭借着其优质的技术实力和完善的生态系统,成为了移动生态中的强者。 那么,百度AI究竟靠什么成为了强者呢?首先,百度AI的技…

网络安全/黑客零基础入门(经验分享)

相关网站推荐 博主研究方向为安全领域,以后可能更多的在圈子内发表文章,提高文章质量。 1、FreeBuf 国内关注度最高的全球互联网安全媒体平台,爱好者们交流与分享安全技术的社区,网络安全行业门户。 2、看雪 看雪论坛是个软件…

GB/T 25000.51解读——软件产品的兼容性怎么测?

GB/T 25000.51-2016《软件产品质量要求和测试细则》是申请软件检测CNAS认可一定会用到的一部国家标准。在前面的文章中,我们为大家整体介绍了GB/T 25000.51-2016《软件产品质量要求和测试细则》国家标准的结构和所涵盖的内容以及对软件产品的八大质量特性中的功能性…

Failed to load local font resource:微信小程序加载第三方字体

加载本地字体.ttf 将ttf转换为base64格式:https://transfonter.org/ 步骤如下 将下载后的stylesheet.css 里的font-family属性名字改一下,然后引进页面里就行了,全局样式就放app.scss,单页面就引入单页面 注: .title…

Jmeter+MySQL链接+JDBC Connection配置元件+使用

参考大大的博客学习:怎么用JMeter操作MySQL数据库?看完秒懂!_jmeter mysql_程序员馨馨的博客-CSDN博客 注:里面所有没打码的都是假数据,麻烦大家自行修改正确的信息。 一、背景 需要取数据库中的值,作为…

html2Canvas+jsPDF 下载PDF 遇到跨域的对象存储的图片无法显示

一、问题原因 对象存储的域名和你网址的域名不一样,此时用Canvas相关插件 将DOM元素转化为PDF,就会出现跨域错误。 二、解决办法 两步 1. 图片元素上设置属性 crossorigin"anonymous" 支持原生img和eleme组件 2. 存储桶设置资源跨域访问…

盘点!项目管理软件排行榜前十名

如今企业规模不断扩大,业务逐渐复杂化,项目管理已经成为现代企业管理中不可或缺的一环。作为协调管理者、团队成员和客户之间交流的工具,项目管理软件不仅可以提高工作效率,还可以提高项目成功的几率,对于企业具有重要…

[小尘送书-第二期]《从零开始读懂量子力学》由浅入深,解释科学原理;从手机到超导,量子无处不在;从微观到宏观,遐想人生的意义!

大家好,我是小尘,欢迎关注,一起交流学习!欢迎大家在CSDN后台私信我!一起讨论学习,讨论如何找到满意的工作! 本文目录 一、前言二、作者简介三、内容简介四、抽奖方式五、名家推介写在最后 一、前…

Linux使用教程

一、Linux命令基础 1、ls、ll命令——展示数据 ①ls命令——平铺展示数据 其中ls命令以平铺的方式展现数据 ②ll命令——列表展示数据 ll命令以列表的方式展现数据 -a选项,表示:all的意思,即列出全部文件(包含隐藏的文件/文件夹…

【Vue】div标签实现输入框,利用contenteditable=“true“属性的标签实现

推荐个链接&#x1f517;&#xff0c;可以更好的查阅自己遇到的问题&#xff08;点击此处即可跳转&#xff09; 使用 div 实现 input、textarea 输入框 <template><div class"content"><div class"main editTextList" ><divclass&q…

[c++实验] 快读快写,O123优化,原版用时对比

前言 学过c的多知道&#xff0c;准确的来说是做过c题目的都知道&#xff1a;c题目不仅要求代码正确&#xff0c;还要求用时&#xff0c;大多用时要求都在200ms--1000ms之间&#xff0c;要是遇到大数据时&#xff0c;超时的可能就会大大提升。 结论 用时的把控也很重要&#…

网站实现下载apk安装包

目录 1、背景说明2、效果图3、具体实现3.1 界面代码3.2 js代码 4、说明4.1 存在异常4.2 解决方案 5、参考资料 1、背景说明 有时需要将写好的apk安装包在局域网内部进行发布&#xff0c;具体实现非常简单&#xff0c;如下所示 2、效果图 进入到网站后&#xff0c;点击下载按…

正确认识:2374782-02-0,FAPI-4,成纤维细胞活化蛋白抑制剂

资料编辑|陕西新研博美生物科技有限公司小编MISSwu​ PART1----试剂基础信息​​ 【中文名称】成纤维细胞活化蛋白抑制剂 【英文名称】 FAPI-4 【结 构 式】 【CAS】2374782-02-0 【分子式】C40H54F2N10O10 【分子量】872.93 【沸点】1144.165.0 C(Predicted) 【密度】1.460.…

【力扣周赛】第 355 场周赛(构造二分答案异或前缀 状态压缩⭐)

文章目录 Q1&#xff1a;6921. 按分隔符拆分字符串&#xff08;双指针&#xff09;Q2&#xff1a;6915. 合并后数组中的最大元素&#xff08;倒序遍历贪心&#xff09;代码优化 Q3&#xff1a;6955. 长度递增组的最大数目&#x1f6b9;&#x1f6b9;&#x1f6b9;&#x1f6b9;…

企业级PaaS低代码快开平台源码,基于 Salesforce Platform 的开源替代方案

PaaS低代码快开平台是一种快速开发应用系统的工具&#xff0c;用户通过少量代码甚至不写代码就可以快速构建出各种应用系统。 随着信息化技术的发展&#xff0c;企业对信息化开发的需求正在逐渐改变&#xff0c;传统的定制开发已经无法满足企业需求。低代码开发平台&#xff0…

ElementUI tabs标签页样式改造美化

今天针对ElementUI的Tabs标签页进行了样式修改&#xff0c;更改为如下图所属的样子。 在线运行地址&#xff1a;JSRUN项目-ElementUI tabs标签页样式改造 大家如果有需要可以拿来修改使用&#xff0c;下面我也简单的贴上代码&#xff0c;代码没有注释&#xff0c;很抱歉&#x…

Centos7.9安装瀚高数据库企业版6.0.4_并开启远程连接_使用瀚高连接工具操作_亲测成功---国产瀚高数据库工作笔记003

1.首先去瀚高官网,注册,然后下载安装包, OpenEuler23.03欧拉系统_安装瀚高数据库企业版6.0.4_openeuler切换root用户_su:拒绝权限_passwd: 鉴定令牌操作错误---国产瀚高数据库工作笔记001 一部分内容可以参考一下这个博文 2.准备一下环境: 关闭防火墙,关闭网络管理器 syste…