要使用 Haystack API 查询文档存储,首先需要初始化一个文档存储,将文档加载进去,然后配置一个检索管道。Haystack 为不同的文档存储(如 Elasticsearch、FAISS 或 InMemory)和检索器(稀疏/密集模型)提供了统一的接口。核心工作流程包括定义您的文档存储、添加数据,然后使用检索器组件根据您的查询搜索文档。此过程被设计为模块化,允许您在不重写整个代码库的情况下更换组件。
首先,设置并填充您的文档存储。例如,使用 InMemoryDocumentStore
,您可以创建带有文本和元数据的文档。这是一个简化示例
from haystack import Document
from haystack.document_stores import InMemoryDocumentStore
document_store = InMemoryDocumentStore()
docs = [Document(content="Haystack supports multiple retrievers", meta={"source": "docs"}),
Document(content="InMemoryDocumentStore is for testing", meta={"source": "tutorial"})]
document_store.write_documents(docs)
接下来,选择一个检索器。如果使用稀疏检索器,例如 TF-IDF
,将其链接到文档存储
from haystack.nodes import TFIDFRetriever
retriever = TFIDFRetriever(document_store=document_store)
对于密集检索(例如,使用 EmbeddingRetriever
),您需要指定一个嵌入模型,例如 sentence-transformers/all-MiniLM-L6-v2
。
最后,使用管道执行查询。一个基本的检索管道如下所示
from haystack import Pipeline
pipeline = Pipeline()
pipeline.add_node(component=retriever, name="retriever", inputs=["Query"])
results = pipeline.run(query="What document stores are supported?", params={"retriever": {"top_k": 3}})
results
将包含按相关性排名的文档。您可以通过 results["documents"]
访问其内容,并通过 document.score
访问分数。调整 top_k
以控制结果数量。如果需要过滤(例如,按元数据过滤),大多数文档存储在查询参数中支持 filters={"source": ["docs"]}
。
主要考虑因素包括将检索器类型与您的文档存储匹配(稀疏检索器适用于 Elasticsearch,密集检索器适用于 FAISS),并确保您的文档已预处理(分割成段落,清理)。对于高级用例,可以在集成中组合检索器或添加一个阅读器节点以实现完整的问答功能。查阅 Haystack 的文档,了解存储特定的配置,例如 Elasticsearch 中的索引设置或密集检索器的 GPU 加速。