利用 MongoDB Atlas 进行大模型语义搜索和RAG

节前,我们星球组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学.

针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。

汇总合集:《大模型实战宝典》(2024版)正式发布!

喜欢本文记得收藏、关注、点赞,文末可参与技术交流


你知道吗?MongoDB Atlas 现在提供了强大的向量搜索功能。现在你可以对数据进行语义搜索,并为大型语言模型(LLM)应用实现检索增强生成(RAG)。

通过将 Atlas 向量搜索与 LangChain、LlamaIndex 和客户端库等流行框架集成,你可以轻松构建高级自然语言处理(NLP)解决方案。

本文将探讨如何利用 MongoDB Atlas 向量搜索进行语义搜索和 RAG。

学习目标

  • 理解向量搜索的概念及其在自然语言处理和信息检索中的应用。
  • 学习如何将 MongoDB Atlas Vector Search 与 LangChain 框架集成,以构建检索增强生成(RAG)应用。
  • 掌握构建 RAG 链的能力,结合向量搜索检索、提示模板和大型语言模型(LLM)生成上下文感知的响应。
  • 了解使用 MongoDB Atlas Vector Search 作为向量存储的好处,包括效率、一致性、可扩展性和简易性。
  • 探索 LangChain 的灵活性和可扩展性,学习有关检索过程、LLM 提供者等的自定义选项。

什么是向量搜索?

向量搜索,也称为语义搜索,是一种超越传统基于关键词搜索的技术。它利用机器学习模型将文本、音频或图像等数据转换为称为嵌入的高维向量表示。这些嵌入捕捉数据的语义意义,使您能够根据向量空间中的接近度找到相似的内容,即使具体的词语不匹配。

向量搜索的核心优势在于它能够理解查询背后的意图和上下文,使其在搜索引擎、推荐系统和语言模型等各种应用中非常有用。

集成 MongoDB Atlas 向量搜索

MongoDB Atlas 是一种完全托管的云数据库服务,现在原生支持向量搜索。通过将向量嵌入与您的数据一起存储在 MongoDB 中,您可以在不需要单独的向量存储的情况下执行高效的语义搜索,从而确保数据一致性并简化应用程序架构。

通常过程包括:

  1. 将您的数据加载到 MongoDB Atlas 集群中。
  2. 使用预训练模型(如 OpenAI 的 text-embedding-ada-002)为您的数据生成向量嵌入。
  3. 将嵌入与您的数据一起存储在 MongoDB 中。
  4. 在嵌入字段上创建 Atlas 向量搜索索引。
  5. 使用 Atlas 强大的 $vectorSearch 聚合管道阶段运行向量搜索查询。

前提条件: 要将 Atlas 向量搜索与 LangChain 集成,您需要一个运行 MongoDB 6.0.11、7.0.2 或更高版本的 Atlas 集群,一个 OpenAI API 密钥(或替代的 LLM 提供商),以及一个运行项目的 Python 环境。

LangChain 集成

LangChain 是一个用 Python 编写的开源框架,旨在简化由大型语言模型(LLM)驱动的应用程序的开发。它提供了模块化和可扩展的架构,使开发者可以通过组合称为“链”的可重用组件来构建复杂的工作流。

LangChain 的一个关键特性是其对检索增强生成(RAG)的支持,这是一种将 LLM 的强大功能与外部数据源相结合的技术。通过将 MongoDB Atlas 向量搜索与 LangChain 集成,开发者可以利用 MongoDB 作为高性能的向量数据库,实现高效的语义搜索和 RAG 实现。

这种集成允许开发者:

  • 使用 LangChain 的模块化架构轻松构建和管理复杂的 NLP 应用。
  • 通过 Atlas 向量搜索实现高效的语义搜索,利用向量嵌入来增强 LLM 的生成能力。
  • 在构建 RAG 应用时,结合向量搜索、提示模板和 LLM,以生成上下文感知的响应。

集成过程通常包括以下步骤:

第一步:设置环境

安装所需的 Python 包,包括 langchainlangchain-mongodblangchain-openai
定义环境变量,例如 OpenAI API 密钥和 Atlas 集群连接字符串。

