广告检索系统
从 24 年开始接触广告系统,已经两年了。这里我将主要根据我个人工作的经验,结合业内优秀的系统案例,描述一下广告系统架构和广告相关知识点。
商业化广告业务
商业化广告业务是一个广告主、平台、媒体三方平衡的商业化活动:
广告主是付钱投广告,希望拿到更多收益,提高 ROI;
媒体拥有流量入口,希望在保证用户体验的前提下,卖出广告位,实现商业化收入;
平台则是在需要平衡上述两者的需求,既要满足两者需求,也要保证平台生态的可持续。
商业化广告类型
广告形式
按广告形式来分主要是两大类:
- 搜索广告:用户搜索关键词时,出现在搜索结果页的广告;比如百度、Google 搜索后展示的广告;
- 展示广告(主要是原生广告):以多种媒体形式展现的广告,可能是视频、图片。原生广告就是与页面设计融为一体的广告,就像也页面里本来就该有的一样,不打断用户体验,信息流(Feed)广告就是典型的原生广告。
广告目标
按照广告目标来分可以分成:
- 品牌广告:为品牌服务,提高曝光、注重触达、强化认知;多为 CPM、CPT 计价广告;
- 效果广告:注重效果,多为转化目标优化;通常是 CPC、CPA 计价广告。现在的在线商业化广告中的搜索广告、原生广告大多都是效果广告,这篇文章重点关注的也是效果广告。
此外还有按渠道区分的 联盟广告,比如 Google AdSense、百度联盟广告,将广告分发到各个中小平台上,小平台可以通过这种形式获取收益。
广告计费方式
主要的在线广告根据计费方式不同,主要类型可分为:
- CPM:千次曝光付费
- CPT:按时长付费,买断一个广告位
- CPC:按点击付费,百度、Google搜索广告的主要付费方式,用户点一下广告主就付一次钱,可以算是基础的效果广告,广告主为用户感兴趣的广告付费;相比 CPM,不会浪费曝光,风险更低一些。典型的是百度凤巢早期的“十分”系统。
- CPA:按行动(转化)付费,平台和广告主约定转化目标,当这个转化事件发生后,广告主才付费。(但这个依赖于广告主正确的回传结果,因为是否发生转化一般只有广告主才知道)
下面是 oCPX,是目前主流的在线广告出价模式,依靠智能出价模式,广告主只需要给出成本和目标,由平台来操作竞价过程。核心是:广告主按点击/曝光付费,但是目标是为了一个转化(激活/注册),最多愿意出多少钱。
- oCPC:优化点击付费。按点击计费,优化转化目标。
- oCPM:优化千次曝光付费。按曝光计费,优化转化目标。
这种条件下,转化目标更深、而计费点更靠前,看起来平台承担了更多风险,广告主自然更喜欢这种模式。同时平台计费点提前到点击/曝光等更浅层次,也可以降低 CPA 存在的广告主发生了转化事件但不回传的风险。
但智能出价有一个问题在于 出价点 与 计费点 不一致,因此平台在出价时需要严格的预算控制,避免广告主超出成本。
广告业务全流程图
转自 https://neoremind.com/2020/01/ad_system_architecture/

这张图非常完整的 展示了广告业务的全流程,但文章讲述不了这么多,下面我们将重点关注在线检索系统:
广告检索架构
一个典型的广告检索系统如下:

