Haystack 允许您通过统一接口处理多种文档存储,从而轻松根据您的需求在不同的存储系统之间切换。Haystack 中的文档存储保存您的数据(如文本、元数据或嵌入),并在搜索操作期间实现高效检索。要使用不同的存储,首先需要为您选择的存储后端(例如 Elasticsearch、FAISS 或 Weaviate)安装所需的依赖项,然后使用特定参数初始化文档存储,最后将其集成到您的 Haystack Pipeline 中。每种存储都有其独特优势——Elasticsearch 擅长关键词搜索,FAISS 处理向量相似性,而 Weaviate 支持混合搜索——因此您的选择取决于您的用例。
例如,要使用 Elasticsearch,您首先需要在本地运行 Elasticsearch 服务器或连接到云实例。在 Haystack 中,您将使用主机和端口初始化 ElasticsearchDocumentStore
,然后使用 write_documents()
将文档写入其中。对于像 FAISS 这样的基于向量的存储,您可以使用 FAISSDocumentStore
并将其与嵌入模型(例如 sentence-transformers/all-MiniLM-L6-v2
)配对,将文本转换为向量。添加文档后,您需要将 FAISS 索引保存到磁盘以供重用。Weaviate 是另一种选择,它通过支持关键词搜索和向量搜索来提供混合方法。您需要使用 Docker 容器对其进行配置,初始化 WeaviateDocumentStore
,并在需要时定义数据模式。每种存储所需的代码更改都很少——Haystack 的标准化方法(如 get_all_documents()
或 query()
)适用于所有后端。
选择文档存储时,请考虑可扩展性、搜索类型(关键词 vs 语义)和基础设施要求等因素。Elasticsearch 适用于需要 BM25 检索的文本密集型应用,而 FAISS 非常适合使用预计算嵌入进行语义搜索。Weaviate 简化了混合设置,但需要更多资源。Haystack 的 Pipeline 抽象了存储之间的差异:Retriever
组件(例如用于 Elasticsearch 的 BM25Retriever
或用于 FAISS 的 EmbeddingRetriever
)连接到文档存储,让您无需重写查询逻辑即可更换后端。例如,您可以先使用内存中的 InMemoryDocumentStore
进行测试,然后迁移到 PostgreSQL 或 Milvus 以用于生产环境,而无需修改您的 Pipeline 代码。这种灵活性确保您可以随着项目的演进优化性能、成本或易用性。