利用 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, ChatOpenAIos.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 MongoClientclient = 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.mzph.cn/web/13805.shtml

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

相关文章

基于英飞凌BGT60LTR11AIP E6327芯片具低功耗的脉冲多普勒操作模式常用于汽车应用的雷达上

芯片特征: 60 GHz收发器MMIC,带一个发射器和一个接收器单元封装天线(AIP)(6.73.30.56 mm3)低功耗的脉冲多普勒操作模式自主模式用于运动和运动方向的集成检测器运动检测信号的直接输出目标检测范围的15个可配置阈值检测…

Android14之Binder调试(二百一十一)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

2024年5月20日优雅草蜻蜓API大数据服务中心v2.0.4更新

v2.0.4更新 v2.0.4更新 2024年5月20日优雅草蜻蜓API大数据服务中心v2.0.4更新-增加ai绘画接口增加淘宝联想词接口底部增加联系方式 更新日志 底部增加联系方式 增加ai绘画接口 增加淘宝联想词接口 增加用户中心充值提示 用户中心内页颜色改版完成 截图 部分具体更新接口信…

【NLP】词性标注

词 词是自然语言处理的基本单位,自动词法分析就是利用计算机对词的形态进行分析,判断词的结构和类别。 词性(Part of Speech)是词汇最重要的特性,链接词汇和句法 词的分类 屈折语:形态分析 分析语&#…

k8s 1.24.x之后如果rest 访问apiserver

1.由于 在 1.24 (还是 1.20 不清楚了)之后,下面这两个apiserver的配置已经被弃用 了,简单的说就是想不安全的访问k8s是不可能了,所以只能走安全的访问方式也就是 https://xx:6443了,所以需要证书。 - --ins…

Git系列:git rm 的高级使用技巧

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

【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…

【数据结构】栈和队列的相互实现

欢迎浏览高耳机的博客 希望我们彼此都有更好的收获 感谢三连支持! 1.用栈实现队列 当队列中进入这些元素时,相应的栈1中元素出栈顺序与出队列相反,因此我们可以使用两个栈来使元素的出栈顺序相同; 通过将栈1元素出栈,再…

Databend 倒排索引的设计与实现

倒排索引是一种用于全文搜索的数据结构。它的主要功能是将文档中的单词作为索引项,映射到包含该单词的文档列表。通过倒排索引,可以快速准确地定位到与查询词相匹配的文档列表,从而大幅提高查询性能。倒排索引在搜索引擎、数据库和信息检索系…

前端 CSS 经典:3D 渐变轮播图

前言&#xff1a;无论什么样式的轮播图&#xff0c;核心 JS 实现原理都差不多。所以小伙伴们&#xff0c;还是需要了解一下核心 JS 实验原理的。 效果图&#xff1a; 实现代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta chars…

MySQL —— 复合查询

一、基本的查询回顾练习 前面两章节整理了许多关于查询用到的语句和关键字&#xff0c;以及MySQL的内置函数&#xff0c;我们先用一些简单的查询练习去回顾之前的知识 1. 前提准备 同样是前面用到的用于测试的表格和数据&#xff0c;一张学生表和三张关于雇员信息表 雇员信息…

优化数据查询性能:StarRocks 与 Apache Iceberg 的强强联合

Apache Iceberg 是一种开源的表格格式&#xff0c;专为在数据湖中存储大规模分析数据而设计。它与多种大数据生态系统组件高度兼容&#xff0c;相较于传统的 Hive 表格格式&#xff0c;Iceberg 在设计上提供了更高的性能和更好的可扩展性。它支持 ACID 事务、Schema 演化、数据…

leetcode-设计LRU缓存结构-112

题目要求 思路 双链表哈希表 代码实现 struct Node{int key, val;Node* next;Node* pre;Node(int _key, int _val): key(_key), val(_val), next(nullptr), pre(nullptr){} };class Solution { public: unordered_map<int, Node*> hash; Node* head; Node* tail; int …

普源DHO924示波器OFFSET设置

一、简介 示波器是电子工程师常用的测量工具之一&#xff0c;能够直观地显示电路信号的波形和参数。普源DHO924是一款优秀的数字示波器&#xff0c;具有优异的性能和易用性。其中OFFSET功能可以帮助用户调整信号的垂直位置&#xff0c;使波形更清晰易读。本文将详细介绍DHO924…

声音转文本(免费工具)

声音转文本&#xff1a;解锁语音技术的无限可能 在当今这个数字化时代&#xff0c;信息的传递方式正以前所未有的速度进化。从手动输入到触控操作&#xff0c;再到如今的语音交互&#xff0c;技术的发展让沟通变得更加自然与高效。声音转文本&#xff08;Speech-to-Text, STT&…

爬虫学习--12.MySQL数据库的基本操作(下)

MySQL查询数据 MySQL 数据库使用SQL SELECT语句来查询数据。 语法&#xff1a;在MySQL数据库中查询数据通用的 SELECT 语法 SELECT 字段1&#xff0c;字段2&#xff0c;……&#xff0c;字段n FROM table_name [WHERE 条件] [LIMIT N] 查询语句中你可以使用一个或者多个表&…

vue3使用mitt.js进行各种组件间通信

我们在vue工程中&#xff0c;除开vue自带的什么父子间&#xff0c;祖孙间通信&#xff0c;还有一个非常方便的通信方式&#xff0c;类似Vue2.x 使用 EventBus 进行组件通信&#xff0c;而 Vue3.x 推荐使用 mitt.js。可以实现各个组件间的通信 优点&#xff1a;首先它足够小&…

【云原生】Kubeadm部署k8s

目录 一、部署步骤 二、部署kubernetes 2.1、所有节点关闭防火墙 核心防护 iptables规则 swap交换 2.2、修改主机名并添加主机映射 2.3、调整内核参数 三、安装Docker 3.1、所有节点安装docker 3.2、所有接点添加镜像加速器 3.3、开启docker、并设置开机自启、查看状态…

ESP32学习笔记:WS2812B驱动

WS2812B是一款贴片RGB灯。由于采用了单总线通讯&#xff0c;所以需要特别关注下它的通讯时序。 调试细节&#xff1a; 本来以为会是一个比较简单的调试&#xff0c;结果还是花了很长时间才调试完成。 首先是关于ESP32的纳秒级延时确定&#xff0c;当时按照空指令始终调试不出来…

Linux中的计划任务(crontab)详解

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Linux &#xff1a;从菜鸟到飞鸟的逆袭》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、前言 1、Linux的起源与发展 2、什么是计划任务&#xf…