Skip to content
Charles Shao
Go back

Bidder 频次控制配置篇:五维配置与身份口径降级

views

本文属于 Bidder 竞价服务架构 系列。

定向过滤篇第六节讲了频控放在竞价漏斗哪一级执行(哪半能前置粗筛、哪半必须后置逐条判定),但它把「运营到底能配什么」一笔带过。总览里排在第 5 篇的分布式频次控制,讲的是多实例计数的一致性(本地计数 + 异步回灌 + 容忍超投)。本篇补的是第三块拼图:配置面——运营在 DSP 后台能拧哪些旋钮,每个旋钮怎么映射到执行,以及买方侧最头疼的一件事——当设备 ID 缺失或全 0 时,频控的身份口径到底怎么定。至于这些旋钮拧下去之后,计数到底存在哪、怎么写、怎么读,是姊妹篇频次控制工程篇的主题——建议本篇建立框架后接着读。

频次控制(Frequency Capping)常被当成一句话就能说清的功能:「同一个用户,某广告一天最多看 N 次」。但真正在 DSP 后台配过的人都知道,这句话里每一个词都是一个维度:「同一个用户」是谁(身份口径)、「某广告」是哪一级(层级)、「一天」是什么窗口(时间)、「看」算什么(计数事件)、「最多 N 次」超了怎么办(硬砍还是降权)。把这五个维度拆开,才看得清频控的全貌。

而这五个维度里,最难、最容易翻车的不是「配几次」,而是「同一个用户」这个前提在程序化里根本不牢靠——ATT 之后大量流量没有 IDFA、设备 ID 是一串全 0、或者用户明确开了限制追踪。这时候频控退化成一件「尽力而为」的事,怎么设计降级口径,决定了你是把无 ID 流量白白丢掉,还是能榨出一部分可控投放。本篇最后两节专讲这个。

DSP 频控配置的五维组合总览图:顶部一行五个维度卡片用「×」连接,依次为 ① 层级(Advertiser/Campaign/AdGroup/Creative)、② 时间窗口(hour/day/week/lifetime)、③ 计数事件(impression/viewable/click)、④ 抑制规则(点击后抑制/转化后排除)、⑤ 身份口径(统一 ID/设备 ID/概率指纹);中部用两条真实规则示例展示笛卡尔组合,如「Creative × 1h≤1,1d≤3 × Impression × 信息流 × DeviceID → 硬 cap」与「Campaign × lifetime≤20 × Viewable × 转化后排除 × UID2 → 频次衰减」;底部旁注强调运营配的每条频控都是这五维的一个组合,难点不在配几次而在身份口径可不可靠 运营在后台配的每一条频控规则,本质都是 [层级] × [窗口] × [计数事件] × [抑制规则] × [身份口径] 的一个组合。前四维是「配置」,第五维「身份口径」才是决定频控准不准的命门。

TL;DR

Table of contents

Open Table of contents

一、先建立框架:运营配的是一个五维组合

打开任何一个成熟 DSP 的后台,频控从来不是一个孤零零的输入框。它散落在 campaign / ad group / creative 各层的设置页里,由若干下拉框和数字框拼成。把它们归类,本质就是五个维度:

维度回答的问题典型取值
① 层级对「哪一级广告主体」限频Advertiser / Campaign / Ad Group / Creative
② 时间窗口在「多长时间」里计数hour / day / week / month / lifetime
③ 计数事件「什么行为」算一次impression / viewable / click
④ 抑制规则「超限或某事件后」怎么处理硬 cap / 点击后抑制 / 转化后排除
⑤ 身份口径「同一个用户」到底是谁统一 ID / 设备 ID / 概率指纹 / IP 网段

一条完整的频控规则,就是在这五维上各取一个值的笛卡尔组合。比如:

DeviceID × Creative × (1h≤1, 1d≤3) × Impression × 信息流 → 硬 cap
UID2     × Campaign × lifetime≤20   × Viewable   × 转化后排除 → 频次衰减

