使用有道bce-embedding-vase-v1模型构建知识向量库并进行相似度搜索

国产embedding

       最开始使用LangChain结合通义千问API实现了基础的RAG(Retrieval-Augmented Generation)过程,当时认为embedding模型似乎是LangChain的一部分,然后又通过学习OpenAI的API发现,其实使用embedding模型不需要一定捆绑在LangChain上,可以作为一个独立的API来使用,因此在尝试实现了OpenAI的embedding模型之后,将当初结合LangChain使用的国产的有道的embedding模型来进行一下向单独的知识向量库的生成。


文章目录

  • 国产embedding
  • 1.环境安装
  • 2.模型下载
  • 3.生成词向量
  • 4.保存知识向量库
  • 5.相似文本搜索
  • 6.与text-embedding-3-small的对比
  • 结束

       如果你对embedding还不太了解可以先看一下下面的前置文章,里面会有embedding概念的基础讲解。
前置文章: 使用 OpenAI 的 Embedding模型 构建知识向量库并进行相似搜索

1.环境安装


首先给出有道的BCEmbedding模型的GitHub官网

有道embedding:https://github.com/netease-youdao/BCEmbedding
接下来按照官方的操作先安装一下环境
在这里插入图片描述

       首先创建一个Anaconda虚拟环境叫bce然后启动这个环境,如果是新手不了解Anaconda和虚拟环境安装和使用的话的可以看下面的文章
|Anaconda安装| Anaconda、pycharm安装及配置Python环境详细教程(学弟提供)
在这里插入图片描述

conda create --name bce python=3.10 -y
conda activate bce

然后安装BCEmbedding库

       执行这个命令的时候会自动安装一个CPU版本的pytorch,如果想用GPU,需要重新安装一个GPU版本的pytorch将原来的版本覆盖掉,GPU版本的使用会后续在这篇文章下进行更新。

在这里插入图片描述

pip install BCEmbedding==0.1.3

2.模型下载


​ 下载的话需要有Huggingface的账号,然后同意相关使用协议才能下载,网址如下。

​ 网址:https://huggingface.co/maidalun1020
在这里插入图片描述
下载完成之后的文件夹内容如下。

在这里插入图片描述

3.生成词向量


       官网代码如下,这里对比OpenAi的embedding模型,它可以批量输入文本,然后返回一个embedding向量的数组,而OpenAI的embedding模型的官方例子中,是让我使用列表生成式,一个文本生成一次.

在这里插入图片描述
       代码中输入embedding模型的路径的部分,最好先写绝对路径,有时候写相对路径之后读取不到,会默认进入下载模型,然后进入下载模式之后他又会提示你没有下载权限,因为我们的模型是在网页上经过授权之后下载的,在代码里怎么申请授权不知道,这可能是个小坑

from BCEmbedding import EmbeddingModel
import numpy as np# 读取txt文档,句子列表
f = open("test.txt", 'r', encoding='utf-8')
doc = f.read().splitlines()# 初始化embedding模型
from BCEmbedding import EmbeddingModel
import numpy as np# list of sentences
sentences = ['sentence_0', 'sentence_1']# init embedding model
model = EmbeddingModel(model_name_or_path=r"bce-embedding-vase_v1", device='cpu')embeddings = model.encode(sentences)

打印查看一些信息。

# 查看一下当前设备
print(model.device)
# 查看一下embedding模型向量的维度
print(embeddings.shape)
'''
03/21/2024 13:30:38 - [INFO] -BCEmbedding.models.EmbeddingModel->>>    Loading from `bce-embedding-vase_v1`.
03/21/2024 13:30:38 - [INFO] -BCEmbedding.models.EmbeddingModel->>>    Execute device: cpu;	 gpu num: 0;	 use fp16: False;	 embedding pooling type: cls;	 trust remote code: False
Extract embeddings: 100%|██████████| 1/1 [00:00<00:00,  1.14it/s]
cpu
(2, 768)
'''