这张图由 GPT-image2 生成,非常全面,链路大致是正确的,我们重点关注其中主要链路,以 Feed 广告为例:
流量入口和网关
用户打开媒体 APP (比如:头条,手机百度等)想要去浏览相关内容,此时 APP 就会去请求媒体后端,后端会请求检索服务,检索服务分为两部分:
- 一部分是 Feed 检索,用于检索用户主要浏览的内容;
- 一部分是广告检索,用于检索给用户看的广告。
对于后端请求的检索网关,很可能还有一个服务,用于组合 Feed 检索和广告检索的结果,这一阶段也可以称为混排,他需要组合 Feed 内容和广告,比如几个内容 card 后插入一个广告位,最终展现给用户的效果由此确定。
在线检索服务
进入到第一个服务(姑且叫它 AS)才算真正进入检索端逻辑,这是整个广告检索服务的逻辑中心,调度触发、召回、模型、机制等模块最终返回结果。
预处理
AS 收到请求后首先是预处理,将上游传入的请求信息处理成广告检索系统需要的 Context,并且补齐用户的设备信息、实验分流标识、开关配置;
触发
预处理的基础配置生成好后这是需要请求一个触发服务:
- 请求在线特征服务,拿到用户特征(实时 + 离线)
- 根据用户标识信息、实时行为特征,查询用户画像服务,拿到用户画像相关内容,比如兴趣 Tag、ucf 内容等等;
- 结合用户场景特征、环境特征,生成定向标签,比如根据用户当前geo、时间,生成用户的 LBS 标签、时段偏好等;
还有其他的实验策略/配置,最终会确定本次请求的 Trigger:包括定向条件和各种触发词。
Pre-recall RTA
有些平台在召回前,会有一次预召回 RTA,这里会发给广告主一次 rta 请求,由于此时一般强定向条件已经确定,广告主收到请求后可以根据此时的定向条件、人群决定是否参与此次出价。
召回
这里需要通过召回 Proxy 构建多路召回请求,向下游不同召回模块(在线召回、离线召回、正排等)发起召回请求,根据类目、向量、定向等分别召回结果,然后 Proxy 对收到所有的召回结果进行合并去重。并且针对召回的 adv 根据频控、定向、预算等进行过滤。
RTA
一般在召回、过滤后,排序之前,会向广告主发送一次 RTA 请求,对于已召回的候选广告做决策:出价、ROI 控制等。
粗排
对候选广告使用预计算的 eCPM = bid × 固定CTR(或基于业务规则的轻量模型)进行快速打分,取 Top-200 进入下一阶段
精排
将 Top-200 广告以及用户特征发给模型预估模型服务,得到更精准的预估值,重新计算 eCPM,排序后取 Top-10。
机制/计费
这里根据拍卖机制决定最终胜出广告,并进行计费扣减;
这里涉及一个关键问题就是出价控制,平台需要负责所有广告主的成本控制:需要设计合理的出价机制,保证广告主成本不超,以及平滑的进行预算消耗。
创意
选素材、拼样式,最终返回广告。
行为上报
拼接加密后的点击串,落展现日志,将用户的曝光、点击、转化等事件上报到实时链路
广告主回传链路
归因回传链路就是把广告平台带来的转化结果,准确地通知给广告平台。
实时事件(点击、曝光、转化等)发生后,广告主需要将这些事件通过平台定好的 API 接口,将事件回传给平台,平台据此进行模型训练、数据分析。
sequenceDiagram
participant 用户
participant 广告平台
participant 广告主落地页
participant 广告主App
participant 广告主服务器
用户->>广告平台: 点击广告
广告平台->>广告平台: 生成唯一 click_id
广告平台-->>用户: 302 重定向<br/>到广告主提供的监测链接<br/>(携带 click_id 及设备信息)
用户->>广告主落地页: 请求监测链接<br/>?click_id=abc123&device=xxx
广告主落地页-->>用户: 返回 H5 中间页<br/>(内含唤起逻辑)
用户->>广告主App: 唤起 App<br/>(URL Scheme 或 Universal Link 携带 click_id)
广告主App->>广告主App: 提取 click_id
广告主App->>广告主服务器: 上报激活事件<br/>(click_id + 设备标识)
广告主服务器->>广告主服务器: 完成归因匹配<br/>认定此激活来自你的平台
广告主服务器->>广告平台: S2S 回传转化<br/>(click_id, event_type, 时间等)
广告平台->>广告平台: 校验 click_id 合法性<br/>记录转化,更新报表和模型
点击监测
当用户点击了广告主的广告,此时平台会下发一个点击监测链接,这个链接一般是广告主在平台后台自行配置,带有一个唯一的 click_id,比如:https://your-api.com/callback?click_id=__CLICK_ID__&device_id=__DEVICE_OAID__ 中的宏 __CLICK_ID__ 会被替换为真实的“abc123”,__DEVICE_OAID__ 则会被替换为用户设备的唯一标识符。链接会发给广告主的归因回传服务。
转化事件
当转化事件发生后,比如:用户下载并首次打开App后,广告主的 App 后台会向归因回传服务报告一个“激活”转化事件,并上报当前设备的标识符(如Android的OAID,iOS的IDFA)
归因
上面回传服务拿到了设备标识符,回传服务就需要用这个标识符在数据库中查找对应的 click_id。如果找到匹配成功,就表示归因成功了。
归因策略
由于根据不同的归因策略(末次归因、初次归因)确定最终是哪个广告平台发生的转化。
一个用户的典型购买路径可能是:先在信息流里刷到广告但没点(曝光),过两天在搜索广告里点了品牌词(首次点击),看了下觉得差不多但没下单,最后在短视频种草广告里再次点击(末次点击),进到App完成了付费。
这时问题就来了:这个转化到底算哪个平台的?于是需要不同的归因策略:
- 末次点击归因:把功劳全给最后一个平台。优点是简单且约定俗成,大部分渠道都认。缺点是完全忽略了前期种草、曝光的价值。
- 首次点击归因:功劳全给第一个让用户知道你的渠道。适合评估渠道的拉新拓客能力,但不反映转化的最后临门一脚。
结果回传
当广告主事件归因成功之后,需要将归因结果按照广告平台提供的 API 回传给平台。平台根据归因结果更新模型数据、数据报表。
oCPX 广告出价模型非常依赖实时正样本数据。平台需要在用户点击广告后,立刻知道“哪一类用户完成了高价值行为”,以此来调整下一轮的出价策略。因此,针对转化目标事件,广告主必须采用立即明确将事件 event_type 回传到平台。广告主的数据越准确,模型的出价就越精准,投放效果才能越好。


