加载中...
  • 混合检索如何落地:全文、语义、召回测试与可编辑片段loading

    AI 应用后端工程化:从原型到可交付系统 · 第 13 篇 · 第三章 · 数据管道

    比较关键词检索与向量检索的互补关系,并用召回测试和片段编辑建立质量反馈回路。

    向量检索擅长理解语义,全文检索擅长命中精确词。用户问“账户为什么无法登录”和文档中的“身份验证失败”含义相近,向量检索更有优势;用户输入错误码 E1027,关键词索引通常更可靠。成熟检索不必在两者中二选一,而要建立可评估的组合。

    两路召回,一次排序

    flowchart LR
      Query[查询] --> Normalize[规范化]
      Normalize --> FullText[全文召回]
      Normalize --> Semantic[语义召回]
      FullText --> Fusion[结果融合]
      Semantic --> Fusion
      Fusion --> Filter[权限/版本过滤]
      Filter --> Rerank[重排]
      Rerank --> TopK[候选证据]
      TopK --> Evaluate[召回测试]
    

    两种分数不能直接相加:BM25 与余弦相似度的范围和分布不同。可以分别排序后使用 Reciprocal Rank Fusion,也可以归一化后加权。选择方法应由评估集决定,而不是凭感觉设置 0.7 + 0.3

    def reciprocal_rank_fusion(rankings, k: int = 60):
        scores: dict[str, float] = {}
        for ranking in rankings:
            for position, item_id in enumerate(ranking, start=1):
                scores[item_id] = scores.get(item_id, 0.0) + 1 / (k + position)
        return sorted(scores, key=scores.get, reverse=True)
    

    融合保留了多个检索器的一致信号,同时不会假设原始分数可比较。它简单、可解释,很适合作为混合检索基线。

    过滤要尽量前置

    若先召回全库 Top 10,再删除无权限结果,用户可能只剩一条候选;更严重的是敏感文本已经进入重排模型或日志。租户、文档状态、版本与权限过滤应尽量下推到每个检索器。

    向量数据库与全文引擎对过滤支持不同,系统需要契约测试确认语义一致。删除数据集时也要同步清理两套索引,避免一边已经删除,另一边仍能搜到。

    召回测试测什么

    召回测试接口不应只显示一串分数。它需要保存查询、过滤条件、各检索器候选、融合顺序、最终片段和耗时。开发者才能判断是全文没分词、向量没命中,还是重排把正确结果降了下去。

    离线评估至少关注 Recall@K:正确证据是否进入前 K;MRR:第一个正确结果排多靠前;无答案误召回率:没有证据时系统是否仍给出高分。线上还可以观察用户点击引用、追问和人工纠错,但不能只用点击率代替答案质量。

    评估集要包含精确编号、同义表达、跨段问题、过期内容和无答案问题。只用开发者自己写的几个简单问句,会让所有参数看起来都很好。

    片段可编辑意味着索引可变

    人工发现片段错字或切分不合理时,允许编辑比重新上传整份文档高效。但编辑必须更新全文索引和向量索引,并记录版本。若数据库文本已经修改而向量仍对应旧内容,检索结果会出现无法解释的不一致。

    可以采用“写新版本再切换”的方式:保存新片段,生成向量,更新两个索引成功后将其设为 active,最后下线旧版本。失败时旧版本仍可服务。

    数据集删除不是一条 SQL

    一个数据集通常关联文档、片段、上传文件、后台任务、全文索引和向量对象。数据库级联删除只能处理同库关系。外部索引需要补偿任务与可重试状态。

    先把数据集标记 deleting,阻止新查询和写入,再异步清理各存储,完成后物理删除或保留墓碑。直接在请求中同步删除上万向量容易超时,用户重试又产生并发清理。

    语义相似的陷阱

    用户问“怎样关闭账户”,向量可能召回“账户被关闭后怎样恢复”,因为词义高度相似,操作方向却相反。重排模型可以改善,但更根本的是保留标题、动作类型等元数据,并在评估集中加入这种对抗样本。

    另一个陷阱是多个近重复片段占满 Top K。融合后应按来源去重或限制同一文档候选数量,让模型看到多样证据。否则所谓五条依据可能只是同一段的五个重叠窗口。

    搜索之外的迁移

    推荐系统会组合协同过滤与内容相似,风控会组合规则命中与模型分数,告警系统会融合多路信号。共同方法都是保留各路原始证据、使用可解释融合、通过标注集评估,并允许人工反馈修正数据。

    练习:构造十个片段和六个查询,分别记录全文、向量与融合排序。至少包含一个错误码查询和一个同义改写。计算 Recall@3,并解释一个融合后变好和一个仍失败的案例。

    四次提交形成反馈回路

    • 05d711a:加入全文与语义检索器,建立双路召回。
    • 4d6b6fd:实现召回测试接口,让检索过程可观察。
    • e94e8e3:补充数据集查询与删除,完善索引生命周期。
    • 609ced0:增加片段更新 API,让人工纠错可以回到数据层。

    检索器、测试接口、删除与编辑看似四类功能,合在一起正好构成“生成索引、验证结果、维护生命周期、修正错误”的质量闭环。

    本文目录
    本文目录