后台里能填的,几乎都在前四维;第五维「身份口径」运营常常只能选个开关(如「跨设备 on/off」),而它背后的可靠性,才是频控准不准的真正决定因素。所以本篇的结构是:前四维快速讲透(第二五节),身份口径重点讲(第六七节),最后落到配置如何生效与常见坑。

一句话本质

频控不是「一个用户看几次」,而是「在某个身份口径下,对某一级广告主体,在某个时间窗口内,对某种事件计数,超过后怎么处理」。五个词,五个维度。

二、层级维度:cap 树与「取最严」

第一个维度是「对谁限频」。广告主体是有层级的,从上到下:Advertiser(广告主)→ Campaign / IO(订单)→ Ad Group / Line Item → Creative(素材)。后台通常允许在多个层级分别设 cap,而且它们同时生效

层级 cap 树示意图:竖直排列五个层级卡片,从上到下依次为 Advertiser 级(全广告主 ≤20/天)、Campaign / IO 级(≤10/天,最常用)、Ad Group / Line Item 级(≤5/天)、Creative 级(≤3/天,防素材疲劳)、Creative Concept 素材组(多尺寸/变体合并计数,防换尺寸绕过),层级之间用向下箭头连接;右侧一个大括号注释说明「多级同时生效 = 取最严:任一层计数超限即整条候选 no-bid」;底部旁注补充素材组合并计数是为了防止同一创意换个尺寸就重新计数 多级 cap 是「与」关系,不是「或」:Advertiser、Campaign、Ad Group、Creative 各自的 cap 任一超限就 no-bid,实际触达受最严的那一层约束。

几个配置要点:

映射到主流 DSP 的实际叫法:

DSP频控配置位置 / 叫法
DV360(Google)Line Item / Insertion Order 层 Frequency cap,支持 per day/week/month/lifetime、可 cross-device
The Trade DeskAd Group 层 Frequency,可设多条 cap,另有 Impression frequency 优化
Amazon DSPLine item Frequency cap,支持多窗口

三、时间窗口维度:自然窗口 vs 滑动窗口

第二个维度是「在多长时间里计数」。后台里就是那个 per [Hour / Day / Week / Month / Lifetime] 下拉框。常见组合是多条并存:

至多 1 次 / 小时
至多 3 次 / 天
至多 10 次 / 周
至多 20 次 / campaign 生命周期(lifetime)

lifetime cap 在品牌广告里尤其常用——控制单用户在整个投放周期内被触达的总次数,追求「触达但不骚扰」。它对存储的要求也最高(窗口跨越整个 campaign 周期)。

窗口维度真正的工程分歧,在于怎么实现这个「窗口」

程序化的 QPS 极高(单 DSP 常见十万到百万级),存储成本约束很硬,所以多数系统用自然窗口 + 短 TTL,只在少数高价值场景上滑动窗口。

除了「总量」,还有一个控节奏的旋钮常被忽略:

四、计数事件维度与抑制规则

4.1 计数什么事件

第三个维度是「什么行为算一次」:

这里藏着一个买方侧的口径难题:按 Win 计还是按 Impression 回传计?

生产上常见折中:win 时预扣(reserve)一个名额防并发超投,impression 回传时确认对账。这套「本地计数 + 异步回灌 + 容忍少量超出」的一致性机制,和预算不超投是同一类问题,细节属于总览排的分布式频次控制那一篇。

4.2 抑制规则:频次为 0 的特例

除了正向的「最多 N 次」,运营还常配负向的「不再投」:

这些本质都是「频次上限 = 0」的特例——只是触发条件从「曝光次数」换成了「发生了某个下游事件」。放进五维框架,它们属于「抑制规则」这一维。

五、策略维度:硬 cap vs 频次衰减软控

第四个维度是「超限(或接近上限)时怎么处理」。这是频控里最有优化空间、也最能体现买方水平的一维。

