You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 09:37:52