RAG组件:Embedding词嵌入模型

一、Embedding词嵌入模型介绍

       前面我们介绍了大模型组件之一的分词器RAG组件之一的向量数据库 ,分词器的作用是将文本信息给数字化,而向量数据库存储的是包含语义信息的向量化数据,那数字化的文本信息是如何转变为向量化的形式的呢?这就涉及到今天要分享的Embedding词嵌入模型了。

       词嵌入模型简单来说就是以数字化后的文本信息为输入,通过预训练模型将其转化为固定维度的向量进行表示;像这样的词嵌入模型不光是在向量化存储时会使用,在送入transformer结构的大模型之前也会使用,不过他们有一点小小的区别,区别在于送入向量数据库的词嵌入模型输出是将一整段文本信息向量化为[1, N]的一维向量,而送入大模型的词嵌入模型输出是将一整段文本信息向量化为[M, N]维度的向量,M为token的数量。

       那又有一个新问题,分词器将文本划分为若干个token,通过词嵌入模型理应会生成对应数量的高维向量矩阵,那送入向量数据库的Embedding词嵌入模型是怎么会输出一维高维向量的呢?其实送入向量数据库的Embedding词嵌入模型就是一个语义特征提取的模型,就相当于transformer模块的Encode部分,众所周知,BERT模型就是从transformer模块的Encode部分演变出来的用于语义特征提取的模型,所以Embedding词嵌入模型有很多都是BERT系列的模型,而BERT模型有一个区别于transformer模块的Encode部分独有的结构,就是在模型的输入tokens中有一个[CLS]token的添加,用于总结、提炼整个文本tokens的语义信息,所以送入向量数据库的一维向量就是[CLS]token经过Embedding词嵌入模型后的输出向量。

二、Embedding词嵌入模型使用

       其实理解了Embedding词嵌入模型的作用,去使用它就是一件很简单的事情;这里通过两个获取Embedding词嵌入模型的途径分享一下模型的部署及调用;

2.1 基于Ollama的Embedding

       这种方式的模型加载及第三方工具的调用如Dify、CherryStudio等在之前的博文中都有提到过,这里就不再过多的去讲如何在Ollama上拉取和部署Embedding模型,只简单的展示一下如何通过python调用的方式调用Ollama上的词嵌入模型;

       通过Ollama官网搜索,会发现有很多Embedding模型,这里我本地部署的是bge-m3这个模型,官方介绍它的三个特点:
多功能:它可以同时执行嵌入模型的三种常见检索功能,密集检索、多向量检索和稀疏检索;
多语言:它可以支持100多种工作语言;
多粒度:它能够处理不同粒度的输入,从短句到长达8192个标记的长文档;

2.1.1 python调用 

       返回结果是[1, 1024]的向量,我们就可以将这个向量存入向量数据库;

import requests

url = "http://localhost:8787/api/embeddings"  # 替换自己本地Ollama的宿主机IP及暴露端口,路由不变
data = {
    "model": "bge-m3:latest",  # 替换为你的模型名称,我这里选择bge-m3
    "prompt": "只要你奔跑,这个世界就会跟着你奔跑,只要你停驻,这个世界就会舍弃你独自奔跑。唯有你确定一个方向,使劲的跑起来,这个世界会为你而让路。"     # 输入需要嵌入的文本
}
response = requests.post(url, json=data)
embedding = response.json()["embedding"]
print(len(embedding))

## 输出
## 1024

2.2 ModelScope上的Embedding

       在模型库里搜索文本向量,也会发现有很多的开源模型,这里我们选择下载量最高的‘nlp_gte_sentence-embedding_chinese-large’模型展示;

2.2.1 python调用

       在ModelScope框架上,提供输入文本(默认最长文本长度为128),即可以通过简单的Pipeline调用来使用GTE文本向量表示模型。ModelScope封装了统一的接口对外提供单句向量表示、双句文本相似度、多候选相似度计算功能,下面是一个官方示例:

from modelscope.models import Model
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks

model_id = "iic/nlp_gte_sentence-embedding_chinese-large"
pipeline_se = pipeline(Tasks.sentence_embedding,
                       model=model_id,
                       sequence_length=512
                       ) # sequence_length 代表最大文本长度,默认值为128
# 当输入包含“soure_sentence”与“sentences_to_compare”时,会输出source_sentence中首个句子与sentences_to_compare中每个句子的向量表示,以及source_sentence中首个句子与sentences_to_compare中每个句子的相似度。
inputs = {
        "source_sentence": ["吃完海鲜可以喝牛奶吗?"],
        "sentences_to_compare": [
            "不可以,早晨喝牛奶不科学",
            "吃了海鲜后是不能再喝牛奶的,因为牛奶中含得有维生素C,如果海鲜喝牛奶一起服用会对人体造成一定的伤害",
            "吃海鲜是不能同时喝牛奶吃水果,这个至少间隔6小时以上才可以。",
            "吃海鲜是不可以吃柠檬的因为其中的维生素C会和海鲜中的矿物质形成砷"
        ]
    }

result = pipeline_se(input=inputs)
print (result)

# 当输入仅含有soure_sentence时,会输出source_sentence中每个句子的向量表示以及首个句子与其他句子的相似度。
inputs2 = {
        "source_sentence": [
            "不可以,早晨喝牛奶不科学",
            "吃了海鲜后是不能再喝牛奶的,因为牛奶中含得有维生素C,如果海鲜喝牛奶一起服用会对人体造成一定的伤害",
            "吃海鲜是不能同时喝牛奶吃水果,这个至少间隔6小时以上才可以。",
            "吃海鲜是不可以吃柠檬的因为其中的维生素C会和海鲜中的矿物质形成砷"
        ]
}
result = pipeline_se(input=inputs2)
print (result)

2.3  从BERT系列预模型中抽取

       上面有提到BERT系列模型的[CLS]token的输出可以作为语义特征向量;下面就以‘bert-base-uncased’模型为例进行抽取;

from transformers import AutoTokenizer, AutoModel
import torch

# 加载分词器和模型
tokenizer = AutoTokenizer.from_pretrained('bert-base-uncased')
model = AutoModel.from_pretrained('bert-base-uncased')

# 输入文本
text = "各奋愚公之愿,即可移山;共怀精卫之心,不难填海。人生须奋斗,失败是成功之母,奋斗乃万物之父。成功之花总是扎根于奋斗的土壤。"

# 分词并转换为模型输入格式
inputs = tokenizer(text, return_tensors="pt")

# 获取模型输出
with torch.no_grad():
    outputs = model(**inputs)

# 提取最后一层的 [CLS] 向量作为句子 embedding
cls_embedding = outputs.last_hidden_state[:, 0, :].numpy()
print("CLS Token Embedding:", cls_embedding)

三、总结 

       理解了Embedding词嵌入模型,我们可以通过各种方式调用、抽取语义向量,并且利用获取到的向量信息进行相似度计算、进行进一步的self-attention运算等等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值