HOW 技术原理

向量检索:相似不等于相关

两句话向量很近,只说明它们常出现在相似的上下文里,不说明回答的是同一个问题。

向量检索:相似不等于相关
题图 / Unsplash

embedding 在算什么

把一段文本压成一串数字,语义相近的文本,数字之间的距离也近。

“怎么退款”和“退款流程”会很近,“怎么退款”和“退货政策”也近,但后者可能答非所问。

这个距离是在训练语料里学出来的,反映的是“经常一起出现”,不是“逻辑上等价”。

理解这一点,就能理解后面的所有误判。

所以向量检索擅长“找同类表述”,不擅长“判断真假对错”。

夜色中的地球灯火,语义网络
场景配图 / Unsplash

四种常见的相似误判

否定词。 “支持退款”和“不支持退款”向量非常近,意思相反。

数字。 “三十天”和“九十天”几乎一样,差的是关键。

专有名词。两个不同产品的型号,字面接近,指向完全不同的东西。

同义不同指。 “苹果手机”和“苹果价格”,都含苹果,指向不同。

这四种误判里,否定词造成的损失最大,因为答案看起来完全合理,只是意思反了。

混合检索怎么配

向量检索加关键词检索,两路结果合并再重排。这是目前最稳的做法。

关键词检索补的是精确匹配:型号、编号、人名、条款号。这些向量表达不好,字面匹配反而准。

合并方式有两种:按分数加权,或者各取前若干条再去重。后者简单,效果通常够用。

重排是最后一步,用一个专门的小模型对候选段落重新打分。量不大时,收益很明显。

重排模型不用太大,几千条候选里挑几十条,小模型够用。

手绘坐标与图表
场景配图 / Unsplash

召回率怎么测

准备五十个问题,人工标出每个问题的答案在哪一段。这是标准答案。

跑检索,看这五十个问题里,有多少个的正确答案出现在了返回的前五条里。这个比例就是召回率。

低于七成,先修文档和切块;七到九成,加重排;九成以上,再考虑换模型。

别用“看起来相关”来判断效果。人看五条会觉得都还行,实际正确答案可能一条都没进来。

所以标注时必须先看原文,再看检索结果。

补充一句召回率和准确率要分开看。召回是“该找到的找到没有”,准确是“找到的有没有用”。前者更要紧。 实际调优时,先把召回做到九成,再谈准确率。召回不够,后面全是白搭。
终端里跑检索脚本
场景配图 / Unsplash

常见问题

embedding 模型要跟生成模型一致吗?

不需要,两套是独立的。但要保证建库和查询用的是同一个 embedding 模型,换模型要重建索引。

切多长合适?

三百到八百字之间,按语义边界切。固定字数切最省事,效果最差。

重排值得上吗?

候选多、要求高的时候值得。候选只有三五条,重排收益有限。