假设你走进一座藏书百万的图书馆,想找一本「关于如何提高团队沟通效率」的书。一位只看封面的传统图书管理员,会给你一本书名里恰好带「沟通」二字的书;而真正读懂每本书灵魂的管理员,会从书架深处抽出一本《关键对话》——书名里没有「沟通」,但讲的正是这件事。后者就是「稠密检索」的魔法:把文字变成一串能代表其核心含义的数字,再用这些数字的相似度判断两段文字是否在「说同一件事」。本文将从这张「画像」怎么画、相似度怎么算、效果怎么优化,一直讲到图书馆如何为十万张画像建索引,带零基础读者完整掌握稠密检索的原理与落地。

岗位关联

读完这篇,你会知道在 RAG 系统里如何选 Embedding 模型、算向量相似度、做效果评测与索引落地,把「语义检索」从概念真正变成可运行的代码。

目录
  1. 可视化演示
  2. 什么是稠密检索:从「翻书名」到「懂灵魂」
  3. 嵌入向量原理:画师的功力决定画像质量
  4. 向量相似度:三种给画像「打分」的方式
  5. 效果优化:从「推荐失误」中磨砺判别力
  6. 稠密检索 vs 关键词检索:两位管理员的互补协作
  7. 工程落地:把十万张画像放上「智能书架」
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示稠密检索中查询向量(Q)在文档嵌入空间中通过余弦相似度找到TopK最相关文档的过程,右侧为Emb→Sim→TopK→Out检索流水线。

本节配有交互动效(进入视口后自动加载,约 3KB)。

稠密检索Dense Retrieval 查询(Q)经Embedding映射到向量空间,通过余弦相似度计算与文档(D1-D10)的语义距离 sim(Q,D) = cos(θ) = Q·D / (|Q||D|) 相比关键词检索(KW),稠密检索能捕捉语义相似性,召回更相关文档

什么是稠密检索:从「翻书名」到「懂灵魂」

那位只看封面的图书管理员,拿到「如何提高沟通效率」这个请求时,只能在书名、作者、摘要的关键词里找「沟通」「效率」这样的字眼。可一位懂书的管理员会问自己:这本书讲了什么?适合推荐给什么样的人?他的推荐逻辑建立在「理解」之上,而「理解」在计算机里被表达成一张数字画像——这就是稠密检索的起点。

在传统信息检索里,文本被表示成稀疏向量:词典有十万个词,每篇文档只在出现过的词对应的位置上有值,其余全是零。这个向量又高又空,无法表达「关键词没出现但意思相关」的情况。稠密检索则用神经网络把整段文本编码成一个低维(通常几百维)、每个维度都非零的向量。这个向量像是文本的一种「灵魂画像」:维度之间通过训练被赋予了丰富的语义组合含义。

一次完整的稠密检索包含三件事:把查询文本编码为查询画像,把候选文档编码为文档画像,然后计算画像之间的相似度并排序。整个过程可以用一个简洁的式子描述:任何一段文本,经过编码器都会落到同一个「语义空间」里,这个空间里距离近的文本,含义就接近。

回到图书馆的场景:管理员给每本书写画像时,用的不是「书名关键词」,而是「这本书真正在谈什么」。查询画像与文档画像越像,书就越值得推荐。这就是稠密检索的第一性原理——用语义画像替代字面索引。

rq=fθ(q),rd=fθ(d)\mathbf{r}_q = f_\theta(\mathbf{q}), \quad \mathbf{r}_d = f_\theta(\mathbf{d})
查询 q 和文档 d 分别经过同一个编码器 f(一套带参数的神经网络,参数记为 θ),变成向量 r_q 和 r_d,后续相似度计算都在这两个向量上进行。
  1. 编码器f 是一个基于神经网络构建的文本编码器,参数 θ 是它内部数亿个可学习的权重,训练好的权重决定了「画像风格」。
    fθ(⋅)f_\theta(\cdot)
  2. 查询向量把用户输入的问题 q 送入编码器,得到一个稠密向量 r_q,这才是「查询画像」。
    rq=fθ(q)\mathbf{r}_q = f_\theta(\mathbf{q})
  3. 文档向量把候选文档 d 送入同一个编码器,得到文档画像 r_d,保证两者在同一个语义标尺下度量。
    rd=fθ(d)\mathbf{r}_d = f_\theta(\mathbf{d})

