使用BGE-M3和K近邻实现语义搜索

使用BGE-M3和K近邻实现语义搜索

1 简单介绍

随着大模型和 检索增强生成(Retrieval-augmented Generation, RAG)不断的发展,文本语义检索很重要。文本语义检索离不开文本向量生成,在文本向量生成上面有几个比较好的模型,例如:北京智源人工智能研究院构建的BGE(BAAI General Embedding)、北京希瑞亚斯科技有限公司构建的M3E(Moka Massive Mixed Embedding)、SentenceTransformers可以实现文本的句子、段落的向量化,也可实现图片的向量化。

本文选择BGE-M3模型,目前从公布的参数上看它的效果最好,参考地址如下:

# GitHub地址
https://github.com/FlagOpen/FlagEmbedding# HuggingFace地址
https://hf-mirror.com/BAAI/bge-m3

2 安装环境

# 安装BGE-M3
pip install -U FlagEmbedding -i https://pypi.tuna.tsinghua.edu.cn/simple# 安装sklean
pip install scikit-learn -i https://pypi.tuna.tsinghua.edu.cn/simple

3 简单使用BGE

3.1 使用BGE生成文本向量

import numpy as np
from FlagEmbedding import BGEM3FlagModel# 引入模型
model = BGEM3FlagModel(model_name_or_path="E:/model/bge-m3")# 注意:单篇文章的字数最大8192个
sentences = ["文章摘要1","文章摘要2"
]# 对文本进行向量编码,使用稠密编码
# sentences_vector_dict = model.encode(sentences, return_dense=True)
sentences_vector_dict = model.encode(sentences,# 设置返回Dense Embedding,默认打开return_dense=True,# 设置返回Sparse Embedding (Lexical Weight),默认关闭return_sparse=True,# 设置返回Multi-Vector (ColBERT),默认关闭return_colbert_vecs=True
)
#
"""
返回一个对象,对象中含有三个属性分别是:dense_vecs、lexical_weights、colbert_vecs
{"dense_vecs": array([[……], [……]],"lexical_weights": [dict({'6': 0.002955027, '20403': 0.107134104, '89095': 0.25817403, '418': 0.075165465}), dict({'20403': 0.08092275, '89095': 0.22856326, '304': 0.079813644})],"colbert_vecs": array([[……], [……]],
}
"""
print(sentences_vector_dict)# 获取稠密编码
sentences_vector_arr = sentences_vector_dict.get("dense_vecs")# 查看类型:numpy.ndarray
print(type(sentences_vector_arr))# 查看维度:(2, 1024)
print(np.shape(sentences_vector_arr))# 获取第一个文本的语义向量:一维向量[……]
print(sentences_vector_arr[0])# 使用sentence_transformers比较两个文本的相似度
from sentence_transformers import util
print(util.cos_sim(sentences_vector_arr[0], sentences_vector_arr[1]))

3.2 使用BGE计算colbert的评分

from FlagEmbedding import BGEM3FlagModelmodel = BGEM3FlagModel(model_name_or_path="E:/model/bge-m3",  use_fp16=True)sentences_1 = ["What is BGE M3?", "Defination of BM25"]
sentences_2 = ["BGE M3 is an embedding model supporting dense retrieval, lexical matching and multi-vector interaction.","BM25 is a bag-of-words retrieval function that ranks a set of documents based on the query terms appearing in each document"]output_1 = model.encode(sentences_1, return_dense=True, return_sparse=True, return_colbert_vecs=True)
output_2 = model.encode(sentences_2, return_dense=True, return_sparse=True, return_colbert_vecs=True)# colbert_score中使用了”爱因斯坦求和“(torch.einsum),colbert_score具体算法请参考相关文献
"""
爱因斯坦求和是一种对求和公式简洁高效的记法,其原则是当变量下标重复出现时,即可省略繁琐的求和符号。
例如:
C = einsum('ij,jk->ik', A, B)注释:->符号就相当于等号,->左边为输入,右边为输出。
"""
print(model.colbert_score(output_1['colbert_vecs'][0], output_2['colbert_vecs'][0]))
print(model.colbert_score(output_1['colbert_vecs'][0], output_2['colbert_vecs'][1]))