4.保存知识向量库


       保存知识向量库的流程也很简单,读取文档,然后把一个带有句子列表输进model.encodezh中就可以了,代码如下:

from BCEmbedding import EmbeddingModel
import numpy as np# 读取txt文档,句子列表
f = open("test.txt", 'r', encoding='utf-8')
doc = f.read().splitlines()# 初始化embedding模型
model = EmbeddingModel(model_name_or_path=r"bce-embedding-vase_v1", device='cpu')# 提取词向量
embeddings = model.encode(doc)# 保存生成的向量
np.save("embeddings.npy", embeddings)

打印查看一些信息

# 打印句子列表
print(doc)
# 打印向量维度
print(embeddings.shape)
# 打印向量数据类型
print(type(embeddings))
'''
03/21/2024 13:35:52 - [INFO] -BCEmbedding.models.EmbeddingModel->>>    Loading from `bce-embedding-vase_v1`.
03/21/2024 13:35:52 - [INFO] -BCEmbedding.models.EmbeddingModel->>>    Execute device: cpu;	 gpu num: 0;	 use fp16: False;	 embedding pooling type: cls;	 trust remote code: False
Extract embeddings: 100%|██████████| 1/1 [00:01<00:00,  1.28s/it]
['糖尿病', '高血压', '抑郁症', '阿尔茨海默症', '慢性阻塞性肺疾病(COPD)', '骨折', '哮喘', '乳腺癌', '心肌梗塞', '脑卒中', '化疗', '放射疗法', '心脏搭桥手术', '经皮冠状动脉介入治疗(PCI)', '腹腔镜手术', '物理疗法', '认知行为疗法', '血液透析', '绝育手术', '骨髓移植', 'MRI扫描仪', 'CT扫描仪', '心电图机', '超声波设备', '血糖仪', '血压计', '吸氧机', '呼吸机', '脉搏血氧仪', '自动体外除颤器(AED)', '青霉素', '阿司匹林', '他汀类药物', '阿片类镇痛药', '抗生素', '抗抑郁药', '胰岛素', '利尿剂', '抗凝血药', '抗病毒药', '免疫疗法', '基因编辑', '微创手术', '患者健康记录(PHR)', '电子医疗记录(EMR)', '临床试验', '医疗保健大数据', '精准医疗', '遥感监测', '医疗伦理']
(50, 768)
<class 'numpy.ndarray'>
'''

测试使用的文本文件内容如下,保存为test.txt,默认编码UTF-8,一行一个词

糖尿病
高血压
抑郁症
阿尔茨海默症
慢性阻塞性肺疾病(COPD)
骨折
哮喘
乳腺癌
心肌梗塞
脑卒中
化疗
放射疗法
心脏搭桥手术
经皮冠状动脉介入治疗(PCI)
腹腔镜手术
物理疗法
认知行为疗法
血液透析
绝育手术
骨髓移植
MRI扫描仪
CT扫描仪
心电图机
超声波设备
血糖仪
血压计
吸氧机
呼吸机
脉搏血氧仪
自动体外除颤器(AED)
青霉素
阿司匹林
他汀类药物
阿片类镇痛药
抗生素
抗抑郁药
胰岛素
利尿剂
抗凝血药
抗病毒药
免疫疗法
基因编辑
微创手术
患者健康记录(PHR)
电子医疗记录(EMR)
临床试验
医疗保健大数据
精准医疗
遥感监测
医疗伦理

5.相似文本搜索


       我们使用计算两个文本向量的余弦相似度的方法来计算两个文本含义的相似程度其计算公式如下:


