Views
No views yet
2_Dense_{dims}文件夹,dims代表最终的向量维度。2_Dense_256文件夹里存储了把向量维度转换为256维的Linear权重,具体如何使用请看下面的章节1import os
2import torch
3from transformers import AutoModel, AutoTokenizer
4from sentence_transformers import SentenceTransformer
5from sklearn.preprocessing import normalize
6
7# 待编码文本
8texts = ["通用向量编码", "hello world", "支持中英互搜,不建议纯英文场景使用"]
9# 模型目录
10model_dir = "{MODEL_PATH}"
11
12#### 方法1:使用SentenceTransformer
13# !!!!!!!!!!!!!!默认是4096维度,如需其他维度,请自行复制2_Dense_{dims}中的文件到2_Dense文件夹中覆盖!!!!!!!!!!!!!!
14model = SentenceTransformer(model_dir)
15vectors = model.encode(texts, convert_to_numpy=True, normalize_embeddings=True)
16print(vectors.shape)
17print(vectors[:, :4])
18
19#### 方法2:使用transformers库
20# !!!!!!!!!!!!!! 本代码会根据vector_dim值会读取对应的Linear层权重,请按需选择vector_dim !!!!!!!!!!!!!!
21vector_dim = 4096
22model = AutoModel.from_pretrained(model_dir).eval()
23tokenizer = AutoTokenizer.from_pretrained(model_dir)
24vector_linear = torch.nn.Linear(in_features=model.config.hidden_size, out_features=vector_dim)
25vector_linear_dict = {
26 k.replace("linear.", ""): v for k, v in
27 torch.load(os.path.join(model_dir, f"2_Dense_{vector_dim}/pytorch_model.bin")).items()
28}
29vector_linear.load_state_dict(vector_linear_dict)
30with torch.no_grad():
31 input_data = tokenizer(texts, padding="longest", truncation=True, max_length=512, return_tensors="pt")
32 attention_mask = input_data["attention_mask"]
33 last_hidden_state = model(**input_data)[0]
34 last_hidden = last_hidden_state.masked_fill(~attention_mask[..., None].bool(), 0.0)
35 vectors = last_hidden.sum(dim=1) / attention_mask.sum(dim=1)[..., None]
36 vectors = normalize(vector_linear(vectors).cpu().numpy())
37print(vectors.shape)
38print(vectors[:, :4])
39