import os
import getpass
from langchain_mongodb import MongoDBAtlasVectorSearch
from langchain_openai import OpenAIEmbeddings, ChatOpenAI

os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Key:")
ATLAS_CONNECTION_STRING = getpass.getpass("MongoDB Atlas SRV Connection String:")

第二步:使用 Atlas 作为向量存储

使用提供的连接字符串连接到 Atlas 集群。
将数据加载到 Atlas 中,可以直接插入文档或使用 LangChain 的内置数据加载器加载各种文件格式(如 PDF、CSV、JSON)。
使用 LangChain 的文本拆分器将数据拆分成较小的块或文档。
使用 MongoDBAtlasVectorSearch 类实例化 Atlas 作为向量存储,指定集合和索引名称。
使用预训练模型(如 OpenAI 的 text-embedding-ada-002)为数据生成向量嵌入。

from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter

# 从 PDF 加载数据
loader = PyPDFLoader("https://example.com/document.pdf")
data = loader.load()

# 将数据拆分成文档
text_splitter = RecursiveCharacterTextSplitter(chunk_size=200, chunk_overlap=20)
docs = text_splitter.split_documents(data)

第三步:创建 Atlas 向量搜索索引

定义 Atlas 向量搜索索引架构,指定向量字段(例如 “embedding”)和任何附加的过滤字段。
使用 Atlas UI 或 MongoDB Atlas Search API 在 Atlas 集合上创建索引。

# 实例化 Atlas 作为向量存储
from pymongo import MongoClient

client = MongoClient(ATLAS_CONNECTION_STRING)
atlas_collection = client["langchain_db"]["documents"]
vector_search = MongoDBAtlasVectorSearch.from_documents(
    documents=docs,
    embedding=OpenAIEmbeddings(),
    collection=atlas_collection,
    index_name="vector_index"
)

第四步:运行向量搜索查询

使用 LangChain 的 MongoDBAtlasVectorSearch.as_retriever 方法将 Atlas 向量搜索实例化为语义搜索的检索器。
执行各种类型的向量搜索查询,例如基本语义搜索、带相关性评分的搜索或带元数据过滤的搜索。

query = "MongoDB Atlas security"
results = vector_search.similarity_search(query)

第五步:实现 RAG

定义一个提示模板,指示 LLM 使用检索到的文档作为生成响应的上下文。
通过结合 Atlas 向量搜索检索器、提示模板和 LLM(如 OpenAI 的 ChatGPT)构建 RAG 链。
使用查询提示 RAG 链,它将从 Atlas 中检索相关文档,将它们传递给 LLM,并生成上下文感知的响应。

from langchain.prompts import PromptTemplate
from langchain.chains import RetrievalQA

# 定义提示模板
template = """Use the following context to answer the question:
Context: {context}
Question: {question}"""
prompt = PromptTemplate(template=template, input_variables=["context", "question"])

# 创建 RAG 链
rag = RetrievalQA.from_chain_type(
    llm=ChatOpenAI(),
    chain_type="stuff",
    retriever=vector_search.as_retriever(),
    prompt=prompt)

# 提问
query = "How can I secure my MongoDB Atlas cluster?"
result = rag({"query": query})
print(result['result'])

LangChain 提供了高度的灵活性和可扩展性,允许开发者根据具体需求自定义与 Atlas 向量搜索的集成。例如,您可以通过调整检索文档的数量、相关性评分阈值或用于排名的相似性度量来优化检索过程。

虽然这种集成主要关注 MongoDB Atlas 向量搜索,LangChain 还支持各种向量数据库和搜索引擎,包括 Chroma、Weaviate 和 Pinecone 等。此外,LangChain 支持多种 LLM 提供商,如 OpenAI、Anthropic、Cohere 等,使您可以轻松利用不同的语言模型进行 RAG 实现。

通过结合 LangChain 的模块化架构和 MongoDB Atlas 向量搜索的高效语义搜索功能,开发者可以构建复杂的自然语言处理应用,这些应用能够理解上下文、检索相关信息并生成有信息的响应,同时利用 MongoDB 文档数据库的可扩展性和一致性。