cosine similarity ( A , B ) = A ⋅ B ∥ A ∥ ∥ B ∥ = ∑ i = 1 n A i B i ∑ i = 1 n A i 2 ∑ i = 1 n B i 2 \text{cosine similarity}(\mathbf{A}, \mathbf{B}) = \frac{\mathbf{A} \cdot \mathbf{B}}{\|\mathbf{A}\| \|\mathbf{B}\|} = \frac{\sum_{i=1}^{n}A_iB_i}{\sqrt{\sum_{i=1}^{n}A_i^2} \sqrt{\sum_{i=1}^{n}B_i^2}} cosine similarity(A,B)=A∥∥BAB=i=1nAi2 i=1nBi2 i=1nAiBi


       自己使用numpy广播机制写的一对多余弦相似度计算代码如下,如果是新手的话,只需要知道输入输出是什么就好。

import numpy as npdef cos_similarity(target, embedding):numerator = np.sum(target * embedding, axis=1)denominator = np.sqrt(np.sum(np.square(target)) * np.sum(np.square(embedding),axis=1))return numerator / denominatorif __name__ == '__main__':x = np.array([1, 2])y = np.array([[1, 2], [1, 1]])print(cos_similarity(x, y))# [1.        0.9486833]

搜索代码如下:

from BCEmbedding import EmbeddingModel
import numpy as np# 读取txt文档,句子列表
f = open("test.txt", 'r', encoding='utf-8')
name = f.read().splitlines()# 初始化embedding模型
model = EmbeddingModel(model_name_or_path=r"bce-embedding-vase_v1", device='cpu')# 计算余弦相似度函数
def cos_similarity(target, embedding):numerator = np.sum(target * embedding, axis=1)denominator = np.sqrt(np.sum(np.square(target)) * np.sum(np.square(embedding), axis=1))return numerator / denominator# 加载知识向量库
embeddings = np.load("embeddings.npy")# 获取用户输入
search_text = input("User:")
# 将用户的输入使用embedding模型转换为词向量
search_embedding = model.encode(search_text)# 计算余弦相似度
embedding_similarity = cos_similarity(search_embedding, embeddings)# 由上到下输出相似度
for i in np.argsort(embedding_similarity)[::-1]:print(name[i], embedding_similarity[i])

输入结果如下:这里就不粘全了太多了把前面的结果粘贴出来。

03/21/2024 15:46:08 - [INFO] -BCEmbedding.models.EmbeddingModel->>>    Loading from `bce-embedding-vase_v1`.
03/21/2024 15:46:08 - [INFO] -BCEmbedding.models.EmbeddingModel->>>    Execute device: cpu;	 gpu num: 0;	 use fp16: False;	 embedding pooling type: cls;	 trust remote code: False
User:心脏
Extract embeddings: 100%|██████████| 1/1 [00:00<00:00,  1.22it/s]
心肌梗塞 0.7346949
心脏搭桥手术 0.6819945
呼吸机 0.6626346
心电图机 0.66097486
哮喘 0.59669954
高血压 0.58787584
抑郁症 0.5580719
骨折 0.5393874
脉搏血氧仪 0.5336546
血压计 0.52758914
血液透析 0.5266952

6.与text-embedding-3-small的对比


       在进行了使用相似度搜索之后我发现OpenAI和和有道的embedding模型的结果还是有不少不同,对比之后的结果,结果见仁见智,我只把结果图放出来,不做评价。

我们拟定三个搜索词:呼吸,心脏,医疗,然后每个词分别给出两张图,一张是按招bce-embedding-vase-v1的结果排序,一个是按照text-embeddubg-3-small的结果排序,计算相似度的方式使用的都是余弦相似度。

  • 搜索与呼吸相似的词汇

在这里插入图片描述
在这里插入图片描述

  • 搜索与心脏相似的词汇

在这里插入图片描述

在这里插入图片描述

  • 搜索与医疗相似的词汇

在这里插入图片描述
在这里插入图片描述

结束

之后会尝试考虑实验一下有道的RerankerModel模型,看看能不能输出一些结果,还有就是尝试一下在GPU上使用。

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

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

相关文章

智能农业:农业技术与效益

