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

news2024/11/17 17:33:02

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

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

汇总合集:《大模型实战宝典》(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,备注:技术交流

用通俗易懂方式讲解系列

  • 《大模型面试宝典》(2024版) 正式发布!

  • 《大模型实战宝典》(2024版)正式发布!

  • 用通俗易懂的方式讲解:自然语言处理初学者指南(附1000页的PPT讲解)

  • 用通俗易懂的方式讲解:1.6万字全面掌握 BERT

  • 用通俗易懂的方式讲解:NLP 这样学习才是正确路线

  • 用通俗易懂的方式讲解:28张图全解深度学习知识!

  • 用通俗易懂的方式讲解:不用再找了,这就是 NLP 方向最全面试题库

  • 用通俗易懂的方式讲解:实体关系抽取入门教程

  • 用通俗易懂的方式讲解:灵魂 20 问帮你彻底搞定Transformer

  • 用通俗易懂的方式讲解:图解 Transformer 架构

  • 用通俗易懂的方式讲解:大模型算法面经指南(附答案)

  • 用通俗易懂的方式讲解:十分钟部署清华 ChatGLM-6B,实测效果超预期

  • 用通俗易懂的方式讲解:内容讲解+代码案例,轻松掌握大模型应用框架 LangChain

  • 用通俗易懂的方式讲解:如何用大语言模型构建一个知识问答系统

  • 用通俗易懂的方式讲解:最全的大模型 RAG 技术概览

  • 用通俗易懂的方式讲解:利用 LangChain 和 Neo4j 向量索引,构建一个RAG应用程序

  • 用通俗易懂的方式讲解:使用 Neo4j 和 LangChain 集成非结构化知识图增强 QA

  • 用通俗易懂的方式讲解:面了 5 家知名企业的NLP算法岗(大模型方向),被考倒了。。。。。

  • 用通俗易懂的方式讲解:NLP 算法实习岗,对我后续找工作太重要了!。

  • 用通俗易懂的方式讲解:理想汽车大模型算法工程师面试,被问的瑟瑟发抖。。。。

  • 用通俗易懂的方式讲解:基于 Langchain-Chatchat,我搭建了一个本地知识库问答系统

  • 用通俗易懂的方式讲解:面试字节大模型算法岗(实习)

  • 用通俗易懂的方式讲解:大模型算法岗(含实习)最走心的总结

  • 用通俗易懂的方式讲解:大模型微调方法汇总

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1684116.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

太速科技-基于5VLX110T FPGA FMC接口功能验证6U CPCI平台

基于5VLX110T FPGA FMC接口功能验证6U CPCI平台 一、板卡概述   本板卡是Xilinx公司芯片V5系列芯片设计信号处理板卡。由一片Xilinx公司的XC5VLX110T-1FF1136 / XC5VSX95T-1FF1136 / XC5VFX70T-1FF1136芯片组成。FPGA接1片DDR2内存条 2GB,32MB Nor flash存储器&a…

本特利330878-90-00前置传感器在PLC系统中的应用与优势

本特利330878-90-00前置传感器在PLC系统中的应用与优势 一、引言 在现代工业自动化领域中,传感器作为信息获取的重要工具,其性能的稳定性和准确性直接影响到整个系统的运行效率。其中,本特利330878-90-00前置传感器以其卓越的性能和广泛的应…

Mysql搭建主从同步,docker方式(一主一从)

服务器:两台Centos9 用Docker搭建主从 使用Docker拉取MySQL镜像 确保两台服务器都安装好了docker 安装docker请查看:Centos安装docker 1.两台服务器都先拉取mysql镜像 docker pull mysql 2.我这里是在 /opt/docker/mysql 下创建mysql的文件夹用来存…

LiveGBS流媒体平台GB/T28181用户手册-云端录像:查看录像、列表视图、时间轴视图、下载、删除

LiveGBS流媒体平台GB/T28181用户手册-云端录像:查看录像、列表视图、时间轴视图、下载、删除 1、云端录像1.1、查看录像1.1.1、时间轴视图1.1.2、列表视图1.1.3、日期切换1.1.4、删除当天 1.2、录像计划1.2.1、录像计划列表1.2.2、编辑录像计划1.2.3、关联通道1.2.4、删除录像计…

Steam致富:玩免费游戏Banana获得可交易道具

最近,Steam平台上一款普普通通的免费游戏《Banana》引起了轰动,接近2万人同时在线,好评率高达94%,究竟是什么让这款游戏如此受欢迎呢?原来,玩家们都在争相获取稀有的香蕉。 《Banana》属于点击放…

电信光猫获取超级密码,亲测可用

目前多数地区的光猫超级密码都改成动态的了,之前的密码已经无效,也有部分地区还有效。 动态密码目前可通过抓包来获取,比较简单。 抓包获取密码 1. 下载小翼管家(建议版本小于5.0)并通过WiFi或其他绑定你的光猫。 …

创建型设计模式之建造者模式

文章目录 概述定义建造者模式原理结构图小结 概述 建造者模式又被称为生成器模式,是一种创建型设计模式。 和之前的单例,工厂一样,同属于创建型设计模式。 定义 建造者模式是将一个复杂对象的构建与表示分离,使得同样的构建过程…

深入理解 Spring 循环依赖之三级缓存(附源码分析)

前言: 学过 Spring 的都知道 Spring 利用三级缓存解决了循环依赖问题,那你知道什么是循环依赖?什么又是三级缓存?本篇将从源码层面分析 Spring 是怎么去利用三级缓存帮我们解决循环依赖问题。 深入理解 Spring IOC 底层实现机制…

Day 38 防火墙技术IPtables

一:防火墙简介 1.简介 ​ iptables其实并不是真正的防火墙,我们可以把他理解为一个客户端的代理,用户是通过iptables这个代理,将用户的安全设定执行到对应的“安全框架”中,这个“安全框架”才是真正的防火墙。这个框…

【go项目01_学习记录15】

重构MVC 1 Article 模型1.1 首先创建 Article 模型文件1.2 接下来创建获取文章的方法1.3 新增 types.StringToUint64()函数1.4 修改控制器的调用1.5 重构 route 包1.6 通过 SetRoute 来传参对象变量1.7 新增方法:1.8 控制器将 Int64ToString 改为 Uint64ToString1.9…

Linux程序开发(八):操作系统进程通信编程

Tips:"分享是快乐的源泉💧,在我的博客里,不仅有知识的海洋🌊,还有满满的正能量加持💪,快来和我一起分享这份快乐吧😊! 喜欢我的博客的话,记得…

Java面向对象-常用类 (包装类)

常用类 – 包装类 基本数据类型的包装类 理解:包装类是8种基本数据类型对应的类 出现原因:Java是一种纯面向对象语言,但是java中有8种基本数据类型,破坏了java为纯面向对象的特征。为了承诺在java中一切皆对象,java…

【Hive SQL 每日一题】分析电商平台的用户行为和订单数据

需求描述 假设你是一位数据分析师,负责分析某电商平台的用户行为和订单数据,平台上有多个用户,用户可以在不同的日期下单,每个订单包含多个商品。请你完成相关业务分析,帮助平台优化运营策略和用户体验。 数据准备 …

音视频-常用的分析工具介绍-连续补充

目录 1:Audacity 2:MediaInfo 3:MP4Box 4:hexinator 5:Adobe Audition 6:VideoEye 7:YUVplayer (YUV/RGB播放器) 在做音视频分析时,经常用到各种分析工…

Sentinel的隔离和降级

文章目录 1、概念简介2、FeignClient整合Sentinel2.1、修改配置,开启sentinel功能2.2、编写失败降级逻辑2.3、总结 3、线程隔离(舱壁模式)3.1、线程隔离的实现方式3.2、sentinel的线程隔离1)配置隔离规则2)Jmeter测试 …

