单位 4 / 11

检索策略:Top-k、混合、重新排序

收益:

  • 实现结合top-k选择和语义和关键词搜索的混合搜索
  • 通过重新排名提高首次搜索的准确性
  • 通过查询转换和 HyDE 等技术使难题更易于搜索

您很好地粉碎了文档并将它们放入矢量数据库中。现在真正的工作是:当用户提出问题时获取正确的部分。这称为检索,是 RAG 质量的支柱。记住这句话“检索质量=RAG质量”;这个单元正是提高质量的艺术。我们将涵盖从 t​​op-k 选择到混合搜索,从重新排序到查询转换的实用技术。

Top-k:我们会带多少件?

最基本的设置:搜索返回多少件(k)。如果您携带的物品较少(k=1),则错过正确物品的风险很高;如果添加太多(k=20),就会给模型增加噪音,代币成本也会增加。

区分两个概念。召回率:正确的作品在检索到的作品中的比率。精度:检索内容的相关率。增加 k 会增加召回率,但会降低精确度。目标是平衡两者。

前k个

影响

适合的情况

1-3

精度高,有遗漏风险

简单的单选题

4-8

平衡;大多数场景

一般企业 RAG

10-20日

召回率更高,噪音增加

重新排名(下)

提示:常见且强大的模式:获取宽范围 (k=20),然后通过重新排名缩小范围(前 4 个)。这样您就不会错过任何内容,并且可以为模型提供清晰的上下文。

混合搜索:两种搜索的力量

语义(矢量)搜索捕获了含义,但遗漏了一些内容:完整的产品代码(“XR-4471”)、罕见的缩写、专有名称、版本号。对于这些精确匹配任务,老式关键字搜索(尤其是称为 BM25 的经典算法)非常好。

混合搜索将两者结合起来:语义搜索和关键字搜索都可以工作,并结合结果。因此,在诸如“保修期”之类的问题中,

合并通常通过 RRF(倒数排名融合)完成:两个列表中较高的曲目会出现在前面。

# 混合检索(概念)sem = vector_search(question, k=20) #meaningkey = bm25_search(question, k=20) # fullwordresult = rrf_merge(sem, key)[:8] # 融合两者,前 8 个

重新排名:第二和更智能的通行证

第一次通话可能很快但很粗鲁。使用更强大的模型(通常是交叉编码器 - 一起读取问题和段落并对相关性进行评分的模型)对第一次搜索返回的候选者进行重新排名,并将最相关的候选者移动到顶部。

逻辑是这样的:第一次搜索分配大量候选者用于召回(20 个候选者),重新排序器选择最好的 4 个候选者以提高精确度。这种两阶段方法比单阶段搜索准确得多。会产生一些延迟和额外的处理;收获是质量的显着提高。

# 两阶段检索(概念)candidates = Hybrid_search(question, k=20) # 广泛,quickscore = reranker.score(question, Candidates) # 每个候选者的相关性得分 context = rating.rank()[:4] # 前 4 名

转换查询

有时问题不在于搜索,而在于问题本身。如果用户问“远程工作人员怎么样?” ’,这不能单独寻求(目前尚不清楚远程工作人员的情况是什么)。以下是查询转换技术:

  • 重写:使用对话历史记录来独立提出问题:“远程工作人员有权享受哪些年假?”
  • 多查询:生成同一问题的 3 个不同表达方式,对所有这些表达方式进行搜索,然后合并结果。不同的词会找到不同的部分。
  • HyDE(假设文档嵌入):首先打印模型的“可能答案”,然后嵌入并搜索该假设答案。有时,想象的答案会更好,因为它在文字上更接近真实的文档。

# 多查询(概念)variants = model.uret("用 3 种不同的方式表达这个问题:" + Question)tum_sonuc = []for v invariants: all_sonuc += vector_intermediate(v, k=6)context = Single_and_order(tum_result)[:6]

弱检索/强检索

弱(单阶段,仅语义,常数 k=3):

result = vector_search(question, k=3)# 问题:产品代码丢失,无法在困难问题中输入正确的第 3 部分。

功能强大(混合+ Widek + 重新排名+必要时的多查询):

候选者=hybrid_search(rewrite(question,过去),k=20)context=reranker.score(question,candidates).first(4)#精确匹配和含义均被捕获;选出最好的 4 个模型。

三个迷你箱

案例 1 — 产品代码逃逸。支持团队的纯语义搜索无法在“RTX-9080 驱动程序错误”问题中逐字找到“RTX-9080”;他带来了其他名称相似的产品。添加混合搜索后,出现了精确的代码匹配,返回正确文章的比率从 58% 提高到 92%。

案例 2 — 重新排名差异。一名律师助理使用 k=5,但大多数情况下正确的项目是 7-10。他留在队伍中。当k=20+引入重新排名时,正确文章进入前3名的比率从61%提高到94%;延迟仅增加 300 毫秒——这是一个可以接受的折衷方案。

案例 3 — 没有上下文的后续问题。在人力资源助理中,用户询问“兼职人员呢?”当我询问时,系统带来了无关的部分。通过重写查询(从过去拉出“年假”上下文并添加“兼职员工有权享受年假”),正确答案率从 40% 提高到 86%。

常见错误

  • 单纯依靠语义搜索:产品代码、缩写、专有名称丢失;添加混合动力。
  • 让k太小:正确的棋子无法进入列表;通过重新排序使其变宽和缩小。
  • 从不考虑重新排名:第一次搜索是粗鲁的;第二次智能通过显着提高了质量。
  • 按原样搜索后续问题:没有上下文的问题搜索毫无意义;改写。
  • 盲目增加k(不重新排序):模型充满噪声,响应失真,成本增加。
注意:每种技术都会增加成本和延迟。多重查询意味着3倍搜索,重新排序意味着额外的模型调用。先从简单混合+合理k开始;在真正需要的地方测量和添加重型技术。无需测量即可添加。

综上所述

  • Top-k是查全率和查准率之间的平衡;一般来说 4-8 是一个好的开始。
  • 混合搜索将语义搜索与关键词(BM25)搜索相结合;恢复精确匹配。
  • 重新排名通过强大的模型对广泛的初始搜索中的候选者进行重新评分,并选择最佳的候选者。
  • 查询转换(重写、多查询、HyDE)使困难且与上下文无关的问题变得可搜索。
  • 强模式:广泛获取→与混合合并→缩小范围并重新排序;但通过测量来添加每种技术。

应用任务

使用之前单元的数据准备 6 个困难问题:至少 2 个需要完全匹配的问题(产品代码、缩写、日期)、2 个语义问题(相同主题但不同单词)、2 个没有上下文的后续问题。 (1) 首先将每个问题视为纯语义搜索,并手动标记将出现哪些部分。 (2) 重新评估相同的问题,添加混合和重新排名。 (3) 在没有上下文的情况下重写后续问题。以表格形式注明哪种技术对哪种问题类型有影响。

清单

  • [ ] 我知道top-k是召回率-精度的平衡和合理的起始范围。
  • [ ] 我可以解释为什么混合搜索可以恢复精确匹配。
  • [ ] 我可以应用重新排名的两步逻辑(宽→智能窄)。
  • [ ] 我认识到需要在没有上下文的情况下重写后续问题。
  • [ ] 我确认我是通过测量而不是通过测量来添加重型技术的。