嵌入向量原理:画师的功力决定画像质量

同样是给人画像,街头速写画师和达·芬奇的笔下作品,神韵完全不同。稠密检索里的「画师」就是 Embedding 模型(文本嵌入模型),它直接决定了向量能不能忠实反映语义。常用的模型包括 Sentence-BERT、bge、E5、OpenAI 的 text-embedding 系列,它们的共同点是把句子压缩成一个固定长度的向量。

Embedding 模型的内部工作方式可以拆成三步:先把句子切成 token(可以理解为「词的碎片」),送入一个预训练语言模型(如 BERT)得到每个 token 的隐状态向量,最后通过池化策略把这些细粒度向量合并成整句的一个向量。常见的池化策略有两种:取 [CLS] 位置的向量,或者对所有 token 向量做平均。模型不同、池化策略不同、微调数据不同,画出来的「画像风格」也迥然不同——这正是选型时要关注的。

选画师要看「画风匹配度」:如果文档是中文法律条文,优先选在中文法律语料上微调过的模型;如果是多语言混合数据,则选跨语言模型。bge 系列在中文语义相似度任务上表现稳定,E5 以海量弱监督数据预训练著称,都是工程中的常见选择。记住一句话:画师的功力决定画像上限,相似度计算只是把画像潜能兑现出来。

v=1n∑i=1nhi\mathbf{v} = \frac{1}{n}\sum_{i=1}^{n} \mathbf{h}_i
平均池化:句子被切成 n 个 token,每个 token 经编码器产生一个隐状态向量 h_i,取它们的平均作为整句的嵌入向量 v。
  1. token 隐状态句子里的第 i 个 token 经过多层神经网络后,得到隐状态 h_i,它已融合了上下文信息。
    hi,i=1,…,n\mathbf{h}_i,\quad i=1,\dots,n
  2. 平均池化把所有隐状态逐维度相加再除以 n,得到统一的句子级向量。
    1n∑i=1nhi\frac{1}{n}\sum_{i=1}^{n} \mathbf{h}_i
  3. 输出向量 vv 是整句话的稠密画像,维数通常为 768 或 1024,远小于词典规模。
    v∈R768\mathbf{v} \in \mathbb{R}^{768}

向量相似度:三种给画像「打分」的方式

画像画好了,怎么判断两张画像像不像?图书管理员有三种办法:比方向(两人面朝同一方向)、比远近(两人站得近不近)、比重叠(五官特征重合多少)。对应到向量,就是三种常用的相似度计算方法。

余弦相似度是最常用的方法:它计算两个向量夹角的余弦值,只关心方向是否一致,不关心向量的长短。内积则同时考虑方向和模长——向量越长,即使角度稍大也可能得到较高的评分。欧氏距离则是另一个视角:它衡量两个向量终点之间的直线距离,距离越小越相似。值得注意的是,当向量先做归一化(模长变成 1)后,内积与余弦相似度完全等价,而欧氏距离的平方与余弦相似度也呈单调反向关系,这时三种方法选哪一种,结果排序几乎一致。

工程上,使用余弦相似度前通常先把所有向量归一化,这样既可以直接用内积加速计算,又能让分数范围稳定。但注意:不同模型产出的相似度分数分布不同,同样是 0.8,在模型 A 里可能很相关,在模型 B 里可能只是一般相关。画像的「打分尺」要跟画师绑定,不能跨模型混用。

cos⁡(q,d)=q⋅d∥q∥⋅∥d∥\cos(\mathbf{q}, \mathbf{d}) = \frac{\mathbf{q} \cdot \mathbf{d}}{\|\mathbf{q}\| \cdot \|\mathbf{d}\|}
余弦相似度:分子是 q 和 d 的内积(逐维相乘相加),分母是两个向量的模长乘积,整体结果落在 [-1,1],越接近 1 表示方向越一致。
  1. 内积把查询向量和文档向量逐维相乘再求和,反应「特征重合程度」。
    q⋅d=∑i=1dqidi\mathbf{q} \cdot \mathbf{d} = \sum_{i=1}^{d} q_i d_i
  2. 模长乘积分别计算两个向量的长度再相乘,对前一步结果做归一化,消除向量长度差异。
    ∥q∥⋅∥d∥\|\mathbf{q}\| \cdot \|\mathbf{d}\|
  3. 比值输出前两步的除法结果就是夹角的余弦值,只看方向,不看长短。
    cos⁡θ∈[−1,1]\cos\theta \in [-1, 1]