flink程序本地运行报: A JNI error has occurred和java.lang.NoClassDefFoundError

1.问题描述 在idea中运行flink job程序出现如下错误: Error: A JNI error has occurred, please check your installation and try again Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/flink/api/common/io/FileInputFormat …

Excel模板计算得出表格看板

背景 表格看板及导出,单元格时间年是根据筛选器时间变化的 较往年和往年是计算单元格 思路 1.通过excel模板来把数据填入excel再数据清洗得到数据返回前端 2.数据填充,通过行列作为key 列如:key整体20241月,根据key匹配数据填…

资料防拷贝该如何实现?数据防拷贝的方法有哪些

数据安全和隐私保护成为企业和个人关注的重点。电脑中存储的资料往往包含了重要的商业机密、个人隐私或其他敏感信息。 因此,如何有效防止他人非法拷贝电脑资料,成为了一个亟待解决的问题。 本文将探讨数据防拷贝的方法,以帮助企业和个人保护…

linux查看硬盘信息

1、查看挂接的分区状态 [rootMaster ~]# fdisk -l |grep Disk 2、查看硬盘和分区分布 [rootMaster ~]# lsblk 3、查看硬盘和分区的详细信息 [rootMaster ~]# fdisk -l 4、查看挂接的分区状态 [rootMaster ~]# swapon -s 5、查看硬盘使用情况 [rootMaster ~]# df -hT 6、硬…

Mysql总结1

Mysql常见日志 (1)错误日志:记录数据库服务器启动、停止、运行时存在的问题; (2)慢查询日志:记录查询时间超过long_query_time的sql语句,其中long_query_time可配置,且…