文章目录 什么是智慧农业&#xff1f;智能农业的好处智能农业技术物联网智能农业解决方案智能农业软件和移动应用程序智能农业的挑战作物监测卫星智能农业解决方案使用卫星数据数据测量历史数据和预测在便携式设备上使用应用程序 智能农业的未来参考 现代技术的发展影响着人类活…

走进jvm之垃圾回收器篇

这里我想首先说明一下&#xff0c;虽然我们经常会拿垃圾回收器来做比较&#xff0c;虽然想挑选一个最好的收集器出来&#xff0c;但是目前也没有说哪一款收集器是完美的&#xff0c;更不存在万能的收集器&#xff0c;我们也只是对收集器选择最适合场景的一个收集器。 那么作者将…

深入解析权限之钥RBAC模型!

在2B系统中设计中&#xff0c;角色基于访问控制&#xff08;RBAC&#xff0c;Role-Based Access Control&#xff09;是最常见的权限管理模型之一。它将权限分配给角色而非个别用户&#xff0c;简化了权限管理的过程。接下来我们一起了解下几种常见的RBAC模型。 1. 标准 RBAC&…

母亲的奶牛(蓝桥杯,acwing每日一题)

题目描述&#xff1a; 农夫约翰有三个容量分别为 A,B,C升的挤奶桶。 最开始桶 A 和桶 B 都是空的&#xff0c;而桶 C 里装满了牛奶。 有时&#xff0c;约翰会将牛奶从一个桶倒到另一个桶中&#xff0c;直到被倒入牛奶的桶满了或者倒出牛奶的桶空了为止。 这一过程中间不能有…

每日学习笔记:C++ STL 的无序容器(unordered_set、unordered_map)

定义 特性 能够快速查找元素 操作函数 负载系数 元素个数 / bucket个数 提供哈希函数 提供等价准则 方法一&#xff1a;重写元素的操作符 方法二&#xff1a;自定义函数对象 提供自定义哈希函数和等价准则例子 例一&#xff1a;传入函数对象 例二&#xff1a;传入lambda 检…

蓝桥杯2023省赛:矩阵总面积|模拟、数学(几何)

题目链接&#xff1a; 0矩形总面积 - 蓝桥云课 (lanqiao.cn) 说明&#xff1a; 参考文章&#xff1a;矩形总面积计算器&#xff1a;计算两个矩形的总面积&#xff0c;包括重叠区域_矩形r1的左下角坐标为x1, yl 、宽度为w1、高度为h1, 矩形r2的左下角坐标为x2,y2、宽-CSDN博客…

移卡 2023 年支付GPV超 2.88 万亿 龙头地位稳固

3月21日&#xff0c;中国领先的基于支付的科技平台——移卡有限公司&#xff08;以下简称“移卡”或“公司”&#xff0c;股份代号&#xff1a;09923.HK&#xff09;发布2023年年度业绩报告。与上年同期相比&#xff0c;移卡2023年收入同比增长15.6%&#xff0c;至人民币39.51亿…

Java代码基础算法练习-求一个三位数的各位平方之和-2024.03.21

任务描述&#xff1a; 输入一个正整数n&#xff08;取值范围&#xff1a;100<n<1000&#xff09;&#xff0c;然后输出每位数字的平方和。 任务要求&#xff1a; 代码示例&#xff1a; package march0317_0331;import java.util.Scanner;public class m240321 {public …

YOLOV5 改进:替换backbone为Swin Transformer

1、前言 本文会将YOLOV5 backbone更换成Swin Transformer 具体为什么这样实现参考上文:YOLOV5 改进:替换backbone(MobileNet为例)-CSDN博客 这里只贴加入的代码 训练结果如下: 2、common文件更改 在common文件中加入下面代码: 这里是swin transformer的实现,参考:…

如何申请免费通配符SSL证书

