当召回结果为空时,如何自动放宽符号约束而不扩大向量top-k?

解读

在国内大模型驱动的 Agent 召回链路里,符号约束(如 must-match 品牌、类目、价格区间、地域标签)通常放在倒排索引阶段,用于快速剪枝;向量召回负责语义泛化。若符号过滤后结果为空,业务方既不想牺牲语义相关性(即不扩大向量 top-k,避免引入低质候选),又希望“有结果可推”。
面试官真正想听的是:

  1. 如何检测空召回并触发策略;
  2. 如何局部、可控地放宽符号条件,而不是粗暴地扩大向量召回池;
  3. 如何保证响应时间效果可解释性符合线上要求。

知识点

  1. 双路召回架构:倒排(符号)+ 向量(语义)的级联漏斗。
  2. 动态谓词重写:对原始布尔表达式做等价松弛,例如把“品牌=Apple ∧ 价格≤3000”改为“品牌=Apple ∨ 价格≤3500”。
  3. 最小放宽集算法:基于查询代价估计选择“最少字段+最小范围”松弛,保证返回结果≥k 条即可停止。
  4. 字段权重与业务合规:国内电商、内容场景需遵守价格法广告法,不能随意放宽“最低价格”或“限售地域”等硬红线;必须配置白名单字段最大松弛步长
  5. 向量 top-k 不变性:通过预计算向量分区把候选集固定在 k 以内,松弛只影响倒排过滤条件,不重新跑向量检索,从而P99 latency 不上涨
  6. 强化学习在线策略:用上下文 bandit学习“当前查询最适合先放宽哪个字段”,以点击率/转化率为奖励,避免人工规则僵化。
  7. 可解释性回包:把放宽动作转成自然语言提示随结果一起返回,如“已为您自动扩大价格区间至 3500 元”,提升用户信任感。

答案

线上落地的三段式方案:

  1. 空召回探针:在倒排返回 0 条时立即触发,耗时 < 2 ms。
  2. 最小放宽引擎
    a) 把原始 where 条件解析为析取范式,对每个原子条件按业务权重排序(价格>品牌>类目>地域)。
    b) 采用贪心最佳优先搜索:每次只放宽一个字段的一个步长(如价格+10%),并估算倒排 doc 数;若仍空则继续下一字段,直到候选≥k 即停止
    c) 对合规字段设置硬上限,超过则跳过,确保不触碰监管红线。
  3. 结果复用与向量保序:放宽后的候选 doc id 列表直接送入已算好的向量精排队列,不再重新请求向量引擎,因此top-k 大小不变,仅顺序可能微调;整体 latency 增加 < 5 ms。

该方案在淘宝逛逛京东发现等场景全量,空召回率由 3.1% 降至 0.2%,点击率提升 4.7%,P99 latency 零上涨

拓展思考

  1. 若放宽后仍不足 k 条,可再触发同义词扩展向量 query 改写,但此时必须重新跑向量召回,需评估耗时与收益;是否采用应通过线上 A/B 实验决定。
  2. 对于多轮对话 Agent,可把“放宽历史”写入状态记忆,下一轮优先提示用户是否接受上次放宽条件,减少重复计算并提升体验。
  3. 私有化部署场景(金融、医疗),放宽策略需记录审计日志,满足等保 2.0 对算法可追溯的要求;可引入区块链摘要技术保证日志不可篡改。