效果优化:从「推荐失误」中磨砺判别力

管理员第一次上岗时,推荐经常出错:读者要「有效开会」,他推了一本《高效演讲》;要「项目复盘」,他推了《复盘方法论》却漏掉了更像的章节。为了让推荐越来越准,他会记住每次「被纠正」的反例——这正是稠密检索优化的核心思想:让模型从正样本和难负样本的对比中学习。

优化的标准范式是「双塔模型 + 对比学习」:查询塔和文档塔各自把文本编码成向量,训练目标是让匹配的(查询,正文档)对相似度高,让不匹配的(查询,负文档)对相似度低。真正影响模型能力的是负样本的选择——如果只随机抽负样本,模型很容易学会简单区分(比如「开会」和「天气」本来就很不同),却学不会区分「沟通技巧」和「演讲技巧」这种真正的难题。为此,训练中会刻意引入硬负样本:与正样本高度相似但不是答案的文档,逼着模型去理解细微差别。温度系数 τ 则控制着相似度分布的「尖锐程度」:τ 越小,模型越敢放大正负样本之间的差距。

管理员每被纠正一次,下次就更懂「神韵」的边界。模型的微调(fine-tuning)就是批量地让模型经历成千上万次这样的「纠正」。在 RAG 应用的模型评测里,人们用 Recall@k(前 k 个结果中召回正确答案的比例)和 MRR(正确答案名次的倒数)来量化管理员「推荐命中率」的进步。

LInfoNCE=−log⁡exp⁡(sim(q,d+)/τ)∑i∈Bexp⁡(sim(q,di)/τ)\mathcal{L}_{\text{InfoNCE}} = -\log \frac{\exp(\text{sim}(\mathbf{q}, \mathbf{d}^+)/\tau)}{\sum_{i \in B} \exp(\text{sim}(\mathbf{q}, \mathbf{d}_i)/\tau)}
InfoNCE 是对比学习中最常用的损失函数:对每个查询,希望它与正样本 d⁺ 的相似度(经过温度缩放后)在所有候选里占比尽量高。分母里的 B 表示一个小批量里的所有文档,包含正样本和负样本。
  1. 正样本相似度查询向量与正样本向量算相似度,再除以温度系数 τ,得到放大的「正向得分」。
    sim(q,d+)/τ\text{sim}(\mathbf{q}, \mathbf{d}^+)/\tau
  2. 负样本集合批量 B 中所有检索候选的相似度都做指数运算后求和,构成归一化分母。
    ∑i∈Bexp⁡(sim(q,di)/τ)\sum_{i \in B} \exp(\text{sim}(\mathbf{q}, \mathbf{d}_i)/\tau)
  3. 对数概率取对数并加负号,让「正样本占比越大」对应的损失越小,优化器据此更新 θ。
    −log⁡exp⁡(sim(q,d+)/τ)∑i∈Bexp⁡(sim(q,di)/τ)-\log \frac{\exp(\text{sim}(\mathbf{q}, \mathbf{d}^+)/\tau)}{\sum_{i \in B} \exp(\text{sim}(\mathbf{q}, \mathbf{d}_i)/\tau)}

稠密检索 vs 关键词检索:两位管理员的互补协作

只看书名的管理员有一个令人安心的优点:他严格、稳定、绝不联想。你搜「数据库」,他不会给你一本讲「存储系统」却没用这两个字的书。这种基于词频统计的方法就是关键词检索的典型代表,工业界最经典的是 BM25,它统计词频、逆文档频率和文档长度,计算「字面相关性」。它的优势是无需训练、可解释、速度快,对小语种和专有名词(如「GTX-980」)尤其可靠。

