通过MongoDB Atlas 实现语义搜索与 RAG——迈向AI的搜索机制

news2024/11/19 17:42:17

目录

通过MongoDB Atlas 实现语义搜索与 RAG——迈向AI的搜索机制

一、引言

二、语义搜索与 MongoDB Atlas 的背景

三、MongoDB Atlas 的向量搜索功能

1. 向量搜索的实现方式

2. 典型操作示例

四、RAG 在 MongoDB Atlas 的应用

1、RAG是什么

2、RAG 的实现过程

3、RAG 的实际应用场景

4、实现 RAG 的示例流程

五、语义搜索与传统搜索方式的对比

六、总结


作者:watermelo37

涉及领域:Vue、SpingBoot、Docker、LLM、python等

---------------------------------------------------------------------

温柔地对待温柔的人,包容的三观就是最大的温柔。

---------------------------------------------------------------------

通过MongoDB Atlas 实现语义搜索与 RAG——迈向AI的搜索机制

一、引言

        随着大模型和语义搜索的迅速发展,如何高效管理和检索大规模非结构化数据成为现代应用的重要课题。MongoDB Atlas 近年来推出了面向语义搜索的向量存储和检索功能,使开发者能够在 Atlas 中轻松构建语义搜索和 RAG(Retrieval-Augmented Generation)应用。本文将深入探讨 MongoDB Atlas 的语义搜索功能、其向量检索的实现原理,并结合 RAG 框架介绍其在实际场景中的应用潜力。

二、语义搜索与 MongoDB Atlas 的背景

        语义搜索是基于内容意义而非简单关键词匹配的搜索方式,在信息检索领域具有广泛应用。然而,传统数据库中的全文检索无法实现语义级的理解和匹配。而 MongoDB Atlas 新推出的向量搜索功能,通过引入向量化语义数据存储和检索,使语义搜索和 RAG 在文档数据库中成为可能。

为什么需要语义搜索?

  • 提高信息匹配精度:语义搜索基于内容的相似性,可跨越词汇的表面差异。
  • 支持自然语言处理:与大语言模型(如 GPT)集成,使得数据库能够直接支持生成式 AI 和问答系统等高级应用。
  • RAG 模式的基础:向量搜索为 RAG 提供了高效的检索方式,以强化生成式模型的知识深度。

三、MongoDB Atlas 的向量搜索功能

        MongoDB Atlas 的向量搜索通过将文本、图像等内容向量化并存储在数据库中,实现基于向量相似度的检索。这种方式允许用户在存储文档的同时存储对应的向量表示,从而支持语义搜索。

1. 向量搜索的实现方式

        在 MongoDB Atlas 中,向量搜索的核心是将内容向量化并存储到文档的字段中,并通过余弦相似度或欧氏距离计算相似性。以下是其主要流程:

  • 向量化数据:通常借助大模型(如 BERT、GPT)将文本或图像转换为高维向量。
  • 索引管理:Atlas 提供对向量字段的索引,使得高维度数据的检索效率显著提升。
  • 相似性计算:支持基于距离度量的相似性查询,从而实现语义搜索。

        Atlas 的向量搜索适合以下几类应用:

  • 文本语义搜索:从大量文本中查找语义相似的内容。
  • 多模态检索:在图像或文本等不同数据类型上实现跨模态的检索。
  • 个性化推荐:基于用户行为向量化,为其推荐相似内容。

2. 典型操作示例

        在 MongoDB Atlas 中进行向量搜索,通常需要先向量化数据,然后在 MongoDB 中执行语义查询。以下是一个简单的示例:

// 设定文档格式,包含文本内容和对应的向量
db.collection.insertOne({
    content: "This is a sample document.",
    embedding: [0.23, 0.45, 0.78, ...]  // 向量化后的表示
});

// 执行基于向量相似度的查询
db.collection.aggregate([
    {
        $search: {
            "index": "default",
            "knnBeta": {
                "vector": [0.21, 0.47, 0.80, ...],
                "path": "embedding",
                "k": 5  // 返回与查询向量最相似的5条记录
            }
        }
    }
]);

四、RAG 在 MongoDB Atlas 的应用

1、RAG是什么

        RAG(Retrieval-Augmented Generation,检索增强生成)是一种结合了信息检索技术与语言生成模型的人工智能技术。它通过从外部知识库中检索相关信息,并将其作为提示(Prompt)输入给大型语言模型(LLMs),以增强模型处理知识密集型任务的能力,如问答、文本摘要、内容生成等。RAG模型由Facebook AI Research(FAIR)团队于2020年首次提出,并迅速成为大模型应用中的热门方案。

        RAG 是近年来一种将生成式 AI 和检索技术结合的框架,主要应用于知识问答、文档总结等任务。RAG 模型通过检索相关的背景信息作为生成模型的输入,显著提高了生成结果的准确性和可靠性。

        MongoDB Atlas 的向量搜索功能使 RAG 应用能够直接在数据库内实现数据检索,为生成式模型提供上下文。

2、RAG 的实现过程

在 RAG 框架中,通常有以下关键步骤:

  1. 内容向量化:利用向量化模型(如 BERT 或 Sentence Transformers)将文档存储为向量。
  2. 语义检索:使用 MongoDB Atlas 的向量检索功能查找与输入查询相似的内容。
  3. 生成结果:将检索到的内容传递给生成模型(如 GPT)进行答案生成或内容总结。

3、RAG 的实际应用场景

        MongoDB Atlas 结合 RAG 可以支持多种实际应用,如下所示:

  • 智能客服:将客户常见问题和答案向量化存储在 MongoDB Atlas 中,当客户提出问题时,RAG 模型可以先检索相关答案,然后由生成式模型生成个性化回应。
  • 企业知识管理:公司内部知识库往往包含大量复杂文档。通过 RAG,可以实现对知识库的语义化检索,提供更智能的知识问答。
  • 内容生成和推荐:在电商和媒体行业,可以根据用户兴趣向量推荐相关产品或文章,提供个性化内容。

4、实现 RAG 的简要流程

        下面是一个简单的 RAG 框架实现流程:

        假设我们有一个文档数据库,其中每个文档都经过向量化处理,并且我们使用 MongoDB Atlas 的向量搜索来进行相似文档检索。然后将检索到的结果作为上下文传递给生成式 AI 模型以生成答案。

        我们将详细分解以下几步:

  1. 将用户查询向量化。
  2. 在 MongoDB Atlas 中根据向量搜索匹配最相似的文档。
  3. 将这些相似文档合并成上下文。
  4. 传递上下文和用户查询给生成式模型生成答案。
  5. 返回答案。

        由于涉及到文本向量化的相关知识和与大模型交互的知识,这里不多赘述。假设已经有一个函数 vectorize(query) 将文本向量化,并且有一个函数 generate_answer_with_ai_model(query, context) 使用生成式模型生成答案。

// 引入 MongoDB Atlas 连接库
const { MongoClient } = require("mongodb");

// 假设 MongoDB Atlas 的连接信息
const uri = "YOUR_MONGODB_ATLAS_CONNECTION_STRING";
const client = new MongoClient(uri);

// 假设数据库和集合的名称
const dbName = "knowledgeBase";
const collectionName = "documents";

// 1. 定义向量化和生成模型函数(假设已经定义好或导入)
async function vectorize(query) {
    // 调用向量化模型 API,例如 Hugging Face 模型或自定义 BERT 模型
    // 返回查询的向量表示
}

async function generate_answer_with_ai_model(query, context) {
    // 调用生成式 AI 模型(例如 OpenAI 的 GPT 模型或自建模型)
    // 使用 query 和 context 生成最终答案
}

// 2. 主 RAG 实现函数
async function retrieve_and_generate_answer(userQuery) {
    try {
        // 连接 MongoDB Atlas
        await client.connect();
        const db = client.db(dbName);
        const collection = db.collection(collectionName);

        // 1. 将用户查询向量化
        const queryVector = await vectorize(userQuery);

        // 2. 在 MongoDB Atlas 中进行向量相似度搜索
        const k = 5;  // 设置希望检索的相似文档数量
        const results = await collection.aggregate([
            {
                $search: {
                    "index": "default",
                    "knnBeta": {
                        "vector": queryVector,
                        "path": "embedding",
                        "k": k  // 返回最相似的 k 个文档
                    }
                }
            },
            {
                $project: {
                    content: 1,
                    _id: 0,  // 仅保留内容字段
                    score: { $meta: "searchScore" }  // 选择性:记录相似度得分
                }
            }
        ]).toArray();

        // 3. 整理上下文,将相似文档内容合并为完整上下文
        let context = results.map(doc => doc.content).join(" ");
        console.log("检索到的上下文内容: ", context);

        // 4. 传递上下文和用户查询给生成式 AI 模型生成答案
        const answer = await generate_answer_with_ai_model(userQuery, context);

        // 5. 返回生成的答案
        return answer;

    } finally {
        // 关闭 MongoDB Atlas 连接
        await client.close();
    }
}

// 示例:用户输入的问题
const userQuery = "What are the best practices for managing microservices?";

// 调用 RAG 实现函数
retrieve_and_generate_answer(userQuery)
    .then(answer => console.log("生成的答案: ", answer))
    .catch(err => console.error("出现错误: ", err));

五、语义搜索与传统搜索方式的对比

        语义搜索和传统关键词搜索在实现原理和应用效果上有显著区别:

特点传统关键词搜索语义搜索
匹配方式基于字符串或关键词匹配基于语义相似性
搜索结果精确匹配,常出现遗漏或误报相似内容匹配,结果更具相关性
处理数据类型结构化文本非结构化数据(如图像、文本等)
计算需求计算成本低高维向量计算,资源需求较高
应用场景基本信息检索智能客服、推荐系统、知识问答等

        语义搜索可以更好地理解用户的意图,尤其适用于开放性查询和需要语义理解的场景。而传统搜索依赖于精确的关键词匹配,对自然语言理解有限。

六、总结

        MongoDB Atlas 的向量搜索功能为语义搜索和 RAG 提供了一个高效的数据库管理平台。在这个全新的应用场景下,Atlas 的向量检索能力支持开发者实现高效的知识检索和增强型生成应用,使其在智能客服、知识问答、个性化推荐等场景中大放异彩。结合生成式模型的 RAG 应用,MongoDB Atlas 提供了从数据存储到智能生成的完整解决方案,展现出其在现代应用中的巨大潜力。希望本文能够帮助大家更好地理解 MongoDB Atlas 的语义搜索功能和 RAG 的实际应用。

         只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

        MongoDB Atlas官网:MongoDB:开发者数据平台 | MongoDB

        MongoDB Atlas Vector Search:MongoDB Atlas Vector Search | MongoDB

        其他热门文章,请关注:

        你真的会使用Vue3的onMounted钩子函数吗?Vue3中onMounted的用法详解

        通过array.filter()实现数组的数据筛选、数据清洗和链式调用

        极致的灵活度满足工程美学:用Vue Flow绘制一个完美流程图

        el-table实现动态数据的实时排序,一篇文章讲清楚elementui的表格排序功能

        TreeSize:免费的磁盘清理与管理神器,解决C盘爆满的燃眉之急

        在线编程实现!如何在Java后端通过DockerClient操作Docker生成python环境

        Dockerfile全面指南:从基础到进阶,掌握容器化构建的核心工具

        MutationObserver详解+案例——深入理解 JavaScript 中的 MutationObserver

        JavaScript中闭包详解+举例,闭包的各种实践场景:高级技巧与实用指南

        干货含源码!如何用Java后端操作Docker(命令行篇)

        Idea启动SpringBoot程序报错:Port 8082 was already in use;端口冲突的原理与解决方案

        PDF预览:利用vue3-pdf-app实现前端PDF在线展示

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

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

相关文章

【graphics】图形绘制 C++

众所周知,周知所众,图形绘制对于竞赛学僧毫无用处,所以这个文章,专门对相关人员教学(成长中的码农、高中僧、大学僧)。 他人经验教学参考https://blog.csdn.net/qq_46107892/article/details/133386358?o…

Excel使用-弹窗“此工作簿包含到一个或多个可能不安全的外部源的链接”的发生与处理

文章目录 前言一、探讨问题发生原因1.引入外部公式2.引入外部数据验证二、问题现象排查及解决1.排查公式2.排查数据验证3.特殊处理方式总结前言 作为一种常用的办公软件,Excel被大家所熟知。尽管使用了多年,有时候在使用Excel时候也会发生一些不太常见的现象,需要用心核查下…

递归(3)----力扣40组合数2,力扣473火柴拼正方形

