向量化
TextEmbedding
类功能
功能描述
本地使用transformers启动模型,提供文本至向量的embedding功能。需要使用transformers支持的BertModel类模型权重。类继承实现了langchain_core.embeddings.Embeddings接口。当前支持的模型:BAAI/bge-large-zh-v1.5,aspire/acge_text_embedding。
Note
配置的模型如果不是safetensors权重格式,请先将模型权重转换为safetensors格式后再使用,防止使用ckpt、bin等不安全的模型权重格式引入安全问题。
函数原型
from mx_rag.embedding.local import TextEmbedding
TextEmbedding(model_path, dev_id, use_fp16, pooling_method, lock)
输入参数说明
| 参数名 |
数据类型 |
可选/必选 |
说明 |
| model_path |
str |
必选 |
模型权重文件目录,路径长度不能超过1024,不能为软链接和相对路径。目录下的各文件大小不能超过10GB、深度不超过64,且文件总个数不超过512。运行用户的属组,以及非运行用户不能有该目录下文件的写权限。目录下的文件以及文件的上一级目录的属组必须是运行用户。存放路径不能在路径列表中:["/etc", "/usr/bin", "/usr/lib", "/usr/lib64", "/sys/", "/dev/", "/sbin", "/tmp"]。 |
| dev_id |
int |
可选 |
模型运行NPU ID,通过npu-smi info查询可用ID,取值范围[0, 63],默认为卡0。 |
| use_fp16 |
bool |
可选 |
是否将模型转换为半精度,默认为True。 |
| pooling_method |
str |
可选 |
选择处理last_hidden_state的方式,取值范围['cls', 'mean', 'max', 'lasttoken'],默认'cls'。 |
| lock |
multiprocessing.synchronize.Lock或_thread.LockType |
可选 |
local model不支持多线程或者多进程进行处理,如果用户需要多进程或者多线程调用此接口需要申请锁。默认值为None。可选值:None:表示不使用锁,此时该接口不支持并发。multiprocessing.Lock():表示进程锁,此时该接口支持多进程调用。threading.Lock():表示线程锁。此时该接口支持多线程调用。 |
不启用推理加速调用示例
from paddle.base import libpaddle
from mx_rag.embedding.local import TextEmbedding
embed = TextEmbedding.create(model_path="/path/to/model", dev_id=1)
print(embed.embed_documents(['abc', 'bcd']))
print(embed.embed_query('abc'))
开启推理加速调用示例
import os
from paddle.base import libpaddle
import torch_npu
from modeling_bert_adapter import enable_bert_speed
os.environ["ENABLE_BOOST"] = "True"
from mx_rag.embedding.local import TextEmbedding
device_id = 1
torch_npu.npu.set_device(f"npu:{device_id}")
embed = TextEmbedding.create(model_path="/path/to/model", dev_id=device_id )
print(embed.embed_documents(['abc', 'bcd']))
print(embed.embed_query('abc'))
多线程调用示例(其余嵌入模型均可参考该示例)
from paddle.base import libpaddle
import threading
from mx_rag.embedding.local import TextEmbedding
def infer(k, embed):
print(f"thread_{k}")
print(embed.embed_query('abc'))
print(embed.embed_documents(['abc', 'bcd']))
if __name__ == '__main__':
worker_nums=2
threads = []
embed = TextEmbedding.create(model_path='/path/to/model', dev_id=1, pooling_method='cls', lock=threading.Lock())
for i in range(worker_nums):
thread = threading.Thread(target=infer, args=(i,embed,))
threads.append(thread)
thread.start()
for thread in threads:
thread.join()
create
功能描述
创建并返回一个TextEmbedding对象。
函数原型
@staticmethod
def create(**kwargs)
输入参数说明
| 参数名 |
数据类型 |
可选/必选 |
说明 |
| kwargs |
dict |
必选 |
关键字参数,参考类功能的入参,必选参数必须传入,否则将抛出KeyError。 |
返回值说明
| 数据类型 |
说明 |
| TextEmbedding |
TextEmbedding对象。 |
embed_documents
功能描述
使用模型将用户提供的文本转换至向量。
函数原型
def embed_documents(texts, batch_size)
输入参数说明
| 参数名 |
数据类型 |
可选/必选 |
说明 |
| texts |
List[str] |
必选 |
文本列表,列表长度取值[1,1000 * 1000],字符串长度范围[1, 128 * 1024 * 1024]。 |
| batch_size |
int |
可选 |
组batch的大小,每次会组合batch_size的texts进行embed操作,取值范围:[1, 1024],默认值为32。可配置的值由设备显存决定。 |
返回值说明
| 数据类型 |
说明 |
| List[List[float]] |
texts转换后的向量数组。如果texts为长度是4的数组,embedding模型的输出是1024维向量,最终的输出结果为(4,1024)大小的数组。 |
embed_query
功能描述
使用模型将用户提供的文本转换至向量。
函数原型
def embed_query(text)
输入参数说明
| 参数名 |
数据类型 |
是否必选 |
说明 |
| text |
str |
必选 |
待向量化的文本,文本长度范围:[1, 128 * 1024 * 1024]。 |
返回值说明
| 数据类型 |
说明 |
| List[float] |
text转换后的向量。如果embedding模型的输出是1024维向量,最终的输出结果为(1,1024)大小的数组。 |
SparseEmbedding
类功能
功能描述
本地使用transformers启动模型,提供文本至向量的sparse embedding功能。需要使用transformers支持的BertModel类模型权重。类继承实现了langchain_core.embeddings.Embeddings接口。当前支持的模型:BAAI/bge-m3。
Note
配置的模型如果不是safetensors权重格式,请先将模型权重转换为safetensors格式后再使用,防止使用ckpt、bin等不安全的模型权重格式引入安全问题。
函数原型
from mx_rag.embedding.local import SparseEmbedding
SparseEmbedding(model_path, dev_id, use_fp16)
输入参数说明
| 参数名 |
数据类型 |
可选/必选 |
说明 |
| model_path |
str |
必选 |
模型权重文件目录,路径长度不能超过1024,不能为软链接和相对路径。目录下的各文件大小不能超过10GB、深度不超过64,且文件总个数不超过512。运行用户的属组,以及非运行用户不能有该目录下文件的写权限。目录下的文件以及文件的上一级目录的属组必须是运行用户。存放路径不能在路径列表中:["/etc", "/usr/bin", "/usr/lib", "/usr/lib64", "/sys/", "/dev/", "/sbin", "/tmp"]。 |
| dev_id |
int |
可选 |
模型运行NPU ID,通过npu-smi info查询可用ID,取值范围[0, 63],默认为卡0。 |
| use_fp16 |
bool |
可选 |
是否将模型转换为半精度,默认为True。 |
调用示例
from paddle.base import libpaddle
from mx_rag.embedding.local import SparseEmbedding
embed = SparseEmbedding.create(model_path="/path/to/model", dev_id=1)
print(embed.embed_documents(['abc', 'bcd']))
print(embed.embed_query('abc'))
create
功能描述
创建并返回一个TextEmbedding对象。
函数原型
@staticmethod
def create(**kwargs)
输入参数说明
| 参数名 |
数据类型 |
可选/必选 |
说明 |
| kwargs |
dict |
必选 |
关键字参数,参考类功能的入参,必选参数必须传入,否则将抛出KeyError。 |
返回值说明
| 数据类型 |
说明 |
| SparseEmbedding |
SparseEmbedding对象。 |
embed_documents
功能描述
使用模型将用户提供的文本转换至向量。
函数原型
def embed_documents(texts, batch_size)
输入参数说明
| 参数名 |
数据类型 |
可选/必选 |
说明 |
| texts |
List[str] |
必选 |
文本列表,列表长度取值[1,1000 * 1000],字符串长度范围[1, 128 * 1024 * 1024]。 |
| batch_size |
int |
可选 |
组batch的大小,每次会组合batch_size的texts进行embed操作,取值范围:[1, 1024],默认值为32。可配置的值由设备显存决定。 |
返回值说明
| 数据类型 |
说明 |
| List[Dict[int, float]] |
texts转换后的向量数组。如果texts为长度是4的数组,embedding模型的输出是key为token_id,value为token_weights的字典,最终的输出结果为4维的数组,每个元素为一组字典。 |
embed_query
功能描述
使用模型将用户提供的文本转换至向量。
函数原型
def embed_query(text)
输入参数说明
| 参数名 |
数据类型 |
是否必选 |
说明 |
| text |
str |
必选 |
待向量化的文本,文本长度范围:[1, 128 * 1024 * 1024]。 |
返回值说明
| 数据类型 |
说明 |
| Dict[int, float] |
text转换后的稀疏向量。 |
TEIEmbedding
类功能
功能描述
连接TEI服务,提供文本至向量的embedding功能。类继承实现了langchain_core.embeddings.Embeddings接口。
函数原型
from mx_rag.embedding.service import TEIEmbedding
TEIEmbedding(url, client_param, embed_mode)
输入参数说明
| 参数名 |
数据类型 |
可选/必选 |
说明 |
| url |
str |
必选 |
TEI embed服务地址,字符串长度范围[1, 128]。支持"/v1/embed"、"/v1/embeddings"、"/embed_sparse"接口。 当前基于TEI框架创建的embed服务不支持https协议,为安全起见可通过搭建一个nginx服务,让该服务与embed服务处于一个可信网络。使用时客户端以https方式访问nginx,nginx转发请求到embed服务。 |
| client_param |
ClientParam |
可选 |
https客户端配置参数,默认值为ClientParam(),具体描述请参见ClientParam。 |
| embed_mode |
str |
可选 |
与TEI服务提供的向量化类型对应,默认为"dense",值只能为"sparse"或"dense","sparse"表示稀疏向量化,"dense"表示稠密向量化,该参数当前已弃用。 |
返回值说明
TEIEmbedding对象。
调用示例
from paddle.base import libpaddle
from mx_rag.embedding.service import TEIEmbedding
from mx_rag.utils import ClientParam
tei_embed = TEIEmbedding.create(url="https://ip:port/embed",
client_param=ClientParam(ca_file="/path/to/ca.crt"))
print(tei_embed.embed_documents(['abc', 'bcd']))
print(tei_embed.embed_query('abc'))
create
功能描述
创建并返回一个TEIEmbedding对象。
函数原型
@staticmethod
def create(**kwargs)
输入参数说明
| 参数名 |
数据类型 |
可选/必选 |
说明 |
| kwargs |
dict |
必选 |
关键字参数,参考类功能的入参,必选参数必须传入,否则将抛出KeyError。 |
返回值说明
| 数据类型 |
说明 |
| TEIEmbedding |
TEIEmbedding对象。 |
embed_documents
功能描述
调用TEI服务,将用户提供的文本列表转换至向量。
函数原型
def embed_documents(texts, batch_size)
输入参数说明
| 参数名 |
数据类型 |
可选/必选 |
说明 |
| texts |
List[str] |
必选 |
文本列表,列表长度取值(0,1000 * 1000],字符串长度范围:[1, 128 * 1024 * 1024]。 |
| batch_size |
int |
可选 |
组batch的大小,每次会组合batch_size的texts进行embed操作,取值范围:[1, 1024],默认值为32。 |
返回值说明
| 数据类型 |
说明 |
| List[List[float]] |
texts转换后的向量数组。如果texts为长度是4的数组,embedding模型的输出是1024维向量,最终的输出结果为(4,1024)大小的数组。 |
embed_query
功能描述
调用TEI服务,将用户提供的文本转换至向量。
函数原型
def embed_query(text)
输入参数说明
| 参数名 |
数据类型 |
是否必选 |
说明 |
| text |
str |
必选 |
待向量化文本,长度范围:[1, 128 * 1024 * 1024]。 |
返回值说明
| 数据类型 |
说明 |
| List[float] |
text转换后的向量数组。如果embedding模型的输出是1024维向量,最终的输出结果为(1,1024)大小的数组。 |
CLIPEmbedding
类功能
功能描述
连接CLIP服务,提供文本或图片至向量的embedding功能。类继承实现了langchain_core.embeddings.Embeddings接口。
函数原型
from mx_rag.embedding.service import CLIPEmbedding
CLIPEmbedding(url, client_param)
输入参数说明
| 参数名 |
数据类型 |
可选/必选 |
说明 |
| url |
str |
必选 |
CLIP embedding服务地址,url字符串长度不能超过128。 |
| client_param |
ClientParam |
可选 |
https客户端配置参数,默认值为ClientParam(),具体描述请参见ClientParam。 |
返回值说明
CLIPEmbedding对象。
调用示例
from paddle.base import libpaddle
from mx_rag.embedding.service import CLIPEmbedding
from mx_rag.utils import ClientParam
clip_embed = CLIPEmbedding.create(url="https://ip:port/encode",
client_param=ClientParam(ca_file="/path/to/ca.crt"))
print(clip_embed.embed_documents(['abc', 'bcd']))
print(clip_embed.embed_query('abc'))
create
功能描述
创建并返回一个CLIPEmbedding对象。
函数原型
@staticmethod
def create(**kwargs)
输入参数说明
| 参数名 |
数据类型 |
可选/必选 |
说明 |
| kwargs |
dict |
必选 |
关键字参数,参考类功能的入参,必选参数必须传入,否则将抛出KeyError。 |
返回值说明
| 数据类型 |
说明 |
| CLIPEmbedding |
CLIPEmbedding对象。 |
embed_documents
功能描述
调用CLIP服务,将用户提供的文本列表转换至向量。
函数原型
def embed_documents(texts, batch_size)
输入参数说明
| 参数名 |
数据类型 |
可选/必选 |
说明 |
| texts |
List[str] |
必选 |
文本列表,列表长度取值(0,1000 * 1000],字符串长度范围:[1, 128 * 1024 * 1024]。 |
| batch_size |
int |
可选 |
组batch的大小,每次会组合batch_size的texts进行embed操作,取值范围:[1, 1024],默认值为32。 |
返回值说明
| 数据类型 |
说明 |
| List[List[float]] |
texts转换后的向量数组。如果texts为长度是4的数组,embedding模型的输出是512维向量,最终的输出结果为(4,512)大小的数组。 |
embed_images
功能描述
调用CLIP服务,将用户提供的图像列表转换至向量。
函数原型
def embed_images(images, batch_size)
输入参数说明
| 参数名 |
数据类型 |
可选/必选 |
说明 |
| images |
List[str] |
必选 |
图片列表,列表长度取值[1,1000],字符串长度范围:[1, 10 * 1024 * 1024]。每个图片为一个使用base64编码后的字符串。 |
| batch_size |
int |
可选 |
组batch的大小,每次会组合batch_size的texts进行embed操作,取值范围:[1, 1024],默认值为32。如果batch_size太大,可能导致服务器返回500错误,此时需要调小batch_size。 |
返回值说明
| 数据类型 |
说明 |
| List[List[float]] |
images转换后的向量数组。如果images为长度是4的数组,embedding模型的输出是512维向量,最终的输出结果为(4,512)大小的数组。 |
embed_query
功能描述
调用CLIP服务,将用户提供的文本转换至向量。
函数原型
def embed_query(text)
输入参数说明
| 参数名 |
数据类型 |
是否必选 |
说明 |
| text |
str |
必选 |
待向量化文本,长度范围:[1, 128 * 1024 * 1024]。 |
返回值说明
| 数据类型 |
说明 |
| List[float] |
text转换后的向量数组。如果embedding模型的输出是512维向量,最终的输出结果为大小为512的浮点数列表。 |
ImageEmbedding
类功能
功能描述
本地使用cn_clip启动模型,提供将图片和文本的embedding功能。ImageEmbedding类继承实现了langchain_core.embeddings.Embeddings接口。
Note
cn_clip采用torch.load加载权重文件,请确保权重文件安全可信,防止加载权重时引入命令注入等安全问题。
函数原型
from mx_rag.embedding.local import ImageEmbedding
ImageEmbedding(model_name, model_path, dev_id)
输入参数说明
| 参数名 |
数据类型 |
可选/必选 |
说明 |
| model_name |
str |
必选 |
模型名称,必须为['ViT-B-16', 'ViT-L-14', 'ViT-L-14-336', 'ViT-H-14', 'RN50']其中之一。对应模型下载链接参见网页说明。 |
| model_path |
str |
必选 |
模型权重文件目录,路径长度不能超过1024,不能为软链接和相对路径。目录下的各文件大小不能超过10GB、深度不超过64,且文件总个数不超过512。运行用户的属组,以及非运行用户不能有该目录下文件的写权限。目录下的文件以及文件的上一级目录的属组必须是运行用户。 存放路径不能在路径列表中:["/etc", "/usr/bin", "/usr/lib", "/usr/lib64", "/sys/", "/dev/", "/sbin", "/tmp"]。 |
| dev_id |
int |
可选 |
模型运行的NPU卡ID,取值范围[0, 63],默认为0。 |
返回值说明
ImageEmbedding对象。
调用示例
import sys
from paddle.base import libpaddle
from mx_rag.document.loader import ImageLoader
from mx_rag.embedding.local import ImageEmbedding
embed = ImageEmbedding.create(model_name="ViT-B-16", model_path="/data/chinese-clip-vit-base-patch16")
print(embed.embed_documents(['abc', 'bcd']))
print(embed.embed_query('abc'))
loader = ImageLoader("image path")
docs = loader.load()
if len(docs) < 1:
print("load image failed")
sys.exit(1)
print(embed.embed_images([docs[0].page_content]))
create
功能描述
创建并返回一个ImageEmbedding对象。
函数原型
@staticmethod
def create(**kwargs)
输入参数说明
| 参数名 |
数据类型 |
可选/必选 |
说明 |
| kwargs |
dict |
必选 |
关键字参数,参考类功能的入参,必选参数必须传入,否则将抛出KeyError。 |
返回值说明
| 数据类型 |
说明 |
| ImageEmbedding |
ImageEmbedding对象。 |
embed_documents
功能描述
将文本列表进行向量化。
函数原型
def embed_documents(texts, batch_size)
输入参数说明
| 参数名 |
数据类型 |
可选/必选 |
说明 |
| texts |
List[str] |
必选 |
文本列表,列表长度取值[1, 1000*1000],列表中每个文本长度取值[1, 256]。 |
| batch_size |
int |
可选 |
组batch大小,每次会组合batch_size的texts进行embed操作,取值范围:[1, 1024],默认值为32。可配置的值由设备显存决定。 |
返回值说明
| 数据类型 |
说明 |
| List[List[float]] |
texts转换后的向量数组。如果texts为长度是4的数组,embedding模型的输出是512维向量,最终的输出结果为(4,512)大小的数组 |
embed_query
功能描述
将单个文本进行向量化。
函数原型
def embed_query(text)
输入参数说明
| 参数名 |
数据类型 |
是否必选 |
说明 |
| text |
str |
必选 |
文本长度取值范围为:[1, 256]。 |
返回值说明
| 数据类型 |
说明 |
| List[float] |
text转换后的向量。如果embedding模型的输出是512维向量,最终的输出结果为大小为512的浮点数列表。 |
embed_images
功能描述
将给定的图片进行向量化。
函数原型
def embed_images(images, batch_size)
输入参数说明
| 参数名 |
数据类型 |
可选/必选 |
说明 |
| images |
Union[List[str], List[Image.Image]] |
必选 |
入参类型为List[str]时,列表中每个元素为图片base64编码后对应的字符串,列表总长度取值范围为[1, 1000],每个元素长度取值范围为[1, 10 * 1024 * 1024];入参类型为List[Image.Image]时,表示输入的数据类型为PIL.Image.Image。 |
| batch_size |
int |
可选 |
组batch大小,每次会组合batch_size的images进行embed操作,取值范围:[1, 1024],默认值为32。可配置的值由设备显存决定。 |
返回值说明
| 数据类型 |
说明 |
| List[List[float]] |
images转换后的向量数组。如果images为长度是4的数组,embedding模型的输出是512维向量,最终的输出结果为(4,512)大小的数组。 |
EmbeddingFactory
类功能
功能描述
embedding的工厂方法类,用于生产RAG SDK的embedding。
函数原型
from mx_rag.embedding import EmbeddingFactory
class EmbeddingFactory(ABC)
调用示例
from paddle.base import libpaddle
from mx_rag.embedding import EmbeddingFactory
from mx_rag.utils import ClientParam
txt_embed = EmbeddingFactory.create_embedding(embedding_type="local_text_embedding",
model_path="path to model", dev_id=0)
print(txt_embed.embed_query("abc"))
tei_embed = EmbeddingFactory.create_embedding(embedding_type="tei_embedding",
url="https://ip:port/embed",
client_param=ClientParam(ca_file="/path/to/ca.crt"))
print(tei_embed.embed_query("abc"))
img_embed = EmbeddingFactory.create_embedding(embedding_type="local_images_embedding", model_name="model_name",
model_path="path to model", dev_id=0)
print(img_embed.embed_query("abc"))
create_embedding
功能描述
构造embedding实例。会调用TextEmbedding、ImageEmbedding和TEIEmbedding类的静态方法create创建类实例。
函数原型
@classmethod
def create_embedding(**kwargs):
输入参数说明
| 参数名 |
数据类型 |
可选/必选 |
说明 |
| embedding_type |
str |
必选 |
该参数在kwargs中,用于指定生成的embedding类型。通过关键字参数传递。 可取值:local_text_embeddinglocal_images_embeddingtei_embedding |
| **kwargs |
Any |
可选 |
除去embedding_type,其余参数为embedding的构造参数。调用对应类的静态方法create返回实例。如果是local_text_embedding,请参见类功能。如果是local_images_embedding,请参见类功能。如果是tei_embedding,请参见类功能。 |
返回值说明
| 数据类型 |
说明 |
| langchain_core.embeddings.Embeddings |
返回Embeddings实例对象。 |