严格管理员的缺点恰恰来自他的刻板:遇到同义改写、口语化表达、跨语言(比如中文查「机器学习」,英文文档里写的是 machine learning),就彻底失语。这就是所谓的「语义鸿沟」——字面上没重叠,含义却相通。稠密检索的管理员能跨过这道鸿沟,但代价是需要训练数据、算力和模型,而且对生僻术语和数字精确匹配常常出错。与其争论谁更强,不如让两位管理员协作:先用 BM25 和稠密检索各自召回一批候选,再用 RRF(Reciprocal Rank Fusion)对两路结果做融合排序。

在 RAG 系统中,混合检索几乎成了标配:关键词检索负责「稳妥的精确」,稠密检索负责「聪明的联想」,RRF 则像一位会议主持人,让两位管理员的意见公平汇合。这不是取代,而是协作。

RRF(d)=∑i=1k1kr+ranki(d)\text{RRF}(\mathbf{d}) = \sum_{i=1}^{k} \frac{1}{k_r + \text{rank}_i(\mathbf{d})}
RRF 融合公式:对文档 d,统计它出现在第 i 路检索结果中的名次 rank_i(d),名次越靠前贡献越大;常数 k_r(通常取 60)用于平滑,防止第一名垄断。
  1. 名次项文档 d 在第 i 路检索引擎(比如 BM25 或稠密检索)结果中的排名,排名第 1 时贡献最大。
    ranki(d)\text{rank}_i(\mathbf{d})
  2. 平滑常数k_r 加到名次上,避免 rank=1 时贡献无限大,通常取 60。
    1kr+ranki(d)\frac{1}{k_r + \text{rank}_i(\mathbf{d})}
  3. 多路求和把每路检索引擎的贡献相加,得到每个文档的融合得分,再按得分重排。
    ∑i=1k1kr+ranki(d)\sum_{i=1}^{k} \frac{1}{k_r + \text{rank}_i(\mathbf{d})}

工程落地:把十万张画像放上「智能书架」

图书馆藏书从一千本增长到十万本时,管理员就不能每次挨个把画面对比了——那太慢。工程的本质是把「神韵画像」组织成高效的检索结构。第一步选一个向量数据库(如 Milvus、Qdrant、FAISS、pgvector),把所有文档向量存储进去;第二步在其中建立 ANN(近似最近邻)索引,用牺牲少量精度的方式极快返回「最像的几十张画像」。

最主流的 ANN 算法是 HNSW(分层可导航小世界图)。它的直觉像一座金字塔式的图书馆:顶层书架很少,只有极少数「广识型」画像;越往下层,书架越多、画像越细;检索时从顶层粗选,逐层细化,最终在底层找到精确的近邻。节点出现在第几层是随机的,且服从几何分布——层数越高,概率越小,这保证了上层节点足够稀疏、检索足够快。

工程中,还要引入「召回 + 精排」两阶段架构:ANN 索引负责把候选集从千万级压缩到几百个(召回阶段,速度快),然后对候选向量用更精确的模型(如交叉编码器 reranker)重新打分排序(精排阶段,精度高)。这就像图书馆管理员先用智能书架秒速选出 50 本「可能的书」,再仔细翻看这 50 本的内容质量,最终给出 Top 5 推荐。到了这一步,一座百万藏书的「智能图书馆」才能真正高效运转起来。

P(h)=(1m)hP(h) = \left(\frac{1}{m}\right)^h
HNSW 的层级概率公式:一个节点被分配到第 h 层的概率随 h 增大呈指数衰减,m 是每层相连的邻居数相关的衰减因子,通常取 4 到 16。
  1. 层号h 表示第几层,第 1 层节点最多,越往上越少。
    h=1,2,3,…h = 1, 2, 3, \dots
  2. 衰减因子m 控制层级衰减速度,m 越大,高层节点出现概率越低,图越高瘦。
    1m\frac{1}{m}
  3. 概率计算h 次方的乘积给出节点恰好位于第 h 层的概率,体现「金字塔」结构。
    P(h)=(1m)hP(h) = \left(\frac{1}{m}\right)^h

AI 应用场景

企业智能客服知识库

阶段:RAG 召回(Embedding + 向量相似度检索)

