要在 Haystack 中实现实时更新,需要确保文档存储支持即时索引,并使用适当的方法来添加或修改数据。Haystack 的架构将文档存储与检索分开,因此实时更新取决于您选择的文档存储(例如 Elasticsearch、OpenSearch 或 InMemoryDocumentStore)。对于大多数生产场景,建议使用 Elasticsearch 或 OpenSearch,因为它们原生支持近实时索引,通常在插入文档后 1-2 秒内即可搜索。关键在于正确使用文档存储的写入方法并原子地处理更新。
首先使用您的文档存储类提供的 write_documents()
方法。例如,对于 ElasticsearchDocumentStore
,调用 document_store.write_documents(docs, duplicate_documents="overwrite")
来添加或更新文档。将 duplicate_documents
参数设置为“overwrite”可确保替换具有匹配 ID 的现有文档。写入后,通过调用 document_store.refresh()
触发显式索引刷新,使更改立即对搜索管道可见。如果您使用的是 Elasticsearch 7.0 以下的版本,您可能需要在 Elasticsearch 本身中调整索引刷新间隔设置以获得更快的可见性。对于删除操作,使用 document_store.delete_documents(ids=[...])
后跟一个刷新操作。
如果您使用的是像 InMemoryDocumentStore
这样的内存存储,实时更新是自动的,但数据是易失的(重启时数据会重置)。对于像 FAISS 这样的持久化存储,更新后需要使用 document_store.save()
重建向量索引,这不是真正的实时更新。在这种情况下,可以考虑将 SQL 数据库用于元数据与向量存储结合使用,并使用数据库触发器或消息队列(例如 RabbitMQ)通知您的应用程序更改。始终通过在您的管道中写入后立即查询来测试更新的可见性——这可以确保您的检索组件,如 BM25Retriever
或 EmbeddingRetriever
,可以访问最新数据。