3.3 使用BGE-M3和K近邻实现语义检索

from FlagEmbedding import BGEM3FlagModel
from sklearn.neighbors import NearestNeighbors# 引入模型
model = BGEM3FlagModel(model_name_or_path="E:/model/bge-m3")# 注意:单篇文章的字数最大8192个
sentences = ["河南大学是一所历史悠久的综合性高校","河南大学软件学院","软件工程是一个专业","我是河南大学的一名学生"
]# 对文本进行向量编码,使用稠密编码
sentences_vector_dict = model.encode(sentences)# 获取稠密编码
sentences_vector_arr = sentences_vector_dict.get("dense_vecs")# 初始化最近邻搜索对象,n_neighbors:距离最近的数量,algorithm:使用的算法
nbrs = NearestNeighbors(n_neighbors=3, algorithm='ball_tree').fit(sentences_vector_arr)# 查询最近邻
distances, indices = nbrs.kneighbors(sentences_vector_arr)# 注意:距离的第一个值是0,因为文本自己到自己是最近的才为0;
print("距离:", distances)
# 索引中第一个值是文本的索引位置,对应自己,因为文本自己到自己最近
print("索引:", indices)

输出:

距离: 
[[0.         0.69528755 0.8755811 ][0.         0.77477873 0.86843368][0.         0.86843368 1.01228235][0.         0.69528755 0.77477873]]
索引:
[[0 3 1][1 3 2][2 1 3][3 0 1]]

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

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

相关文章

C++中vector的简单实现

文章目录 一、主要任务1. 查看文档的网站的链接2.内部模拟的函数 二、本人的模拟实现过程1. 所需模拟实现的函数a.构造、拷贝构造b. reverse()扩容c.insert()、push_back()插入数据d. erase()、pop_back()删除数据e. swap()交换f. begin()、end()非const与const迭代器g. 完善构…

mysql的存储结构

一个表就是一个ibd文件 .ibd文件大小取决于数据和索引,在5.7之后才会为每个表生成一个独立表空间即一个ibd文件,在此之前,所有表默认下都会存储在“系统表空间”(共享表空间),所有表都在一个ibd文件。 inn…

示例六、湿敏传感器

通过以下几个示例来具体展开学习,了解湿敏传感器原理及特性,学习湿敏传感器的应用: 示例六、湿敏传感器 一、基本原理:随着人们生活水平的不断提高,湿度监控逐步提到议事日程上。由于北方地区秋冬季干燥,需要控制室内…

16.接口自动化学习-编码处理与装饰器

1.编码和解码 编码:将自然语言翻译成计算机可以识别的语言 hello–01010 解码:将机器识别的语言翻译成自然语言 2.编码格式 UTF-8 GBK unicode 3.编码操作 #编码操作str1"hello呀哈哈哈"str2str1.encode(gbk)print(str2)print(type(str2))…

js原型链与继承笔记

