Skip to content
Charles Shao
Go back

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

Updated:
–views

本文是 买侧竞价链路 系列的第 6 篇(频控 · 配置)。 全系列 9 篇:

  1. Bidder 竞价服务架构
  2. OpenRTB 协议精讲
  3. Bidder 解析层
  4. Bidder 定向过滤
  5. RTA 竞价前过滤
  6. Bidder 频次控制:五维配置与身份降级
  7. Bidder 频次控制工程篇
  8. Bidder 预算 Pacing
  9. Pacing 目标曲线

一句话定位:运营在 DSP 后台能拧的频控旋钮是层级、窗口、事件、抑制和身份口径;设备 ID 缺失时,还要有一条不会把频控整体打穿的降级路径。

定向过滤篇的第六节探讨了频次控制在竞价漏斗中的执行层级,但并未深入探讨实际的运营配置。本篇旨在填补这一空白:系统梳理运营人员在 DSP 后台可调节的维度,并剖析当设备 ID 缺失或被置零时,需求方平台(DSP)该如何设计稳健的身份降级机制。至于这些配置如何映射到分布式计数与工程链路,请参阅姊妹篇频次控制工程篇。

一提起频次控制(Frequency Capping),很多人会简单地将其概括为「限制同一用户每天观看某广告的最高次数」。事实上,这句话里的每一个词都对应着一个关键维度:「同一用户」界定了身份口径,「某广告」锚定了控制层级,「每天」划定了时间窗口,「观看」定义了计数事件,而「最高次数」则决定了超出限制后的抑制规则。只有将这五个维度拆开来看,我们才能真正看清频控的全貌。

然而,在这五个维度之中,最容易引发生产事故的并非前四维的配置,而是第五维的身份口径。在程序化广告的真实场景里,「同一用户」这个前提往往并不牢靠。尤其是苹果实施 ATT 框架之后,大量流量失去了有效的 IDFA,设备 ID 经常是一串全 0,或者用户主动开启了限制追踪(lmt=1)。面对这种情况,频控被迫退化为一项「尽力而为(best-effort)」的任务;如何巧妙地设计降级策略,将直接决定这些无 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)后台,你会发现频次控制从来都不是一个孤零零的输入框。它散落在不同层级的设置页面中,由一系列下拉框和数字框拼凑而成。为了厘清这些配置,我们需要将其归纳为五个核心维度:

维度回答的问题典型取值
① 层级对哪一级广告主体进行限频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   × 频次衰减

需要注意的是,运营在后台能够灵活调节的往往只有前四维;而对于第五维的「身份口径」,运营通常只能控制如「是否跨设备」这类开关。然而,这背后的底层身份可靠性,才是决定频次控制究竟准不准的真正主因。

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

我们首先来看第一个维度:对谁限频。在广告系统中,主体是严格分层的,从上至下依次为 Advertiser(广告主)、Campaign(订单)、Ad Group(广告组)以及 Creative(素材)。通常情况下,DSP 后台允许在这四个层级分别设置 cap,并且它们会同时生效。

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

在这里,有几个配置要点需要格外关注:

接下来,我们看看这些层级维度是如何映射到主流 DSP 的具体配置中的:

DSP频控配置位置 / 叫法
DV360(Google)Line Item / Insertion Order 层 Frequency cap,支持按天、周、月或生命周期设置,且可实现跨设备频控
The Trade DeskAd Group 层 Frequency 模块,支持多条 cap 并行,同时提供 Impression frequency 优化选项
Amazon DSPLine item 层 Frequency cap,支持多种时间窗口组合配置

三、时间窗口维度:自然窗口与滑动窗口的取舍

第二个维度探讨的是「在多长时间周期内进行计数」。这正是 DSP 后台里常见的按小时、按天、按周或按生命周期(lifetime)配置的下拉选项。在实际应用中,多条窗口规则常常会并存:

至多 1 次 / 小时
至多 3 次 / 天
至多 10 次 / 周
至多 20 次 / Campaign 生命周期

其中,lifetime cap 在品牌广告投放中尤为常见。它的核心诉求是在整个投放周期内控制对单用户的总触达次数,以达成「有效触达而不构成骚扰」的微妙平衡。当然,这种方式对系统的存储能力提出了极高的要求,因为它的窗口跨度贯穿了整个 Campaign 的生命周期。

深入到底层实现,窗口维度的工程分歧主要集中在如何定义和实现这个「窗口」:

考虑到程序化广告生态中极高的并发请求量(单 DSP 节点往往面临十万至百万级别的 QPS),严苛的存储成本约束迫使大多数系统默认采用「自然窗口结合短 TTL」的方案,仅在极少数高净值场景中才会启用昂贵的滑动窗口机制。

除了控制总量,还有一个控制展示节奏的关键旋钮常常被忽略:

四、计数事件与抑制规则

4.1 计数什么事件

第三个维度聚焦于「什么样的行为算作一次有效计次」:

这里隐藏着一个困扰需求方已久的口径难题:究竟是应该在赢得竞价(Win)时就立刻计数,还是等待真实的 Impression 回传后再进行累加?

