文本可以表示为捕捉语义的密集数值向量(嵌入)。余弦相似度 ($cos( heta)$) 或欧几里得距离 ($L_2$) 等相似度指标有助于找到接近给定查询向量的向量。在处理这些表示时,一个主要问题出现了:如何处理规模。想象一下,您的知识来源包含数千、数百万甚至数十亿文档。经过分块和嵌入后,您将拥有相应庞大的向量数量。在如此庞大的集合中,对您的查询向量进行暴力相似度搜索,与每个向量进行比较,计算成本高昂且耗时。对于需要快速响应的 RAG 系统而言,检索步骤等待数分钟是不可行的。传统数据库,例如关系型 (SQL) 或许多 NoSQL 数据库,通常设计用于精确匹配、标量值的范围查询或基于关键词的文本搜索。它们本身并未针对在基于相似度指标的高维向量空间中查找“最接近”的匹配进行优化。这时向量数据库就发挥作用了。什么是向量数据库?向量数据库是一种特殊类型的数据库,专门用于存储、管理和查询大量高维向量,例如我们讨论过的文本嵌入。它们的主要目的是实现高效且可扩展的相似度搜索。向量数据库不是基于关键词或特定字段值搜索精确匹配,而是让您输入一个查询向量,并根据选定的距离指标(例如,余弦相似度、欧几里得距离、点积)快速查找其索引中“最相似”的向量。针对近似最近邻 (ANN) 搜索进行优化使向量数据库高效的核心能力是它们对近似最近邻 (ANN) 搜索算法的有效实现。为什么是“近似”?执行精确的K最近邻 (KNN) 搜索,它保证找到距离查询向量绝对最近的 K 个向量,仍然需要将查询与数据集的很大一部分进行比较,尤其是在高维度中。这对于大型数据集来说可能太慢了。ANN 算法牺牲少量准确性,换取速度上的巨大提升。它们使用巧妙的索引技术快速缩小搜索范围,返回极有可能位于真实最近邻中的向量,尽管没有完美保证。在实际应用中,对于像 RAG 这样的系统,ANN 搜索的结果通常非常出色,并且速度优势显著。这就像超快速地找到非常相关的文档,即使最相关的那个文档有极小的可能未被返回。为提高速度而对向量进行索引为了实现快速 ANN 搜索,向量数据库依赖于专门的索引结构。当您向数据库添加向量时,它们会使用旨在划分高维空间的算法进行组织。一些常见的索引策略包括:基于哈希(LSH): 局部敏感哈希使用哈希函数将相似向量分组在一起。基于树(Annoy): 构建多个随机树结构来划分空间。基于图(HNSW): 分层可导航小世界图创建多层图结构,搜索从稀疏的长距离连接导航到密集的短距离连接。HNSW 目前是一种流行的选择,以其出色的性能而闻名。基于量化(IVF, ScaNN): 压缩向量或将空间划分为簇(例如,使用 k-means),并仅搜索相关的分区。您通常无需自己实现这些算法。向量数据库抽象了这种复杂性,让您能够选择索引类型并根据您在搜索速度、内存使用和召回率(准确性)之间所需的权衡来配置其参数。与向量一起存储元数据仅仅向量通常是不够的。在 RAG 系统中,当您检索相关分块时,您还需要知道它们来自哪里(例如,原始文档名称、页码、URL)。向量数据库允许您在每个向量旁边存储相关的元数据。重要的是,它们通常在搜索期间支持元数据过滤。这意味着您可以在符合特定元数据条件的向量子集中执行相似度搜索。例如:“查找与我的查询最相似的文本分块,但仅在 2023 年 1 月之后发布的文档中搜索”或“查找与查询相似、源自‘技术规范’PDF 的分块”。此功能对于构建更有针对性和高效的 RAG 应用非常有用。digraph G { rankdir=LR; node [shape=box, style=rounded, fontname="sans-serif", fontsize=10, color="#495057", fontcolor="#495057"]; edge [fontname="sans-serif", fontsize=9, color="#868e96", fontcolor="#495057"]; subgraph cluster_user { label = "用户交互"; bgcolor="#e9ecef"; Query [label="用户查询\n(例如,“HNSW 是什么?”)", shape=plaintext]; EmbModel [label="嵌入模型", shape=cds, fillcolor="#a5d8ff"]; QueryVec [label="查询向量\n[0.1, 0.9, ...]", shape=note, fillcolor="#bac8ff"]; Query -> EmbModel -> QueryVec; } subgraph cluster_db { label = "向量数据库"; bgcolor="#e9ecef"; VDB [label="向量索引\n(例如,HNSW)", shape=cylinder, fillcolor="#96f2d7"]; Metadata [label="元数据存储\n(文档 ID、分块编号等)", shape=folder, fillcolor="#ffec99"]; QueryVec -> VDB [label="ANN 搜索"]; VDB -> Metadata [label="检索 ID"]; } subgraph cluster_results { label = "检索结果"; bgcolor="#e9ecef"; Results [label="检索到的分块\n+ 元数据", shape=document, fillcolor="#ffc078"]; Metadata -> Results [label="获取数据"]; } QueryVec -> VDB; VDB -> Metadata; Metadata -> Results; }高层流程图,显示用户查询被向量化,在向量数据库内的向量索引中进行搜索,并返回相关分块及其元数据。在 RAG 的背景下,向量数据库作为您知识库的持久、可查询存储。当用户提出问题时:问题使用与文档相同的嵌入模型转换为查询向量。此查询向量发送到向量数据库。数据库执行 ANN 搜索以查找与查询向量最相似的向量(代表文档分块),并可能应用元数据过滤。数据库返回这些相似分块的 ID 或内容,以及它们关联的元数据。这些检索到的分块构成上下文,将在下一阶段传递给大型语言模型 (LLM)。通过使用向量数据库,检索步骤变得快速且可扩展,使 RAG 系统能够高效地从广泛的知识来源获取相关信息。下一节讨论了为您的特定需求选择向量数据库时需要考虑的因素。