RAG 与 MongoDB Vector Search 第1部分

发布: (2025年12月12日 GMT+8 07:24)
7 min read
原文: Dev.to

Source: Dev.to

什么是 RAG?

检索增强生成(Retrieval‑augmented generation,RAG)是一种让大型语言模型(LLM)能够检索并融合新信息的技术。RAG 向 LLM 提供上下文数据,以生成更准确、更有依据的答案。

为什么向量搜索在 RAG 中很重要?

传统的关键词搜索在查询模糊、改写或语义丰富时会失效。向量搜索通过将文本表示为高维嵌入向量来解决此问题,这些向量编码的是意义而非字面文字。

嵌入

将文档和用户查询转换为捕获语义含义的高维向量。

索引

使用这些向量构建近似最近邻(ANN)结构,如 HNSW、IVF‑Flat 或 PQ,从而实现高效的相似度搜索。

检索

对输入查询进行嵌入,并与已索引的向量进行比较,返回基于语义相似度的最近匹配项。

示例场景

来源

  • 来源 1 – “Hono 是一个基于 Web 标准的快速、轻量级 JavaScript 框架。它侧重于低开销、边缘友好执行以及最小化的 API 表面。”
  • 来源 2 – “Elysia 是一个针对 Bun 优化的 Web 框架,提供强类型、模式校验和卓越性能。它旨在构建具备良好开发者体验的可扩展 HTTP 服务。”
  • 来源 3 – “Express 是一个极简且被广泛采用的 Node.js 框架。由于其简单性、丰富的生态系统和灵活的中间件模型,常用于构建 REST API。”

用户查询

如何在 JavaScript 中构建一个后端服务,以更好地集成 Bun 运行时?

当此查询被 嵌入 时,生成的向量会表示后端服务、API 开发、HTTP 框架以及 JavaScript 服务器端技术等概念。

典型的嵌入模型(Voyage、OpenAI、HuggingFace 等)会生成 512 到 3072 维的向量。示例向量:

[
  0.0182, -0.0925, 0.0441, 0.0107, -0.0713, 0.1234, -0.0089, 0.0562,
  -0.0041, 0.0977, 0.0229, -0.0335, 0.1412, -0.0611, 0.0054, 0.0883,
  -0.0122, 0.0745, -0.1099, 0.0671, 0.0144, -0.0528, 0.0995, -0.0173,
  0.0811, -0.0442, 0.0368, 0.1210, -0.0075, 0.0932, -0.0661, 0.0152,
  0.0473, -0.0891, 0.1329, 0.0287, -0.0174, 0.0721, -0.0554, 0.1012,
  0.0069, -0.0312, 0.1184, -0.0251, 0.0526, 0.0048, -0.0903, 0.1301,
  0.0110, -0.0782, 0.0433, 0.0271, -0.0622, 0.0999, -0.0148, 0.0711,
  0.0835, -0.0222, 0.0579, -0.0384
]

向量搜索使用 索引 将该查询向量与来源生成的向量进行比较。相似度搜索识别出在语义上最接近查询意图的来源,并 检索 它们。

检索结果

[
  {
    "text": "Elysia is a Bun‑optimized web framework that provides strong typing, schema validation, and excellent performance. It is designed for building scalable HTTP services with good developer ergonomics.",
    "score": 0.91
  },
  {
    "text": "Express is a minimalistic and widely adopted Node.js framework. It is commonly used to build REST APIs because of its simplicity, extensive ecosystem, and flexible middleware model.",
    "score": 0.78
  },
  {
    "text": "Hono is a fast, lightweight JavaScript framework built on Web Standards. It focuses on low overhead, edge‑friendly execution, and a minimal API surface.",
    "score": 0.61
  }
]

为什么使用 MongoDB Atlas 向量搜索?

MongoDB Atlas 向量搜索将向量相似度、元数据过滤和文档存储整合到 单一、统一的系统 中。无需在向量数据库和业务数据库之间拆分堆栈,Atlas 让嵌入、原始文档和业务数据并存。这消除了同步两个系统的开销,降低了延迟,并简化了架构。

对于 RAG 流程,这一点尤为关键:你可以把原始来源、它们的嵌入以及任何上下文元数据(标签、时间戳、访问规则、版本)全部存放在同一个位置,并在一次往返中查询所有内容。

MongoDB 向量搜索的工作原理

MongoDB 将嵌入向量存储在集合中的数组字段里,和其他普通字段没有区别。当在该字段上启用向量搜索时,Atlas 会构建一个针对快速语义相似度查找优化的 ANN 索引。

MongoDB Atlas Vector Search diagram

查询到来时,Atlas 使用你的嵌入输入(通常来自应用或 LLM 工作流),将查询向量与已索引的向量进行比较,并返回距离最小的文档。

在 MongoDB Atlas 中创建向量搜索索引

要在 MongoDB Atlas 中启用向量搜索,需要在存放嵌入的字段上定义向量索引。该索引告诉 Atlas 如何构建 ANN 图(HNSW)以及使用哪种相似度度量。

索引定义

{
  "mappings": {
    "dynamic": false,
    "fields": {
      "embedding": {
        "type": "knnVector",
        "dimensions": 1536,
        "similarity": "cosine"
      }
    }
  }
}
  • embedding – 每个文档存放向量表示的字段。
  • dimensions – 必须与所使用的嵌入模型的维度相匹配。
  • similarity – 定义检索时的距离计算方式(例如余弦相似度)。

向量搜索查询

{
  "$vectorSearch": {
    "index": "frameworks_vector_index",
    "path": "embedding",
    "queryVector": [/* query embedding values */],
    "numCandidates": 50,
    "limit": 3
  }
}

Atlas 使用 queryVector 在 HNSW 图中遍历,依据配置的相似度度量找出最近的节点,并返回前几名结果。

关键要求:存储文档和传入查询必须使用同一嵌入模型。混用模型或版本会导致向量不兼容,进而削弱相似度搜索效果。

结论

本文概述了 RAG、向量搜索与 MongoDB Atlas 在实际工作流中的协同方式。后续文章将进一步探讨更深层的 RAG 架构、向量索引策略、混合搜索等内容,敬请期待。

Back to Blog

相关文章

阅读更多 »