Haystack 集成入门
您可以将 Atlas Vector Search 与 Haystack 集成,以使用 LLM 构建自定义应用程序并实现检索增强生成 (RAG)。本教程演示如何开始使用带有 Haystack 的 Atlas Vector Search 来对数据执行语义搜索并构建 RAG 实现。具体来说,您需要执行以下操作:
设置环境。
创建 Atlas Vector Search 索引。
在 Atlas 上存储自定义数据。
使用 Atlas Vector Search 来回答有关数据的问题,从而实施RAG 。
背景
Haystack 是一个使用 LLM、嵌入模型和向量搜索来构建自定义应用程序的框架。通过将 Atlas Vector Search 与 Haystack 集成,您可以将 Atlas 用作向量数据库,并使用 Atlas Vector Search 通过从数据中检索语义相似的文档来实现 RAG。要了解有关 RAG 的更多信息,请参阅 使用 Atlas Vector Search 进行检索增强生成 (RAG)。
先决条件
如要完成本教程,您必须具备以下条件:
运行 MongoDB 6.0.11 版本的 Atlas 集群, 7.0.2 或更高版本(包括RC )。
OpenAI API 密钥。 您必须拥有一个 OpenAI 付费帐户,并有可用于 API 请求的信用。
用于运行 Python 项目(例如 Colab)的笔记本。
注意
如果使用 Colab,请确保笔记本会话的 IP 地址包含在 Atlas 项目的访问列表中。
设置环境
为此教程设置环境。通过保存扩展名为 .ipynb
的文件来创建交互式Python笔记本。此 Notebook 允许您单独运行Python代码片段,并且您将使用它来运行本教程中的代码。
要设立笔记本环境,请执行以下操作:
安装并导入依赖项。
运行以下命令:
pip --quiet install mongodb-atlas-haystack pymongo 运行以下代码,导入所需包:
import getpass, os from haystack import Pipeline, Document from haystack.document_stores.types import DuplicatePolicy from haystack.components.writers import DocumentWriter from haystack.components.generators import OpenAIGenerator from haystack.components.builders.prompt_builder import PromptBuilder from haystack.components.embedders import OpenAITextEmbedder, OpenAIDocumentEmbedder from haystack_integrations.document_stores.mongodb_atlas import MongoDBAtlasDocumentStore from haystack_integrations.components.retrievers.mongodb_atlas import MongoDBAtlasEmbeddingRetriever from pymongo import MongoClient from pymongo.operations import SearchIndexModel
定义环境变量。
运行以下代码并在出现提示时提供以下内容:
您的 OpenAI API 密钥。
您的Atlas集群的SRV连接string 。
os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Key:") os.environ["MONGO_CONNECTION_STRING"]=getpass.getpass("MongoDB Atlas Connection String:")
注意
连接字符串应使用以下格式:
mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net
创建 Atlas Vector Search 索引
注意
要创建 Atlas Vector Search 索引,您必须对 Atlas 项目具有Project Data Access Admin
或更高访问权限。
在本节中,您将创建 haystack_db
数据库和 test
集合来存储自定义数据。然后,为了对数据启用向量搜索查询,您需要创建 Atlas Vector Search 索引。
定义 Atlas Vector Search 索引。
运行以下代码,创建 vectorSearch 类型的索引。embedding
字段包含您将使用 OpenAI 的 text-embedding-ada-002
嵌入模型创建的嵌入。索引定义指定了 1536
个向量维度,并使用 cosine
来衡量相似性。
# Create your index model, then create the search index search_index_model = SearchIndexModel( definition={ "fields": [ { "type": "vector", "path": "embedding", "numDimensions": 1536, "similarity": "cosine" } ] }, name="vector_index", type="vectorSearch" ) collection.create_search_index(model=search_index_model)
构建索引大约需要一分钟时间。在建立索引时,索引处于初始同步状态。 构建完成后,您可以开始查询集合中的数据。
在 Atlas 中存储自定义数据。
在本节中,您将把 Atlas 实例化为向量数据库,也称为文档存储 。然后,您可以从自定义数据创建向量嵌入,并将这些文档存储在 Atlas 集合中。在 notebook 中粘贴并运行以下代码片段。
在 Atlas 集群上加载样本数据。
该代码定义了一些示例文档,并通过以下组件运行管道:
# Create some example documents documents = [ Document(content="My name is Jean and I live in Paris."), Document(content="My name is Mark and I live in Berlin."), Document(content="My name is Giorgio and I live in Rome."), ] # Initializing a document embedder to convert text content into vectorized form. doc_embedder = OpenAIDocumentEmbedder() # Setting up a document writer to handle the insertion of documents into the MongoDB collection. doc_writer = DocumentWriter(document_store=document_store, policy=DuplicatePolicy.SKIP) # Creating a pipeline for indexing documents. The pipeline includes embedding and writing documents. indexing_pipe = Pipeline() indexing_pipe.add_component(instance=doc_embedder, name="doc_embedder") indexing_pipe.add_component(instance=doc_writer, name="doc_writer") # Connecting the components of the pipeline for document flow. indexing_pipe.connect("doc_embedder.documents", "doc_writer.documents") # Running the pipeline with the list of documents to index them in MongoDB. indexing_pipe.run({"doc_embedder": {"documents": documents}})
Calculating embeddings: 100%|██████████| 1/1 [00:00<00:00, 4.16it/s] {'doc_embedder': {'meta': {'model': 'text-embedding-ada-002', 'usage': {'prompt_tokens': 32, 'total_tokens': 32}}}, 'doc_writer': {'documents_written': 3}}
提示
运行示例代码后,您可以导航到您的集群中的haystack_db.test
collection,在 Atlas 用户界面中查看向量嵌入。
回答有关数据的问题
本节演示了如何使用 Atlas Vector Search 和 Haystack 在应用程序中实现 RAG。
以下代码定义并运行具有以下组件的管道:
OpenAITextEmbedder embedder 从您的查询中创建嵌入。
MongoDBAtlasEmbeddingRetriever从您的文档存储中检索与查询嵌入相似的嵌入的 检索器。
PromptBuilder 用于传递提示模板,指示 LLM 使用检索到的文档作为提示的上下文。
OpenAIGenerator 生成器使用 OpenAI 的 LLM 生成上下文感知响应。
在此示例中,您使用示例查询 Where does Mark live?
作为 LLM 的提示。LLM 会根据您存储在 Atlas 中的自定义数据生成准确、情境感知的响应。
# Template for generating prompts for a movie recommendation engine. prompt_template = """ You are an assistant allowed to use the following context documents.\nDocuments: {% for doc in documents %} {{ doc.content }} {% endfor %} \nQuery: {{query}} \nAnswer: """ # Setting up a retrieval-augmented generation (RAG) pipeline for generating responses. rag_pipeline = Pipeline() rag_pipeline.add_component("text_embedder", OpenAITextEmbedder()) # Adding a component for retrieving related documents from MongoDB based on the query embedding. rag_pipeline.add_component(instance=MongoDBAtlasEmbeddingRetriever(document_store=document_store,top_k=15), name="retriever") # Building prompts based on retrieved documents to be used for generating responses. rag_pipeline.add_component(instance=PromptBuilder(template=prompt_template), name="prompt_builder") # Adding a language model generator to produce the final text output. rag_pipeline.add_component(instance=OpenAIGenerator(), name="llm") # Connecting the components of the RAG pipeline to ensure proper data flow. rag_pipeline.connect("text_embedder.embedding", "retriever.query_embedding") rag_pipeline.connect("retriever", "prompt_builder.documents") rag_pipeline.connect("prompt_builder", "llm") # Run the pipeline query = "Where does Mark live?" result = rag_pipeline.run( { "text_embedder": {"text": query}, "prompt_builder": {"query": query}, }); print(result['llm']['replies'][0])
Mark lives in Berlin.
后续步骤
MongoDB 还提供以下开发者资源: