使用有道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 np

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


if __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上使用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

可视化日记——极坐标绘制雷达图

目录 一、创建极坐标 二、数据集准备 三、划分角度 四、指定半径 五、绘制 一、创建极坐标 Python中没有直接画雷达图的函数&#xff0c;若要绘制需要先创建画布和极坐标轴域&#xff0c;再设定角度与半径的参数&#xff08;极坐标中角度与半径确定一个点的位置&#xff…

反射机制的知识

1.反射机制 静态语言&#xff1a;JAVA 和C 反射&#xff1a;可以借助于反射API可以获取任何类的内部信息&#xff0c;并可以直接操作任意对象的内部属性、方法、泛型等。 实现获得Class类的方法有哪些&#xff1a; 类名.classClass.forName("类的绝对路径")对象.ge…

Python爬虫基础教程:爬虫采集数据要注意什么?|电商数据商品详情页API接口

数字化时代&#xff0c;大数据信息的收集和应用逐步普及&#xff0c;离不开网络爬虫的广泛应用。由于数据和信息市场的不断扩大&#xff0c;需要大规模的网络爬虫来应对大规模的数据信息采集。在此过程中需要注意哪些问题&#xff1f; 1、先检查是否有API&#xff0c;API是网站…

Women of Polkadot:波卡生态的女性社群与创新力量

在 Web3 行业里&#xff0c;女性似乎总是被忽视的群体。线下峰会的合照一眼望去尽是西装革履的男性成员&#xff0c;项目和机构高管的名单里也似乎难以寻觅到女性领导者的身影。在这个强调技术、编程、极客精神的行业里&#xff0c;女性身份的缺席看起来如此天生自然。 根据 B…

人工智能基础部分25-一篇文章将透注意力机制(Attention)与自注意力机制(self-Attention),帮助大家加深印象

大家好&#xff0c;我是微学AI&#xff0c;今天给大介绍一下人工智能基础部分25-一篇文章将透注意力机制(Attention)与自注意力机制(self-Attention),帮助大家加深印象。注意力机制(Attention)与自注意力机制(self-Attention)都是在深度学习模型中用于提升模型性能的技术&#…

C 多维数组

C 语言支持多维数组。多维数组声明的一般形式如下&#xff1a; type name[size1][size2]...[sizeN];例如&#xff0c;下面的声明创建了一个三维 5 . 10 . 4 整型数组&#xff1a; int threedim[5][10][4];二维数组 多维数组最简单的形式是二维数组。一个二维数组&#xff0c…

测试开发面试题总结(全)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 某基金管理公司线下测试开发面试题总结。 测开题目如下 可以尝试自己先写&#xff0c;写完之后…

【Linux】实现进度条小程序

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. 前言2. 回车和换行3. 缓冲区4. 进度条4.1 倒计时设置4.2 进度条4.2.1 实现简单进度条4.2.2 进度条完善 5. 附进度条代码5.1 Processbar.h5.2 Processbar.c5.3 Main.c5.4 Makefile 1. 前言 在之前已经了解了 【Lin…

GDK-你的跳广告神器(某足兆足兆替品)

GKD&#xff08;又称搞快点&#xff09;是一款免费开源简洁多规则的自动跳过广告的软件。简而言之&#xff0c;基于预设的定时更新订阅规则快照功能&#xff0c;实现识别并自动点击跳过任何开屏广告及点击关闭应用内部任何弹窗广告&#xff0c;如关闭某些APP开屏和内含推荐广告…

数据库关系代数运算:期末+复试

文章目录 一、知识概览二、并三、差四、交五、笛卡尔积六、投影七、选择八、连接九、除实战训练 一、知识概览 二、并 三、差 四、交 五、笛卡尔积 六、投影 投影是对列 七、选择 选择是对行 八、连接 自然连接是一种特殊的等值连接&#xff0c;他要求两个关系表中进行连…