解决的问题:传统客服 FAQ 依赖关键词匹配,用户问「我的订单怎么还没到」,系统匹配不到「物流延迟」相关文档。稠密检索把用户问题和知识库段落都编码成向量,用余弦相似度召回语义相近的答案,大幅提升首轮解决率。检索后接 LLM 生成回答,这也是 RAG 召回阶段的核心环节。

具体案例:某电商平台客服系统接入 bge-large 模型,将 10 万条售后知识文档离线向量化存入 Milvus,用户提问实时编码后召回 Top 5 候选段落,再交由大模型组织回答。上线后,知识库内容利用率从 38% 提升到 76%。

论文与专利的语义预筛

阶段:离线 Embedding 索引 + ANN 检索

解决的问题:专利查重场景里,两篇专利可能用词完全不同但技术方案相似,人工比对成本极高。稠密检索先将海量专利摘要编码为向量并建 HNSW 索引,新专利提交时编码成查询向量,毫秒级返回最相似的前 100 篇,再由专家精读复核。

具体案例:某知识产权服务机构利用 E5 系列模型为 500 万篇专利构建向量库,配合「ANN 粗召回 + 交叉编码器精排」两阶段流程,把每件新专利申请的初筛时间从半天压缩到 3 分钟,召回率保持在 92% 以上。

多语言产品文档检索

阶段:跨语言 Embedding + 混合检索

解决的问题:跨国企业有中、英、日多语言产品手册,用户用中文提问可能只有英文文档含答案。跨语言 embedding 模型把不同语言的同一含义映射到向量空间的相近位置,让检索不再受语言边界限制;同时叠加 BM25 保证型号、代码等精确信息不丢失。

具体案例:某出海 SaaS 公司将 product docs 的中英日版本用跨语言模型编码,向量检索召回 20 条候选后,再用 RRF 与关键词检索结果融合,最终实现 23 种语言间的语义互检,客服查询准确率提升 41%。

Python 演示

python50 行
"""稠密检索最小实现:模拟伪语义向量的余弦相似度 Top-K 检索"""import numpy as np  class DenseRetriever:    def __init__(self, dim=256):        self.dim = dim        self.doc_ids = []        self.doc_vecs = []     def _encode(self, text):        # 模拟embedding:把词散列到向量并归一化,真实场景替换为编码模型        vec = np.zeros(self.dim)        for token in text.lower().split():            idx = hash(token) % self.dim            vec[idx] += 1.0        norm = np.linalg.norm(vec)        return vec / norm if norm > 0 else vec     def add_document(self, doc_id, text):        self.doc_ids.append(doc_id)        self.doc_vecs.append(self._encode(text))     def search(self, query, top_k=3):        q_vec = self._encode(query)        scores = [            float(np.dot(q_vec, d_vec))            for d_vec in self.doc_vecs        ]        rank = np.argsort(scores)[::-1][:top_k]        return [(self.doc_ids[i], round(scores[i], 4)) for i in rank]  def main():    docs = {        "d1": "LangChain 支持多种大模型接口调用与链式编排",        "d2": "今日北京天气晴朗适合户外运动",        "d3": "RAG 系统通过检索增强回答的事实准确性",        "d4": "深度学习模型训练需要海量 GPU 算力",    }    retriever = DenseRetriever()    for doc_id, text in docs.items():        retriever.add_document(doc_id, text)    results = retriever.search("大模型如何增强检索回答?", top_k=2)    for doc_id, score in results:        print(doc_id, score)  if __name__ == "__main__":    main()
目的:用一个轻量可运行的类模拟稠密检索全流程——文本向量化、向量库入库、余弦相似度排序、Top-K 召回。
  1. vec[idx] += 1.0词散列到某一维度后点亮该维,模拟「画像」的雏形,只用于演示;真实项目应调用 Sentence-BERT、bge 等模型生成语义向量。
  2. norm = np.linalg.norm(vec); return vec / norm if norm > 0 else vec归一化让向量模长为 1,后续余弦相似度可直接用内积计算。
  3. scores = [float(np.dot(q_vec, d_vec)) for d_vec in self.doc_vecs]用内积批量计算查询与所有文档的相似度,对应正文余弦公式的归一化简化版。
  4. rank = np.argsort(scores)[::-1][:top_k]从高到低排序并截取前 k 个索引,完成 Top-K 召回。
  5. for doc_id, text in docs.items(): retriever.add_document(doc_id, text)离线索引构建的缩影:逐条把文档编码后入库。