硬 cap 与频次衰减软控的对比曲线图:横轴为同一用户已曝光次数 n(1 到 8),纵轴为该次的相对出价系数(0 到 1);红色阶梯线『硬 cap』在 n≤3 时保持 1.0、n≥4 骤降为 0(超过上限直接 no-bid);绿色平滑下降曲线『频次衰减』按 bid_n = e^(-0.35(n-1)) 逐次递减(n=1 为 1.0、n=2 约 0.70、n=3 约 0.49……),随次数增加边际递减、竞争力自然下降但从不硬砍到 0;图例区分两条线,旁注说明硬 cap 一刀切、衰减把是否继续投交给拍卖,边际 ROI 更优 硬 cap 是阶跃函数(到 3 次前满价、第 4 次直接 0);频次衰减是把出价随曝光次数连续降低,让边际递减的触达自然失去竞争力,而不是一刀切。程序化买方普遍认为后者 ROI 更优。

5.1 硬 cap

最直接:计数超过上限就 no-bid。简单、可解释、绝对可控。缺点是「一刀切」——第 3 次和第 4 次之间价值不会突然归零,硬砍会丢掉一部分本来还划算的触达。

5.2 频次衰减出价(Frequency Decay)

不硬砍,而是随该用户已曝光次数 n 增加,把 pCTR/pCVR 或 bid 打个递减折扣:

bid_n = bid_0 · e^(-λ(n-1))      # n=1 满价,之后逐次衰减,λ 控制衰减速度

因为同一用户看同一广告的边际效果递减(第 5 次的转化概率远低于第 1 次),让出价跟着递减,就把「还值不值得再投」的判断交给拍卖——划算就还能赢,不划算自然输给别的流量。它比硬 cap 更平滑、更省钱、ROI 更优,代价是更难解释、更难调参。

5.3 求下限而非上限:目标频次

品牌广告有时追求的不是「别超过 N 次」,而是「有效触达至少 N 次」(如 3+ reach 才形成品牌记忆)。这时后台提供的是 Target frequency / Optimize for reach 这类开关,系统朝目标频次优化,是频控的「反向」形态。

更进一步还有序列化投放(sequential / storytelling):控制素材出现的顺序(先看 A 品牌故事,再看 B 促销),是频控的高级形态。

六、身份口径维度:程序化频控的命门

前四维都是「配置」,第五维「身份口径」才是决定频控准不准的根本。频控的第一个字是「频」,但要计频,先得知道「这是不是同一个人」——而在程序化里,这件事天生不牢靠。

6.1 为什么难

6.2 买方怎么把身份「归一」

买方拿到的是 bid request 里 SSP 传来的 user id,要做频控,必须先把各 exchange 的不同 id 映射到自己的内部 UserID——这就是 Cookie Matching / ID Sync。在此之上,行业转向几种统一 ID 作为更稳的 key:

这三种统一 ID 的生成原理(种子、加盐、加密、作用域、隐私机制)差别很大,本篇不展开——它值得单独一篇。这里只需记住:它们的价值在于把「同一个人」在不同 exchange、不同设备的请求归一到同一个频控 key,让跨域频控真正准确。

6.3 现实:匹配率永远 <100%

无论 cookie matching 还是统一 ID,匹配率都不可能到 100%。总有一部分流量身份对不上、或者根本没有可用 ID。频控因此本质是「尽力而为(best-effort)」:能精确的精确,不能精确的要有降级口径——这正是下一节的主题。

七、没有 GAID/IDFA、或全 0 设备 ID 怎么办

这是买方侧频控最现实、也最容易做错的一环。大量流量的设备 ID 要么为空、要么是 00000000-0000-0000-0000-000000000000 这种全 0、要么被 ATT/LAT 置零。处理原则是分级 fallback + 明确降级语义,绝不是简单丢弃或强行合并。

