llama_index [问题]:如何在本地离线状态下使用Huggingface嵌入模型?

gk7wooem  于 2个月前  发布在  其他
关注(0)|答案(1)|浏览(21)

根据您提供的信息,您在使用XLMRobertaModel时遇到了AttributeError: 'XLMRobertaModel' object has no attribute 'get_text_embedding_batch'错误。这是因为XLMRobertaModel没有get_text_embedding_batch这个方法。您可以尝试使用transformers库中的BertModel来代替XLMRobertaModel,因为BertModel具有类似的功能。

首先,确保您已经安装了transformers库:

pip install transformers

然后,您可以使用以下代码加载模型并获取文本嵌入:

from transformers import BertTokenizer, BertModel
import torch

# 加载预训练模型和分词器

model_name = "bert-base-uncased"
tokenizer = BertTokenizer.from_pretrained(model_name)
model = BertModel.from_pretrained(model_name)

# 对输入文本进行分词

input_text = "This is an example sentence."
input_tokens = tokenizer.encode(input_text, return_tensors="pt")

# 获取文本嵌入

with torch.no_grad():
    outputs = model(input_tokens)
    embeddings = outputs[0]

print(embeddings)

这段代码将使用BertModel对输入文本进行编码,并输出对应的文本嵌入。请注意,这里的示例使用了英文的预训练模型,如果您需要使用中文的预训练模型,可以将model_name替换为相应的中文模型名称。

c90pui9n

c90pui9n1#

你好!我在这里帮助你解决编程问题。让我们一起解决任何错误或回答你可能有的任何问题。
要解决 AttributeError: 'XLMRobertaModel' object has no attribute 'get_text_embedding_batch' ,你需要确保使用的模型具有实现 get_text_embedding_batch 方法。以下是如何实现或使用 get_text_embedding_batch 方法的示例:

from transformers import AutoModel, AutoTokenizer
from typing import List

class CustomEmbeddingModel:
    def __init__(self, model_name: str, embed_batch_size: int = 32):
        self.model = AutoModel.from_pretrained(model_name)
        self.tokenizer = AutoTokenizer.from_pretrained(model_name)
        self.embed_batch_size = embed_batch_size

    def _get_text_embeddings(self, texts: List[str]) -> List[List[float]]:
        inputs = self.tokenizer(texts, return_tensors='pt', padding=True, truncation=True)
        outputs = self.model(**inputs)
        embeddings = outputs.last_hidden_state.mean(dim=1).tolist()
        return embeddings

    def get_text_embedding_batch(self, texts: List[str], show_progress: bool = False) -> List[List[float]]:
        cur_batch = []
        result_embeddings = []

        for idx, text in enumerate(texts):
            cur_batch.append(text)
            if idx == len(texts) - 1 or len(cur_batch) == self.embed_batch_size:
                embeddings = self._get_text_embeddings(cur_batch)
                result_embeddings.extend(embeddings)
                cur_batch = []

        return result_embeddings

# Example usage
model_name = './bge-m3-model'
texts = ["Hello world", "How are you?"]
embedding_model = CustomEmbeddingModel(model_name)
embeddings = embedding_model.get_text_embedding_batch(texts)
print(embeddings)

或者,你可以使用 OptimumEmbedding 类,它来自 llama-index 框架,提供了更全面的嵌入处理实现。以下是如何使用它的示例:

from llama_index.legacy.core.embeddings.base import BaseEmbedding

class OptimumEmbedding(BaseEmbedding):
    def _get_text_embedding(self, text: str) -> List[float]:
        # Implement the method to get a single text embedding
        pass

    def _get_text_embeddings(self, texts: List[str]) -> List[List[float]]:
        # Implement the method to get multiple text embeddings
        pass

# Initialize the OptimumEmbedding model
model_name = './bge-m3-model'
embedding_model = OptimumEmbedding(model_name=model_name)

# Example texts
texts = ["Hello world", "How are you?"]

# Get text embeddings
embeddings = embedding_model.get_text_embedding_batch(texts)
print(embeddings)

这段代码定义了一个 CustomEmbeddingModel 类,它 Package 了 AutoModel 并提供了 get_text_embedding_batch 方法。或者,你可以使用 OptimumEmbedding 类,它来自 llama-index 框架,提供更强大的解决方案 1(https://github.com/run-llama/llama_index/blob/main/llama-index-core/llama_index/core/base/embeddings/base.py)2(https://github.com/run-llama/llama_index/blob/main/llama-index-integrations/embeddings/llama-index-embeddings-huggingface-optimum/llama_index/embeddings/huggingface_optimum/base.py)3(https://github.com/run-llama/llama_index/blob/main/llama-index-legacy/llama_index/legacy/core/embeddings/base.py)。

  • 要继续与 Dosu 交谈,请提及 @dosu。*

相关问题