我使用的是 langchain HuggingFaceEmbeddings 模型:dunzhang/stella_en_1.5B_v5。 当我查看 https://huggingface.co/spaces/mteb/leaderboard 时,我可以看到型号是8192。 但当我这样做时
len(embed_model.embed_query("hey you"))
它给了我1024。 请问为什么会有这种差异?
在 langchain 中看到的嵌入维度 (1024) 与在 Hugging Face 模型卡上报告的维度 (8192) 之间存在差异的原因是没有嵌入整个句子,而是嵌入构成句子的标记。
-
标记化: 像“dunzhang/stella_en_1.5B_v5”这样的语言模型在处理文本时,会先将文本分解成称为 标记 的更小的单元。这些标记可以是词语,也可以是字符,也可以是子词,这取决于具体的模型。
-
嵌入: 每个标记随后都会被嵌入到一个向量空间中,该空间由模型的 嵌入维度 来定义。在“dunzhang/stella_en_1.5B_v5”的情况下,每个标记都被嵌入到一个 8192 维的向量中。
-
句子嵌入: 要获得整个句子的嵌入,一种常见的方法是对句子中所有标记的嵌入进行平均化。这就是 langchain 的
HuggingFaceEmbeddings
类所做的操作。
在的例子中,“hey you”这个句子很可能被标记化为两个标记“hey”和“you”。每个标记都被嵌入到一个 8192 维的向量中,然后将这两个向量平均化以产生一个 8192 维的句子嵌入。
但是,
embed_query
方法返回的是第一个标记的嵌入,在的情况下,它对应于“hey”
。这就是为什么会看到维度为 1024 的原因,而“hey”这个词的嵌入维度恰好是 1024。
要获得整个句子的 8192 维嵌入,需要使用
embed_documents
方法,即使只有一个句子。
以下是如何操作:
from langchain.embeddings import HuggingFaceEmbeddings
embed_model = HuggingFaceEmbeddings(model_name="dunzhang/stella_en_1.5B_v5")
embeddings = embed_model.embed_documents(["hey you"])
print(len(embeddings[0])) # 这将输出 8192
在这个例子中,
embed_documents
方法将返回一个列表,该列表包含一个 8192 维的单一向量,表示整个句子“hey you”的嵌入。