正因如此,生产环境中普遍采用了一种折中方案:在赢得竞价时预扣(reserve)一个名额以防止并发超投,待收到 Impression 回传时再进行最终确认与对账。这套依赖「本地预扣加异步回灌」的分布式一致性机制,在本质上与预算控制的超投问题属于同一类工程挑战;我们在竞价架构总览一文中对此有过详尽的剖析。

4.2 抑制规则:频次为 0 的特殊形态

除了正向设置「最多允许 N 次展示」,运营人员还常常需要配置「绝对不再投放」的反向抑制规则:

透过五维框架来看,这些规则本质上都是「频次上限强制为 0」的特殊场景,只是其触发条件从单纯的「曝光次数」转变为了「发生了某个关键的下游事件」。

五、策略维度:硬 cap 与频次衰减的博弈

第四个维度决定了当用户的曝光次数接近或达到上限时,系统该如何应对。这也是频控策略中最具优化空间的一环。

硬 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 简单粗暴的阶跃式阻断不同,频次衰减策略通过出价折让,将边际效用递减的判断权巧妙地交给了实时竞价机制。在程序化买方的实践中,这种柔性策略往往能带来更优的 ROI。

5.1 硬 cap

硬 cap 的逻辑最为直接:一旦计数达到上限,后续请求直接 no-bid。这种方案胜在简单直白、极易解释且绝对可控。但它的致命弱点在于「一刀切」:用户的第 3 次与第 4 次曝光之间,其商业价值绝不会突然归零。直接砍断投放,往往会白白流失掉一部分原本极具性价比的触达机会。

5.2 频次衰减(Frequency Decay)

对比前一种方案,频次衰减策略摒弃了生硬的阻断,转而随着同一用户累计曝光次数 n 的攀升,对预估点击率(pCTR)、预估转化率(pCVR)或基础出价(bid)施加一个递减的折扣系数:

bid_n = bid_0 · e^(-λ(n-1))      # n=1 时为全价,随后依指数曲线平滑衰减,λ 用于调节衰减速率

由于同一用户反复观看同一广告的边际转化效用必然呈现递减趋势(第 5 次曝光促成转化的概率远低于第 1 次),让出价随之同步下调,就能将「是否还值得继续投放」的艰难抉择顺理成章地交给实时竞价网络(RTB)。如果折让后的出价依然划算,就能继续赢下竞价;反之,自然会在拍卖中败给其他出价更高的竞争者。尽管这种方案在调参和效果解释上颇具挑战,但它无疑更加平滑、更节省预算,且能显著提升整体的 ROI。

5.3 目标频次:追求下限的软控艺术

需要强调的是,在品牌广告的语境下,广告主的终极诉求往往并非「千万别超过 N 次」,而是「必须有效触达至少 N 次」(例如经典的 3+ Reach 理论,即触达三次以上方能形成稳固的品牌记忆)。在这种场景下,DSP 后台通常会提供诸如 Target Frequency 或 Optimize for Reach 的专项优化开关;系统会朝着目标频次全力优化,这堪称频次控制的「反向」高级形态。

更为高阶的玩法则是序列化投放(Sequential Storytelling):通过精细控制多组素材向同一用户的展示次序(例如,先通过品牌故事 A 建立认知,再利用促销信息 B 促成转化)。

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

正如前文所述,前四维只是系统提供的配置旋钮,而第五维的「身份口径」才是决定频控精准度的核心基石。频次控制的先决条件是识别「这到底是不是同一个人」,而在复杂的程序化广告生态中,这一前提天生就充满了变数与不确定性。

6.1 身份识别的重重困境

6.2 买方侧的身份归一化突围

当买方(Buy Side)接收到 Bid Request 时,拿到的是 SSP 传递过来的原始 User ID。为了执行跨域频控,买方必须通过 Cookie Matching 或 ID Sync 等机制,将这些碎片化的 Exchange ID 强行映射回自身的内部 UserID 体系。为了彻底摆脱这种低效的映射,行业正加速向统一 ID 标准靠拢:

这些统一 ID 在生成机制上的差异(包括种子来源、加盐策略、加密算法、作用域边界以及隐私保护机制),值得我们在后续专门开辟一篇进行深度剖析。但就当下而言,它们最大的核心价值就在于:能够将「同一个真实用户」在不同 Exchange 和设备终端产生的海量请求,精准归拢到同一个频控 Key 之下,从而让跨域频次控制从理论走向了现实。

6.3 无法回避的现实:匹配率永远无法触及 100%

遗憾的是,无论是依赖传统的 Cookie Matching 还是拥抱先进的统一 ID,匹配率都永远无法达到完美的 100%。在浩如烟海的请求中,总有相当一部分流量面临身份错位,或者干脆彻底失去了任何可用的 ID 标识。这直接导致了程序化频控注定是一项「尽力而为」的工程妥协:对于能够精准识别的部分,必须做到锱铢必较;而对于无法精准识别的模糊地带,则必须设计出一套严密的身份降级口径。

