集成 (Integrations)
集成 Haystack(Integrate_with_haystack)

使用 Milvus 和 Haystack 构建检索增强生成系统

Haystack (opens in a new tab) 是由 deepset (opens in a new tab) 开发的用于构建可定制、可投入生产的自然语言理解与处理应用的 Python 开源框架。它是一个端到端的框架,通过为应用程序构建生命周期的每个步骤提供工具来协助完整的 NLP 应用的编排。

本指南演示了如何使用 Haystack 的 Milvus 集成 (opens in a new tab) 在 Milvus 文档中构建一个由 LLM 驱动的问答应用。在这个示例中,Haystack 和 Milvus 首先协同工作,将文档页面载入并存储在 MilvusDocumentStore 中,然后使用 OpenAIGenerator 通过检索增强来回答问题。

🚀 可在 此处 (opens in a new tab) 查看使用 MilvusDocumentStore 进行 Milvus 文档问答的完整应用程序。

安装

安装 Haystack 和 Milvus 集成:

pip install milvus-haystack

使用

首先,按照文档中的 "启动 Milvus (opens in a new tab)" 说明启动 Milvus 服务。

一旦你在本地的 localhost:19530 上运行了 Milvus,在 Haystack 中使用 Milvus 之前,你需要初始化一个 MilvusDocumentStore

创建索引流水线并索引一些文档

import os
 
from haystack import Pipeline
from haystack.components.converters import MarkdownToDocument
from haystack.components.embedders import SentenceTransformersDocumentEmbedder, SentenceTransformersTextEmbedder
from haystack.components.preprocessors import DocumentSplitter
from haystack.components.writers import DocumentWriter
 
from milvus_haystack import MilvusDocumentStore
from milvus_haystack.milvus_embedding_retriever import MilvusEmbeddingRetriever
 
file_paths = [os.path.abspath(__file__)]  # 在这里添加你的知识文档
 
document_store = MilvusDocumentStore(
    connection_args={
        "host": "localhost",
        "port": "19530",
        "user": "",
        "password": "",
        "secure": False,
    },
    drop_old=True,
)
indexing_pipeline = Pipeline()
indexing_pipeline.add_component("converter", MarkdownToDocument())
indexing_pipeline.add_component("splitter", DocumentSplitter(split_by="sentence", split_length=2))
indexing_pipeline.add_component("embedder", SentenceTransformersDocumentEmbedder())
indexing_pipeline.add_component("writer", DocumentWriter(document_store))
indexing_pipeline.connect("converter", "splitter")
indexing_pipeline.connect("splitter", "embedder")
indexing_pipeline.connect("embedder", "writer")
indexing_pipeline.run({"converter": {"sources": file_paths}})
 
print("文档数量:", document_store.count_documents())
 

创建检索流水线并尝试查询

question = "如何安装Haystack和Milvus集成?"
 
retrieval_pipeline = Pipeline()
retrieval_pipeline.add_component("embedder", SentenceTransformersTextEmbedder())
retrieval_pipeline.add_component("retriever", MilvusEmbeddingRetriever(document_store=document_store, top_k=3))
retrieval_pipeline.connect("embedder", "retriever")
 
retrieval_results = retrieval_pipeline.run({"embedder": {"text": question}})
 
for doc in retrieval_results["retriever"]["documents"]:
    print(doc.content)
    print("-" * 10)

创建 RAG 流水线并尝试查询

from haystack.utils import Secret
from haystack.components.embedders import SentenceTransformersTextEmbedder
from haystack.components.builders import PromptBuilder
from haystack.components.generators import OpenAIGenerator
 
prompt_template = """回答下面的问题,基于提供的背景。如果背景中没有答案,请回答'I don't know'。\n
                     问题:{{query}}
                     文档:
                     {% for doc in documents %}
                        {{ doc.content }}
                     {% endfor %}
                     答案:
                  """
 
rag_pipeline = Pipeline()
rag_pipeline.add_component("text_embedder", SentenceTransformersTextEmbedder())
rag_pipeline.add_component("retriever", MilvusEmbeddingRetriever(document_store=document_store, top_k=3))
rag_pipeline.add_component("prompt_builder", PromptBuilder(template=prompt_template))
rag_pipeline.add_component("generator", OpenAIGenerator(api_key=Secret.from_token(os.getenv("OPENAI_API_KEY")),
                                                        generation_kwargs={"temperature": 0}))
rag_pipeline.connect("text_embedder.embedding", "retriever.query_embedding")
rag_pipeline.connect("retriever.documents", "prompt_builder.documents")
rag_pipeline.connect("prompt_builder", "generator")
 
results = rag_pipeline.run(
    {
        "text_embedder": {"text": question},
        "prompt_builder": {"query": question},
    }
)
print('RAG答案:', results["generator"]["replies"][0])