使用 Atlas Vector Search 进行检索增强生成 (RAG)
检索增强生成 (RAG) 是一种架构,用于使用额外数据增强大型语言模型 (LLM),以便生成更准确的响应。您可以将 法学硕士 与由 Atlas Vector Search 提供支持的检索系统相结合,在生成式 AI 应用程序中实施 RAG 。
为何使用 RAG?
使用法学硕士时,您可能会遇到以下限制:
过时数据: LLM在特定时间点之前的静态数据集上进行训练。这意味着他们的知识库有限,可能会使用过时的数据。
无权访问本地数据:法学硕士无权访问本地或个性化数据。因此,他们可能缺乏特定领域的知识。
幻觉:当训练数据不完整或已过期时,法学硕士可能会生成不准确的信息。
您可以通过以下步骤实施RAG来解决这些限制:
摄取:将自定义数据作为向量嵌入存储在向量数据库(例如 MongoDB Atlas)中。这样,您就可以创建最新的个性化数据知识库。
检索:使用搜索解决方案(例如 Atlas Vector Search)根据用户的问题从数据库中检索语义相似的文档。这些文档通过额外的相关数据丰富了法学硕士课程。
生成:提示LLM 。法学硕士使用检索到的文档作为上下文,生成更准确、更相关的响应,从而减少幻觉。
由于RAG支持问答和文本生成等任务,因此它是构建 AI 聊天机器人的有效架构,可提供个性化、特定领域的响应。要创建可投入生产的聊天机器人,您必须配置服务器来路由请求,并在RAG实施的基础上构建用户界面。
附带 Atlas Vector Search 的 RAG
要使用 Atlas Vector Search 实施RAG ,您需要将数据提取到 Atlas 中,使用 Atlas Vector Search 检索文档,并使用LLM生成响应。本节介绍使用 Atlas Vector Search 进行基本或原生RAG实施的组件。有关分步说明,请参阅入门。
摄取
RAG的数据摄取涉及处理自定义数据并将其存储在向量数据库中以准备检索。要使用 Atlas 作为向量数据库创建基本摄取管道,请执行以下操作:
Retrieval
构建检索系统涉及从向量数据库中搜索并返回最相关的文档,以增强法学硕士学位。要使用 Atlas Vector Search 检索相关文档,您可以将用户的问题转换为向量嵌入,并对 Atlas 中的数据运行向量搜索查询,以查找嵌入最相似的文档。
要使用 Atlas Vector Search 执行基本检索,请执行以下操作:
在包含向量嵌入的集合上定义Atlas Vector Search 索引。
根据用户的问题选择以下方法之一来检索文档:
将Atlas Vector Search 与常用框架或服务集成。这些集成包括内置库和工具,使您能够使用 Atlas Vector Search 轻松构建检索系统。
构建自己的检索系统。您可以定义自己的函数和管道来运行特定于您使用案例的Atlas Vector Search 查询。
一代
要生成回复,请将您的检索系统与LLM相结合。执行向量搜索以检索相关文档后,您将用户的问题以及相关文档作为上下文提供给LLM ,以便它可以生成更准确的响应。
选择以下方法之一连接到LLM :
将Atlas Vector Search 与常用框架或服务集成。这些集成包括内置库和工具,可帮助您以最少的设置连接到LLM 。
调用法学硕士的API 。大多数 AI 提供商都为其生成模型提供API ,可用于生成响应。
加载开源LLM 。如果您没有API密钥或信用额度,您可以通过从应用程序本地加载开源LLM来使用。
开始体验
以下示例演示了使用 MongoDB LangChain 集成 和 Huugging Face 进行 Atlas Vector Search 的基本 RAG 实施 以轻松加载和访问嵌入和生成模型。
先决条件
➤ 使用 Select your language(选择您的语言)下拉菜单设置此页面上示例的语言。
要完成此示例,您必须具备以下条件:
具有运行 MongoDB 6版本的集群的Atlas 帐户。 0 。 11或7 。 0 。 2及更高版本。要了解更多信息,请参阅创建集群。
拥抱面部访问令牌 具有读取访问权限。
用于运行 Node.js 项目的终端和代码编辑器。
npm 和 Node.js 已安装。
具有运行 MongoDB 6版本的集群的Atlas 帐户。 0 。 11或7 。 0 。 2及更高版本。要了解更多信息,请参阅创建集群。
拥抱面部访问令牌 具有读取访问权限。
运行交互式 Python 笔记本(例如 Colab)的环境。
注意
如果您使用的是 Colab,请确保您的笔记本会话的IP解决包含在Atlas项目的访问权限列表中。
步骤
设置环境。
初始化您的 Node.js 项目。
在终端中运行以下命令,创建名为
rag-mongodb
的新目录并初始化项目:mkdir rag-mongodb cd rag-mongodb npm init -y 安装并导入依赖项。
运行以下命令:
npm install mongodb langchain @langchain/community @xenova/transformers @huggingface/inference pdf-parse 更新
package.json
文件。在项目的
package.json
文件中,按以下示例所示指定type
字段,然后保存文件。{ "name": "rag-mongodb", "type": "module", ... 创建
.env
文件。在您的项目中,创建一个
.env
文件来存储 Atlas 连接字符串和 Huging Face 访问令牌。HUGGING_FACE_ACCESS_TOKEN = "<access-token>" ATLAS_CONNECTION_STRING = "<connection-string>" 将
<access-token>
和<connection-string>
占位符值替换为您的 Huging Face 访问令牌和 Atlas 集群的SRV连接字符串。连接字符串应使用以下格式:mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net 注意
最低 Node.js 版本要求
Node.js v 20 .x 引入了
--env-file
选项。如果您使用的是旧版本的 Node.js,请将dotenv
包添加到您的项目中,或使用其他方法来管理环境变量。
创建一个函数以生成向量嵌入。
在本部分中,您将创建一个函数:
加载 nomic-embed-text-v1 嵌入来自 Huugging Face 模型中心的模型。
从输入数据创建向量嵌入。
在项目中创建一个名为get-embeddings.js
的文件,并粘贴以下代码:
import { pipeline } from '@xenova/transformers'; // Function to generate embeddings for a given data source export async function getEmbedding(data) { const embedder = await pipeline( 'feature-extraction', 'Xenova/nomic-embed-text-v1'); const results = await embedder(data, { pooling: 'mean', normalize: true }); return Array.from(results.data); }
将数据导入 Atlas。
在本部分中,您将把法学硕士无权访问的样本数据导入到 Atlas 中。以下代码使用LangChain 集成和Node.js 驱动程序执行以下操作:
将数据拆分为数据段,并指定数据段大小(字符数)和数据段重叠(连续数据段之间的重叠字符数)。
使用您定义的
getEmbeddings
函数从分块数据创建向量嵌入。将这些嵌入与分块数据一起存储在 Atlas 集群的
rag_db.test
集合中。
在项目中创建一个名为ingest-data.js
的文件,并粘贴以下代码:
import { PDFLoader } from "@langchain/community/document_loaders/fs/pdf"; import { RecursiveCharacterTextSplitter } from "langchain/text_splitter"; import { MongoClient } from 'mongodb'; import { getEmbeddings } from './get-embeddings.js'; import * as fs from 'fs'; async function run() { const client = new MongoClient(process.env.ATLAS_CONNECTION_STRING); try { // Save online PDF as a file const rawData = await fetch("https://investors.mongodb.com/node/12236/pdf"); const pdfBuffer = await rawData.arrayBuffer(); const pdfData = Buffer.from(pdfBuffer); fs.writeFileSync("investor-report.pdf", pdfData); const loader = new PDFLoader(`investor-report.pdf`); const data = await loader.load(); // Chunk the text from the PDF const textSplitter = new RecursiveCharacterTextSplitter({ chunkSize: 400, chunkOverlap: 20, }); const docs = await textSplitter.splitDocuments(data); console.log(`Successfully chunked the PDF into ${docs.length} documents.`); // Connect to your Atlas cluster await client.connect(); const db = client.db("rag_db"); const collection = db.collection("test"); console.log("Generating embeddings and inserting documents."); let docCount = 0; await Promise.all(docs.map(async doc => { const embeddings = await getEmbeddings(doc.pageContent); // Insert the embeddings and the chunked PDF data into Atlas await collection.insertOne({ document: doc, embedding: embeddings, }); docCount += 1; })) console.log(`Successfully inserted ${docCount} documents.`); } catch (err) { console.log(err.stack); } finally { await client.close(); } } run().catch(console.dir);
然后,运行以下命令来执行代码:
node --env-file=.env ingest-data.js
提示
此代码需要一些时间才能运行。您可以导航到Atlas 用户界面中的rag_db.test
集合,以查看插入的向量嵌入。
使用 Atlas Vector Search 检索文档。
在本部分中,您将设置 Atlas Vector Search 以从向量数据库中检索文档。完成以下步骤:
在向量嵌入上创建 Atlas Vector Search 索引。
创建一个名为
rag-vector-index.js
的新文件并粘贴以下代码。此代码连接到 Atlas 集群,并在rag_db.test
集合上创建vectorSearch类型的索引。import { MongoClient } from 'mongodb'; // Connect to your Atlas cluster const client = new MongoClient(process.env.ATLAS_CONNECTION_STRING); async function run() { try { const database = client.db("rag_db"); const collection = database.collection("test"); // Define your Atlas Vector Search index const index = { name: "vector_index", type: "vectorSearch", definition: { "fields": [ { "type": "vector", "numDimensions": 768, "path": "embedding", "similarity": "cosine" } ] } } // Call the method to create the index const result = await collection.createSearchIndex(index); console.log(result); } finally { await client.close(); } } run().catch(console.dir); 然后,运行以下命令来执行代码:
node --env-file=.env rag-vector-index.js 定义一个函数来检索相关数据。
创建一个名为
retrieve-documents.js
的新文件。在此步骤中,您将创建一个名为
getQueryResults
的检索函数,用于运行查询以检索相关文档。它使用getEmbeddings
函数根据搜索查询创建嵌入。然后,它运行查询以返回语义相似的文档。要了解更多信息,请参阅运行向量搜索查询。
将此代码粘贴到文件中:
import { MongoClient } from 'mongodb'; import { getEmbeddings } from './get-embeddings.js'; // Function to get the results of a vector query export async function getQueryResults(query) { // Connect to your Atlas cluster const client = new MongoClient(process.env.ATLAS_CONNECTION_STRING); try { // Get embeddings for a query const queryEmbeddings = await getEmbeddings(query); await client.connect(); const db = client.db("rag_db"); const collection = db.collection("test"); const pipeline = [ { $vectorSearch: { index: "vector_index", queryVector: queryEmbeddings, path: "embedding", exact: true, limit: 5 } }, { $project: { _id: 0, document: 1, } } ]; // Retrieve documents from Atlas using this Vector Search query const result = collection.aggregate(pipeline); const arrayOfQueryDocs = []; for await (const doc of result) { arrayOfQueryDocs.push(doc); } return arrayOfQueryDocs; } catch (err) { console.log(err.stack); } finally { await client.close(); } } 测试检索数据。
创建一个名为
retrieve-documents-test.js
的新文件。在此步骤中,您将检查刚刚定义的函数是否返回相关结果。将此代码粘贴到文件中:
import { getQueryResults } from './retrieve-documents.js'; async function run() { try { const query = "AI Technology"; const documents = await getQueryResults(query); documents.forEach( doc => { console.log(doc); }); } catch (err) { console.log(err.stack); } } run().catch(console.dir); 然后,运行以下命令来执行代码:
node --env-file=.env retrieve-documents-test.js
使用 LLM 生成回复。
在本部分中,您将通过提示 LLM 使用检索到的文档作为上下文来 生成 响应。此示例使用您刚刚定义的函数从数据库中检索匹配的文档,此外:
访问 Mistral7 B 指令 来自 Huging Face 模型中心的模型。
指示法学硕士在提示中包含用户的问题和检索到的文档。
向法学硕士提示 MongoDB 的最新 AI 公告。
创建一个名为generate-responses.js
的新文件,并将以下代码粘贴到其中:
import { getQueryResults } from './retrieve-documents.js'; import { HfInference } from '@huggingface/inference' async function run() { try { // Specify search query and retrieve relevant documents const query = "AI Technology"; const documents = await getQueryResults(query); // Build a string representation of the retrieved documents to use in the prompt let textDocuments = ""; documents.forEach(doc => { textDocuments += doc.document.pageContent; }); const question = "In a few sentences, what are MongoDB's latest AI announcements?"; // Create a prompt consisting of the question and context to pass to the LLM const prompt = `Answer the following question based on the given context. Question: {${question}} Context: {${textDocuments}} `; // Connect to Hugging Face, using the access token from the environment file const hf = new HfInference(process.env.HUGGING_FACE_ACCESS_TOKEN); const llm = hf.endpoint( "https://api-inference.huggingface.co/models/mistralai/Mistral-7B-Instruct-v0.3" ); // Prompt the LLM to answer the question using the // retrieved documents as the context const output = await llm.chatCompletion({ model: "mistralai/Mistral-7B-Instruct-v0.2", messages: [{ role: "user", content: prompt }], max_tokens: 150, }); // Output the LLM's response as text. console.log(output.choices[0].message.content); } catch (err) { console.log(err.stack); } } run().catch(console.dir);
然后,运行此命令以执行代码。生成的响应可能会有所不同。
node --env-file=.env generate-responses.js
MongoDB's latest AI announcements include the launch of the MongoDB AI Applications Program (MAAP), which provides customers with reference architectures, pre-built partner integrations, and professional services to help them build AI-powered applications quickly. Accenture has joined MAAP as the first global systems integrator, establishing a center of excellence focused on MongoDB projects. Additionally, Bendigo and Adelaide Bank have partnered with MongoDB to modernize their core banking technology using MongoDB's Relational Migrator and generative AI-powered modernization tools.
将数据导入 Atlas。
在本部分中,您将把法学硕士无权访问的样本数据导入到 Atlas 中。以下代码使用LangChain 集成和PyMongo 驱动程序执行以下操作:
将数据拆分为数据段,并指定数据段大小(字符数)和数据段重叠(连续数据段之间的重叠字符数)。
加载 nomic-embed-text-v1 嵌入来自 Huugging Face 模型中心的模型。
从数据创建向量嵌入,并将这些嵌入存储在 Atlas 集群的
rag_db.test
集合中。
在笔记本中粘贴并运行以下代码,将<connection-string>
替换为您的 Atlas连接字符串:
from langchain_community.document_loaders import PyPDFLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_huggingface import HuggingFaceEmbeddings from langchain_mongodb import MongoDBAtlasVectorSearch from pymongo import MongoClient # Load the PDF loader = PyPDFLoader("https://investors.mongodb.com/node/12236/pdf") data = loader.load() # Split the data into chunks text_splitter = RecursiveCharacterTextSplitter(chunk_size=400, chunk_overlap=20) docs = text_splitter.split_documents(data) # Load the embedding model (https://huggingface.co/nomic-ai/nomic-embed-text-v1") model = HuggingFaceEmbeddings(model_name="nomic-ai/nomic-embed-text-v1", model_kwargs={ "trust_remote_code": True }) # Connect to your Atlas cluster client = MongoClient("<connection-string>") collection = client["rag_db"]["test"] # Store the data as vector embeddings in Atlas vector_store = MongoDBAtlasVectorSearch.from_documents( documents = docs, embedding = model, collection = collection, index_name = "vector_index" )
提示
运行代码后,您可以导航到集群中的rag_db.test
集合,在 Atlas 用户界面中查看向量嵌入。
使用 Atlas Vector Search 检索文档。
在本部分中,您将设置 Atlas Vector Search 以从向量数据库中检索文档。完成以下步骤:
在向量嵌入上创建 Atlas Vector Search 索引。
您可以使用 PyMongo 驱动程序直接从应用程序创建索引。在笔记本中粘贴并运行以下代码:
pymongo.operations import SearchIndexModel # Create your index model, then create the search index search_index_model = SearchIndexModel( definition = { "fields": [ { "type": "vector", "numDimensions": 768, "path": "embedding", "similarity": "cosine" } ] }, name = "vector_index", type = "vectorSearch" ) collection.create_search_index(model=search_index_model) 将 Atlas Vector Search 配置为检索器。
在您的笔记本中,运行以下代码以设置检索系统,并使用LangChain 集成运行示例语义搜索查询:
# Instantiate Atlas Vector Search as a retriever retriever = vector_store.as_retriever( search_type = "similarity" ) # Run a sample query in order of relevance retriever.invoke("AI technology") [Document(metadata={'_id': '66a910ba7f78f7ec6760ceba', 'source': 'https://investors.mongodb.com/node/12236/pdf', 'page': 0}, page_content="more of our customers. We also see a tremendous opportunity to win more legacy workloads, as AI has now become a catalyst to modernize these\napplications. MongoDB's document-based architecture is particularly well-suited for the variety and scale of data required by AI-powered applications."), Document(metadata={'_id': '66a910ba7f78f7ec6760ced6', 'source': 'https://investors.mongodb.com/node/12236/pdf', 'page': 1}, page_content='artificial intelligence, in our offerings or partnerships; the growth and expansion of the market for database products and our ability to penetrate that\nmarket; our ability to integrate acquired businesses and technologies successfully or achieve the expected benefits of such acquisitions; our ability to'), Document(metadata={'_id': '66a910ba7f78f7ec6760cec3', 'source': 'https://investors.mongodb.com/node/12236/pdf', 'page': 0}, page_content='MongoDB continues to expand its AI ecosystem with the announcement of the MongoDB AI Applications Program (MAAP),'), Document(metadata={'_id': '66a910ba7f78f7ec6760cec4', 'source': 'https://investors.mongodb.com/node/12236/pdf', 'page': 1}, page_content='which provides customers with reference architectures, pre-built partner integrations, and professional services to help\nthem quickly build AI-powered applications. Accenture will establish a center of excellence focused on MongoDB projects,\nand is the first global systems integrator to join MAAP.')]
使用 LLM 生成回复。
在本部分中,您将通过提示 LLM 使用检索到的文档作为上下文来 生成 响应。以下代码使用 LangChain 执行以下操作:
访问 Mistral7 B 指令 来自 Huging Face 模型中心的模型。
向法学硕士提示 MongoDB 的最新 AI 公告。
在笔记本中粘贴并运行以下代码,将<token>
替换为您的 Huging Face 访问令牌。生成的响应可能会有所不同。
from langchain_huggingface import HuggingFaceEndpoint from langchain.prompts import PromptTemplate from langchain_core.runnables import RunnablePassthrough from langchain_core.output_parsers import StrOutputParser import os # Authenticate to your Hugging Face account os.environ["HF_TOKEN"] = "<token>" # Access the LLM (https://huggingface.co/mistralai/Mistral-7B-Instruct-v0.2) llm = HuggingFaceEndpoint(repo_id="mistralai/Mistral-7B-Instruct-v0.2") # Create prompt and RAG workflow prompt = PromptTemplate.from_template(""" Answer the following question based on the given context. Question: {question} Context: {context} """) rag_chain = ( { "context": retriever, "question": RunnablePassthrough()} | prompt | llm | StrOutputParser() ) # Prompt the LLM question = "In a few sentences, what are MongoDB's latest AI announcements?" answer = rag_chain.invoke(question) print(answer)
Answer: MongoDB recently announced the MongoDB AI Applications Program (MAAP) as part of their efforts to expand their AI ecosystem. The document-based architecture of MongoDB is particularly well-suited for AI-powered applications, offering an opportunity to win more legacy workloads. These announcements were made at MongoDB.local NYC.
后续步骤
有关更详细的RAG教程,请使用以下资源:
要了解如何使用流行的 法学硕士 框架和 AI 服务实施 RAG ,请参阅 将向量搜索与 AI 技术集成。
要了解如何使用本地 Atlas 部署和本地模型来实施RAG ,请参阅使用 Atlas Vector Search 构建本地 RAG 实施。
有关基于用例的教程和交互式 Python 笔记本,请参阅 生成式 AI 用例存储库。
要开始使用 Atlas Vector Search 构建可立即投入生产的聊天机器人,您可以使用 MongoDB 聊天机器人框架 。此框架提供了一组库,使您能够快速构建 AI 聊天机器人应用程序。
微调
要优化和微调RAG应用程序,您可以尝试不同的嵌入模型、分块策略和LLM 。要了解详情,请参阅以下资源:
此外,Atlas Vector Search 支持高级检索系统。由于您可以在 Atlas 中将矢量数据与其他数据一起无缝索引,因此您可以对集合中的其他字段进行预过滤或执行混合搜索以将语义搜索与全文搜索结果相结合来微调检索结果。