想象一个叫“句子缘”的婚恋交友平台。每个注册用户(一句话)都有一份性格档案,平台的红娘(检索系统)则负责在几百万份档案中,为新来的客户(查询)找到最合拍的对象。 早年,红娘手里只有写着名字的纸质卡片(One-Hot编码),词与词之间毫无联系。后来升级成“兴趣标签”(Word2Vec静态词向量),“猫”和“狗”因为常出现在相似语境里,被贴上相近的标签。再后来,一位心理学博士(BERT)登场了,他能读懂上下文,为每个词画出精准的动态性格画像。但麻烦也来了:博士的完整报告太厚太长,红娘根本来不及逐页翻阅。于是平台专门训练了一批“速配师”(Sentence-BERT),把长篇报告浓缩成一张“性格速查卡”(句向量),并学会快速计算两个人合不合拍(相似度)。最后,为了让千万级匹配在毫秒内完成,红娘设计了不同的档案管理方案——暴力翻阅、按区域分组(IVF)、按关系画图谱(HNSW)。这就是本文要讲的完整故事。
掌握文本Embedding与向量检索,是构建语义搜索、智能问答、推荐系统的底层能力。理解BERT如何编码语义、Sentence-BERT如何生成优质句向量、HNSW/IVF如何加速召回,能帮你直接落地一个可用的“语义版”搜索系统。
目录
可视化演示
演示BERT与Sentence-BERT的Embedding生成过程:Token级编码与句向量池化、语义空间的聚类分布,以及基于余弦相似度的向量检索匹配。
本节配有交互动效(进入视口后自动加载,约 3KB)。
BERT Token编码与SBERT池化 BERT对每个Token生成独立向量,CLS聚合语义信息 Sentence-BERT通过均值池化生成句级Embedding 句向量可直接计算余弦相似度,效率远超交叉编码 e=MeanPooling(BERT(tokens)) 池化策略决定语义表示质量
1. 词向量基础:从名字卡片到兴趣标签
“句子缘”平台刚成立时,每位用户只有一张写着名字的纸质卡片——这就是最早的One-Hot编码。每个词被表示成一个超级长的稀疏向量,向量里只有自己那一维是1,其他全是0。“猫”和“狗”之间毫无关联,就像两张卡片上只写着“王猫猫”和“李狗狗”,红娘根本看不出两人都喜欢毛茸茸。词与词之间没有距离概念,这正是One-Hot最致命的缺陷。
平台接着推出了“兴趣标签”——Word2Vec静态词向量。它的训练思路很朴素:一个词的意思由它身边的词决定。“猫”总是和“喵”“鱼”一起出现,“狗”总是和“汪”“骨头”一起出现,它们像参加过同一场相亲聚会的人,被分配了相似的标签,在高维空间里离得近。Word2Vec让“语义相似”第一次变得可计算。
具体来说,Word2Vec有CBOW和Skip-gram两种模式,核心目标函数是Softmax形式。训练时用神经网络预测某个窗口中的上下文词,训练完取隐藏层的权重作为词向量。这样“猫”和“狗”的向量就天然聚在一起,而“汽车”离它们很远,语义距离第一次有了可量化的坐标。
但静态词向量有个盲区:每个词只有一个固定向量。“苹果”在“我爱吃苹果”和“苹果公司发布新品”里是同一个向量,红娘听见前半句以为是水果,看了后半句才知道是科技公司。要解决“一词多义”,必须请来更聪明的心理学博士——BERT。
\displaystyle P(w_O|w_I) = \frac{\exp(v'_{w_O}^\top v_{w_I})}{\sum_{k=1}^{V} \exp(v'_k^\top v_{w_I})}- 分子是“合拍度投票”把中心词的输入向量与目标词的输出向量做内积,结果越大表示它们越相互吸引,再用指数函数放大差异。
\exp(v'_{w_O}^\top v_{w_I}) - 分母是“全员投票”对词表里所有词的输出向量 $v'_k$ 与中心词的合拍度求和,把分子分数归一化成0到1之间的真实概率。
\sum_{k=1}^{V} \exp(v'_k^\top v_{w_I}) - 训练目标让正确上下文词的概率最大化,等价于让相似词的向量靠得更近、无关词离得更远。
2. BERT双向编码:心理学博士的上下文洞察
BERT博士的厉害之处在于,他从不孤立地评价一个人。他读“苹果公司发布新品”时,会同时往左看“公司”、往右看“发布新品”,用完整的上下文判断:这里的“苹果”是一家企业。这份洞察力来自深度双向Transformer编码器。
Transformer编码器的核心是自注意力机制。每个词在更新自己的向量时,会向句子里所有其他词“提问”:你们谁和我关系最紧密?是“我爱吃的苹果”里的“苹果”,还是“苹果公司发布新品”里的“苹果”?自注意力并行计算句子内部所有词两两之间的关联权重,让每个词都获得全句的语境信息。
但普通的语言模型通常只能“从左往右”读,像只看简历前半段的HR。BERT设计了一个聪明的预训练任务MLM:随机遮住句子中15%的词,让模型像做填空题一样,根据左右两侧的信息预测被遮住的词。这一招强迫模型同时利用双向上下文,从而真正理解词语在具体语境中的含义。
经过BERT处理,每个词在不同句子中都会得到不同的动态向量。这相当于心理学博士给每个人写了一份“结合具体场景”的性格报告。但问题来了:红娘需要句子级的匹配,而BERT的“完整报告”动辄768维甚至更高,里面塞满了每个词的位置信息和局部细节,直接拿去比对很不合适。这就到了第三节——为什么长篇报告不能直接当速查卡。
- Q和K做内积,算出“合拍度”句子里每个词作为Query去和其他词的Key打分,得到一个表示“关联强弱”的注意力分数矩阵。
- 除以缩放因子并归一化$\sqrt{d_k}$ 防止内积值过大导致梯度消失;Softmax把每一行分数归一化成权重之和为1的概率分布。
- 用权重加权Value注意力权重对Value做加权求和,每个词的输出向量就是全句信息的加权融合——这个词现在“看得见”整句话。
3. 句向量瓶颈:厚重报告的取舍难题
很多“句子缘”新手红娘最开始的做法,是把博士报告里所有词向量平均一下当作句子的整体画像。这个操作叫逐词平均池化。但结果并不理想:就像把一份性格报告里所有形容词揉成一团,“既活泼又安静,既外向又谨慎”——平均完之后哪种性格都不突出,关键信息被稀释了。
另一种做法是取BERT输入末尾那个[CLS]标记的向量。BERT预训练时[CLS]位置被设计来汇总全句信息,但在未针对句子相似度任务微调时,[CLS]向量表现糟糕,甚至存在“各向异性”问题:所有句子向量挤在一个狭窄的锥形区域里,两两之间的差异很小,语义几乎“坍缩”成一团。
更深层的问题来自“维度灾难”。随着句子向量维度增高,高维空间中的点越来越稀疏,任意两点之间的距离都趋近同一个常数——就像在一间超大的体育馆里撒上万把椅子,任何两把椅子之间的距离看起来都差不多。这时用欧氏距离或余弦相似度,很难区分“猫在沙发上睡觉”和“这辆汽车很省油”谁更接近查询。
直接平均的思路简单,但“没有重点”正是它的死穴。要生成真正适合比对的句向量,平台需要一批专业的“速配师”——他们在明确的任务目标(判断两句话是否同义/是否相关)中,学会把报告浓缩成一张信息密度极高的速查卡。这就是Sentence-BERT的登场。
- 取出每个词的BERT输出向量$\mathbf{h}_i$ 表示第 $i$ 个词经过多层Transformer后的上下文向量,已经包含全句信息。
- 对全部n个词向量求和把句子中所有词的信息累加成一个总向量。
- 除以词数取平均得到句子的平均表示,每个词的贡献被均匀对待,没有突出任何关键词。
4. Sentence-BERT:专业速配师的孪生绝技
速配师(Sentence-BERT)的培训模式很特别:他不需要背诵整份报告,只需要学习“如何把两个句子放一起比较”。训练时,两句话分别输入两个结构完全相同的BERT编码器——这就是“孪生网络”。注意这两个编码器的权重完全共享,相当于同一个速配师用同一套标准分别打量两人,保证两张速查卡的“书写风格”一致。
拿到两个句子的词级输出后,速配师会进行池化。论文里对比了CLS、MEAN、MAX三种策略,实践中最常用的是MEAN池化,即把所有词向量平均成一个固定维度的句向量。这一步把“长篇报告”压缩成“一张速查卡”——维度固定(比如768维),信息浓缩,适合快速比较。
训练目标用对比学习:从数据里取一对“同义句”作为正样本,再取几对“不相关句”作为负样本。模型要让正样本对的余弦相似度尽量高,负样本对的距离尽量远。就好比红娘培训速配师时反复纠正他:“这两个人性格合拍,打高分;这两个人南辕北辙,打低分。”
训练完成后,Sentence-BERT的编码器可以把任意句子映射成有意义的句向量。有了优质的“速查卡”,接下来就得解决千万级档案的管理问题——红娘的检索系统不能每次都把所有档案翻一遍。
- 相似度打分$\text{sim}(\mathbf a, \mathbf p)$ 通常用余弦相似度,衡量两张速查卡的“合拍度”,取值越大越相似。
- 正样本占比归一化分子是正样本放大后的指数,分母是正负样本指数之和;比值表示“正样本在所有样本中的相对权重”。
- 取负对数整个分数越接近1,损失越小;把分数转化为损失值后,训练时通过梯度下降最小化它。
5. 向量检索原理:红娘的档案管理进化史
最朴素的红娘是“暴力全扫描”:来一个新人,就把他和数据库里所有存档逐一比对,取相似度最高的前K个。这个方案精确无遗漏,但平台有1000万份档案,每次匹配都要做1000万次余弦计算,延迟暴涨到几秒甚至几十秒。用户等不起。
于是产生了“近似最近邻”思想。红娘不再保证100%找到最合拍的人,而是保证“大概率找到很合拍的人”,换取数量级的提速。ANN家族里最直观的方案是IVF(倒排文件索引):先用K-means把所有句子向量聚成nlist个簇,每个簇有一个簇中心;查询时只选最近的nprobe个簇,在簇内做暴力扫描,计算量一下子降到原来的nprobe/nlist。
另一个明星方案是HNSW(分层可导航小世界图)。它用“多层图”组织数据:最上层只有少量节点、连接稀疏,像城市地铁的“区域快线”;下层节点越来越多、连接密集,像“每站都停的公交”。查询时从顶层出发,沿着图边不断跳到距离查询点更近的节点,逐层下钻,最后在底层精确找到最近邻。几跳之内就能大致锁定答案区域。
IVF和HNSW各有千秋:IVF内存紧凑、构建快,适合超大规模甚至分布式场景;HNSW召回率更高、查询更快,但内存占用偏大。真实工程里,两者还常结合乘积量化(PQ)一起使用,把“速查卡”本身再压缩一档,让内存和速度双丰收。
- 聚类把档案分成nlist个区K-means把N个向量分成nlist个簇,每个簇的中心向量代表这个区的“气质代表”。
- 查询时只挑nprobe个最近簇把查询向量和所有簇中心比对,挑出距离最近的nprobe个簇,跳过其余簇。
- 只在候选簇内暴力扫描候选簇内做精确距离计算,总计算量正比于候选簇的向量总数,即上式。
6. 检索性能优化:给档案库装上压缩与快车道
平台会员突破千万,“速查卡”也越来越多。每张卡768维浮点数,1000万张就要占用约30GB内存,服务器快撑不住了。乘积量化(PQ)登场:把768维向量切成M段子向量,每段分别做聚类产生一个“码本”,每个子段只用码本编号(如一个字节)表示。查询时先预计算每段码本中所有中心与对应子段的距离,用查表代替真实向量距离计算。存储量骤降,速度反升——这就是“为速查卡做有损压缩”。
按工程师的话说,PQ是“用少量精度换大量内存和速度”。但检索链路还可以继续优化,常见方案是“粗排精排”两阶段:粗排阶段用PQ压缩后的近似距离快速召回Top 2000,精排阶段用原始浮点向量精确计算Top 2000的距离,再取Top 10返回。红娘先花一秒广撒网,再花一秒细品茶,效率远高于对1000万人都品茶。
多级索引与缓存是另外两味加速药:多级索引指“先按聚类分区,区内再建HNSW”,两级漏斗逐层缩小范围;缓存指把高频查询(比如当日热搜问题)的结果直接存起来,命中缓存就直接返回,避免重复检索。平台还配合异步更新索引,避免每次新增会员都重建整个档案库。
压缩、粗排、缓存这些优化让系统在千万级数据上依然能毫秒级返回。但红娘的服务质量如何衡量?检索系统上线后如何监控?最后一节讲工程落地。
- 切分子空间$u_m(\mathbf x)$ 取出向量 $\mathbf x$ 的第 $m$ 段子向量。
- 查码本$c_{m,k_m}$ 是第 $m$ 段码本中离该子向量最近的码字中心,用下标 $k_m$ 编码存储,只需1个字节。
- 距离求和近似各段子距离 $d_m$ 相加,作为原始向量与查询向量距离的近似值。因为每段可以查表,省去了逐维浮点运算。
7. 工程落地实践:给红娘系统装上仪表盘
平台决定考核红娘的工作质量。光看“她一天匹配多少人”不够,还要看“她想找的人都找到了吗”——这就是召回率Recall@K。如果100个真正合拍的档案里有85个出现在她推荐的前K个名单里,Recall@K就是85%。它衡量的是“该找回的有没有漏掉”。
另一个关键指标是MRR(平均倒数排名):合拍的档案在推荐列表里排第2,贡献1/2;排第5,贡献1/5。倒数排名对“排序靠前”非常敏感,适合评估问答、搜索这类“第一名很重要”的场景。延迟指标也不能忽视:p99(99%请求的耗时上限)比平均延迟更能反映体验——偶尔的超时卡顿比稳定的慢更让人崩溃。
工程上还会纠结索引选型:千万级以下、对召回要求高,选HNSW;亿级以上、内存吃紧,选IVF+PQ;要支持实时增删,用支持动态插入的HNSW变体。全链路搭建不只是模型和索引,还包括:离线用Sentence-BERT批量生成文档向量、写入索引;线上用同一模型生成查询向量、送入索引检索;定期用新数据增量更新索引;接入监控看板观察召回率、延迟、内存水位。
至此,从一张名字卡片到BERT博士的性格报告,再到Sentence-BERT速配师的速查卡,最后是红娘的千万级档案检索系统,一条完整的语义搜索链路搭建完成。红娘系统上线后用户满意率大增——这就是今天故事的全部答案。
- 分子统计相关文档被命中数$R_{\text{相关}} \cap R_{\text{召回的K条}}$ 表示“本该命中的”和“实际返回的”重叠了多少条。
- 分母是全部相关文档数$|R_{\text{相关}}|$ 是人工标注的所有真正合拍的档案数量。
- 比值即召回率比值越接近1,红娘越没有漏掉真正合拍的档案。
AI 应用场景
场景一:智能客服FAQ语义匹配
阶段:离线向量化 + 在线近似检索
解决的问题:传统客服只能靠关键词精确匹配FAQ标题,用户说“我的手机连不上Wi-Fi了”匹配不到“无线网络连接失败的解决方法”。用Sentence-BERT把FAQ标题和答案一起编码成句向量,用户query编码后走HNSW索引检索,语义相近即可命中。
具体案例:某银行客服语料10万条FAQ,传统ES查不到就问不到、转人工;接入Embedding检索后语义召回率提升40%,“信用卡还款日怎么算”能召回“账单结算规则说明”。
场景二:电商搜索“语义召回”
阶段:查询改写与向量召回
解决的问题:用户搜“耐用的跑鞋”,字面匹配搜不到“耐磨运动鞋”。将商品标题/描述用Sentence-BERT编码进IVF+PQ索引,用户query先在向量侧召回语义相近的商品,再与BM25字面召回结果做粗排融合,大幅提升长尾query的搜索体验。
具体案例:某跨境电商把1000万商品标题向量化后,长尾query的整体点击率提升18%,“无线蓝牙耳机”能召回“TWS真无线入耳式耳机”。
场景三:工单自动聚类与查重
阶段:批量向量化 + 高维近邻聚类
解决的问题:技术团队每天收到大量相似工单,需要自动聚类发现高频问题。用Sentence-BERT对工单文本编码后做HNSW近邻查找,把相似工单聚成一簇,运维据此定位隐性故障热点。
具体案例:某SaaS公司10万条历史工单经向量聚类后,发现“导出报表超时”类问题占20%,由此定位到数据库慢查询根因。
Python 演示
from sentence_transformers import SentenceTransformer, util model = SentenceTransformer('paraphrase-MiniLM-L6-v2') corpus = [ "The cat is sleeping on the sofa.", "A dog is running in the park.", "The weather is nice today.", "I like eating apple pie.", "This car is very fuel efficient."]query = "A kitten is taking a nap." doc_emb = model.encode(corpus)query_emb = model.encode(query) scores = util.cos_sim(query_emb, doc_emb)[0]rank = scores.argsort(descending=True) print("Top 3 closest sentences:")for pos in range(3): idx = rank[pos].item() print(f"{scores[idx].item():.4f} {corpus[idx]}")
corpus 换成你自己的文档库、把列表换成批量编码,再套上 HNSW 索引,就得到了一个可用的语义搜索 demo。model = SentenceTransformer('paraphrase-MiniLM-L6-v2')加载一个轻量级 Sentence-BERT 预训练模型,开箱即用。doc_emb = model.encode(corpus)把5条候选句子编码成句向量矩阵,每个向量就是一张“性格速查卡”。query_emb = model.encode(query)查询句子同样经过同一套编码器生成句向量,保证坐标系一致。scores = util.cos_sim(query_emb, doc_emb)[0]计算查询向量与所有候选向量的余弦相似度,得到“合拍度”分数列表。rank = scores.argsort(descending=True)按相似度从高到低排序,输出最匹配的下标顺序。print(f"{scores[idx].item():.4f} {corpus[idx]}")打印分数和原句,让结果可读。
常见误区
误区BERT那么强,把[CLS]位置的向量拿出来当句向量放进检索系统,效果一定很好。
正解BERT预训练目标(MLM)优化的是“预测遮住词”,不是“让句子互相比对”。未经过微调的[CLS]向量呈现各向异性,所有句子挤成一条窄带,语义坍缩严重;在STS基准上性能甚至不如平均Word2Vec。必须用Sentence-BERT的对比学习目标在NLI/STS数据上微调后,[CLS]或MEAN池化向量才适合做句向量。
为何常见:很多人把“预训练模型很强”简单地等同于“输出任意特征都很好用”,忽略了预训练任务和下游任务目标之间的鸿沟。
误区BERT的向量有768维,比Word2Vec的300维更高,检索一定更准,不如直接上千维。
正解高维空间存在“维度灾难”:维度越高,任意两点的距离越趋近于一个常数,相似度区分度反而下降。768维在亿级数据下已经需要非常紧凑的索引结构;为了速度和内存,很多场景反而用PQ把维度切块量化。检索质量取决于训练目标和索引设计,而非单纯堆维度。
为何常见:直觉上觉得“信息越多越好”,忽略了高维空间几何特性的反直觉规律。
误区我用了HNSW/IVF,召回率应该是100%,比暴力扫描更快更好。
正解ANN的本质是“用精度换速度”。IVF只扫描nprobe个簇,会漏掉邻近但不在选中簇里的点;HNSW的贪心图搜索也可能停在局部最优。上线前必须用Recall@K、MRR等指标对比ANN和暴力结果,确认质量损失在可接受范围(如Recall@10≥0.95)。
为何常见:把“近似”二字忽略了,以为高性能索引是“更快且更准”的强化版暴力扫描。
误区HNSW又快又准,是终极方案,统统上HNSW。
正解HNSW上层小图内存开销大,亿级向量时可能装不进内存;且删除/更新节点代价高。离线批处理、内存受限、海量数据场景更适合IVF+PQ;需要动态增删的场景要用带增量更新能力的HNSW变体或联合构建。选型要综合数据规模、延迟预算、内存水位和更新频率。
为何常见:技术社区里HNSW声量最大,让人误以为只有它才是“行业标准”,忽略了每种方案都是权衡产物。
面试题
Q1. 关于One-Hot编码,下列说法正确的是?
- A.向量维度高且词间无语义关联← 正确答案
- B.向量维度低且包含上下文信息
- C.向量是稠密的浮点数向量
- D.向量能体现词语之间的相似度
答案:A。One-Hot把每个词映射为词表大小的稀疏向量,仅一维为1,其余全为0,维度随词表膨胀且任意两词正交无语义联系。B、C、D说的是稠密词向量的特征,与One-Hot矛盾。
Q2. Word2Vec的核心训练思想是什么?
- A.利用上下文预测目标词来学词向量← 正确答案
- B.统计词频后直接计数生成向量
- C.人工标注为每个词进行语义评分
- D.对整句做平均池化生成词向量
答案:A。Word2Vec用滑动窗口里的中心词与上下文词互相预测,在预测过程中压缩出稠密词向量。B是词袋统计,C是人工标注,D是句向量操作,都不是它的核心思想。
Q3. BERT能生成上下文相关词向量的根本原因是什么?
- A.使用深度双向Transformer编码器← 正确答案
- B.使用比Word2Vec更大的语料
- C.采用随机初始化的词嵌入矩阵
- D.使用CNN提取局部n-gram特征
答案:A。BERT通过双向Transformer让每个词同时看到左右两侧的信息,配合MLM预训练任务,使词向量随上下文动态变化。大语料有帮助但不是根本原因;BERT使用的是Transformer而非CNN。
Q4. 直接用BERT输出做句向量会遇到哪些典型问题?
- A.未经微调向量呈现各向异性分布← 正确答案
- B.平均池化会稀释句子的关键语义← 正确答案
- C.高维向量导致检索计算开销大← 正确答案
- D.向量无法用浮点数数组存储
答案:ABC。A是BERT句向量的经典“语义坍缩”现象;B是逐词平均的固有缺陷;C是768维向量在千万级检索时的现实瓶颈。D是基本错误——向量当然可以用浮点数组存储,正因如此才能做索引和检索。
Q5. Sentence-BERT中“孪生网络”指的是什么?
- A.两个结构相同且共享权重的编码器← 正确答案
- B.两个独立训练的不同结构编码器
- C.一个编码器加一个线性分类层
- D.一个编码器加一个语言模型头
答案:A。孪生网络是两个结构完全相同、权重完全共享的BERT编码器,保证两个句子被同一种标准编码。B权重和结构都不共享,是普通双塔但非孪生;C、D都只描述单侧结构,不符合孪生定义。
Q6. 相对于暴力全量扫描,ANN检索需要接受的代价有哪些?
- A.返回结果可能不是全局最近邻← 正确答案
- B.索引构建需要额外的构建与内存开销← 正确答案
- C.召回率指标可能需要打折评估← 正确答案
- D.必须改用非欧式距离度量
答案:ABC。ANN牺牲精确性换取速度,A是“近似”二字的本质代价;B是IVF/HNSW都需要构建索引和额外内存的现实成本;C对应工程上要用Recall@K监控质量损失。D错误,ANN并不强制更换距离度量,只是减少参与计算的点数。
Q7. IVF索引的核心思想是什么?
- A.聚类划分空间只搜少数候选簇← 正确答案
- B.用跳表在有序链表上加速查找
- C.用哈希函数把向量映射到固定桶
- D.用红黑树对所有向量做全序排列
答案:A。IVF先用K-means把所有向量聚成nlist个簇,查询时把目标限定在最近的nprobe个簇内做精确扫描,从而把计算量降到约nprobe/nlist。B是跳表,C是LSH,D是树结构,均不是IVF的思路。
Q8. HNSW索引的主要数据结构是什么?
- A.多层跳表结构的有向图← 正确答案
- B.一棵自平衡的二叉搜索树
- C.由随机超平面划分出的哈希桶
- D.按词频降序排列的倒排表
答案:A。HNSW把数据组织成多层图,顶层连接稀疏像“区域快线”,底层密集像“公交”,查询从顶层逐层下钻到精确层。B是树结构,C是LSH,D是文本检索的倒排索引,都与HNSW不符。
Q9. 乘积量化(PQ)能带来哪些收益?
- A.大幅降低每个向量的存储开销← 正确答案
- B.用查表方式加速距离计算← 正确答案
- C.用子空间码本近似替代原向量← 正确答案
- D.完全消除索引构建的聚类开销
答案:ABC。PQ把向量切段分别聚类,每段以码字编号存储,数据量从每维4字节降到每段1字节,A对;查询时各段距离预计算成表直接查表加和,B对;整体用各段码字中心拼凑出近似向量,C对。D错:PQ仍然要做子码本聚类,不会消除构建开销。
Q10. 语义检索中Recall@K=0.85的含义是什么?
- A.全部相关文档中85%出现在前K结果← 正确答案
- B.前K个结果中有85%是相关文档
- C.系统估算的候选集85%被最终返回
- D.前K个结果的平均相似度是0.85
答案:A。Recall@K的分母是全部相关文档数,分子是相关文档中被前K个结果召回的数量,比值0.85表示“该找的文档找回了85%”。B描述的是精确率Precision@K,C是过滤比例,D是相似度分值的实数概念,均与召回率定义不符。