7.1 第一步:给身份「可用性」分类

拿到 bid request,先判断设备 ID 处于哪种状态——关键是不能把「全 0」当成一个真实用户

状态例子含义
有效 ID正常 IDFA / GAID / OAID可精确频控
全 0 / 空00000000-... 或字段缺失ATT 拒绝 / LAT 开启 / 未采集
LAT 标记lmt=1 / dnt=1用户限制追踪,合规上不应追踪
脏数据全 F、测试值、明显异常重复归一化异常

最致命的错误:把所有全 0 设备当成同一个用户去计数。这个「用户」会瞬间打满 cap,导致整批无 ID 流量全部 no-bid——而无 ID 流量在部分流量源(尤其 iOS)可占相当比例,损失巨大。全 0 必须视为「无用户身份」,绝不能合并成一个 key。

7.2 分级 fallback 身份链

按优先级从强到弱依次尝试,命中即用:

无设备 ID 场景下的身份口径决策树:从「收到 Bid Request」开始,竖直向下依次经过四个判断——① 有 UID2/RampID/PPID?命中→用统一 ID 计数(精确频控·硬 cap,绿色);否则② 有有效 device ID 且 lmt≠1?命中→用设备 ID 计数(精确·硬 cap,蓝色);否则③ lmt=1 / dnt=1 / 全 0?命中→不做用户级追踪,只走上下文/IP 网段、bid 保守(红色);否则(只是缺 ID)④ 能拼概率指纹?命中→soft_id 近似频控,独立命名空间、cap 放宽(琥珀色);全不命中→只剩 IP/geo,网段级粗频控或纯 pacing、不承诺用户级频控(灰色);每个判断用「否↓」向下、「命中→」向右指向对应结论卡片;底部旁注强调全 0≠一个用户、身份越弱频控越软、无 ID 流量走独立命名空间 拿到请求后的身份口径决策链:统一 ID > 设备 ID > 概率指纹 > IP 网段 > 放弃。注意 lmt=1/全 0 这一支直接跳出用户级追踪,不参与计数——这是合规红线,也是避免「全 0 合并」事故的关键。

① 统一 ID:UID2 / RampID / PPID(request 里带的)——最优,跨域跨设备
② 平台 / 登录 ID:SSP 传的 hashed email、CTV 的 IFA、publisher user id
③ 设备 ID:有效 IDFA / GAID / OAID / CAID(中国),且 lmt≠1
④ ─────── 以上都没有,进入「无稳定 ID」降级 ───────
⑤ 概率指纹:hash(IP网段 + UA + OS + 设备型号 + 屏幕 + 语言 + 时区)
⑥ 纯上下文:只剩 IP / geo → 网段级粗频控 or 放弃用户级频控

7.3 无稳定 ID 时的三种降级策略

策略 A:概率指纹(Fingerprint)。IP + UA + OS + 设备型号 + 屏幕 + 语言 + 时区 组合哈希成一个「准身份」。能对无 ID 流量做近似频控,但有明显弊端:NAT/公共 WiFi 下多人共享 IP 会误合并(过度限频)、IP 变化会把同一人拆开(欠限频),且在 lmt=1/GDPR 下做指纹有合规风险。缓解:IP 用 /24 网段而非精确 IP,并配更宽松的 cap。

策略 B:粗粒度上下文 cap。 放弃「精确到人」,改对更粗的实体限频:按 IP 网段(「同一 /24 每天 ≤ K 次」,K 设大)、或按 App + 版位 做 recency 节奏控制而非总量。

策略 C:下推 SSP / 媒体侧。 无 ID 流量买方本就管不好,可在 Deal 参数里声明期望频次,靠媒体侧用它的第一方 ID(PPID)执行;买方自己只做预算 pacing + 上下文定向,不承诺用户级频控。

7.4 工程实现要点

  1. 无 ID 流量单独命名空间,绝不和有 ID 流量混在同一 key 空间:
有效 ID:  fc:uid2:{token}:{campaign}:{window}
指纹:     fc:fp:{soft_id}:{campaign}:{window}     # 独立前缀,cap 放宽
无身份:   不计数,走上下文 / 粗粒度分支
  1. 身份越弱 → cap 越松、bid 越保守:频控不可信时,宁可少出价,避免过度打扰。
  2. lmt=1 / dnt=1 / 全 0 直接判为「不可追踪」:不参与用户级计数,只走上下文策略。这是合规红线。
  3. 监控无 ID 流量占比:作为一个核心指标,帮运营理解频控报表为什么「不准」。

一句话本质

在「身份不完整 + 分布式并发 + 毫秒级延迟 + 高 QPS 成本」四重约束下,频控只能是尽力而为。做法是分级 fallback:能精确就精确,不能就降级到粗粒度、再降到只做 pacing;身份越弱,频控越软;而 全 0 / lmt=1 这条线必须干净地跳出用户级追踪——既是合规,也是防止「把一堆人当成一个人」的事故。

八、配置如何落地到执行

运营在后台点的旋钮,不会直接跑在竞价关键路径上,中间隔着一条落地链路。先看一次曝光的频控生命周期需要哪些组件、它们怎么配合:

限制曝光(impression cap)的组件时序图:五个泳道从左到右为 ADX / Exchange、Bidder 竞价实例、频次计数存储(Redis / Aerospike)、Kafka 日志总线、回灌聚合(Flink);顶部注释说明一次曝光的频控生命周期是读计数在关键路径、确认计数走异步回灌;时序步骤依次为 ① ADX 发来 Bid Request(带 user/device id)② Bidder 自处理身份口径归一(统一 ID/设备 ID/指纹,全 0 则降级)③ Bidder 向计数存储读 user×campaign 频次(pipeline·带超时)④ 存储返回已曝光次数 n ⑤ Bidder 判定 n≥cap 则 no-bid、否则 bid×decay(n) ⑥ Bidder 向存储做 win 预扣占位防并发超投 ⑦ Bidder 回 ADX Bid Response 出价 ⑧ ADX 发 Win Notice(nurl) 赢价 ⑨ Bidder 异步写 win/曝光日志到 Kafka,中间注释曝光真正发生(渲染+可见)⑩ ADX 发 Impression 回传(burl) ⑪ Bidder 异步写 impression 日志到 Kafka ⑫ Kafka 被 Flink 消费 ⑬ Flink 向计数存储确认 +1/对账;底部绿色注释强调读计数在关键路径带超时降级、确认 +1 走异步回灌,延迟即 dead time 故容忍少量超投 限制曝光需要的组件与配合:Bidder(身份归一 + 判定)、频次计数存储 Redis/Aerospike(关键路径读计数 + win 预扣)、Kafka(异步日志总线)、回灌聚合 Flink(真实曝光对账 +1)。读计数在关键路径、带超时降级;确认 +1 走异步回灌——这段延迟即 dead time,故容忍少量超投。

九、运营配置常见坑

十、速查表

DSP 后台的频控配置,看起来是几个下拉框和数字框,本质是在五个维度上做组合:对谁(层级)、多久(窗口)、算什么(事件)、超了怎么办(抑制/软控)、以及最要命的——同一个人到底是谁(身份口径)。前四维是可以配清楚的旋钮;第五维在程序化世界里天生残缺,逼着你把频控从「精确计数」降格成「分级尽力而为」。理解了这一点——能精确就精确、不能就分级降级、全 0 绝不合并、身份越弱越软——也就理解了买方侧频控真正的难处所在。


延伸阅读

一手资料与背景:

附录:术语表


views
Share this post on:

Previous Post
Bidder 频次控制工程篇:多维度限频的存储选型与读写分离
Next Post
Bidder 定向过滤(Targeting Filter):竞价漏斗最前端的一票否决