给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意:解集不能包含重复的组合。 示例 1: 输入: candidates [10,1,2,7,6,1…

CCF-第七届AIOps国际挑战赛-季军方案分享|北航-EasyRAG

历经4个月的时间,从初赛赛道第1,复赛赛道第2,到最后决赛获得季军,这一路我们团队收获了很多实践经验,也结识了不少业界的RAG研究者,受益匪浅。应组委会邀请,本文介绍一下我们EasyRAG方案的亮点和…

Spring Boot出现java: 错误: 无效的源发行版:16的解决方式

第一步: 修改为SDK的目标字节码版本 第二步:CtrlShiftAltS进入项目结构 第三步:pom.xml文件中 在网上搜索和自己SDK适配的Springboot版本,1.8对应的是2.7.1(可以用) 修改Java版本为1.8 最后的最后&a…

Redis学习 ——缓存

文章目录 一、Redis缓存的介绍二、Redis缓存问题2.1 缓存穿透2.2 缓存击穿2.3 缓存雪崩2.4 双写一致性2.5 缓存持久化RDBAOF 三、缓存数据管理3.1 数据过期策略3.2 数据淘汰策略 一、Redis缓存的介绍 我们在日常的代码编写中比较少使用到Redis,但是如果涉及到了比较…

【开源免费】基于Vue和SpringBoot的在线考试系统(附论文)

本文项目编号 T 624 ,文末自助获取源码 \color{red}{T624,文末自助获取源码} T624,文末自助获取源码 网络的广泛应用给生活带来了十分的便利。所以把在线考试管理与现在网络相结合,利用java技术建设在线考试系统,实现…

git-.git目录解析

目录 .git目录下的文件信息 logs:记录各个分支日志记录 refs:记录本地分支、远程分支、tag标签最新commitID config: 配置信息,详细内容解析看下面介绍HEAD: 工作空间当前所在分支 inde文件: 它又常被称为“暂存区”或“缓存区”。这个文件…

sglang 部署Qwen2VL7B,大模型部署,速度测试,深度学习

sglang 项目github仓库: https://github.com/sgl-project/sglang 项目说明书: https://sgl-project.github.io/start/install.html 资讯: https://github.com/sgl-project/sgl-learning-materials?tabreadme-ov-file#the-first-sglang…

前端pdf预览方案

前端pdf预览方案 pdf预览一般不需要前端生成pdf文件,pdf文件一般是通过接口,获取pdf文件【responseType:‘blob’,】或二进制文件流【responseType: ‘arraybuffer’,】或者已有的pdf文件。 前端PDF预览通常是通过读取现有的PDF文件,并使用…

Kotlin return与return@forEachIndexed

Kotlin return与returnforEachIndexed fun main() {val data arrayOf(0, 1, 2, 3, 4)println("a")data.forEachIndexed { index, v ->if (v 2) {//类似while循环中的continue//跳过,继续下一个forEachIndexed迭代returnforEachIndexed}println("…

MATLAB绘制克莱因瓶

MATLAB绘制克莱因瓶 clc;close all;clear all;warning off;% clear all rand(seed, 100); randn(seed, 100); format long g;% Parameters u_range linspace(0, 2*pi, 100); v_range linspace(0, pi, 50); [U, V] meshgrid(u_range, v_range);% Parametric equations for t…

DDRPHY数字IC后端设计实现系列专题之数字后端floorplanpowerplan设计

3.2.3 特殊单元的布局 布图阶段除了布置 I/O 单元和宏单元,在 28nm 制程工艺时,还需要处理两种特 殊的物理单元,Endcap 和 Tapcell。 DDRPHY数字IC后端设计实现系列专题之后端设计导入,IO Ring设计 (1)拐…

css uniapp背景图宽度固定高度自适应可以重复

page {height: 100%;background-image: url(https://onlinekc.a.hlidc.cn/uploads/20241115/350f94aaf493d05625a7ddbc86c7804e.png);background-repeat: repeat;background-size: contain;} 如果不要重复 把background-repeat: repeat;替换background-repeat: no-repeat;

CC工具箱使用指南:【CAD导出界址点Excel】

一、简介 群友定制工具。 面图层导出界址点Excel表之前已经做过好几个,这个工具则是将CAD导出Excel。 CAD数据如下: 工具将如上截图中的边界线导出界址点Excel,并记录下面内的文字。 二、工具参数介绍 点击【定制工具】组里的【CAD导出界…

输出比较简介

输出比较简介 主要是用来输出PWM波形,这个波形是驱动电机的(智能车和机器人等)必要条件 OC(Output Compare)输出比较,还有IC,全称是Input Capture,意为输入捕获,还有CC…

力扣(leetcode)题目总结——辅助栈篇

leetcode 经典题分类 链表数组字符串哈希表二分法双指针滑动窗口递归/回溯动态规划二叉树辅助栈 本系列专栏:点击进入 leetcode题目分类 关注走一波 前言:本系列文章初衷是为了按类别整理出力扣(leetcode)最经典题目&#xff0c…

unity老猿随笔

下面是我最近开始整理的一些unity的基础知识和疑难杂症,如果大家有什么可以分享出来的经验,可以评论区留言,验证后整理进来,全猿学习!如果有不对的地方,也欢迎指正,避免误人子弟! l…

『VUE』30. 生命周期的介绍(详细图文注释)

目录 生命周期生命周期的8阶段生命周期小例子总结 欢迎关注 『VUE』 专栏,持续更新中 欢迎关注 『VUE』 专栏,持续更新中 生命周期 每个 Vue 组件实例在创建时都需要经历一系列的初始化步骤,比如设置好数据侦听,编译模板&#xf…

Go语言跨平台桌面应用开发新纪元:LCL、CEF与Webview全解析

开篇寄语 在Go语言的广阔生态中,桌面应用开发一直是一个备受关注的领域。今天,我将为大家介绍三款基于Go语言的跨平台桌面应用开发框架——LCL、CEF与Webview,它们分别拥有独特的魅力和广泛的应用场景。通过这三款框架,你将能够轻…