我正在使用预先训练的LLM来为输入文本生成代表性嵌入.但无论输入文本如何,输出嵌入都是相同的.

代码:

from transformers import pipeline, AutoTokenizer, AutoModel
import numpy as np
PRETRAIN_MODEL = 'mistralai/Mistral-7B-Instruct-v0.2'
tokenizer = AutoTokenizer.from_pretrained(PRETRAIN_MODEL)
model = AutoModel.from_pretrained(PRETRAIN_MODEL)

def generate_embedding(document):
    inputs = tokenizer(document, return_tensors='pt')
    print("Tokenized inputs:", inputs)
    with torch.no_grad():
        outputs = model(**inputs)
    embedding = outputs.last_hidden_state[0, 0, :].numpy()
    print("Generated embedding:", embedding)
    return embedding

text1 = "this is a test"
text2 = "this is another test"
text3 = "there are other tests"

embedding1 = generate_embedding(text1)
embedding2 = generate_embedding(text2)
embedding3 = generate_embedding(text3)

are_equal = np.array_equal(embedding1, embedding2) and np.array_equal(embedding2, embedding3)

if are_equal:
    print("The embeddings are the same.")
else:
    print("The embeddings are not the same.")

打印的 token 不同,但打印的嵌入是相同的.输出:

Tokenized inputs: {'input_ids': tensor([[   1,  456,  349,  264, 1369]]), 'attention_mask': tensor([[1, 1, 1, 1, 1]])}
Generated embedding: [-1.7762679  1.9293272 -2.2413437 ...  2.6379988 -3.104867   4.806004 ]
Tokenized inputs: {'input_ids': tensor([[   1,  456,  349, 1698, 1369]]), 'attention_mask': tensor([[1, 1, 1, 1, 1]])}
Generated embedding: [-1.7762679  1.9293272 -2.2413437 ...  2.6379988 -3.104867   4.806004 ]
Tokenized inputs: {'input_ids': tensor([[   1,  736,  460,  799, 8079]]), 'attention_mask': tensor([[1, 1, 1, 1, 1]])}
Generated embedding: [-1.7762679  1.9293272 -2.2413437 ...  2.6379988 -3.104867   4.806004 ]
The embeddings are the same.

有人知道问题出在哪里吗?谢谢!

推荐答案

你没有将其切成合适的尺寸

outputs.last_hidden_state[0, 0, :].numpy()

问:所有输入中的第0个令牌是多少?

A:句子开头标记(BOS)

问:那么这就是我切片的"嵌入"是BOS令牌吗?

A:试试这个:

from transformers import pipeline, AutoTokenizer, AutoModel
import numpy as np

PRETRAIN_MODEL = 'mistralai/Mistral-7B-Instruct-v0.2'
tokenizer = AutoTokenizer.from_pretrained(PRETRAIN_MODEL)
model = AutoModel.from_pretrained(PRETRAIN_MODEL)

model(**tokenizer("", return_tensors='pt')).last_hidden_state

[输出]:

tensor([[[-1.7763,  1.9293, -2.2413,  ...,  2.6380, -3.1049,  4.8060]]],
       grad_fn=<MulBackward0>)

问:那么,如何从纯解码器模型中获取嵌入?

答:你真的能从纯解码器的模型中获得"嵌入"吗?该模型 for each "回归"的标记输出一个隐藏状态,因此不同的文本获得不同的张量输出大小.

问:那么如何将其变成一个固定大小的载体呢?

答:很可能,

Python相关问答推荐

在Pandas 日历中插入一行

Polars比较了两个预设-有没有方法在第一次不匹配时立即失败

使用SciPy进行曲线匹配未能给出正确的匹配

如何删除索引过go 的lexsort深度可能会影响性能?' &>

海运图:调整行和列标签

更改键盘按钮进入'

删除字符串中第一次出现单词后的所有内容

"使用odbc_connect(raw)连接字符串登录失败;可用于pyodbc"

Pandas—在数据透视表中占总数的百分比

转换为浮点,pandas字符串列,混合千和十进制分隔符

改进大型数据集的框架性能

如何在turtle中不使用write()来绘制填充字母(例如OEG)

如何禁用FastAPI应用程序的Swagger UI autodoc中的application/json?

网格基于1.Y轴与2.x轴显示在matplotlib中

如何创建引用列表并分配值的Systemrame列

Odoo16:模板中使用的docs变量在哪里定义?

如何按row_id/row_number过滤数据帧

Python pint将1/华氏度转换为1/摄氏度°°

使用Scikit的ValueError-了解

删除另一个div中的特定div容器