自制颜色调试网站(渐变色调试,桌面选色)

一、页面展示 二、网站 缓若江海凝清光

【Linux】进程控制 -- 详解

一、进程创建 目前学习到的进程创建的两种方式&#xff1a; 命令行启动命令&#xff08;程序、指令等&#xff09; 。通过程序自身&#xff0c;调用 fork 函数创建出子进程。 1、fork 函数初识 在 Linux 中的系统接口 fork 函数是非常重要的函数&#xff0c;它从已存在进程中…

JavaEE 初阶篇-深入了解操作系统中的进程与 PCB

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 关于计算机是如何进行工作的 “常识” 1.1 关于寄存器、缓存与内存是如何配合 CPU “工作” 2.0 操作系统概述 2.1 操作系统内核 2.2 进程 2.3 PCB 2.3.1 PCB 属性…

Grok-1开源革新:探索人工智能的新境界

Grok-1开源革新&#xff1a;探索人工智能的新境界 在科技发展的马拉松中&#xff0c;Elon Musk旗下的xAI公司稳步前进&#xff0c;推出了名为Grok-1的语言模型。这个巨型模型&#xff0c;作为目前参数量最大的开源人工智能语言模型&#xff0c;赋予了机器学习领域全新的活力。 …

Swift 从获取所有 NSObject 对象聊起:ObjC、汇编语言以及底层方法调用链(二)

概览 我们在第一篇博文: 《Swift 从获取所有 NSObject 对象聊起:ObjC、汇编语言以及底层方法调用链(一)》中讨论了 Swift 语言中的钩子(Hook)机制,以及如何用它来“勾”住 NSObject 的 init 构造器方法。 不过,目前“疑云重重”的实现显然“虐”的你在一直“怀疑人生”…

信雅纳400/800G网络测试仪之 CDF/ Extended Payload 功能:完全用户自定义的协议报文支持/可编程的协议内容支持

Note# 2024-3-21 今天被一个做芯片测试的客户追着问&#xff0c;应该合作在测试仪上做完全自定义的报文&#xff0c;添加自己的私有协议进去&#xff0c;他觉得每次都导入报头太麻烦了&#xff0c;然后就看了下Application Note关于CDF功能的描述&#xff0c;照着机翻的版本来…

回归学术圈,何恺明MIT第一堂AI课

大家好&#xff0c;3月7日&#xff0c;麻省理工学院电气工程与计算机科学系副教授何恺明&#xff0c;迈上讲台&#xff0c;并成功地进行了他人生中的首堂教学课程。 第一堂课 课程官网&#xff1a;https://advances-in-vision.github.io/ 作为麻省理工学院&#xff08;MIT&am…

处理器方法的返回值--返回对象Object

处理器方法也可以返回Object对象。这个Object可以是Integer&#xff0c;String&#xff0c;自定义对象&#xff0c; Map&#xff0c;List 等。但返回的对象不是作为逻辑视图出现的&#xff0c;而是作为直接在页面显示的数据出现的。 返回对象&#xff0c;需要使用ResponseBody注…

【前端工程化】TypeScript概念及使用

前端工程化&#xff08;2&#xff09;- TS 文章目录 前端工程化&#xff08;2&#xff09;- TSTS概念TS声明变量方式TS的类访问修饰符静态属性抽象类 TS的数据类型tuple元祖enum枚举anyvoidnever enum枚举使用例子反向映射枚举和常量枚举&#xff08;const枚举&#xff09;的区…

一文读懂融资融券交易技巧!在上海开融资融券账户交易利率一般是多少?

融资融券交易技巧包括以下几点&#xff1a; 熟悉股票市场&#xff1a;了解市场走势、公司基本面等信息&#xff0c;根据趋势选择合适的股票进行交易。 做好风险管理&#xff1a;对买卖的风险进行合理评估&#xff0c;设定止损价位&#xff0c;防止损失过大。 控制杠杆比例&am…