一、检索技术
掌握检索算法(如 HNSW 等)、向量数据库选择、Emdbedding 模型微调、文档切分算法、文本相似度计算方法、Query 理解、意图识别、混合检索等技术
掌握 文档切分算法、Emdbedding 模型微调、向量数据库选择、Query 理解、意图识别、文本相似度计算方法、检索算法(如 HNSW 等)、混合检索、重排等技术
1. 检索算法
在 RAG 中的应用:根据用户输入的 query 向量,在文档向量库中找到“最相似的文档”,供大模型(如 ChatGPT)后续回答参考。
用户输入 query(例如:"鲁迅的主要作品有哪些?")
↓
用 embedding 模型转成 query 向量
↓
FAISS(用 HNSW 索引)在文档库中查找“最相似的 N 篇文档”
↓
把 query 和检索到的文档拼在一起发给大模型
↓
大模型基于“真实知识片段”生成答案(增强了可靠性)
检索算法是一种用于在数据集合中查找特定信息或满足特定条件的数据项的算法。其目的是高效地从大量数据中定位到所需的数据,以满足用户的查询需求。以下从功能、实现方式和性能指标角度为你详细介绍:
- 功能
- 数据定位:能够根据用户输入的查询条件,在数据集合中准确找到与之匹配的数据记录。例如,在一个包含大量图书信息的数据库中,根据书名、作者或关键词等条件找到相关的图书记录。
- 相似性搜索:不仅能进行精确匹配查找,还能进行相似性搜索。比如在图像检索中,根据给定的图像特征,找到与之相似的其他图像;在文本检索中,找到与给定文本内容相似的其他文本段落。
- 实现方式
- 基于索引:先对数据集合建立索引结构,如倒排索引。在文本检索中,将每个单词与其出现的文档编号建立对应关系。这样在查询时,可直接通过索引快速定位到包含查询单词的文档,大大提高检索效率。
- 基于空间划分:将数据空间划分成不同的区域,如 KD - Tree 算法,将 K 维空间中的数据点通过不断地沿不同维度划分,组织成树形结构。在检索时,通过在树形结构中搜索,快速定位到可能包含查询点的子空间,减少搜索范围。
- 基于哈希:利用哈希函数将数据映射到哈希表中。如局部敏感哈希森林(LSH Forest),通过设计特殊的哈希函数,使相似的数据点在哈希空间中也能大概率地映射到相邻位置,从而实现快速检索。
- 性能指标
检索速度、准确性、可扩展性**:随着数据量的不断增加和数据维度的提高,算法能否保持较好的性能。好的检索算法应具有良好的可扩展性,能够适应大规模、高维度数据的检索需求。例如,在互联网公司处理海量的用户数据和各种类型的数据(如文本、图像、视频等)时,检索算法需要能够随着数据规模的扩大而有效地工作。
(1)FLAT(Brute - force,蛮力)
暴力检索,
原理:遍历所有向量,计算查询向量与每个向量的距离,找到最近的向量。在 Faiss 库中,FLAT 索引用一个数组存储所有向量,并通过线性扫描进行检索。
优点:召回率是 100%,
缺点:在大规模数据集和高维向量空间中,检索速度非常慢,计算量巨大。
适用于:数据量较小、对检索精度要求极高且对速度要求不高的场景。
训练时间复杂度:O(1)
推理时间复杂度:O(Nd)
(2)K 近邻算法
原理:
给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的 K 个实例,这 K 个实例的多数属于某个类别,就把该输入实例分类到这个类别。简单来说,就是 “近朱者赤,近墨者黑” 的思想,根据周围邻居的类别来推断自己的类别。
优点:
- 算法原理简单直观
- 无需训练
缺点:
- 对 K 值敏感:K 值的选择对分类结果影响较大。K 值过小,模型容易过拟合;K 值过大,模型可能会欠拟合。
- 样本不平衡问题:如果训练数据集中不同类别的样本数量差异较大,可能会导致分类偏差。例如,少数类别的样本可能被多数类别的样本包围,从而影响分类结果。
缺点:
- 数据量较小的分类问题:如对一些小型的图像数据集进行分类,判断图像属于猫、狗等不同类别。
- 实时性要求不高的场景:由于计算量较大,不适用于对实时性要求很高的任务,但在一些离线分析或对时间要求不严格的预测场景中可以发挥作用
训练时间复杂度:O(1)
推理时间复杂度:O(Nd)
(3)KD - Tree(K - Dimensional Tree)
原理:是平衡二叉树,这是一种用于对 K 维空间中的数据点进行组织和检索的数据结构。它通过不断地将数据空间沿着不同的维度进行划分,将数据点分配到不同的子空间中,形成树形结构。
在查询时,从根节点开始,根据查询点在各个维度上的值与节点的分割值进行比较,决定搜索路径,快速定位到可能包含查询点的子空间。
步骤:构建 KD - Tree 时,首先选择一个维度作为分割维度,(通常选择数据在该维度上分布范围最大的维度。)然后找到该维度上的中位数作为分割点,将数据集分为左右两个子集,分别递归地构建左子树和右子树。在检索时,从根节点开始,将查询点与当前节点进行比较,根据比较结果决定进入左子树还是右子树继续搜索,直到找到叶子节点或满足停止条件。
优点:
- 快速查询多维数据:在低维空间中,检索效率较高,能够快速定位到目标数据点或其近似点;对于小规模数据集,构建和查询速度都比较快。
- 灵活适应不同维度
缺点:
- 高维性能退化:在高维空间中,性能会急剧下降,出现 “维度灾难” 问题;
- 对稀疏数据不适用
适用场景:适用于低维空间中的数据检索,如二维或三维空间中的点数据检索,常用于地理信息系统(GIS)中查找地理位置附近的点【地理信息中的空间位置索引】、计算机图形学中的空间数据处理等场景。
训练时间复杂度:O(N·logN)
推理时间复杂度:O(logN)
(3)Ball-tree
原理:Ball - Tree 是一种基于空间划分的数据结构,它将数据点组织成一系列的球(超球体),每个球包含一定数量的数据点。通过计算球的中心和半径来表示球的范围,在查询时,利用球与查询点之间的距离关系,快速排除不包含查询点的球,从而缩小搜索范围。
步骤:构建 Ball - Tree 时,首先选择一个数据点作为初始球的中心,然后不断添加数据点到球中,直到球的半径达到一定阈值或不能再添加更多的数据点。接着,以新的未包含的数据点为中心,创建新的球,重复上述过程,直到所有数据点都被包含在某个球中。
在检索时,从根球开始,计算查询点与当前球的距离,如果距离大于球的半径,则该球及其子球都不可能包含查询点,可以直接排除;如果距离小于等于球的半径,则继续搜索该球的子球,直到找到目标数据点或遍历完所有可能的球。
优点:
- 在高维空间表示更好。在高维空间中,性能通常优于 KD - Tree。
- 对数据分布的适应性较好,能够处理各种分布的数据
缺点:
构建 Ball - Tree 的时间复杂度较高;在某些情况下,球的重叠可能导致不必要的搜索,影响检索效率。
适用场景:适用于处理高维数据和大规模数据集的检索问题,在机器学习中的最近邻搜索、图像检索等领域有广泛应用。
训练时间复杂度:O(N·logN)
推理时间复杂度:低维 O(logN),高维度是 O(N)
(4)LSH Forest (Locality - Sensitive Hashing Forest,局部敏感哈希森林)
原理:结合了局部敏感哈希(LSH)和森林结构的思想。
LSH 通过设计一系列的哈希函数,将相似的数据点映射到同一个哈希桶(空间)中,(使得在原始空间中距离相近的数据点在哈希空间中也有较高的概率被映射到相邻的桶中。
LSH Forest 则是通过构建多个 LSH 哈希表,并将它们组织成森林结构,进一步提高检索效率。
在查询时,通过对查询点进行多次哈希操作,找到与查询点的哈希值相近的桶,然后在这些桶中遍历数据点(更精确的查找),计算它们与查询点的实际距离,找到最近邻。
步骤:首先,根据数据的特点和 LSH 算法的要求,选择合适的哈希函数族,并初始化多个哈希表。对于每个数据点,通过哈希函数将其映射到各个哈希表的相应桶中。在构建森林时,将这些哈希表组织成树形结构,每个节点对应一个哈希表。
在检索时,对查询点进行同样的哈希操作,在森林中遍历各个哈希表,找到与查询点哈希值相近的桶,然后在这些桶中遍历数据点,计算它们与查询点的实际距离,找到最近邻。
优点:
- 高效查询,显著降低送搜索时间。
- 适用于高维数据,避免维度灾难
缺点:
- 检索结果是近似的,不一定能找到真正的最近邻;(召回率受限,可能遗漏部分近邻)
- 哈希函数的选择和参数调整对检索效果有较大影响,需要根据具体数据进行优化。
适用场景:适用于大规模高维数据的快速检索,如文本、图像、音频等数据的相似性搜索,在信息检索、推荐系统、数据挖掘等领域有重要应用。
训练时间复杂度:O(LND),构建 L 个哈西表,每个哈西表处理 N 个点的 d 维数据
推理时间复杂度:不确定
HNSW(Hierarchical Navigable Small World,分级导航小世界)
https://www.xiaohongshu.com/explore/663145cc000000001e039d8d?note_flow_source=wechat&xsec_token=CBXjcuhnciSbHTmzt2WROUfH_rtBn2Nv1dlA6OX4FXC60=
近似 K 近邻搜索的算法之一,可以在多维下达到 log(n)的查询速度,应用非常广泛(NLP、推荐、图像等)
HNSW 的多层结构,最上层是长距离连接,节点最稀疏,数据查询时从最上层查找最近邻,以上一层的 K 最近邻作为下一层查找的输入点。
HNSW 基于 NSW(Navigable Small World)结构,HNSW 的最底一层包含所有数据,相当于 NSW(它的查找是随机多次查找 K 最近邻)。数据结构构建的过程中某个数据点 出现的层数是随机的,用 K-Nearest Greedy Search 插入数据。HNSW 和 NSW 有一个理论基础(Small World),即著名的六度分割理论,你和世界上任何一个人的最近社交关系是 6 个人,实际上 Meta 上的平均最长距离只有 4. 这个理论基础证明近似查询的正确率有一个很高的上限(感兴趣的可以看这个论文 The Small-World Phenomenon: An Algorithmic Perspective * Jon Kleinberg)。大量数据情况下可以达到 99%以上正确率, 比上一篇帖子谈到的 ANNOY 算法还优秀。
数据查询结构的构建还有一些细节,比如用到了 Monte Carlo 算法,原论文需要付费下载,没看。Python 库 hnswlib 和 faiss 都可以实现它。
https://www.xiaohongshu.com/explore/66d7d519000000001e01b056?note_flow_source=wechat&xsec_token=CBmqbsVrI6H8ECRN4fDlTq2eS9Z00Fs2F1hhh7q9B5sOk=
在向量数据库中使用 HNSW(Hierarchical Navigable Small World)进行搜索的原理,分为三个部分:
1️⃣ 简单索引:Navigable Small World 图
向量一个接一个地添加,并连接到最近的邻居。每个节点都通过边与其他节点相连,形成一个小世界网络。
2️⃣ 查找与查询向量最近的邻居
从某个起点(A 节点)开始搜索,逐步找到离查询向量(Query)最近的节点。搜索过程是逐步从起始点移动到更接近查询向量的节点,直到找到最近的邻居为止。
3️⃣ 更高效的索引:Hierarchical Navigable Small World
将网络分层处理,每一层的概率不同(如 P=1/4, P=1/2, P=1),在较高层中快速粗略搜索,然后逐层下沉到更精确的层,最终找到最近的邻居。这种分层结构大大提高了搜索效率。
gpt:
原理:
- 基于小世界图(Small World Graph)结构 构建索引。
- 构建分层图结构,上层稀疏、下层密集,实现快速近似最近邻搜索。
优点:
- 查询速度快(log 级别),适合百万到亿级数据。
- 支持动态添加向量。
缺点:
- 构图时内存开销较大。
- 不适合频繁删除。
应用场景:
完全基于图的算法,适合数据分布稠密、需要高精度的场景。
- 向量数据库(如 FAISS、Milvus、Weaviate)常用索引类型。
训练时间复杂度:O(N·logN)
推理时间复杂度:O(logN)
IVF(Inverted File Index,倒排文件索引)
IVF、IVF-Flat 和 IVF-PQ 三种索引方法,它们都是 FAISS(Facebook AI Similarity Search)中常见的向量索引方式,用于加速大规模向量检索,尤其是在百亿级向量场景中被广泛应用。
https://www.bilibili.com/video/BV1ap421d7Hf?buvid=XU25AC924F7C15F4F571A580411A5F36DBA1B&from_spmid=search.search-result.0.0&is_story_h5=false&mid=LdltaPxVbLWzC4f6p5yoPA%3D%3D&plat_id=116&share_from=ugc&share_medium=android&share_plat=android&share_session_id=3df8a6a7-a36d-4871-8f6e-35b24d25d20c&share_source=WEIXIN&share_tag=s_i&spmid=united.player-video-detail.0.0×tamp=1746157854&unique_k=bPodayV&up_id=517221395&share_source=weixin
倒排索引:构建的单词到文档的映射
豆包:
-
原理:使用 K - means 聚类算法(或类似的聚类算法来实现簇的划分),将向量空间划分为多个子空间或簇,每个簇有一个质心(桶)。在查询时,先计算查询向量与各个簇的质心的距离,找到距离最近的簇,然后仅在这个簇内进行搜索,而不需要在所有向量中进行全局搜索,从而减少了搜索空间,提高检索效率。
✅ 本质是:先粗筛(聚类定位桶)→ 再细排(桶中做精确匹配) -
优点:通过聚类划分,显著减少了需要计算距离的向量数量,在大规模数据集上能有效提升查询速度;相比一些更复杂的算法,实现相对简单,对数据分布有一定的适应性。
-
缺点:
- 返回的结果是近似的,因为只在局部簇内搜索,不保证能找到全局的精确最邻近向量;
- 聚类结果对检索效果影响较大,如果聚类质量不好,可能导致检索精度下降。
- 适用场景:适用于大规模向量数据的检索场景,对检索速度有一定要求,但又能接受近似结果的情况,如一些非精确匹配的推荐系统、图像特征检索等领域。
IVF-Flat
- 原理:是基于倒排文件的近似算法。在找出最近的簇后,在该簇中执行精确的 L2 搜索(欧几里得距离计算),无需对所有向量进行全局搜索。
- 优点:
- 检索精度高(因为是精确计算)
- 在中等规模数据集上能平衡好检索速度和精度,且实现相对简单,索引构建和存储的复杂度适中。
- 缺点:由于是基于簇划分的近似搜索,不能保证返回的是全局最精确的最近邻向量;当数据量非常大或者对精度要求极高时,可能无法满足需求。
- 适用场景:适用于中规模数据集的检索场景,要求较快的查询速度,同时对精度有一定要求但并非极其严格,例如一些小型的图像或文本检索系统,以及对实时性有一定要求的推荐系统等。
https://www.xiaohongshu.com/explore/67af606a000000001703908b?note_flow_source=wechat&xsec_token=CBj7-iwfgOyo2XXk8bgTWX95vSzFfUxPkCnEV-prVhkKs=
核心思想:将向量空间划分为多个簇,每个簇对应一个倒排文件,搜索时先在簇中过滤数据,再进行精确计算。
实现方式:
通过聚类算法(如 K-Means)将数据分成若干组(簇)。
查询时,首先找到最接近的几个簇(通常通过中心点计算),然后在这些簇内进行精确的距离计算。
特点:IVF-Flat 是一种聚类+线性扫描的索引方法,适合数据分布稀疏、需要快速初步过滤的场景。
训练时间复杂度:O(kNd)
推理时间复杂度:O(kd)
IVF-PQ
倒排文件(IVF)和乘积量化(PQ)技术的结合
- 原理:桶内 不保存原始向量,而是使用 PQ(Product Quantization)压缩后存储。(基于倒排文件(IVF)和乘积量化(PQ)技术的组合索引。先采用与 IVF - Flat 相同的方式将数据集划分为多个簇,然后对每个簇内的向量使用 PQ 技术进行量化。PQ 将向量分为多个子向量,并对每个子向量进行量化,把原始向量用码本中的索引来表示,在查询时通过近似距离计算找到最相似的向量。)
✅ 本质是:粗筛 + 向量压缩 + 近似搜索 - 优点:
- 内存占用极低:通过量化,大大降低了内存占用和存储需求,特别适合大规模数据集;
- 检索速度快:在大规模向量搜索时,由于量化后的计算量减少,其效率比 IVF - Flat 更高。
- 缺点:
- 训练复杂:量化技术和倒排索引的结合使得训练过程比 IVF - Flat 更为复杂;
- 量化会造成一定的精度损失:由于量化过程会损失一定信息,检索精度相对 IVF - Flat 略低,且参数调优较为复杂。
- 适用场景:适用于大规模高维向量数据集的检索,尤其是存储和内存资源有限的情况,如大规模的图像、视频特征向量检索,以及大规模的文本向量检索等场景。对精度容忍度较高,如推荐系统、召回阶段
特性 IVF IVF-Flat IVF-PQ 基本原理 聚类建桶 聚类建桶 + 精确向量 聚类建桶 + 向量压缩 向量存储 不指定方式 原始向量 PQ 压缩后的向量 检索精度 中等 高 中低(可调) 内存占用 中等 高 低 检索速度 快 较快(精确) 非常快 适用场景 中等规模检索 小~中规模,高精度需求 大规模场景,对精度要求适中 - 原理方面:IVF 是基础的倒排文件索引,只进行聚类划分和基于簇的搜索;IVF - Flat 在 IVF 基础上,在簇内采用精确的 L2 搜索;IVF - PQ 则在 IVF - Flat 基础上,对簇内向量进行乘积量化,以压缩数据和加速查询。
- 性能方面:查询速度上,IVF - PQ 由于量化加速,在大规模数据下最快,IVF - Flat 次之,IVF 相对较慢;精度上,IVF - Flat 在簇内精确搜索,精度相对 IVF - PQ 高一些,不过都属于近似搜索,IVF 的精度受聚类质量影响较大;存储方面,IVF - PQ 通过量化存储需求最低,IVF - Flat 需要存储簇中心和簇内原始向量,存储开销中等,IVF 的存储与 IVF - Flat 类似但可能略高,因为未对簇内向量做任何压缩。
- 适用场景方面:IVF 适用于大规模数据的一般近似检索;IVF - Flat 适用于中规模数据、对精度要求相对较高且对速度有一定要求的场景;IVF - PQ 适用于大规模高维数据且存储和内存受限、对查询速度要求高的场景。
- IVF-PQ 为什么适合大规模检索?
- IVF-Flat 和 IVF-PQ 的检索精度有何差异?适用场景如何选择?
- IVF 的 nlist 和 nprobe 分别代表什么?如何影响性能与精度?
Annoy(Approximate Nearest Neighbors Oh Yeah,近似近邻哦耶)
是一个用于快速近似最近邻搜索的库,它基于随机投影和树形数据结构来实现高效的向量相似性搜索。
-
原理
- 随机投影:Annoy 将高维向量通过随机投影的方式映射到低维空间,在低维空间中构建树形数据结构。(随机投影矩阵是在初始化时随机生成的,并且在构建索引和查询阶段保持一致。)通过这种方式,将高维空间中的向量相似性问题转化为低维空间中的距离计算问题,从而降低计算复杂度。
- 树形数据结构:使用二叉树或其他树形结构来组织投影后的向量。树的每个节点将空间划分为两个子空间,通过比较向量在特定维度上的值来决定向量属于哪个子空间。这样,在查询时可以通过树的遍历快速缩小搜索范围,减少需要比较的向量数量。
-
步骤
- 构建索引:首先,将训练数据集中的向量通过随机投影映射到低维空间,然后按照树形数据结构的规则将这些向量插入到树中。在插入过程中,根据向量在投影空间中的值确定其在树中的位置,逐步构建起整个索引结构。
- 查询:对于给定的查询向量,同样先将其投影到低维空间,然后从树的根节点开始,根据查询向量在各个节点的划分维度上的值,沿着树的分支进行遍历,直到到达叶子节点或满足一定的停止条件。在遍历过程中,记录下与查询向量距离最近的若干个向量作为近似最近邻结果。
-
优点
- 高效性:通过随机投影和树形结构,大大减少了在大规模向量数据集中进行最近邻搜索的时间复杂度,能够快速返回近似最近邻结果,适用于处理高维向量和大规模数据集。
- 可扩展性:能够方便地处理不断增加的数据集,支持动态插入和删除向量,不需要重新构建整个索引,具有较好的扩展性和灵活性。
- 内存高效:Annoy 采用了一些优化策略来减少内存占用,例如可以将索引存储在磁盘上,在需要时按需加载到内存中,适合处理超出内存容量的大规模数据集。
-
缺点
- 近似结果:由于采用了近似搜索算法,不能保证返回的结果是精确的最近邻,而是近似最近邻。在一些对精度要求极高的场景中可能不太适用。
- 参数敏感性:索引的性能和结果质量对一些参数(如随机投影的维度、树的数量等)比较敏感,需要通过实验进行调优,以找到适合具体数据集和应用场景的参数设置。
- 不适合高动态数据:虽然支持动态更新,但在频繁插入和删除大量数据的情况下,索引的性能可能会下降,需要定期进行优化和重建。
-
适用场景
- 信息检索:在文本、图像、音频等数据的检索系统中,快速找到与查询对象相似的文档、图像或音频片段,例如在图片搜索引擎中,根据用户上传的图片找到相似的图片。
- 推荐系统:基于用户行为数据或物品特征向量,为用户推荐相似的物品或其他相似用户,如音乐推荐系统中,为用户推荐与其喜欢的音乐风格相似的其他歌曲。
- 数据挖掘和聚类分析:在大规模数据集中快速找到相似的数据点,用于聚类分析、异常检测等任务,帮助发现数据中的潜在结构和模式。
训练时间复杂度:O(N·logN)
推理时间复杂度:待定
https://www.xiaohongshu.com/explore/67130e5700000000260361cc?note_flow_source=wechat&xsec_token=CBCGioAZogXn-65wbspy4aUkiCA-8309k9fULv20DA4ko=算法 训练复杂度(Train) 推理复杂度(Search) 说明与备注 Flat / Brute-force O(1)无需构建索引,直接存储数据。(无需训练) O(N·D)线性扫描所有数据点,计算查询点与每个点的距离。 精度高,速度慢,常作为基线方法 KNN(暴力法) O(1)无需构建索引,直接存储数据。 O(N·D)线性扫描所有数据点,计算查询点与每个点的距离。 与 FLAT 相同,本质为暴力对比 KD-Tree O(N·logN) 递归划分数据空间,每次划分需 O(N) 时间,共 O(log N) 层 O(logN)(低维) / ((O(N)(高维) 适合低维(D≤20),高维退化为线性搜索 Ball-Tree O(N·logN) O(logN)(低维) / O(N)(高维) 与 KD-Tree 类似,但更适合欧式距离 HNSW O(N·logN) O(logN)(子线性) 精度高、速度快,广泛使用,结构复杂 LSH Forest O(LNd) 构建 L 个哈希表,每个哈希表处理 N 个点的 d 维数据。 ((O(N1/k) 子线性查询,依赖哈希函数设计,适合余弦/汉明距离 Annoy O(t·N·logN)构建 t 棵二叉树,每棵树构建时间为 O(N log N) O(logN) × 树数量【遍历每棵树的路径,搜索 t 棵树。】 适合只读应用(如推荐系统) IVF(倒排文件) O(Nkd)(k-means 聚类) O(kd) 先找中心再比邻居,k=簇数 ((IVF-Flat O(N)(聚类) O(D + N/k) IVF+Flat 为每个簇线性扫描 ((IVF-PQ O(N + PQ 编码训练) O(D/kp + r) IVF + PQ 压缩加速,r 为候选数,适合大规模
-
N:数据库中向量数量
-
D:向量维度
-
k:聚类中心数(IVF)
-
r:候选向量数量
-
kp:PQ 的子空间维度(PQ 会将 D 切成若干块)
🧪 常见应用建议
算法 | 是否适合大规模 | 是否需要训练 | 精度 | 速度 | 适用场景 |
---|---|---|---|---|---|
Flat | ❌(慢) | 否 | ✅ 高 | ❌ 慢 | 精度基准,小数据集 |
KD-Tree | ❌(高维差) | 是 | ✅ | ⚠️ | 低维数据(D<20) |
HNSW | ✅ | 是 | ✅ 高 | ✅ 快 | 大规模、实时搜索系统 |
Annoy | ✅(只读场景) | 是 | ✅ | ✅ | 推荐系统、嵌入式搜索 |
IVF-Flat | ✅ | 是 | ✅ | ✅ | RAG 系统、文档搜索 |
IVF-PQ | ✅ | 是 | ⚠️ 可调 | ✅ 极快 | 向量压缩、大规模推理 |
2. 向量数据库选择
概念:专门存储向量数据,支持高效的向量检索。
向量检索通过计算查询向量和数据库中的向量相似度,快速找到最匹配的向量。这种技术广泛应用于 推荐系统、图像识别、NLP 等领域。
作用:
向量数据库起着 知识记忆、外部知识增强和相似性搜索 的关键作用,主要用于:
- 向量化语义检索:支持根据语义相似性查找文本/图像/音频等。
- RAG(Retrieval-Augmented Generation):与大模型结合,把检索到的外部知识输入 LLM,增强回答准确性。
- 去重/聚类/推荐:通过 Embedding 相似性去除重复、做相似推荐。
- 构建企业私有知识库:支持上传文档后智能问答。
什么阶段使用:
✅ 下游应用阶段 / 推理阶段 / 增强阶段 会使用,特别是在 RAG(检索增强生成) 场景中使用频繁。
向量数据库不在预训练和微调阶段使用,而是在模型部署后的应用阶段使用,用于增强模型知识覆盖能力。
数据库 | 支持索引 | 支持过滤 | 分布式 | 特点 |
---|---|---|---|---|
FAISS | HNSW/IVF | 否 | 否 | Facebook 出品,性能优 |
Milvus | HNSW/IVF | 是 | 是 | 适合生产级应用,开源,内置语义搜索能力,支持 GraphQL 查询 |
Weaviate | HNSW | 是 | 是 | 支持 Hybrid 检索 |
Qdrant | HNSW | 是 | 是 | 轻量级,支持 REST 接口,Rust 写的高性能数据库,API 友好 |
3. Embedding 模型微调
对预训练好的 文本嵌入模型(如 BERT、Sentence-BERT、E5、GTE 等)在特定任务/领域数据上继续训练,(以适配特定应用,如问答匹配、向量检索、语义搜索等。)这种方式保留了预训练模型的通用语义能力,同时让其更贴合目标场景。
方法:通常采用反向传播算法,将模型输出与标注信息进行对比,计算损失函数,然后根据损失来更新模型的参数。也可以采用一些无监督的微调方法,如对比学习,通过让模型学习相似样本和不同样本之间的差异,来优化 Embedding 表示。
目标:
- 提高语义匹配质量:提升下游检索效果,在语义检索、问答匹配中大幅提高精度
- 适应领域专属词汇(法律、医疗等):针对具体任务进行优化,提高模型在特定任务上的性能。
缺点:
- 需要构造高质量标注数据
常用微调工具 / 框架
- 🤗
sentence-transformers
- OpenAI 的
text-embedding-3
也支持部分微调流程(API) - BGE Embedding
- Langchain / LlamaIndex 中也可插入自定义向量模型
适用场景:
- 医疗健康领域:学习专业术语,药名等
- 客服聊天:学习口语化、非标准的表达,总是卡死、求退差价
构建训练数据
通常需要构建三种形式之一的数据:
- (query, positive, negative) 三元组(Triplet loss)
- (query, positive) + 生成负样本(Contrastive loss,对比损失)
- (query, document, label)(Cross-entropy softmax loss)
选择损失函数:
损失函数 | 简要说明 |
---|---|
Triplet Loss | 拉近正样本距离,推远负样本 |
Contrastive Loss | 判断样本对是否相似 |
Multiple Negative Ranking Loss (MNRL) | 多负对比,适合无监督大规模训练 |
Cosine Similarity + MSE | 常用于打分任务 |
什么是 Embedding 模型
EMbedding 模型通常是一个 预训练好的神经网络模型,你把一句话输入进去,它就会输出一个向量,比如:
模型名称 | 框架 | 特点 |
---|---|---|
text-embedding-ada-002 | OpenAI | 英文、通用 |
bge-base-zh | BAAI | 中文优化 |
m3e-base | 中文/多语言,性能优异 | |
sentence-transformers | HuggingFace | 多语种、多任务 |
在 RAG 里的作用是什么?
RAG = 检索(Retrieval)+ 生成(Generation),embedding 模型用在检索部分:
- 构建知识库:先用 embedding 模型把所有知识文档转成向量,存到向量数据库(如 FAISS、Milvus)。
- 用户提问:把用户的问题也用 embedding 模型转成向量。
- 检索相关文档:在向量空间里,找到与用户提问“最接近”的知识文档。
- 交给大模型生成回答(比如 GPT、BLOOM 等)。
[用户问题] --> [embedding 模型] --> 问题向量
|
在向量数据库中找相似文档
↓
[找出的文档 + 问题] → [大模型生成回答]
常见误解澄清
误解 | 正确说法 |
---|---|
“embedding 是大模型的一部分” | ❌ embedding 模型和生成模型是分开的 |
“一个 embedding 模型能适用所有场景” | ❌ 不同语言、场景需要不同的 embedding |
“向量是固定词的表示” | ❌ 现代 embedding 是上下文相关的句子表示 |
如果你是实习生,应该掌握的几点
- Embedding 的基本定义(文字转向量)
- 常用的中文 embedding 模型(比如
bge-base-zh
,m3e-base
) - 向量数据库怎么存储这些向量(如 FAISS)
转成向量后,FAISS 以矩阵 + 索引结构的形式存储(通常在内存)
✅ 两种常见存储方式:
索引类型 | 存储方式 | 特点 |
---|---|---|
IndexFlatL2 | 全量内存,直接存向量矩阵 | 精确、但慢 |
IndexHNSWFlat / IndexIVFFlat | 构建图结构或倒排索引 | 快速、近似 |
✅ 举个例子:
- 你有 10,000 篇文档,每篇通过 embedding 转成 768 维向量。
- 所有向量组成一个矩阵,大小为
[10000 x 768]
- FAISS 把这个矩阵载入内存后,为它建立一个近似索引结构(比如 HNSW 图)
- 注意:索引结构 != 原始向量,它是额外生成的加速搜索用的数据结构。
✅ 存储位置:默认在内存中,也可以
faiss.write_index
将索引结构保存到磁盘。
- 如何计算相似度(如余弦相似度、L2 距离,又叫欧式距离)
一般使用 余弦相似度:将向量归一化后用点积(FAISS 用 IndexFlatIP)即可 - 在 RAG 中,embedding 是“检索”阶段的核心
4. 文档切分算法
RAG 应用中遇到的外部文档可能会非常大。
因此,需要通过分块(chunking)将大型文档划分为更小且可管理的部分。
这样可以确保文本适配嵌入模型的输入大小,同时还能够提高检索质量。
👇👇 以下是适用于 RAG 的五种分块策略:
1️⃣ 固定大小分块(FIxed-size chunking)
https://www.xiaohongshu.com/explore/67d283b9000000001d0063cc?note_flow_source=wechat&xsec_token=CB9E1a5_0BvxsaX2gAbIBUNilrYW55UchifOWwROhYDok=
概念:按预定义的字符数、单词数或 Token 数量对文本进行切分。
注意:由于直接分割会破坏语义流,所以建议 2 个连续的块之间保持一些重叠,例如蓝色部分
优点:实现简单
缺点:可能会将句子截断,从而导致信息分散在不同的块中。
2️⃣ 语义分块
概念:根据句子、段落或主题等有意义的单元对文档进行分段。
为每个片段创建嵌入:
- 如果二个段的嵌入 具有较高的余弦相似度,就把这两个块形成一个块。
- 持续将单元添加到现有块中,直到余弦相似度显著下降。依赖阈值来确定余弦相似度是否显著下降
- 一旦下降明显,就开始新的分块。
优点:
- 与固定大小分块不同,这种方法能够保持语言的自然流畅性。
- 由于每个块都更丰富,提高了检索的准确性,进而使 LLM 产生更连贯和相关的信息
3️⃣ 递归分块
🔹 基于内在分隔符(如段落或章节)进行分块。
🔹 如果某个块的大小超过限制,则将其进一步分割为更小的块;如果块的大小没有超过限制,就不会进一步拆分
优点:这种方法能够保持语言的自然流畅性。
缺点:实施和计算复杂性有一些额外开销
如上图所示,首先定义 2 个块(2 个紫色段落)
然后将第一段进一步分割成更小的块
4️⃣ 基于文档结构的分块
概念:利用文档的固有结构(如标题、章节或段落)进行分块。
优点:这种方法能够保持文档的自然结构,但前提是文档具有清晰的结构。
缺点:
- 文档可能没有清晰的结构
- 分割后的块可能长度不同,可能会超出模型的令牌限制,可以尝试使用地柜拆分进行合并。
5️⃣ 基于 LLM 的分块
概念:使用提示引导 LLM 生成有意义的分块
优点:这种方法能够保留语义准确性,因为 LLM 可以理解上下文和含义。
缺点:计算成本较高,并受限于 LLM 的上下文长度。
5. 文本相似度计算
(1)编辑距离(Edit Distance / Levenshtein Distance)
计算从字符串 A 变成 B 所需的最小编辑操作次数(插入、删除、替换),编辑距离越小表示越相似
优点:
- 易于实现
- 无需训练
缺点:
对语义不敏感,如 “dog” 和 “puppy” 语义相似但编辑距离大
适用场景:
拼写纠错、DNA 序列比对
(2)Jaccard 相似度
概念:计算 2 个集合的交集 / 并集,来计算相似度
- 优点
- 简单直观:基于集合的交集和并集计算相似度,概念简单,容易理解和实现。
- 对文本长度不敏感:Jaccard 相似度只关注集合中元素的共同性,不依赖于文本的长度,因此在处理不同长度的文本时具有较好的稳定性。
- 缺点
- 忽略词序:将文本转换为集合后,会忽略词的顺序信息,导致一些语义相近但词序不同的文本可能被判定为相似度较低。
- 对停用词敏感:如果文本中包含大量的停用词(如“的”“是”“在”等),这些停用词会影响集合的交集和并集计算,从而降低相似度计算的准确性。
- 忽略词频、词顺序、语义
- 适用场景:适用于对词序不太敏感,更关注文本中词汇共同性的场景,如文档分类、网页去重等。
(3)TF-IDF + Cosine 相似度(Term Frequency - Inverse Document Frequency)
TF-IDF:反应词语在文档中的重要性
Cosine 相似度度量两个向量夹角(语义相似),夹角越小,cos 值越大,即方向越一致
- 词频(TF):指的是词语在文档中出现的频率。词频越高,说明该词在文档中越重要。计算方式为某词在文档中出现的次数除以文档的总词数。
- 逆文档频率(IDF):是一个词语普遍重要性的度量。如果一个词在很多文档中都出现,那么它的区分度可能就不高,对文档的重要性相对较低;反之,如果一个词只在很少的文档中出现,那么它对这些文档的重要性就较高。计算方式是文档集的总文档数除以包含该词的文档数,再取对数。例如,在一个包含 1000 篇文档的文档集中,“苹果” 出现在 100 篇文档中,那么 “苹果” 的逆文档频率就是(\log(1000\div100)=\log(10)\approx1)。
- TF - IDF 值:是将 TF 和 IDF 相乘得到的结果。它综合考虑了词在文档中的出现频率以及在整个文档集中的稀有程度,用于衡量一个词对特定文档的重要性。TF - IDF 值越高,说明该词对文档的重要性越高。
优点:
- 速度快
- 能识别关键词
缺点:
不理解语义,不能处理词义相同但词不同的情况
适用场景:
文档初步匹配、传统搜索系统
(4)BM25(Best Matching 25,改进的 TF-IDF)
(通过计算查询词在文档中的出现频率、文档的长度以及整个文档集合中包含该查询词的文档数量等因素,来评估文档与查询的相关性。
(更精准的加权词频 + 文档长度归一化
相较于 TF-IDF,BM25 考虑了文档长度,进行了文档长度归一化
- 具体来说,BM25 考虑了三个主要因素:
- 词频(TF):即查询词在文档中出现的次数。一般来说,查询词在文档中出现的频率越高,该文档与查询的相关性可能越高。
- 文档长度归一化:长文档通常包含更多的词,因此可能会有更高的词频,但这并不一定意味着它们与查询更相关。BM25 通过对文档长度进行归一化处理,来避免长文档在相关性得分上的不公平优势。
- 逆文档频率(IDF):与 TF - IDF 中的 IDF 类似,它衡量了一个词在整个文档集合中的稀有程度。如果一个词在很少的文档中出现,那么它对区分相关文档和非相关文档的作用更大,其 IDF 值就会较高。
优点:
- 考虑因素全面:综合考虑了词频、文档长度和逆文档频率等多个因素,能够更准确地评估文档与查询的相关性,相比简单的词频统计方法,能更好地处理不同长度文档和不同词分布的情况。
- 效果较好:在各种信息检索任务中,如搜索引擎、文献检索系统等,BM25 通常能取得较好的检索效果,能够将与查询相关度较高的文档排在前面,提高检索的准确性和用户满意度。
缺点:
忽略词序、语义
适用场景:
尤其是做 “混合检索(hybrid search)” 时,经常将其和 embedding 检索结合,提升检索多样性和召回率。
- 搜索引擎:用于计算网页与用户查询之间的相关性得分,对搜索结果进行排序,帮助用户快速找到相关的信息。
- 文档检索系统:在企业内部的文档管理系统、学术文献数据库等中,用于根据用户的查询检索相关的文档,提高文档检索的效率和准确性。
- 信息过滤:根据用户的兴趣和需求,从大量的文本信息中筛选出相关的内容,例如在新闻推荐系统中,根据用户的浏览历史和兴趣关键词,筛选出相关的新闻文章。
(5)Word2Vec + 平均词向量
原理:把词表示为稠密向量(如 CBOW、Skip-gram),句子表示为词向量平均
Word2Vec 是一种将「词」转换为「向量」的模型。把每一个词变成一个多维坐标(比如 300 维),在向量空间中语义相近的词距离也更近。
Word2Vec 两种训练方式:
- CBOW(Continuous Bag of Words,词袋模型):用上下文预测当前词。
- Skip-gram(跳字模型):用当前词预测上下文。
二者都会训练出词的稠密向量(dense vector),这就是词嵌入(embedding)。
Word2Vec 只对「词」有效,它不会直接输出句子的向量。所以,为了把一句话变成向量,把句子的每个词的向量加起来求平均,作为句子的向量表示。
✅ 举个例子:
句子:
“I love NLP”
步骤如下:
-
查词向量:
- I → v₁ = [0.1, 0.3]
- love → v₂ = [0.4, 0.6]
- NLP → v₃ = [0.2, 0.8]
-
求平均:
- 句向量 = (v₁ + v₂ + v₃) / 3
- = ([0.1 + 0.4 + 0.2, 0.3 + 0.6 + 0.8]) / 3
- = [0.2333, 0.5667]
优点:
- 能捕捉语义信息(初步能力)(例如 “dog” 和 “puppy” 会比较近)。
- 非常快,不需要训练句子模型。
缺点:
- 忽略词序(“A loves B” 与 “B loves A” 表示一样)。
- 忽略上下文信息、全局信息(polysemy 问题:同一个词在不同句子里可能语义不同,但向量固定)。
- 对长句子或语法复杂句子效果差、窗口有限。
适用场景:
- 文本聚类(初步分类)
- 相似度检索(简单句子)
- 零资源、低资源场景(没法用 BERT 等大模型时)
效果不如 Sentence-BERT 系列 embedding 好
(6)BERT / Sentence-BERT + Cosine 相似度
原理:使用预训练语言模型对整个句子建模,直接输出语义向量
优点:
语义理解强,适合复杂句子
缺点:
模型大,计算慢(可配合 Faiss 做检索优化)
适用场景:
智能客服、语义搜索、问答匹配、RAG
(7)DSSM / Siamese / 双塔网络
通过两个独立的塔(两个神经网络)分别对 query 和文档进行向量化表示,通过计算两个向量的相似度,来判断查询和文档之间的关系
优点:
- 精度高,可微调
- 可部署向量检索
缺点:训练成本较高
适用场景:问答匹配、推荐排序、商品匹配
方法类型 | 模型代表 | 是否考虑语义 | 推理速度 | 准确率 | 是否可训练 | 适用任务 |
---|---|---|---|---|---|---|
字符匹配 | Edit Distance | 否 | 快 | 低 | 否 | 拼写纠错、基础比对 |
关键词统计 | TF-IDF, BM25 | 否 | 快 | 中 | 否 | 搜索引擎初步匹配 |
静态嵌入 | Word2Vec | 弱 | 快 | 中 | 否(可微调) | 轻量级语义分析 |
动态嵌入 | BERT, SBERT | 是 | 较慢 | 高 | 可微调 | 问答匹配、语义检索 |
双塔结构 | DSSM, Siamese BERT | 是 | 快 | 高 | 是 | 检索式问答、相似匹配 |
交叉结构 | Cross-Encoder | 是 | 慢 | 最高 | 是 | 精排、精确匹配任务 |
6. Query 理解
https://www.xiaohongshu.com/explore/674b08790000000006014790?note_flow_source=wechat&xsec_token=CBTsqh2MEBDbks81A_5DUPOKPAavJDH1NYMT8SrksrLO8=
为什么要进行 query 理解
在 RAG 系统中,进行 query 理解是非常关键的一步。
概念:query 理解指的是对用户提出的问题进行深入分析,提取出关键信息,
目标:从而更准确地从知识库中检索出与用户查询最相关的信息,进而生成高质量的回答。
在 RAG 系统中,对用户 query 进行理解,包括但不限于以下原因:
1、用户表达的模糊性
2、query 和 doc 不在同一个语义空间
用户的 query 通常是非结构化的,可能使用非正式或口语化的语言进行自由表达,而文档则可能采用正式的书面表达。query 理解可以帮助将用户的表述转换为文档中术语,从而提高召回率。(实际为正例的样本中,被模型正确预测为正例的比例,高召回率表示能够尽可能全面地找到所有包含相关信息的文本)
比如,用户输入「手机坏了怎么办」,而文档中可能使用的是「手机维修步骤」这样的表述。
当用户的 query 和文档不在同一个语义空间时,这增加了检索系统的复杂性,因为它需要在不同的表达方式、术语使用、上下文信息等方面建立
联系。
3、用户的 query 可能比较复杂
用户的 query 有时可能涉及多个子问题或包含多个步骤,需要将复杂的 query 分解成更易处理的部分,逐一进行处理, 以便提供准确和完整的答案。
处理复杂 query 时,RAG 系统需要能够识别并分解用户的查询,将其拆分为更小、更具体的子问题。这样不仅可以提高检索的准确性,还可以使生成的回答更加精确和相关。
query 理解有哪些技术(从 RAG 角度)
在 RAG 系统中,query 理解技术是提高信息检索效率和准确性的关键。
我把当前常用的 query 理解技术分为三大类: query 改写、query 增强和 query 分解,如图所示。
(1)上下文信息补全
在多轮对话中,用户的当前输入往往包含隐含的指代关系和省略的信息。
例如,用户在对话中提到的「它」可能指代之前对话中提到的某个具体事物。如果缺乏这些上下文信息,系统无法准确理解用户意图,从而导致语义缺失,无法有效召回相关信息。
在这种情况下,我们可以使用上下文信息补全,(这里的上下文不仅仅是指多轮对话的信息,还包含当前对话的背景信息,比如时间、地点等。)我们可以通过使用大型语言模型(LLM) ,对当前 query 进行重写,将上下文中隐含的信息纳入到新生成的 query 中。
下面是一段多轮对话的示例:
1 user: 最近有什么好看的电视刷:
Bot:最近上映了《庆余年 2》,与范闲再探庙堂江湖的故事
user:我想看第一季
「 我想看庆余年第一季」
(在这个例子,用户的问题「 我想看第一季」 包含了隐含的指代信息,没有上下文信息的补全,系统无法知道具体指的是哪部电视剧。通过采用上
下文信息补全,我们把前面的对话信息也纳入其中,对 query 进行改写,可以生成类似「 我想看庆余年第一季」的完整 query,从而提高后续检索
的清晰度和相关性。)
优点:上下文信息补全可以提高 query 的清晰度,使系统能够更准确地理解用户意图。
缺点:因为需要多调用一次 LLM,会增加整体流程的 latency 问题。因此,我们也需要权衡计算复杂度和延迟的问题。
(2)RAG-Fusion(RAG 融合)
(RAG Fusion 旨在提升搜索精度和全面性
核心原理:根据用户的原始 query 生成多个不同角度的 query,以捕捉 query 的不同方面和细微差别。然后通过使用逆向排名融合( Reciprocal Rank Fusion, RRF)技术,将多个 query 的检索结果进行融合,生成一个统一的排名列表, 从而增加最相关文档出现在最终 TopK 列表的机会。
RAG Fusion 的整体流程如图所示,工作流程如下
(1)多查询生成:直接使用用户输入的 query 进行查询,查询结果可能太窄导致无法产生较为全面的结果。通过使用 LLM 将原始查询扩展成多样化的查询(根据用户的原始 query 生成多个不同角度的 query),从而增加搜索的广度(视野)和深度。
(2)逆向排名融合(RRF,Reverse ranking fusion) : 将多个 query 的检索结果进行融合,生成一个统一的排名列表, 从而增加最相关文档出现在最终 TopK 列表的机会。(RRF 是一种简单而有效的技术,用于融合多个检索结果的排名,以提高搜索结果的质量。它通过将多个系统的排名结果进行加权综合,生成一个统一的排名列表,使最相关的文档更有可能出现在结果的顶部。这种方法不需要训练数据,适用于多种信息检索任务,且在多个实验中表现优于其他融合方法。
(3)生成性输出:将重新排名的文档和查询输入到 LLM,生成结构化、富有洞见的答案或摘要。
(3)Multi-Query
跟 RAG Fusion 类似, MultiQuery 是一种通过生成多种视角的查询来检索相关文档的方法。
跟 RAG Fusion 不同的是,MultiQuery 没有使用 RRF 来融合多个搜索结果列表的排名,而是将多个搜索结果放到 context 中。
这样做的好处:
- 保留更多的检索结果,提供更丰富的信息源,
- 同时减少了在排名融合上的复杂性。通过这种方法,用户可以获得更加多样化和全面的信息集合,有助于更好地理解和回答复杂的问题。
(4)HyDE(Hypothetical Document Embeddings)
通常,RAG 向量检索通过使用内积相似度来度量查询(query) 和文档(doc)之间的相似性。事实上,这里存在一个挑战: query 和 doc 不在同一个语义空间(前面已经介绍) ,通过将 query 和 doc 向量化,然后基于向量相似性来检索,检索的精度有限而且噪声可能比较大。为了解决这个问题,一种可行的方法是通过标注大量的数据来训练 embedding 函数。
而 HyDE ( 假设性文档嵌入,Hypothetical Document Embeddings)技术是一种无监督的方法,它基于这样一个假设: 与 query 相比,假设性回答(LLM 直接对 query 生成的答案)与文档共享更相似的语义空间。
HyDE 具体是怎么工作的呢?
首先,HyDE 针对 query 直接生成一个假设性文档或者说回答(hypo_doc) 。然后,对这个假设性回答进行向量化处理。最后,使用向量化的假设性回答去检索相似文档。
经过这么一顿操作,以前的 query - doc 检索就变成了 query -hypo_doc - doc 的检索,而此时 hypo_doc 和 doc 可能在语义空间上更接近。因此,HyDE 可以在一定程度上提升文档检索的精准度和相关度。
举个例子,假设用户提问「如何提高睡眠质量?」,HyDE 首先生成一个假设性回答,比如「提高睡眠质量的方法包括保持规律的睡眠时间、避免咖啡因和电子设备等。」,这个假设回答经过编码后,可能与提供的知识库中的文档内容( 如不喝咖啡,不玩手机等电子设备)更接近,从而更容易找到相关文档。
可以提升检索阶段中的 embedding 质量,从而增强向量检索效果
优势:
- 避免了在同一向量空间中学习两个嵌入函数的复杂性
- 利用无监督学习,直接生成和利用假设文档。
- 在缺乏标注数据的情况下,仍能显著提高检索的准确性和效率。
缺点:
因为 HyDE 强调问题的假设性回答和查找内容的相似性,因此也存在着不可避免的问题,即,假设性回答的质量取决于大型语言模型的生成能力,如果模型生成的回答不准确或不相关,会影响检索效果。例如,如果讨论的主题对 LLM 来说比较陌生,这种方法就无效了,可能会导致生成错误信息的次数增加。
(5)Step-back prompting
Step-back prompting 技术旨在提高LLM 进行抽象推理的能力,它引导 LLM 在回答问题前进行深度思考和抽象处理,将复杂问题分解为更高层次的问题。
Step-Back Prompting 包含两个主要步骤:
- 抽象(Abstraction) :不是直接针对问题进行回答,而是首先促使 LLM 提出一一个更高级别的「回溯问题」(step-back question),这个问题涉及更广泛的高级概念或原则,并检索与这些概念或原则相关的相关事实。
- 推理(Reasoning) :在高级概念或原则的基础上,利用语言模型的内在推理能力,对原始问题进行推理解答。这种方法被称为基于抽象的推理(Abstraction-grounded Reasoning)。
(研究者在多个挑战性推理密集型任务上测试了 Step- Back Prompting,包括 STEM、知识问答( Knowledge 0A)和多跳推理( Multi-Hop
Reasoning)。实验涉及 PaLM-2L、GPT-4 和 Llama2-70B 模型,并观察到在各种任务上的性能显著提升。例如,在 MMLU (物理和化学)上,
PaLM-2L 的性能分别提高了 7%和 11%,在 TimeQA 上提高了 27%,在 MuSiQue.上提高了 7%。)
Step-Back Prompting 适用于需要复杂推理的领域,如:
●STEM 领域:涉及物理和化学等科学原理的应用问题。
● 知识问答:需要大量事实性知识的问题回答。
● 多跳推理:需要通过多个步骤或信息源进行推理的问题。
(6)IR-CoT(Interleaving Retrieval with Chain-of-Thought Reasoning,交错检索与思维链推理)
https://www.xiaohongshu.com/explore/666677c0000000000d00c652?note_flow_source=wechat&xsec_token=CBNmxY1XGmURdbqXx2VT1o1z3hg8FTxGkEXLyxi8E_Wj4=
IR-CoT,是一种用于解决多步骤问题(Multi-Step Questions)的技术。IR-CoT 通过交替执行检索(retrieval)和推理(生成)(reasoning) 步骤来提高大型语言模型(LLMs) 在处理复杂问题时的性能。
如图所示,
- 初始问题: Lost Gravity 是在哪个国家制造的?
- CoT生成与检索步骤交替:
● 第一步检索:系统首先进行一次检索,获得相关信息,结果发现「Lost Gravity 是由 Mack Rides 制造的」
● 第二步检索:基于之前的结果,系统进行进一步的检索,发现「Mack Rides 是一家来自德国的公司」
● 第三步检索:继续累积文档,确认这一信息。 3.最终回答:根据累积的信息做出回答:「答案是德国」 。
IR-CoT 通过交替进行 CoT 生成和检索步骤,使得每一步的检索过程都受到前一步的推理结果指导,从而可以更精确地定位相关信息。
这相比于传统的单次检索方法,即只使用初始问题作为查询的方式,能够获得更多相关且精确的信息,提高了最终答案的准确性。
(7)Least-to-Most
Least-to-Most prompting 也可以用于解决多步推理的问题,它将复杂问题分解为一系列更简单的子问题,并按顺序解决这些子问题。
Least-to-Most prompting 包括两个主要阶段:
- 分解(Decomposition) : 在这个阶段,将复杂问题分解为更简单的子问题。
- 子问题解决(Subproblem Solving) :在这个阶段,使用之前解决的子问题的答案来帮助解决当前子问题。
这种方法的核心思想是将问题分解为可管理的步骤,并利用逐步构建的答案来指导模型解决更复杂的问题。
如图所示,展示了如何通过两阶段的方法使用 LLM 解决一个数学题。
问题: Amy 爬到滑梯顶部需要 4 分钟,从滑梯滑下需要 1 分钟。水滑梯将在 15 分钟后关闭。她在关闭之前可以滑多少次?
阶段 1:将问题分解为子问题
LLM 将复杂问题分解为更小的子问题:为了回答「她在关闭之前可以滑多少次?」,我们需要先解决 )「每次滑行需要多长时间?」的问题。
阶段 2:依次解决子问题
子问题 1:问:每次滑行需要多长时间?答: Amy 爬上滑梯需要 4 分钟,滑下来需要 1 分钟。因此每次滑行需要 5 分钟。
子问题 2:问:她在关闭之前可以滑多少次?答:水滑梯将在 15 分钟后关闭。每次滑行需要 5 分钟。因此 Amy 可以滑 15+ 5= 3 次。
7. 意图识别
https://www.xiaohongshu.com/explore/67da3647000000001c001550?note_flow_source=wechat&xsec_token=CB_4pzR21xgt4GLCg_HmMc2XMMURSVFThr44-oZxz_EZM=
什么是意图识别?
在任务型多轮对话中,意图识别是一个关键的环节。
意图识别是指从用户输入的对话内容(如文本、语音等形式)中分析并判断出用户的目的或者意图。
- 用户问:「我想订明天下午去上海的机票」
- ➤ 意图:订机票
- 用户问:「你会讲笑话吗?」
- ➤ 意图:获取娱乐
意图识别的具体作用:
- 有效引导对话流程:它能够帮助对话系统理解用户想要做什么,从而决定对话的走向。如果系统正确识别了用户是要查询订单状态,就可以引导用户提供订单相关的信息,如订单号等,以便完成查询任务。
- 提高对话效率:准确的意图识别可以避免系统对用户的回答驴唇不对马嘴。比如,当用户意图是退货,系统不会误解为换货而提供错误的引导步骤,从而让用户更快地得到想要的服务,减少对话的轮数。
- 增强用户体验:当系统能够精准理解用户意图时,用户会感觉自己的需求被重视和理解。相反,如意图识别错误,用户可能会因为反复解释或者得不到正确的服务而感到沮丧。
意图识别难点
目前业界相对较小的模型,如果对话轮数过长,例如超过 3 轮,且每轮对话字数较多,模型回复易陷入混乱,回复质量降低。
解决思路 1: 一种粗暴的解决办法是删掉历史对话,仅保留最新的,但这样又会影响对话流畅度。
解决思路 2:基于上下文语义分割+基于上下文槽位关联
解决思路 3:基于多路多轮数据的微调
单轮意图:
单轮意图识别是指仅针对用户的单句输入进行意图判断。它聚焦于独立的、一次性的用户表达,不考虑之前或之后可能的对话内容。
单轮意图识别相对简单,因为它只需要处理一个句子的语义理解。通常可以通过关键词匹配、简单的语法分析和基于单句的机器学习模型来实现。
5 种常见的方案:
(1)基于规则的意图识别
基于规则的方案往往需要应用到分词器,例如 jieba、hanlp 等。通过分词后,会返回预先设置的关联词汇或短语(没命中返回空即可),然后返回意图。
(2)向量召回(向量检索)意图识别
向量检索的目的是将输入 query 匹配到知识库里面与之相似的其他 query。这里需要使用 embedding (向量化)和 retrival (检索),向量化的模型很多,例如 bge、 simcse 和 promcs 等;检索的工具也有很多,例如 Faiss、 Milvus 和 Hologres 等。通过向量检索后,会返回 top3 相似 query 及相似度值。
(3)深度学习意图识别
使用深度学习的方法来做意图识别是一种常见的方法,一般是文本分类深度学习框架,例如:预训练模型(RoBERTa、 ALBERT 等) + TextCNN。这里需要人工设定分类类别和标注数据,然后使用分类模型训练与推理部署。数据集构建如下:
((将句子输入深度模型,输出语义向量 → softmax → 分类))
(4)大模型意图识别
使用大模型的方法来做意图识别是一种越来越流行的方法,这里分为 2 种,第一种不需要微调,直接使用 prompt 的形式给到大模型,然后大模型返回意图结果;另一种需要微调,意味着需要人工标注一定量的数据,然后给大模型微调训练。
- Zero shot/Few Shot
- SFT
如果对准确率有非常高的要求,且有人工标注资源,这个时候使用大模型进行微调会是一个比不错的选择。使用大模型微调需要注意以下几点:
a.大模型选择;
b.文本长度设置;
C.标注数据的质量和数量。
(5)融合方案
在实际项目中,意图识别往往并不能被单一模型完成, 因为准确率、业务逻辑、 线效率等都是需要考虑的因素。所以,一个串并行同时存在且进行排序的意图框架往往是我们所需要的。
这里,我们注意 2 点:先后关系和意图排序,可以根据实际需求采取不同的策略。例如,通过关键词可以快速召回意图,可以放置在最前面;通过大模型配置 prompt 召回部分意图等。
多轮意图
多轮意图识别:涉及对用户在一系列对话轮次中的意图进行识别。多轮意图识别要复杂得多,它
需要考虑对话的历史信息,包括之前轮次的意图、对话的主题转移、用户情绪的变化等诸多因素。多轮意图识别系统需要能够及时捕捉到这种意图的转变,并准确理解每个意图在整个对话流程中的作用。
多轮意图广泛应用于复杂的对话系统,如智能客服、智能聊天机器人等。
多轮意图示例
比如在一个智能客服对话场景下,用户先问“我买的商品坏了怎么办? ",客服回答后,用户又问“那维修需要多长时间? ",多轮意图识别需要综合考虑这两轮对话,判断出用户最初是想了解商品损坏后的解决方案,后续是想知道维修时长,并且理解这两个意图之间的关联。
(1)Pipeline
在 pipeline 的多轮对话中,仅仅使用当前 query 往往不一定能给出正确的意图, 还需要查看历史的对话信息。
如何判断上下文是否关联?
这里主要通过 2 种途径,第 1 种是基于上下文语义分割,第 2 种是基于上下文槽位关联
1.基于上下文语义分割
关于如何实现上下文语义分割,当前主要是基于深度学习或大模型方法。如果使用深度学习方法,可以基于 NER 算法框架来实现,从而来判断上下文衔接是否可分;如果使用大模型,需要标注一少部分数据,再微调大模刑,从而来判断上下立是否可分 2. 基于上下文的槽位关联
如果将“那北京的呢? “改成“北京”,仅从语义上看,并不能判断 User 是 否想问“前天北京的天
气? ",但是通过槽位(地点)可以判断需要继承用户想问天气的意图。
- 基于多路多轮数据的微调
8.2 关键词检索
用传统的关键词匹配技术,例如 BM25、TF-IDF 等。
计算效率高
8.1 语义检索(((又叫或者包含了向量检索
https://www.xiaohongshu.com/explore/65788d5b000000003803274c?note_flow_source=wechat&xsec_token=CBnSBWigxSnxXaX_H8Qa8qYEgUIZPcxEc86vEqARLThbc=
单纯的语义检索存在许多漏洞,导致召回率并不令人满意,因此推出了混合检索来强化检索的召回率和准确率。
下图是语义检索、关键词检索和混合检索的流程对比
通过向量距离,计算用户问题和知识库内容的距离,从而得出下行速度。不是语文上的相似度,而是数学上的。
语义检索,字面意思即根据词句的内在意思来检索(像人一样去理解词与词、句与句的关系,使匹配更加精准、富有感情),能够发现词语和句子之间微妙的语义关系,例如“狼追小羊”和“豺狼追山羊”的语义关系就比“狼追小羊”和“我爱吃炸猪排”之间的语义关系更强假设我的提问 query 是“狼和小羊”,那么 RAG 就会拿着 query 去向量数据库中寻找语义相似性高的块 chunks,每一个块会有一个相似度的分数,从高到低排序,假设“豺狼追山羊”的分数是 0.9(90 分),排名第 1,“我爱吃炸猪排"的相似度得分是 0.6 (60 分),排名第 8,此时如果 RAG 设
定的 top_ _k=6, score 分数=0.7,那意味着 RAG 管道会从得分 70 分以上的文本块中选取前 6 个捞出,喂给大模型,那么此时“豺狼追山羊”会被成功捞出召回,而“我爱吃炸猪排”因为得分低排名靠后,不能被召回,不能上岸。这就是完全基于语义的检索,召回的文本块会被 LLM 用来生成答案回答用户的 query。
8. 混合检索
先用语义检索,得到了 6 个文本块(开设 top_k=6),然后使用关键词检索,又得到了 6 个文本块。一共 12 个文本块,但是太多了 token 消耗太大了,我还是只想要 6 个。因为 2 种检索方式的相似度得分依据不同,所以需要用统一的标准对 12 个文档再次排序,这就是重排序。通过重排序 Rerank,拿到了前 6 个文本块
包括 2 个环节:
-
多路召回:通过不同的检索方式从多个来源或不同索引中获取相关的文档或者段落,比如基于 BM25 的检索、向量检索、基于知识图谱的查询、基于规则等等
-
融合排序:合并这些不同来源的结果,按相似性或者相关性排序。工程实践中需要兼顾效率和效果,一种典型的策略是 2 阶段融合:
粗排:RRF 或加权融合等无监督方法,快速筛选出 Top-k
精排:rerank
9. 重排
因为混合检索后的查找范围很大,并且无法直接进行相似度过滤,通过重排(Rerank)模型进行重新排序,用重排的得分进行过滤
- 向量检索中,HNSW 和 Faiss IVF 有什么区别?
- 如何切分长文档用于大模型的上下文检索?
- 混合检索的原理是什么?适用于哪些场景?
- 如何进行 embedding 模型的有监督微调?
- 文本相似度方法中,为什么有时 BM25 比 BERT 更好?
二、增强技术
如何实现多轮问答、了解 RAG 中的提示词工程、熟悉相关重排算法原理、如何利用专业领域知识针对性微调底座大模型等
1. !!什么是 RAG
通过检索外部知识库来解决幻觉、最新知识、和复杂任务表现不足的问题
本质上是把检索到的资料作为 prompt 的一部分,发送给大语言模型,让大预言模型有根据的输出内容,从而降低大模型的“臆想答案”。
RAG 有 3 个步骤:建立索引、检索、生成
- 建立索引:清洗和提取原始数据,将 PDF、doc 等文件解析成纯文本数据;然后将文本数据分割成更小的片段(chunk)(文本切分算法);最后将这些片段经过嵌入模型转换成向量数据(此过程叫 embedding),并将原始语料块和嵌入向量以键值对的形式存储到向量数据库中(嵌入向量是键,原始文本是值),以便进行后续快速且频繁的搜索,这就是建立索引的过程。
- 检索生成:系统会获取到用户输入,随后计算出 query 和向量数据库中文档块的相似性,选择相似性最高的 k 个文档块,作为回答当前问题的知识。然后知识和问题会合并到提示词模板中提交给大模型,大模型做出回复,这就是检索生成过程。
提示词模板类似:请阅读:(知识文档),请问:(用户问题)
向量数据库(如 FAISS、Pinecone、Milvus)本质上是一种“以向量为索引键”的数据库结构。
- ✅ 键(Key):embedding 向量(例如 768 维、1536 维的浮点数组)
- ✅ 值(Value):chunk 原始文本(有时还会存储 metadata,比如来源文件名、页码)
举例说明:
假设某个文档 chunk 是:
“鲁迅是中国现代文学的重要作家,他的代表作包括《狂人日记》、《阿Q正传》……”
用 BGE 模型转换后生成的向量(768 维)为:
[0.12, -0.03, ..., 0.98] ← 向量就是 Key
存入向量数据库时就是这样的结构:
{
"id": "chunk_001",
"vector": [0.12, -0.03, ..., 0.98], ← Key
"metadata": {
"text": "鲁迅是中国现代文学的重要作家……", ← Value
"source": "modern_chinese_lit.pdf",
"page": 17
}
}
🔄 整个检索流程是这样进行的:
-
用户输入 query 文本:
比如:“鲁迅写了哪些著名作品?”
-
对 query 文本做 embedding(例如用 BGE 或 text2vec 模型)
得到一个向量q_vec = [0.34, -0.02, ..., 0.88]
(1536 维) -
这个 query 向量
q_vec
会被拿去和向量数据库中的“所有键”(即语料的 embedding 向量)进行相似度搜索《这里会用到文本相似度计算方法》:- 这一步用的是 HNSW、IVF、Flat 等算法来加速搜索
- 并非对文本做直接相似度计算,而是对“向量”做相似度计算!
-
检索出相似度 Top-k 的向量(即语料块的 embedding),从中找到对应的原始文本片段(value)
-
这些 value 被送入 LLM 进行生成
在 RAG 检索过程中,是“对 embedding 向量做相似度计算,再返回对应文本”,不是直接对文本做相似度比较!
https://www.xiaohongshu.com/explore/67526bea0000000007033135?note_flow_source=wechat&xsec_token=CBwxo3dSn9uI8uySBoi-6VE5dwKH_IzkWt7I4IvR5BMwI=
https://www.xiaohongshu.com/explore/67526bea0000000007033135?note_flow_source=wechat&xsec_token=CBwxo3dSn9uI8uySBoi-6VE5dwKH_IzkWt7I4IvR5BMwI=
https://www.xiaohongshu.com/explore/675ae6660000000002016c16?note_flow_source=wechat&xsec_token=CBIiplm6HWUMYePkL6RStwyRDRWnsb65DLDG9kl1Im3Ac=
RAG 流程:
RAG 评估:
检索质量:命中率、MRR、NDCG。召回率:实际检索出的文本块数量/期待被检索的文本数量
生成质量:评估模型生成的连贯性、准确性、真实性等。包括有标注评估和无标注评估
2. 提示词工程
https://www.xiaohongshu.com/explore/677f4c9b000000000b034f07?note_flow_source=wechat&xsec_token=CBTT8k5t0VmDy4zkVGeluUNfoIBSNye74Q2w59B_giXu8=
概念:提示词工程是 研究如何构建和调整提示词,从而让大雨呀模型生成结果符合用户期望。
和 AI 沟通的语言艺术,像 Qwen 这样的大语言模型更好地理解你的需求,你需要清晰地描述你
的需求,提供必要的背景信息,明确告诉 AI 你想让它做什么。就像跟人沟通一样,你需要不断调整你的表达方式,直到 AI 理解你的意思,并给出你想要的答案。
提示词技巧:
通过对比可以发现,通过在提示词中提供明确的用户需求,大语言模型的输出质量更好,更符合用户预期,接下来我们可以一起来学习构建有效提示词的更多技巧。
(1)直接提问(零样本提示,Zero- Shot Prompting)
直接提问,也称为零样本提示(Zero- Shot Prompting),即不给大语言模
型提供案例,完全依靠 LLM 理解和处理能力完成任务。前文给的提示词例子,都属于直接提问。目前大部分开源和商用的大语言模型已经经过了大量的预训练和指令调试,能够很好的理解并响应用户的直接提问。适用于目标明确、问题简单、答案确定且唯一等场景。
直接提问时,可遵循以下原则:
简洁:尽量用最简短的方式表达问题。过于冗长的问题可能包含多余的信息,导致模型理解错误或答非所问。
- 具体:避免抽象的问题,确保问题是具体的,不含糊。
- 逻辑清晰:问题应逻辑连贯,避免出现逻辑上的混淆或矛盾,这样才能促使模型提供有意义的回答。
- 详细上下文:如果问题涉及特定上下文或背景信息,要提供足够的详情以帮助模型理解,即使是直接提问也不例外。
- 避免歧义:如果一个词或短语可能有多重含义,要么明确其含义,要么重新表述以消除歧义。
然而,大语言模型给出的答案有时候也不是固定的,直接提问效果在很大程度上取决于所使用的模型的理解能力和泛化能力,它无法很好地处理复杂、模糊或多义性的问题,当需要较深入的背景知识或分析时,可能无法准确了解用户的真正意图。我们可以尝试在提示词中增加示例样本、分配角色、提示写作风格/输出格式或构建思维链和思维树拆解复杂任务等方式解决。
(2)增加示例(少样本提示 Fewer -Shot Prompting)
在提示词中提供少量(通常几个或几十个)示例,也称为少样本提示(Fewr -Shot Prompting),以帮助模型更好地理解任务要求和期望输出。比如:
让 LLM 跟随我们所要求的规范、格式、概念、文法、语气进行输出。
提供进一步推理的参考, 比如让大模型学会数学运算或按照示例方式进行逻辑推理。
示例的质量和数量会直接影响回答的结果,增加示例时可参考以下技巧:
- 精选代表性样本:选择具有代表性的示例,覆盖任务的各种情况,同时避免使用可能引起模型混淆的极端或边缘案例,确保模型能从有限的数据中学习到任务的核心特征。
- 保证示例的多样性:尽可能覆盖任务的各种角度和情境,确保模型能从有限的数据中学习到任务的核心特征。
- 使用相似的格式和结构:在所有示例中使用相似的提示格式和结构,使模型能够清晰识别输入与输出的关系。
- 让大语言模型生成示例:实践时,我们还可以先让 LLM 按照提示生成一些示例,再进行筛选或人工调整,以提高示例质量和针对性。
(3)分配角色
赋予模型一个具体的角色或身份,如“作为经验丰富的营养师”,来引导模型在特定角色视角下生成回答。
分配角色适用以下场景:
- 需要专业知识或特定视角的问题解答。例如,模拟老师、医生、律师等回答相关领域的问题。
- 模拟特定人物或角色的语言风格。例如,模仿某个著名人物(如历史人物或文学角色)语言风格的文本时。
- 进行角色扮演游戏或创作。在创意写作或角色扮演游戏中扮演指定的角色,与使用者进行互动。
- 在特定行业内进行决策模拟。例如,模拟一个管理咨询师来分析商业案例或提供商业建议。
分配角色引导模型生成符合特定情境和对话逻辑的内容,可遵循以下技巧:
- 明确角色身份与特性:确定角色的基本属性,如年龄、性别、职业、性格、技能、价值观等。赋予角色相关领域的专业知识或特殊背景,如专家、学者、历史人物、虚构角色等。
- 设定角色目标与动机
为角色设定对话的目标,如寻求信息、说服他人、解决问题、分享观点等。
揭示角色的内在动机,如个人利益、道德信念、情感需求等,有助于塑造角色的真实性和深度。 - 设定角色语言风格:
根据角色性格、教育水平、文化背景等设定其语言习惯、用词选择、句式结构、口头禅等。
规定角色在对话中的情绪状态,如冷静理智、激动愤怒、悲伤失落、幽默风趣等,影响其表达方式。 - 设定角色规则约束:规定角色在对话中的行为约束,如不得人身攻击、保持礼貌尊重、遵守讨论主题等。
- 动态调整角色设定:
随着对话深入,适时调整角色设定以适应新的情境和话题,如角色态度转变、关系演变、目标更新等。
向模型反馈角色表现,如偏离设定、缺乏个性、对话僵化等,及时修正角色设定并引导模型调整。
(4)限定输出风格/格式
大语言模型非常善于撰写论文、文章等内容,不过如果我们仅仅简单地告诉大语言模型-些宽泛的提示, 大语言模型有可能会生成枯燥、平淡、空洞的内容,这些内容往往与我们期望的结果有较大的出入。
我们可以在提示词中增加“风格”的限定,为了更好的限定“风格”,准确引导模型写出符合需求的内容,下面我们介绍一些推荐的技巧: .
明确指出所需的内容类型,如“论文/散文/诗歌/新闻报道/剧本/日记”等。
用形容词限定风格,如“严谨客观”、“感性抒情” 、“幽默诙谐” 、“庄重典雅”等。
(5)拆解复杂任务
把一个复杂的任务,拆解成多个稍微简单的任务,让大语言模型分步来思考问题,称为思维链(Cha in of- Thought Prompting, CoT)提示,这种方式可让大语言模型像人类一样逐步解释或进行推理,从而极大地提升 LLM 的能力。
与前面介绍的标准提示不同,该方法不仅寻求答案,还要求模型解释其得出答案的步骤。
有时 LLM 通过零样本思维链可能会得到错误的答案,可以通过增加示例的方式,即少样本思维链,帮助 LLM 理解相关任务并正确执行
提示词框架
原则:简单、明确、清晰
包含一下要素:
指令(做什么、回答什么问题)、上下文(背景)信息、参考样本、输入数据、输出指示(输出类型、格式、限定条件)
背景信息+指令+输出提示
优化 prompt:
https://www.xiaohongshu.com/explore/67a5c622000000001703b91e?note_flow_source=wechat&xsec_token=CBbtOlSqX9reMYbke_-KIHovpM8gJJnZAiPUH6BGzSJck=
补充
K-Means
K-Means 是一种经典的无监督学习算法,用于将数据集划分为 K 个互不相交的簇(Cluster)。其核心思想是通过迭代优化,使得同一簇内的数据点尽可能相似,不同簇间的数据点尽可能不同。
-
初始化中心点
- 随机选择 K 个数据点作为初始聚类中心(Centroid)。
-
分配数据点
- 计算每个数据点到所有中心的距离(通常用欧氏距离),将其分配到最近的簇。
-
更新中心点
- 重新计算每个簇的中心点(取簇内所有点的坐标均值)。
-
迭代优化
- 重复步骤 2 和 3,直到满足终止条件:
- 中心点不再变化(收敛)
- 达到最大迭代次数
- 簇内误差(SSE,Sum of Squared Errors)变化小于阈值
- 重复步骤 2 和 3,直到满足终止条件:
很好,这三个术语看似相似,其实层次不同、抽象程度不同、用途也略有区别。下面我用一个图谱和例子来讲清楚它们之间的关系:
🧠 一图看懂三者关系:
算了也有的说 embedding 检索是向量检索的子集
┌────────────────────────────┐
│ 语义检索(最广) │ ◀── 基于意义的检索范式
│ ┌────────────────────┐ │
│ │ embedding 检索 │ ◀── 一种语义检索实现方法
│ │ ┌──────────────┐ │
│ │ │ 向量检索(最底层) │ ◀── 技术手段(比对 embedding 向量)
│ │ └──────────────┘ │
│ └────────────────────┘ │
└────────────────────────────┘
1️⃣ 向量检索(Vector Search)
✅ 定义:
- 指用向量之间的距离或相似度(如余弦相似度、L2 距离)来进行检索
- 不关心这个向量代表什么:可以是文本、图片、音频、用户行为等等
🧠 举例:
- 给定一个 768 维向量,从 10 亿个向量中找最近的 10 个。
🧰 技术代表:
- Faiss、HNSW、IVF、Annoy、ScaNN 等
2️⃣ Embedding 检索(Embedding-based Search)
✅ 定义:
- 一种利用语义表示(embedding)进行语义搜索的方式
- 先用模型把文本 → 向量(embedding),然后用向量检索算法搜索
🧠 举例:
- 用户提问:“中国最高的山是?” → 编码为 embedding → 在 embedding 文档库中检索相似问题/答案
✅ 依赖:
- embedding 模型(如 BERT、CoSENT、E5)
- 向量检索算法(Faiss、HNSW)
3️⃣ 语义检索(Semantic Search)
✅ 定义:
- 是一种更高层次的检索范式
- 目标是找到“语义相似”的信息,不依赖于表面关键词
🧠 举例:
- 搜索“想看海的地方”,返回“海边度假指南”“沿海城市推荐”而不是含“海”字的网页
✅ 实现方式可能多种:
- embedding 检索(主流)
- 大模型 rerank(语义重排序)
- Dense Retrieval + Sparse Retrieval 混合
✅ 总结类比:
名称 | 层次 | 是什么 | 举例 |
---|---|---|---|
向量检索 | 底层工具 | 比较向量之间的相似度 | Faiss 检索 768 维向量 |
embedding 检索 | 方法层 | 文本 → embedding → 向量检索 | 用 BERT 编码搜索相似问句 |
语义检索 | 目标范式 | 找到“语义”相关内容 | 搜“求职”,返回“简历撰写”指南 |
如果你希望我继续补充一张图来可视化整个流程,我可以为你生成。你想要吗?