如何基于InMemoryDocumentStore预存嵌入向量,避免重复生成耗时?
基于InMemoryDocumentStore实现嵌入向量预存与复用的方案
正确的保存方式
无需单独提取文档,直接序列化整个InMemoryDocumentStore实例,可完整保留所有文档、嵌入向量以及BM25索引数据:
import pickle # 生成完嵌入向量后,直接保存完整的document_store with open("document_store_full.pkl", "wb") as f: pickle.dump(document_store, f)
正确的加载与复用方式
在REST API端加载保存好的document_store,直接关联到EmbeddingRetriever即可,无需重新生成嵌入向量:
import os import pickle from haystack.nodes import EmbeddingRetriever, FARMReader def reader_retriever(): # 加载完整的document_store实例 store_path = os.path.join(settings.BASE_DIR, 'downloaded_models/document_store_full.pkl') with open(store_path, 'rb') as f: document_store_new = pickle.load(f) # 初始化retriever,直接关联已加载的document_store retriever_model_path = os.path.join(settings.BASE_DIR, 'downloaded_models/my_local_multi-qa-mpnet-base-dot-v1') retriever = EmbeddingRetriever( document_store=document_store_new, embedding_model=retriever_model_path, use_gpu=True ) # 初始化reader farm_reader_path = os.path.join(settings.BASE_DIR, 'downloaded_models/my_local_bert-large-uncased-whole-word-masking-squad2') reader = FARMReader( model_name_or_path=farm_reader_path, use_gpu=True ) return reader, retriever
关键注意事项
- 禁止仅保存
get_all_documents()的结果:该方法返回的是文档对象列表,不包含document_store内部的索引结构(如BM25倒排索引、嵌入向量存储容器),加载后无法直接复用已生成的嵌入向量,仍需重新计算。 - 加载后不要调用
update_embeddings:这会重新生成所有文档的嵌入向量,完全失去预存复用的意义。 - 保证保存与加载的Haystack版本一致:不同版本的Haystack对
InMemoryDocumentStore的序列化结构可能有调整,版本不一致会导致加载失败。
内容的提问来源于stack exchange,提问作者sherin_a27
相关产品推荐
相关产品推荐

