问题验证
- 我已经在文档和discord上寻找答案。
问题
我想在自动合并检索中使用开源嵌入模型,如BAAI/bge-m3。我运行了以下代码,但嵌入输出与查询引擎的输入大小不兼容。错误是:ValueError: shapes (1024,) 和 (384,) 不对齐:1024 (dim 0) != 384 (dim 0)
当我使用较小的模型,如BAAI/bge-small-en-v1.5时,代码可以正常工作。有人能解释一下如何调整不同的嵌入模型以适应查询引擎吗?
import os
from llama_index.core import Settings, StorageContext, VectorStoreIndex, load_index_from_storage
from llama_index.core.node_parser import HierarchicalNodeParser, get_leaf_nodes
from llama_index.core.retrievers import AutoMergingRetriever
from llama_index.core.query_engine import RetrieverQueryEngine
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from llama_index.core import Document
from llama_index.llms.azure_openai import AzureOpenAI
def build_automerging_index(document, LLM, save_dir=None, chunk_sizes=None):
if save_dir is None:
save_dir = os.path.join(os.path.expanduser("~"), "merging_index")
if not os.path.exists(save_dir):
os.makedirs(save_dir)
chunk_sizes = chunk_sizes or [2048, 512, 128]
node_parser = HierarchicalNodeParser.from_defaults(chunk_sizes=chunk_sizes)
nodes = node_parser.get_nodes_from_documents(document)
leaf_nodes = get_leaf_nodes(nodes)
Settings.llm = LLM
Settings.embed_model = Settings.embed_model = HuggingFaceEmbedding(model_name="BAAI/bge-m3")
storage_context = StorageContext.from_defaults()
docstore_path = os.path.join(save_dir, 'docstore.json')
if os.path.exists(docstore_path):
automerging_index = load_index_from_storage(StorageContext.from_defaults(persist_dir=save_dir))
else:
storage_context.docstore.add_documents(nodes)
automerging_index = VectorStoreIndex(leaf_nodes, storage_context=storage_context)
automerging_index.storage_context.persist(persist_dir=save_dir)
return automerging_index
def get_automerging_query_engine(automerging_index, similarity_top_k=10):
base_retriever = automerging_index.as_retriever(similarity_top_k=similarity_top_k)
retriever = AutoMergingRetriever(base_retriever, automerging_index.storage_context, verbose=True)
auto_merging_engine = RetrieverQueryEngine.from_args(retriever)
return auto_merging_engine
content = "example...."
document = Document(id="1", text=content)
# Configuration for Azure OpenAI
azure_openai_api_key = "...."
azure_openai_endpoint = "...."
azure_openai_api_version = "....."
# Instantiate OpenAI with Azure configuration
llm = AzureOpenAI(
model="gpt-4o",
deployment_name="deployment_name",
api_key=azure_openai_api_key,
azure_endpoint=azure_openai_endpoint,
api_version=azure_openai_api_version,
)
index = build_automerging_index(
[document],
LLM = llm,
save_dir="./merging_index"
)
query_engine = get_automerging_query_engine(index, similarity_top_k=10)
query = "What is the example content about?"
response = query_engine.query(query)
print(response)
3条答案
按热度按时间gr8qqesn1#
嘿 @Sajad7010!我是一个机器人,可以帮助你解决任何错误、问题或贡献。在我们等待人工协助的同时,让我们一起解决这个问题。
要调整不同的嵌入模型以与您自动合并检索器设置中的查询引擎兼容,您需要确保嵌入模型已集成到向量存储和检索器组件中。以下是根据您提供的代码的逐步指南:
此外,您还可以使用
AdapterEmbeddingModel
来 Package 任何嵌入模型,并在其上添加适配器层。这对于在下游任务上微调嵌入模型非常有用。以下是如何使用AdapterEmbeddingModel
的示例:通过遵循这些步骤,您可以调整不同的嵌入模型以与您自动合并检索器设置中的查询引擎兼容。关键是确保嵌入模型已正确集成到向量存储和检索器组件中。此外,您还可以使用诸如Hit-Rate和MRR(Mean-Reciprocal-Rank)之类的指标来评估不同嵌入类型的性能,以选择最适合您需求的最佳模型 1(https://github.com/run-llama/llama_index/blob/main/docs/docs/examples/retrievers/auto_merging_retriever.ipynb)2(https://github.com/run-llama/llama_index/blob/main/llama-index-integrations/embeddings/llama-index-embeddings-adapter/llama_index/embeddings/adapter/base.py)3(https://github.com/run-llama/llama_index/blob/main/docs/docs/examples/cookbooks/cohere_retriever_eval.ipynb)4(https://github.com/run-llama/llama_index/blob/main/llama-index-legacy/llama_index/legacy/embeddings/adapter.py)5(https://github.com/run-llama/llama_index/blob/main/llama-index-legacy/llama_index/legacy/embeddings/openai.py)。
xzv2uavs2#
@Sajad7010听起来你用了一个嵌入模型来构建索引,然后用另一个模型进行查询。
如果你想更换嵌入模型,你需要重建索引。非常重要的一点是,用于构建和查询的嵌入模型必须相同。
w6mmgewl3#
@Sajad7010 听起来你用了一个嵌入模型构建索引,然后用另一个嵌入模型进行查询。
如果你想更换嵌入模型,你需要重建索引。非常重要的一点是,用于构建和查询的嵌入模型必须相同。
@logan-markewich 我不明白你的观点。我只调用了 build_automerging_index 函数来构建嵌入模型,仅此而已。我觉得问题可能是一些嵌入模型生成的大向量尺寸与查询不匹配,但我不知道该如何调整!