本节导读:深入理解Haystack的文档存储系统,掌握主流Document Store的选型、配置和使用,构建高性能、高可用的企业级文档存储方案。
Document Store是Haystack RAG系统的核心组件,负责存储和检索文档数据。它不仅是数据的持久化层,更是后续检索和生成的基础设施。
| 类型 | 特点 | 适用场景 | 性能 | 扩展性 |
|---|---|---|---|---|
| InMemoryDocumentStore | 内存存储,速度快 | 开发测试、原型验证 | ⭐⭐⭐⭐⭐ | ⭐ |
| WeaviateDocumentStore | 向量数据库,支持语义搜索 | 生产环境、语义搜索 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
| ElasticsearchDocumentStore | 分布式搜索,全文检索 | 大规模文本检索 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| MilvusDocumentStore | 专用向量数据库 | 高维向量检索 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
| PineconeDocumentStore | 托管向量服务 | 云原生部署 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
# 基础依赖安装 pip install haystack-ai # 特定Document Store依赖 pip install "haystack-ai[weaviate]" # Weaviate pip install "haystack-ai[elasticsearch]" # Elasticsearch pip install "haystack-ai[milvus]" # Milvus pip install "haystack-ai[pinecone]" # Pinecone # 验证安装 from haystack.document_stores import ( InMemoryDocumentStore, WeaviateDocumentStore, ElasticsearchDocumentStore ) print("Document Store组件加载成功")
from haystack import Document from haystack.document_stores import InMemoryDocumentStore # 创建内存文档存储 doc_store = InMemoryDocumentStore() # 添加文档 documents = [ Document( content="Python是一种高级编程语言", meta={"source": "python-guide", "author": "Guido van Rossum"} ), Document( content="机器学习是人工智能的重要分支", meta={"source": "ml-intro", "author": "Andrew Ng"} ), Document( content="Haystack是构建RAG系统的开源框架", meta={"source": "haystack-doc", "author": "Deepset"} ) ] # 写入文档 doc_store.write_documents(documents) # 检索文档 results = doc_store.search(query="机器学习", top_k=2) print(f"检索到 {len(results)} 个文档") for i, doc in enumerate(results): print(f"{i+1}. {doc.content[:50]}... (分数: {doc.score})")
from haystack import Document from haystack.document_stores import WeaviateDocumentStore from haystack.components.embedders import SentenceTransformersDocumentEmbedder from haystack.components.writers import DocumentWriter from haystack import Pipeline # 配置Weaviate Document Store doc_store = WeaviateDocumentStore( url="http://localhost:8080", index="haystack_docs", text_field="content", embedding_dim=384, duplicate_documents="overwrite" ) # 创建嵌入管道 embedding_pipeline = Pipeline() embedding_pipeline.add_component("embedder", SentenceTransformersDocumentEmbedder( model_name="all-MiniLM-L6-v2", document_template="Document content: {{content}}" )) embedding_pipeline.add_component("writer", DocumentWriter(document_store=doc_store)) # 连接管道 embedding_pipeline.connect("embedder.documents", "writer.documents") # 准备文档 documents = [ Document( content="Python是一种高级编程语言,具有简洁的语法和丰富的标准库", meta={"source": "python-guide", "category": "programming"} ), Document( content="机器学习是人工智能的重要分支,通过算法让计算机从数据中学习", meta={"source": "ml-intro", "category": "ai"} ), Document( content="深度学习使用多层神经网络来模拟人脑的学习过程", meta={"source": "dl-intro", "category": "ai"} ) ] # 执行嵌入和写入 embedding_pipeline.run(data={"embedder": {"documents": documents}}) # 向量检索 query = "什么是深度学习?" query_embedding = embedding_pipeline.run(data={"embedder": {"documents": [Document(content=query)]}})["embedder"]["embeddings"][0] results = doc_store.search_embedding( query_embedding=query_embedding, top_k=2 ) print("Weaviate向量检索结果:") for i, doc in enumerate(results): print(f"{i+1}. {doc.content[:60]}... (相似度: {doc.score:.3f})")
from haystack import Document from haystack.document_stores import ElasticsearchDocumentStore from haystack.components.embedders import SentenceTransformersDocumentEmbedder from haystack.components.writers import DocumentWriter from haystack import Pipeline # 配置Elasticsearch Document Store doc_store = ElasticsearchDocumentStore( host="localhost", port=9200, index="haystack_docs", embedding_dim=384, duplicate_documents="overwrite" ) # 创建写入管道 writing_pipeline = Pipeline() writing_pipeline.add_component("embedder", SentenceTransformersDocumentEmbedder( model_name="all-MiniLM-L6-v2" )) writing_pipeline.add_component("writer", DocumentWriter(document_store=doc_store)) writing_pipeline.connect("embedder.documents", "writer.documents") # 批量处理文档 import time batch_size = 10 all_documents = [] # 生成测试文档 for i in range(30): doc = Document( content=f"文档 {i+1}: 这是关于人工智能和机器学习的技术文档,包含了各种算法和应用场景。", meta={ "doc_id": i+1, "category": "ai" if i < 15 else "programming" } ) all_documents.append(doc) # 批量写入 print("开始批量写入Elasticsearch...") writing_pipeline.run(data={"embedder": {"documents": all_documents}}) print("批量写入完成") # 全文检索 keyword_results = doc_store.search(query="机器学习", top_k=5) print(f"全文检索结果: {len(keyword_results)} 个文档") for i, doc in enumerate(keyword_results[:3]): print(f"{i+1}. {doc.content[:50]}...")
from haystack import Document, Pipeline from haystack.document_stores import WeaviateDocumentStore from haystack.components.embedders import SentenceTransformersDocumentEmbedder from haystack.components.writers import DocumentWriter from haystack.components.preprocessors import DocumentCleaner, DocumentSplitter from haystack.components.retrievers import EmbeddingRetriever, BM25Retriever from haystack.components.joiners import DocumentJoiner class CompleteRAGSystem: """完整的RAG系统""" def __init__(self, storage_type="weaviate"): self.storage_type = storage_type self.doc_store = None self.indexing_pipeline = None self.query_pipeline = None self._setup_system() def _setup_system(self): """设置RAG系统""" # 初始化文档存储 if self.storage_type == "weaviate": self.doc_store = WeaviateDocumentStore( url="http://localhost:8080", index="rag_docs", text_field="content", embedding_dim=384 ) # 设置索引管道 self.indexing_pipeline = Pipeline() self.indexing_pipeline.add_component("cleaner", DocumentCleaner( remove_empty_lines=True, remove_extra_whitespaces=True )) self.indexing_pipeline.add_component("splitter", DocumentSplitter( split_by="sentence", split_length=3, split_overlap=1 )) self.indexing_pipeline.add_component("embedder", SentenceTransformersDocumentEmbedder( model_name="all-MiniLM-L6-v2" )) self.indexing_pipeline.add_component("writer", DocumentWriter(document_store=self.doc_store)) # 连接索引管道 self.indexing_pipeline.connect("cleaner.documents", "splitter.documents") self.indexing_pipeline.connect("splitter.documents", "embedder.documents") self.indexing_pipeline.connect("embedder.documents", "writer.documents") # 设置查询管道 self.query_pipeline = Pipeline() self.query_pipeline.add_component("vector_retriever", EmbeddingRetriever( document_store=self.doc_store, top_k=3 )) self.query_pipeline.add_component("keyword_retriever", BM25Retriever( document_store=self.doc_store, top_k=2 )) self.query_pipeline.add_component("joiner", DocumentJoiner(join_mode="concatenate")) # 连接查询管道 self.query_pipeline.connect("vector_retriever.documents", "joiner.documents") self.query_pipeline.connect("keyword_retriever.documents", "joiner.documents") def index_documents(self, documents): """索引文档""" print("开始索引文档...") self.indexing_pipeline.run(data={"cleaner": {"documents": documents}}) def query(self, query): """执行查询""" print(f"执行查询: {query}") # 获取查询嵌入 query_embedding = self.indexing_pipeline.run( data={"embedder": {"documents": [Document(content=query)]}} )["embedder"]["embeddings"][0] # 执行混合检索 result = self.query_pipeline.run( data={ "vector_retriever": {"query_embedding": query_embedding}, "keyword_retriever": {"query": query} } ) return result["joiner"]["documents"] # 使用RAG系统 rag_system = CompleteRAGSystem(storage_type="weaviate") # 准备测试文档 test_documents = [ Document( content="Python是一种高级编程语言,由Guido van Rossum于1991年创建。", meta={"category": "programming", "language": "Python"} ), Document( content="机器学习是人工智能的核心技术,通过算法让计算机从数据中学习规律。", meta={"category": "ai", "subfield": "machine_learning"} ), Document( content="深度学习使用多层神经网络,能够处理复杂的模式识别任务。", meta={"category": "ai", "subfield": "deep_learning"} ), Document( content="自然语言处理使计算机能够理解和生成人类语言。", meta={"category": "ai", "subfield": "nlp"} ), Document( content="Haystack是Deepset公司开发的开源RAG框架,用于构建问答系统。", meta={"category": "framework", "name": "Haystack"} ) ] # 索引文档 rag_system.index_documents(test_documents) # 执行查询 results = rag_system.query("什么是机器学习?") print("查询结果:") for i, doc in enumerate(results): print(f"{i+1}. {doc.content[:50]}... (分数: {doc.score:.3f})")
A: 根据需求选择:
A: 性能优化策略:
A: 数据保护措施:
A: 实时数据处理:
通过本节学习,你掌握了Haystack文档存储的核心知识:
文档存储是RAG系统的基石,选择合适的存储方案和配置优化参数对系统性能至关重要。在实际项目中,需要根据数据规模、访问模式、性能要求等因素综合考虑。
下一章将深入探讨检索引擎的设计和实现,学习如何构建高效的检索系统。
关键词:文档存储, Document Store, Haystack存储, 向量数据库, 企业级存储, 性能优化
难度:进阶
预计阅读:50 分钟