使用 Milvus 和 Haystack 进行检索增强生成(RAG)
本指南演示了如何使用 Haystack 和 Milvus 构建一个检索增强生成(RAG)系统。
RAG 系统将检索系统与生成模型结合起来,根据给定的提示生成新文本。该系统首先使用类似 Milvus 的向量相似度搜索引擎从语料库中检索相关文档,然后使用生成模型根据检索到的文档生成新文本。
Haystack 是由 deepset 开发的用于构建具有大型语言模型(LLMs)的自定义应用程序的开源 Python 框架。Milvus 是世界上最先进的开源向量数据库,旨在支持嵌入相似度搜索和人工智能应用程序。
先决条件
在运行此笔记本之前,请确保已安装以下依赖项:
$ pip install --upgrade --quiet pymilvus milvus-haystack markdown-it-py mdit_plain
如果您正在使用 Google Colab,在启用刚安装的依赖项后,您可能需要重新启动运行时。
我们将使用 OpenAI 的模型。您应准备好api key OPENAI_API_KEY
作为环境变量。
import os
os.environ["OPENAI_API_KEY"] = "sk-***********"
准备数据
我们使用关于列奥纳多·达·芬奇的在线内容作为我们的 RAG 流水线的私有知识存储,这是一个简单 RAG 流水线的良好数据源。
下载并将其保存为本地文本文件。
import os
import urllib.request
url = "https://www.gutenberg.org/cache/epub/7785/pg7785.txt"
file_path = "./davinci.txt"
if not os.path.exists(file_path):
urllib.request.urlretrieve(url, file_path)
创建索引流水线
创建一个索引流水线,将文本转换为文档,将其分割为句子,并对其进行嵌入。然后将这些文档写入 Milvus 文档存储。
from haystack import Pipeline
from haystack.components.converters import MarkdownToDocument
from haystack.components.embedders import OpenAIDocumentEmbedder, OpenAITextEmbedder
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
document_store = MilvusDocumentStore(
connection_args={"uri": "./milvus.db"},
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", OpenAIDocumentEmbedder())
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_path]}})
print("文档数量:", document_store.count_documents())
将 markdown 文件转换为文档: 100%|█| 1/
计算嵌入: 100%|█| 9/9 [00:05<00:00,
E20240516 10:40:32.945937 5309095 milvus_local.cpp:189] [SERVER][GetCollection][] 集合 HaystackCollection 不存在
E20240516 10:40:32.946677 5309095 milvus_local.cpp:189] [SERVER][GetCollection][] 集合 HaystackCollection 不存在
E20240516 10:40:32.946704 5309095 milvus_local.cpp:189] [SERVER][GetCollection][] 集合 HaystackCollection 不存在
E20240516 10:40:32.946725 5309095 milvus_local.cpp:189] [SERVER][GetCollection][] 集合 HaystackCollection 不存在
文档数量: 277
创建检索流水线
创建一个检索流水线,使用向量相似度搜索引擎从 Milvus 文档存储库中检索文档。
question = '绘画《战士》目前存放在哪里?'
retrieval_pipeline = Pipeline()
retrieval_pipeline.add_component("embedder", OpenAITextEmbedder())
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)