两种检索解决不同的失配
产品手册里的短型号、错误码和精确参数通常只有几个字符,向量表示容易被周围通用语义稀释;用户说“那个能耐高温的旧款”时,关键词又未必与正式术语重合。混合检索不是简单把两份结果拼在一起,而是让词法通道守住精确标识,让语义通道覆盖同义表达,再通过可解释融合形成候选集。生成模型只能消费这个候选集,不能用相似记忆补齐缺失事实。
设计前先区分查询中的硬锚点与软意图。型号、版本、法规编号、日期和带单位数值应原样保留,必要时做大小写或连字符的受控变体;自然语言目的则生成语义查询。若改写模型把型号纠正成另一个常见型号,后续召回再高也已偏题,因此原查询、解析结果和改写版本都要保存,且硬锚点不能被改写覆盖。
索引先保留文档结构与版本
切片不能只存一段文本和向量。每个片段应携带文档标识、内容版本、页码或章节、标题路径、片段类型和相邻关系;表格还需保存表题、列头、行头和单位。这样检索命中一个单元格时,系统能补足解释所需的表头,而不是把数值脱离列关系交给模型。代码块、警告框和脚注也应按各自边界处理。
文档更新采用版本化索引流程:新版本完成解析、嵌入和完整性检查后再切换可见指针,旧版本退出在线检索但保留必要审计。不能在重建过程中让新旧切片混杂,也不能只新增内容而忘记删除过期段落。片段记录源文件摘要和处理器版本,便于确认一次引用究竟来自哪份原文以及哪套切片规则。
独立归一后再融合排名
关键词分数与向量相似度没有共同量纲,直接相加会让数值范围较大的通道长期占优。可以先在各自候选中按名次做倒数排名融合,或用固定金标集校准分数分布,再加入硬锚点匹配、文档新鲜度和权限过滤。融合参数必须版本化,不能随着一次线上问题临时调整后失去可复现性。每个结果还应记录来自哪些通道及其原始名次。
权限过滤应尽可能在检索阶段完成,而不是召回后让模型忽略。若底层向量库只能后过滤,候选数不足可能导致合法结果被越权结果挤出,需要扩大受控候选或按租户分区。重复片段要聚类去重,但同一句在不同版本出现时不能丢掉版本信息。重排器接收的文本长度有限,应优先保留标题、命中位置和否定词附近内容。
证据编号成为生成边界
检索服务为每个候选分配本次请求内的证据编号,并返回可引用片段、来源位置与版本。生成提示明确要求每个事实性结论关联编号,编号只能从本次集合选择;应用在输出后解析引用并验证存在性。长期文档编号不宜直接充当证据编号,因为模型可能从训练或前文猜到一个有效标识,绕过本次检索范围。
有编号不代表结论受到支持。验证器还要检查引用片段是否包含核心实体、关系、数值和限定条件,特别关注“不支持”“仅适用于旧版”等否定信息。对高风险答案可把结论拆成原子陈述逐项核对;无法自动判断的进入人工抽样。展示层提供跳回原文版本和位置的入口,让读者能够看到引用上下文,而不是只看到一个装饰性角标。
证据不足时显式返回缺口
系统需要定义最低证据条件,例如硬型号必须至少有精确命中,参数回答必须同时取得数值、单位和适用版本,比较问题必须覆盖双方资料。条件不满足时返回缺少哪份信息、尝试过哪些查询和可供用户补充的字段,而不是提高温度继续生成。拒答也是一种可评测结果,不能在产品层被统一改写成看似有帮助的猜测。
多轮对话中,上一轮证据不能无条件沿用。用户改变型号、时间范围或文档集合后,应重新检索并生成新证据集合;若沿用,必须确认版本与权限仍有效。查询扩展可以尝试同义词、缩写和结构路径,但达到预算仍无证据就停止。这样系统把未知保持为未知,避免相似产品的参数被悄悄移植。
升级组件时防止隐性漂移
嵌入模型升级会改变相似度分布,不能在原阈值下直接替换向量。应在平行索引上重算固定金标集,比较召回、排名、成本和存储,再一次性切换索引版本。重排模型与查询改写器也有独立版本,任何一项变化都可能截断关键词或改变语言偏好。线上请求需记录完整检索配置,便于出现错误引用时重放。
内容管道漂移同样危险。OCR 更新可能改变页码映射,解析器可能把表头拆开,去重算法可能删除看似重复但单位不同的行。索引构建应有结构完整性检查:页数、标题层级、表格行列、空片段比例和源摘要均在合理范围。若失败,保留上一可用版本,不把半成品暴露给检索服务。
用金标与引用审计组成验证矩阵
从真实问题标注最小证据集合,分别运行关键词、向量和融合方案,报告各自的召回率与前若干名命中,而不是只看最终答案。样本要覆盖短型号、口语同义、表格参数、否定条款、旧版本和确实无答案的问题。融合若没有同时改善目标桶,就应检查归一与权重,而不能凭总体均值宣布成功。
端到端测试逐条核对引用覆盖率、结论支持关系、绝对来源位置和版本一致性;无证据样本必须稳定说明缺口。索引重建前后使用同一金标比较并审阅退化项,随机抽取引用验证能跳回原文页与结构路径。最终门槛同时约束召回、错误支持率、拒答稳定性和过期片段为零,才能让关键词、向量与证据编号真正各司其职。
查询诊断保留每个阶段的候选
线上答案缺证据时,需要知道问题出在解析、召回、融合还是生成。诊断事件记录硬锚点、各通道候选标识与名次、融合参数、重排变化和最终证据集合,但不复制受限正文。使用请求内追踪标识串联阶段,工程师可判断正确片段从未召回,还是召回后被错误降序。
诊断数据按租户权限访问,资源标识使用可控映射,避免观测平台成为文档目录。高基数候选不进入指标标签,只在短期追踪中保留。若要查看片段,诊断界面回到原文权限服务实时授权,而不是从日志直接展示缓存正文。
回放工具使用相同索引和配置版本,外部版本已下线时明确标记不可完整重放。对同一查询比较单通道与融合轨迹,找到丢失阶段后再调整切片或权重,避免靠改写最终提示掩盖检索缺口。
内部链接帮助补证据但不替代召回
文档章节之间的明确引用可用于扩展上下文,例如参数表引用定义页、正文引用附录限制。只有源文件中可验证的结构链接或受控知识图边才能扩展,模型猜测的相关章节不直接加入证据。扩展遵循权限、版本和跳数上限,防止一条链接拖入整个资料库。
邻接补充在融合排名之后进行并标明来源原因,主命中与辅助上下文分开。回答若使用辅助块,同样要引用具体编号。链接指向旧版本或已删除文档时停止扩展并报告缺口,不能自动选择标题相似的新文件。
测试构造循环链接、跨租户链接、断链和版本错链,确认遍历有界且权限优先。金标单独统计需要链接扩展的问题,观察它是否提高证据覆盖而没有增加错误支持。还要把极短错误码、混合中英文型号、单位相同而量纲不同和表头跨页纳入压力样本,分别观察词法锚点与语义候选是否被错误去重。对重排器输入制造超长前缀,确认命中位置与否定限定不会因截断消失;对融合参数做小幅扰动,结果不应在无关片段间剧烈跳变。人工审阅错误引用时记录是实体、关系、版本还是单位不一致,再据此扩充对应金标桶;连续无答案查询也要确认拒答原因来自证据阈值而非服务故障,并记录各通道在拒答前实际返回的候选规模。结构关系成为受控补充,而不是绕过检索门槛的后门。
实现片段
const ranked = reciprocalRankFusion(keywordHits, vectorHits)
评论 · 0