步骤1&#xff1a;了解免费通配符证书的选项 首先&#xff0c;您需要了解哪些机构或项目提供免费的通配符证书。目前绝大部分CA机构只提供免费的单域名证书&#xff0c;只有少数服务商提供商可以提供免费的通配符证书&#xff0c;比如JoySSL。 免费通配符证书申请地址https://…

GPT2从放弃到入门(二)

引言 本文介绍如何利用GPT2从零训练一个多轮对话聊天机器人&#xff0c;按照本文的思路可以轻松地训练自己的数据。 数据处理 ⚠️ 这是本文的核心部分&#xff0c;其他的内容甚至可以不用看。 本小节阐述多轮对话数据的处理。 数据来自网上的一份开源数据&#xff1a;htt…

Java特性之设计模式【装饰器模式】

一、装饰器模式 概述 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其结构。这种类型的设计模式属于结构型模式&#xff0c;它是作为现有的类的一个包装 装饰器模式通过将对象包装在装饰器类中&#xff0c;以…

C语言牛客网刷题

1.最大公约数和最小公倍数的组合问题 &#xff08;1&#xff09;在调试的过程中涉及到很大的数据&#xff0c;我们我们在定义变量的时候定义为long long类型 &#xff08;2&#xff09;这个里面我们自定义了max2用来求最大公约数&#xff0c;min2用来求最小公倍数 &#xff0…

MYSQL报 - Lock wait timeout exceeded; try restarting transaction

前言 今天在使用数据库编辑数据时&#xff0c;页面突然卡主&#xff0c;退出程序后重新编辑&#xff0c;发现报错&#xff0c;1205 - Lock wait timeout exceeded&#xff1b; try restarting transaction&#xff08;如下图&#xff09;&#xff0c;正巧在和同事开会&#xf…

大屏页面 电子数字 制作

字体包下载地址 链接: https://pan.baidu.com/s/1pjslpT5QQi7-oALDM-uX8g 提取码: zxcv 效果展示 使用前使用后 使用方式 1.解压后将文件夹放入public 2.在公用样式中加入 font-face {font-family: mFont;src: url(../../public/DS-Digital/DS-DIGI-1.ttf); } 3. 在项目…

技术总结: 基于http3的动态网页图片爬虫设计

目录 写在前面第一步: 打开网页第二步: 学会模拟浏览器发送请求第三步: 分析网页结果, 找到爬取内容第四步: 处理动态网页 所有程序 写在前面 作为一名算法工程师, 收集处理数据的能力也是比较重要的. 能够充分利用好互联网的数据资源, 加上优秀的算法能力, 就如虎添翼. 这次就…

关于在CentOS中卸载MySQL

想要卸载MySQL当然要知道自己的MySQL是用那种方法来安装的了&#xff0c;一般来说MySQL的安装方法在市面上有三种 编译安装、YUM安装、RPM安装&#xff0c;下面会介绍到后两种安装的卸载方法 首先查看是否安装MySQL&#xff0c;一般可以看到版本信息就证明安装了 mysql -V 卸载…

【DL经典回顾】激活函数大汇总(四十二)(CosReLU附代码和详细公式)

激活函数大汇总(四十二)(CosReLU附代码和详细公式) 更多激活函数见激活函数大汇总列表 一、引言 欢迎来到我们深入探索神经网络核心组成部分——激活函数的系列博客。在人工智能的世界里,激活函数扮演着不可或缺的角色,它们决定着神经元的输出,并且影响着网络的学习能…

【热门话题】深入浅出:npm常用命令详解与实践

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 标题&#xff1a;深入浅出&#xff1a;npm常用命令详解与实践引言一、npm基本概…

Kubernetes的Namespace使用

在 Kubernetes 中&#xff0c;命名空间提供了一种用于隔离单个集群中的资源组的机制。资源名称在命名空间内必须是唯一的&#xff0c;但不能跨命名空间。基于命名空间的作用域仅适用于命名空间物体 &#xff08;例如部署、服务等&#xff09;而不是集群范围的对象&#xff08;例…