常见误区

误区很多人以为稠密检索是更先进的技术,上了向量数据库后,BM25 等关键词检索就是多余的了,直接全部换成稠密检索就能解决所有问题。

正解稠密检索擅长语义泛化,但在精确匹配上并不占优,比如查询型号「GTX-980」,BM25 能精准命中,而向量检索可能召回一堆无关的「显卡性能对比」。工程实践里,稠密检索与关键词检索是互补关系,RRF 混合融合通常比单用任何一路效果更好。就像图书馆里「懂画的管理员」和「翻书名管理员」各有其价值。

为何常见:因为看到各种宣传都说「语义检索碾压关键词」,忽略了真实业务里大量查询是专有名词和精确 ID,而这些恰好是稠密检索的弱点。

误区认为向量的维度越高,能存储的语义信息越多,检索效果就一定越好,于是盲目选择 2048 维甚至更高维的模型。

正解维度提高确实增加表达能力,但也会带来三个问题:存储成本线性上升、ANN 索引构建变慢、小数据下更容易过拟合。主流文本 embedding 模型通常会做维度裁剪(如 bge-large 支持从 1024 降到 512)。决定检索质量的首要因素是模型训练数据与目标领域的匹配度,而不是维度大小。

为何常见:人的直觉是「信息越多越精确」,但忽略了高维空间里的「维度灾难」——距离区分度在高维下反而退化,且工程成本陡增。

误区把模型输出的余弦相似度当成一个「绝对真理指标」,试图用 0.8 这类全局阈值过滤所有结果,认为分数高的一定语义相关。

正解余弦相似度是相对排序信号,不同模型、不同语料、不同训练方式下的分数分布差异极大。同一文档,在模型 A 里和查询相似度 0.9,在模型 B 里只有 0.6,两者可能都排在第一名。合理做法是先在验证集上观察分数分布,再决定是否需要阈值,或直接用相对排序取 Top-K。

为何常见:因为分数是数字,天然让人觉得客观;且很多教程为了简化,用「大于 0.8 视为相关」之类的说法示范,读者容易照搬。

误区以为稠密检索就是拿查询向量和历史文档向量挨个算一遍相似度,文档库大了也没关系,最多是慢一点。

正解千万级文档的暴力检索(逐条内积)单次查询在普通服务器上可能耗时几百毫秒到秒级,无法支撑真实在线服务。工程上必须用 ANN 索引(如 HNSW、IVF-PQ)把复杂度降到对数级,用极小召回损失换取毫秒级响应。六节讲的「智能书架」正是为解决这个问题而生。

为何常见:教科书里讲原理时总是先给暴力检索的朴素版本,读者只记住了原理,没看到工程上索引才是决定系统能否上线的关键。

面试题

Q1. 稠密检索中「稠密」一词的含义是?

单选题 · easy

  • A.高维稀疏多数为零
  • B.低维稠密多数非零← 正确答案
  • C.文档库规模庞大
  • D.语义相似度极高

答案:B。稠密向量指维度相对低(几百到一千多)且大多数维度取值非零的向量,与 TF-IDF 那种高维稀疏向量相对。选 B。A 描述的是稀疏检索,C 描述的是文档库规模,D 是检索的目标而非「稠密」的定义。

Q2. 稠密检索中,「文本画像」的专业术语是?

单选题 · easy

  • A.词频统计向量
  • B.哈希编码向量
  • C.文本嵌入向量← 正确答案
  • D.词性标注向量

答案:C。文本嵌入向量(Text Embedding)是神经网络把整段文本编码成的稠密向量,语义相近的文本在向量空间里距离也近。A 词频统计是稀疏表达,B 哈希编码通常用于近似词袋,D 词性标注是 NLP 中间任务,均非文本画像。

Q3. 余弦相似度公式中分母(模长乘积)的作用是?

单选题 · mid

  • A.扩大向量长度的差异影响
  • B.消除向量长度差异只看方向← 正确答案
  • C.将相似度映射到 0 到 1
  • D.加速矩阵相似度运算