七、无设备 ID 与全 0 标识的灾难与救赎

如何妥善处理那些丢失了 GAID / IDFA,或者设备 ID 被强行抹为 00000000-0000-0000-0000-000000000000(全 0)的残次流量,是买方侧频次控制中最核心也最容易引发大规模生产事故的一环。对此,我们的基本原则是:必须实施分级 Fallback 策略并赋予明确的降级语义,绝不能简单粗暴地予以丢弃,更不能愚蠢地将其强行合并计数。

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

在接收到 Bid Request 的第一时间,我们必须对设备 ID 的状态进行精准判别,其中的核心底线是:绝不能将「全 0」视作一个真实的独立用户。

状态典型特征核心语义
有效 ID合规的 IDFA / GAID / OAID支持实施精确的用户级频次控制
全 0 / 缺失呈现为 000000-... 或完全缺省遭遇 ATT 拦截、LAT 开启或采集失败
LAT 标记携带明确的 lmt=1 或 dnt=1 标记用户明确拒绝追踪,触发合规红线
异常脏数据全 F 字符、固定测试桩或高频重复值归一化逻辑失效,数据严重失真

必须再次强调: 绝对不要将所有设备 ID 为全 0 的请求荒唐地归结为同一个「超级用户」去累加频次。一旦这样做,这个虚构的「超级用户」会在毫秒级瞬间被打满 cap,直接导致系统中一整批无 ID 流量惨遭无情 no-bid;而必须正视的是,在某些特定的流量源(尤其是 iOS 生态),无 ID 流量往往占据着惊人的高额比例。全 0 必须被严格界定为「完全丧失用户身份」,绝不允许被合并成一个单一的控制键值。

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:提取 request 携带的 UID2 / RampID / PPID(优先级最高,支持跨域与跨设备)
② 平台 / 登录 ID:使用 SSP 传递的 hashed email、CTV 的 IFA 或 publisher user id
③ 设备 ID:验证 IDFA / GAID / OAID 是否有效,且必须满足 lmt≠1 的前置条件
④ ─────── 若以上均未命中,系统自动降级进入「无稳定 ID」处理分支 ───────
⑤ 概率指纹:通过哈希 (IP网段 + UA + OS + 设备型号 + 屏幕分辨率 + 语言 + 时区) 组合生成
⑥ 纯上下文:退化至仅依赖 IP 或地理位置进行网段级粗略频控,或彻底放弃用户级频控

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

策略 A:概率指纹(Fingerprint)。 该策略通过组合 IP + UA + OS + 设备型号 + 屏幕特征 + 语言 + 时区 并进行哈希计算,凭空捏造出一个「准身份」。这使得对无 ID 流量实施近似频控成为可能,但其先天缺陷也极其明显:在 NAT 网络或公共 WiFi 场景下,多用户共享 IP 极易引发误合并(导致过度限频);而一旦 IP 发生动态变更,又会将同一个真实用户错误地拆分为多个个体(导致限频失效)。更为棘手的是,在严苛的 lmt=1 或 GDPR 合规框架下,任何指纹生成行为本身都潜藏着巨大的法律风险。为了缓解这些问题,工程上通常建议将精确 IP 替换为 /24 掩码网段,并辅以更加宽容的 cap 阈值。

策略 B:粗粒度上下文限频。 这是一种彻底放弃「精确追踪到人」的妥协策略,转而对更加宏观的实体进行限频。例如,规定「针对同一 /24 网段每天最多展示 K 次(将 K 适当放大)」,或者直接摒弃绝对总量控制,改用按 App 级别配合广告版位来实施基于 recency 节奏的软性约束。

策略 C:将负担下推至 SSP / 媒体侧。 既然无 ID 流量在买方侧本就难以驾驭,那么一种聪明的做法是在 Deal 交易参数中明确声明期望的频控上限,从而将执行的重任完全推卸给拥有第一方 PPID 优势的媒体侧去完成。买方自己则完全退居二线,仅专注于宏观预算的平滑消耗(Pacing)与上下文维度的精准定向,不再背负用户级精准频控的沉重包袱。

7.4 工程实现的铁律

  1. 为无 ID 流量开辟独立的命名空间:绝不允许将残次标识与高可信的有 ID 流量混杂在同一个 Key 空间内。
高信度有效 ID:  fc:uid2:{token}:{campaign}:{window}
概率指纹软 ID:  fc:fp:{soft_id}:{campaign}:{window}     # 采用独立前缀,同时放宽 cap 约束
无身份全 0 类:  拒绝计数累加,强制导入上下文或粗粒度策略分支
  1. 身份置信度越弱,频次控制越软,出价策略越趋于保守:当频控机制的底层支撑不可靠时,宁可主动压低出价,也必须全力避免对潜在用户造成过度打扰。
  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,因此系统在架构设计上就必须容忍一定程度的小幅超投。

九、运营配置常见坑


延伸阅读

一手资料与背景:

附录:术语表


–views
Share this post on:

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