广告召回系统入门:从匹配到排序

2016 年初我开始做广告检索系统的广告召回,这篇文章记录当时的入门理解。


广告检索和普通搜索有什么不同?

普通搜索要找到“最相关”的文档,广告检索要在“相关”和“商业价值”之间找平衡。公式很简单:

ECPM = bid × pCTR

用户搜一个 query,系统要从百万级广告库中找出几百个候选,然后按 eCPM 排序。整个过程必须在 几十毫秒 内完成。


触发召回:倒排索引不是万能的

普通搜索靠倒排索引就能覆盖大部分场景——query 分词后去倒排链求交即可。但广告召回有个本质问题:

广告主买的词 ≠ 用户真正搜的词

比如广告主买的是“北京装修”,用户搜的是“朝阳区新房简装”——传统倒排匹配什么都召回不到。

所以需要智能匹配:把用户 query 扩展到语义相近的广告词,或者把广告词泛化到能匹配更多 query。


漏斗模型

候选广告池 (百万)
    ↓  触发召回
粗排候选 (万)
    ↓  CTR 预估 + 排序
精排结果 (千)
    ↓  截断
最终展示 (个位数)

每一层都在“精度 vs 性能”之间取舍。触发层的核心 KPI 是召回率(漏掉的相关广告比例),粗排层关注排序一致性,精排就是最终质量。


当时的启发

刚接手时觉得“匹配”很简单——分词、求交、排序就完了。实际做起来才发现:

  1. 冷启动:新广告没有历史数据,怎么评估?
  2. 长尾 query:低频搜索词的匹配质量远低于头部
  3. 预算约束:广告主预算花完了就别召回了,但这个逻辑要实现在毫秒级

这些会在后续文章展开。

下一篇预告:基于高斯随机投影的关键词匹配方法。