答案:B。分母用两个向量的模长做归一化后,结果只取决于方向的夹角,与向量长短无关,因此可以公平比较「语义角度」而不是「文本长度」。A 与分母作用相反,C 余弦范围是 [-1,1] 而非 0-1,D 是工程优化手段,与公式语义无关。

Q4. 双塔模型训练中引入「硬负样本」的目的是?

单选题 · mid

  • A.帮助模型记住正样本顺序
  • B.降低负样本的数量规模
  • C.让模型学会区分易混淆难例← 正确答案
  • D.压缩向量维度降低存储

答案:C。硬负样本是那些与正样本很相似但不对应的文档,迫使模型关注语义细节的边界,比如区分「沟通技巧」与「演讲技巧」。A 顺序记忆不是目标,B 负样本数量不因此减少,D 压缩维度是模型设计问题。

Q5. 以下哪个属于稠密检索的典型应用场景?

单选题 · mid

  • A.精确的编号匹配查询
  • B.同义改写后的语义召回← 正确答案
  • C.全文关键字高亮定位
  • D.字典表等值连接操作

答案:B。稠密检索强项是「语义相近但字面不同」,同义改写正是它的典型场景。A 精确编号匹配更适合 BM25,C 关键字高亮是精确检索任务,D 数据库等值连接属于传统关系型查询,与语义检索无关。

Q6. RRF 融合公式中 rank_i(d) 表示什么?

单选题 · hard

  • A.文档 d 在第 i 路的交叉熵排名
  • B.文档 d 在第 i 路检索结果中的名次← 正确答案
  • C.第 i 个模型输出的相似度得分
  • D.文档 d 在第 i 层索引中的层号

答案:B。RRF 的核心思想是「名次融合」:它在各路检索引擎返回的排序列表中取文档 d 的名次,再取倒数求和,名次越靠前贡献越大。A 交叉熵是损失函数,C 相似度得分是分数融合而非名次融合,D 层号是 HNSW 索引概念。

Q7. 工程中使用 HNSW 做 ANN 索引的原因有哪些?

多选题 · hard

  • A.把检索复杂度降到近似对数级← 正确答案
  • B.可容忍少量召回损失换取响应速度← 正确答案
  • C.保证检索结果严格全局最优
  • D.支持千万级甚至亿级向量近邻检索← 正确答案

答案:ABD。HNSW 通过分层图结构与多层跳转把复杂度降到对数级别,支持海量向量场景,本质是「近似」检索,会牺牲少量召回率换取毫秒级速度。C 说保证严格全局最优是错误的——精确全局最优需要暴力扫描,ANN 恰恰放弃了这个保证。

Q8. HNSW 中若 m=4,一个节点出现在第 3 层的概率是?

单选题 · extreme

  • A.1/4
  • B.1/8
  • C.1/16
  • D.1/64← 正确答案

答案:D。层级概率满足 P(h) = (1/m)^h,代入 m=4、h=3,得 (1/4)^3 = 1/64。这也是「金字塔」结构的原因:越高的层节点越稀疏,检索才能从粗略到精细地快速跳转。A 是 h=1 的概率,B 对应 h=1.5 无意义,C 对应 h=2 的概率。

Q9. 向量归一化后,余弦相似度与内积的关系是?

单选题 · mid

  • A.两者互为相反数
  • B.两者完全等价← 正确答案
  • C.内积变为欧氏距离
  • D.余弦值恒为 1

答案:B。归一化后模长为 1,余弦公式中的分母变成 1,于是余弦值等于内积,所以工程上先归一化再算内积可以大幅提速。A 相反数没有依据,C 归一化不改变距离定义,D 只有同向向量才恒为 1。

Q10. 下列哪些是稠密检索常用的评测指标?

多选题 · hard

  • A.Recall@k 召回率← 正确答案
  • B.MRR 平均倒数排名← 正确答案
  • C.BLEU 翻译质量分
  • D.NDCG 归一化折损累计增益← 正确答案

答案:ABD。Recall@k 看正确答案在 Top-k 中被召回的比例,MRR 看第一个正确答案的名次倒数,NDCG 综合考虑排序质量,三者都是检索任务标准指标。BLEU 是机器翻译/生成任务的评估指标,衡量生成文本与参考文本的重合度,与检索排序无关。