LlamaIndex 集成

LlamaIndex 是另一个开源框架,旨在简化自定义数据源与 LLM 的集成。它提供了加载和准备向量嵌入的工具,支持 RAG 实现。通过将 Atlas 向量搜索与 LlamaIndex 集成,您可以使用 MongoDB 作为向量存储,检索语义相似的文档以增强 LLM 的知识。

该过程包括设置 Atlas 集群,将数据加载到 LlamaIndex 索引中,并使用 MongoDBAtlasVectorSearch 向量存储将向量嵌入存储在 MongoDB 中。然后,您可以使用 LlamaIndex 的 VectorIndexRetriever 运行语义搜索,并利用查询引擎根据检索到的文档生成上下文感知的响应。

客户端库集成

除了流行的框架之外,您还可以使用 MongoDB 的官方客户端库将 Atlas 向量搜索直接集成到您的应用程序中。这种方法包括为您的数据生成向量嵌入(例如,使用 OpenAI API),将它们存储在 MongoDB 中,创建向量搜索索引,并从应用程序代码中运行 $vectorSearch 查询。

例如,使用 Node.js 客户端库,您可以设置一个 Atlas 触发器,使用 OpenAI API 自动为新文档生成嵌入。然后,它可以创建一个向量搜索索引,并使用 $vectorSearch 聚合管道阶段执行语义搜索。

使用 MongoDB 进行向量搜索的好处

集成向量搜索功能与 MongoDB Atlas 提供了几个关键好处:

效率:通过将向量与数据一起存储,您避免了在应用程序数据库和单独的向量存储之间进行同步的需要。这提高了性能并简化了架构。

一致性:将嵌入与原始数据一起存储,确保即使向量生成过程随时间变化,向量也始终与正确的数据关联。

可扩展性:MongoDB Atlas 提供水平和垂直可扩展性,使您能够无缝处理高要求的向量搜索工作负载。

简易性:使用单个数据库存储数据和向量嵌入,减少了应用程序的复杂性和潜在的故障点。

托管服务:MongoDB Atlas 是一种完全托管的云数据库服务,因此它减轻了操作负担,使您能够专注于构建应用程序。

向量搜索和 RAG 的应用场景

向量搜索和 RAG 在各个行业和领域都有广泛的应用,包括:

智能搜索引擎:提供更相关和上下文感知的搜索结果,即使用户的查询含糊不清或不精确。

客户支持:构建能够理解自然语言查询并利用相关知识库提供准确、上下文感知响应的聊天机器人和虚拟助手。

电子商务和推荐系统:通过理解用户偏好和查找语义相似的商品来改进产品推荐。

内容分析:在大数据集中识别相似内容,这有助于完成如剽窃检测、内容重复删除和主题聚类等任务。

生物医学研究:通过基于语义相似性查找相关的科学文献和数据,加速药物发现和医学研究。

结论

MongoDB Atlas 向量搜索为构建能够理解上下文和意图的高级 NLP 应用程序开辟了令人兴奋的可能性。通过与 LangChain 和 LlamaIndex 等流行框架集成,或利用客户端库,您可以轻松实现语义搜索和 RAG 功能。试试看,解锁应用程序中智能和相关性的新层次!

技术交流群

前沿技术资讯、算法交流、求职内推、算法竞赛、面试交流(校招、社招、实习)等、与 10000+来自港科大、北大、清华、中科院、CMU、腾讯、百度等名校名企开发者互动交流~

我们建了算法岗技术与面试交流群, 想要获取最新面试题、了解最新面试动态的、需要源码&资料、提升技术的同学,可以直接加微信号:mlc2040。加的时候备注一下:研究方向 +学校/公司+CSDN,即可。然后就可以拉你进群了。

方式①、微信搜索公众号:机器学习社区,后台回复:加群
方式②、添加微信号:mlc2040,备注:技术交流

用通俗易懂方式讲解系列

  • 18
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值