2026/5/18 20:45:32
网站建设
项目流程
深圳加盟网站建设,安徽六安天气预报,做旅游网站,开发公司各部门职责引言
近年来#xff0c;大型语言模型#xff08;LLM#xff09;取得了令人瞩目的成就#xff0c;但它们仍然存在一些固有的局限性#xff0c;例如知识截止#xff08;knowledge cutoff#xff09;和幻觉#xff08;hallucination#xff09;。为了解决这些问题#…引言近年来大型语言模型LLM取得了令人瞩目的成就但它们仍然存在一些固有的局限性例如知识截止knowledge cutoff和幻觉hallucination。为了解决这些问题研究人员提出了一种名为“检索增强生成”Retrieval-Augmented Generation简称RAG的技术。RAG通过从外部知识库中检索相关信息来增强LLM的生成能力从而提高了生成内容的准确性和时效性。在RAG的核心机制中向量嵌入vector embedding和余弦距离cosine distance扮演着至关重要的角色。本文将深入探讨RAG的工作原理并重点介绍向量余弦距离的数学概念及其在RAG中的应用。什么是RAGRAG是一种将检索retrieval和生成generation相结合的技术。其核心思想是在生成文本之前首先从一个大型的知识库如维基百科、公司内部文档等中检索出与用户输入相关的信息然后将这些信息作为上下文context提供给语言模型引导其生成更准确、更丰富的回答。RAG的工作流程可以概括为以下几个步骤编码Encoding将用户输入query和知识库中的文档都编码成高维向量这些向量被称为“嵌入”embeddings。检索Retrieval使用向量相似度计算方法在知识库中找到与用户输入向量最相似的文档向量。生成Generation将检索到的文档内容与原始的用户输入拼接在一起形成一个增强的提示prompt然后将其输入到语言模型中生成最终的回答。向量余弦距离在RAG的检索步骤中如何判断两个向量的相似度呢答案就是余弦距离。余弦距离也称为余弦相似度是用来衡量两个向量方向上的差异。在几何上它可以被解释为两个向量夹角的余弦值。如果两个向量的方向完全相同它们的余弦相似度为1如果它们的方向完全相反余弦相似度为-1如果它们相互垂直余弦相似度为0。余弦距离就是1减去这个余弦值所以夹角越小余弦距离越近。余弦距离的数学公式给定两个向量A和B它们之间的余弦相似度cosine_similarity可以通过以下公式计算cosine_similarity ( A , B ) A ⋅ B ∥ A ∥ ∥ B ∥ ∑ i 1 n A i B i ∑ i 1 n A i 2 ∑ i 1 n B i 2 \text{cosine\_similarity}(A, B) \frac{A \cdot B}{\|A\| \|B\|} \frac{\sum_{i1}^{n} A_i B_i}{\sqrt{\sum_{i1}^{n} A_i^2} \sqrt{\sum_{i1}^{n} B_i^2}}cosine_similarity(A,B)∥A∥∥B∥A⋅B∑i1nAi2∑i1nBi2∑i1nAiBi其中A · B是向量A和B的点积。||A||和||B||分别是向量A和B的欧几里得范数或长度。n是向量的维度。2维空间中的余弦相似度如果向量A (x1, y1) 和B (x2, y2)则公式为cosine_similarity ( A , B ) x 1 x 2 y 1 y 2 x 1 2 y 1 2 x 2 2 y 2 2 \text{cosine\_similarity}(A, B) \frac{x_1 x_2 y_1 y_2}{\sqrt{x_1^2 y_1^2} \sqrt{x_2^2 y_2^2}}cosine_similarity(A,B)x12y12x22y22x1x2y1y2上图直观地展示了2维平面上的两个向量。余弦距离衡量的是这两个向量之间的夹角大小。夹角越小两个向量方向越一致余弦距离就越小代表它们越相似。3维空间中的余弦相似度如果向量A (x1, y1, z1) 和B (x2, y2, z2)则公式为cosine_similarity ( A , B ) x 1 x 2 y 1 y 2 z 1 z 2 x 1 2 y 1 2 z 1 2 x 2 2 y 2 2 z 2 2 \text{cosine\_similarity}(A, B) \frac{x_1 x_2 y_1 y_2 z_1 z_2}{\sqrt{x_1^2 y_1^2 z_1^2} \sqrt{x_2^2 y_2^2 z_2^2}}cosine_similarity(A,B)x12y12z12x22y22z22x1x2y1y2z1z2余弦距离cosine_distance则由余弦相似度派生而来cosine_distance ( A , B ) 1 − cosine_similarity ( A , B ) \text{cosine\_distance}(A, B) 1 - \text{cosine\_similarity}(A, B)cosine_distance(A,B)1−cosine_similarity(A,B)余弦距离的取值范围在[0, 2]之间。距离为0表示向量完全相同距离越大表示向量差异越大。RAG中余弦距离的应用在RAG中用户输入和知识库中的文档都被转换成了向量。为了找到最相关的文档系统会计算用户输入向量与知识库中所有文档向量之间的余弦距离cosine_distance并选择距离最小的即相似度最高的文档。这种方法的优点在于它不受向量大小的影响只关注向量的方向。这意味着即使两段文本的长度相差很大只要它们的主题或语义相似它们的向量表示在方向上也会很接近从而获得较高的余弦相似度。为什么使用余弦距离而不是欧几里得距离在衡量向量相似度时除了余弦距离另一个常用的度量是欧几里得距离Euclidean Distance也就是空间中两点之间的直线距离。然而在语义相似度的场景下余弦距离通常是更好的选择。关注方向而非大小: 欧几里得距离衡量的是向量终点之间的绝对距离它会受到向量长度的影响。而余弦距离只关注向量之间的方向。在文本表示中向量的长度通常与文档的长度例如词语的数量有关。如果两篇文档讨论的是同一个主题但一篇很长一篇很短它们的向量表示在方向上可能很接近但终点之间的距离可能很远。在这种情况下余弦距离能够准确地捕捉到它们的语义相似性而欧几里得距离则会因为长度的差异而产生误判。高维空间中的稀疏性: 文本向量通常存在于非常高的维度空间中。在高维空间中数据点之间的距离会变得非常稀疏欧几里得距离的度量效果会下降。相比之下余弦距离在高维空间中仍然能够有效地衡量方向上的差异。总而言之当我们关心的是内容的“主题”或“意义”即方向而不是文档的“长度”即大小时余弦距离是更合适的度量方法。pgvector如何加速高维向量搜索正如我们所讨论的高维向量的余弦距离计算涉及大量的浮点运算。当数据库中有数百万甚至数十亿个向量时逐一计算查询向量与每个数据库向量之间的距离即“暴力”或“精确”搜索是极其耗时且不可行的。为了解决这个问题像pgvector这样的向量数据库采用了近似最近邻Approximate Nearest Neighbor, ANN搜索技术。ANN的核心思想是牺牲一点点精度来换取巨大的查询速度提升。它不保证找到绝对最相似的top-k个结果但在大多数情况下它找到的结果与真实结果非常接近足以满足应用需求。pgvector通过构建特殊的索引结构来实现ANN搜索。1. IVFFlat (Inverted File Flat)IVFFlat是一种基于聚类的索引方法。构建过程:聚类 (Clustering): 首先pgvector会使用k-means算法将数据库中所有的向量分成k个簇clusters。每个簇都有一个中心点centroid。倒排文件 (Inverted File): 然后它会创建一个“倒排文件”结构其中每个簇的中心点都指向一个列表这个列表包含了该簇中所有向量的ID。查询过程:寻找中心点: 当一个新的查询向量进来时pgvector会先计算它与所有k个簇中心点的距离。缩小搜索范围: 然后它会选择与查询向量最接近的n个簇n是一个可配置的参数远小于k。簇内搜索: 最后pgvector只在这n个被选中的簇内部进行精确的距离计算从而找到top-k个最相似的向量。通过这种方式pgvector避免了对整个数据集进行扫描而是将搜索范围缩小到了几个最有可能包含结果的簇中从而大大提高了查询速度。2. HNSW (Hierarchical Navigable Small World)HNSW是一种基于图的索引方法它在速度和精度方面通常比IVFFlat表现更优。构建过程:分层图 (Layered Graph): HNSW会构建一个多层的图结构。最底层包含了所有的向量。往上每一层都是下一层的“高速公路”包含的向量数量更少节点之间的连接也更稀疏。远近连接 (Long Short Links): 在每一层中每个节点向量都会与其他一些节点建立连接。这些连接既包括距离较近的“邻居”也包括一些距离较远的节点以确保图的连通性。查询过程:从顶层进入: 查询从最顶层的“高速公路”开始。pgvector会在这里找到一个最接近查询向量的节点作为入口点。逐层下降: 然后它会从这个入口点开始在当前层中导航不断寻找更接近查询向量的节点。当无法找到更近的节点时它就会进入下一层。底层精确搜索: 这个过程会一直持续到最底层。在最底层pgvector会进行更精细的搜索从而找到最终的top-k个结果。HNSW通过这种从稀疏到稠密的图导航方式能够非常快速地定位到查询向量所在的区域从而实现极高的查询效率。底层加速SIMD指令集如AVX512除了ANN索引算法之外pgvector还在更底层的硬件层面进行了优化。现代CPU支持**单指令多数据流Single Instruction, Multiple Data, SIMD**指令集例如AVX2和AVX512。什么是SIMD?: SIMD允许CPU在一个指令周期内同时对多个数据执行相同的操作。例如一个常规的CPU指令一次只能计算两个浮点数的加法而一条AVX512指令可以同时计算16个单精度浮点数的加法。如何加速向量计算?: 向量的距离计算无论是余弦距离还是欧几里得距离都包含大量的重复性数学运算如乘法、加法、开方。这些运算非常适合使用SIMD指令进行并行处理。pgvector会自动检测CPU是否支持这些高级指令集如果支持就会利用它们来并行计算多个向量维度从而将最核心的距离计算速度提升数倍。因此pgvector的快速响应能力是上层ANN算法和底层硬件指令集优化相结合的结果。ANN算法减少了需要计算的向量数量而SIMD指令则加快了每一次距离计算的速度。3D坐标图可视化为了更直观地理解向量和余弦距离我们可以想象一个三维空间。在这个空间中每个向量都可以被表示为一个从原点出发的箭头。两个向量之间的夹角越小它们的余弦相似度就越高。上图展示了三个向量A、B和C。向量A和B之间的夹角很小因此它们的余弦相似度很高意味着它们在语义上是相关的。而向量A和C之间的夹角较大因此它们的余弦相似度较低表示它们在语义上相差较远。余弦距离正是对这个夹角大小的度量。总结RAG通过结合检索和生成有效地提升了大型语言模型的性能。而向量余弦距离作为RAG核心的相似度度量方法在从海量信息中精准地检索出相关内容方面发挥着关键作用。理解余弦距离的数学原理以及pgvector等工具如何通过ANN算法和底层SIMD指令优化来高效地实现向量搜索有助于我们更深入地理解RAG以及其他基于向量嵌入的自然语言处理技术。