前置阅读:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Inheritance_and_the_prototype_chain js中的“类”是一个函数。function test() {}中,test是由Function生成的。prototype与__proto__的区别: 前者是js函数(C…

Linux学习之路 -- 文件系统 -- 缓冲区

前面介绍了文件描述符的相关知识,下面我们将介绍缓冲区的相关知识。 本质上来说,缓冲区就是一块内存区域,因为内核上的缓冲区较复杂,所以本文主要介绍C语言的缓冲区。 目录 1.为什么要有缓冲区 2.应用层缓冲区的默认刷新策略 …

如何在bud里弄3d模型?---模大狮模型网

随着数字化设计的不断发展,越来越多的设计软件提供了对3D模型的支持,为设计师们带来了更广阔的创作空间。Bud作为一款功能强大的设计工具,也提供了添加和编辑3D模型的功能,让用户能够更加灵活地进行设计创作。本文将为您详细介绍如…

Python实战开发及案例分析(16)—— 遗传算法

遗传算法(Genetic Algorithm, GA)是一种模拟自然选择和遗传学原理的搜索启发式算法。它们通常用于解决优化和搜索问题,基于“适者生存”的自然选择概念,通过选择、交叉(杂交)、变异操作在一系列迭代中逐步优…

01-背包

此为本蒟蒻第n次发文,若有错误或不足之处,还请各位牛犇多多指出。 目录 引入 01背包 时间复杂度 O ( n 2 ) O(n^2) O(n2) 空间复杂度 O ( n 2 ) O(n^2) O(n2) 代码 滚动数组优化 空间复杂度 O ( n ) O(n) O(n) 代码 练习与拓展 资源来源与参考 0. 引入 在正式开始讲『01背…

【计算机网络】计算机网络体系结构

🚩本文已收录至专栏:计算机网络学习之旅 一.常见的三种结构 (1) OSI参考模型 为了使不同体系结构的计算机网络都能互连起来,国际标准化组织于1977年成立了专门机构研究该问题,提出了著名的开放系统互连基本参考模型&#xff0c…

pycharm 将项目连同库一起打包及虚拟环境的使用

目录 一、创建虚拟环境 1、用 anaconda 创建 2、Pycharm 直接创建 二、虚拟环境安装第三方库 1、创建项目后,启动终端(Alt F12),或者点击下方标记处。 2、使用 pip 或者 conda 来进行三方库的安装或卸载 3、将项目中的库放入文档,便于…

李宏毅-注意力机制详解

原视频链接:attention 一. 基本问题分析 1. 模型的input 无论是预测视频观看人数还是图像处理,输入都可以看作是一个向量,输出是一个数值或类别。然而,若输入是一系列向量,长度可能会不同,例如把句子里的…

Spring STOMP-消息处理流程

一旦STOMP的接口被公布,Spring应用程序就成为连接客户端的STOMP代理。本节描述服务端消息处理的流程。 spring-messaging模块包含消息类应用的基础功能,这些功能起源于Spring Integration项目。并且,后来被提取整合到Spring框架,…

LeetCode - 0001 两数之和

题目地址:https://leetcode.cn/problems/two-sum/description/ 我:你好,面试官,我对算法了解的不多,只刷过LeetCode第一题,你不要问的太难了,好,我准备好了。 面试官:啊…

Spring Boot 调用外部接口的几种方式

Spring Boot 调用外部接口的几种方式 在微服务架构中,服务间的调用是不可或缺的环节。Spring Boot 为开发者提供了多种方式来实现这一任务,这个文章将为你详细介绍这些方式。 一、使用RestTemplate RestTemplate是 Spring Boot 早期版本中常用的 REST 客…

十个最适合论文写作的GPTs及其应用

文章目录 一、GPTs让一切皆有可能二、最适合论文写作的GPTs及其应用1、[Paper Search Engine](https://chat.openai.com/g/g-9v5gHG9Bo)2、[Academic Paper Specialist(学术论文撰写专家)](https://chat.openai.com/g/g-jryw3pfsH)3、[Paper Connect 论文…

【八十七】【算法分析与设计】单调栈全新版本,右大于,左小于右小于等于,739. 每日温度,907. 子数组的最小值之和

739. 每日温度(右大于) 给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。 示…

微信公众号接入chatGPT自动回复(2)

微信公众平台 配置自动回复的服务器 application.properties中的配置 验证服务器接口配置 其实就两个接口(相同的url地址,只不过请求方式不一样) 1.验证接口(get请求) 2.自动回复接口(post请求) 完整代码 这个地址就是上面URL配置的地址 如果使用Nginx的话自动配置 将该代…

[原创](Modern C++)现代C++的字符串与Windows API交互的正确方式.

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XX QQ联系: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、D…