广告系统工程实践:PI 控制器实现 CTR 精准稳态控制
背景
在 Adx 系统中,CTR 与 DSP 出价强相关:CTR 越高,DSP 出价越高,系统整体营收随之提升。但与此同时,过高的 CTR 往往伴随着更高的媒体投诉率与合规风险。
因此,系统本质上是在做一个多目标约束优化问题:
在媒体可接受范围内,使 CTR 尽可能接近目标值,从而实现收益最大化。
不同媒体、不同流量对 CTR 的敏感度差异显著,统一阈值不可行。因此我们引入:
- 媒体代码位级目标 CTR
- 闭环调控系统(PI 控制)
目标是:
使实际 CTR 稳定、可控地逼近目标 CTR,而非追求极值。
总体思路(控制系统建模)
该问题可以抽象为一个典型的反馈控制系统:
- 系统输出:实际 CTR
- 目标值:Target CTR
- 控制量:高 CTR 策略(A+)的流量占比
- 扰动项:用户变化、DSP 出价波动、媒体流量结构变化
我们采用 PI 控制器(比例 + 积分):
- P(比例项):快速响应当前误差
- I(积分项):消除长期稳态偏差
控制核心
-
定期采样实际 CTR
-
计算误差:
error = actual_ctr - target_ctr -
根据误差动态调整 A+ 策略占比
-
控制调节节奏,避免震荡与过冲
分层策略包设计
为什么需要分层
不同人群对“高 CTR 策略”的容忍度不同:
- 一线城市:敏感度高(投诉风险高)
- 下沉市场:容忍度相对更高
因此将流量划分为多个等级(如 7 层):
等级越高,对 CTR 提升的“责任”越大
策略包结构
每个等级包含:
- 高 CTR 策略包(A+)
- 低 CTR 策略包(A)
控制方式:
- 仅调整 A+ 占比(x%)
- A 自动补齐(100% - x%)

CTR 调整规则(分层控制)
当 actual CTR < target CTR
- 从高等级 → 低等级逐层调节
- 提升 A+ 占比
- 单层存在上限(如 90%)
- 达到上限后向下一层扩展(爬楼机制)
当 actual CTR > target CTR
- 从当前层开始回退
- 逐级降低 A+ 占比
- 抑制过冲
PI 控制的工程化设计
1. 快速区 & 精细区(非线性调节)
为兼顾收敛速度与稳定性,引入分段控制:
-
**快速区( error > 20%)** - 增大调节步长
- 快速逼近目标
-
**精细区( error ≤ 20%)** - 减小调节幅度
- 抑制震荡
本质:非线性 PI(Gain Scheduling)
2. 死区机制(Dead Zone)
|actual_ctr - target_ctr| ≤ 2%
作用:
- 消除抖动
- 提升稳定性
- 降低无效计算
3. 积分偏置修正(Bias)
工程中常见问题:
实际 CTR 长期偏离目标 CTR(系统性偏差)
原因:
- 数据延迟
- 采样误差
- 策略执行偏差
解决方案:
-
引入 bias 参数:
effective_target = target_ctr + bias
本质:积分项的工程替代实现
4. 层级爬楼机制(Saturation Handling)
当某一层:
- A+ 占比已达上限
- 无可调空间
则自动切换到下一层继续调节
作用:
- 保证控制系统始终具备调节能力
- 避免控制失效
5. 概率归一化
在多策略组合下:
-
所有策略下发概率需满足:
Σ p_i = 1
避免:
- 流量分配异常
- CTR 统计失真
数据统计与依赖(工程实现重点)
1. CTR 统计策略
采用分层回溯机制:
- 优先:最近 1 小时数据
- 不足:回溯至 ≤ 24 小时
目标:
平衡实时性 vs 稳定性
2. 多维统计
系统依赖以下核心指标:
- DSP × 媒体代码位 CTR(主控制信号)
- 策略包级 CTR(用于高低策略识别)
- 可调节区间(上下界)
3. CTR 可调节区间
为避免不可达目标,引入:
- 下限:低 CTR 策略历史表现
- 上限:高 CTR 策略历史表现
用于:
- 指导目标 CTR 设置
- 防止系统进入不可控区
冷启动与状态迁移
冷启动问题
新流量:
- 无历史数据
- 无法区分策略优劣
冷启动策略
- 同层策略均分流量
- 引入“最保守策略”兜底
- 限制 A+ 初始占比
状态迁移路径
冷启动 → 初始调控 → 稳态收敛

收敛过程(系统行为)
典型收敛路径:
- 从高层开始调节
- 多层联动
- CTR 逐步逼近目标
- 进入死区稳定
线上效果与稳定性分析
-
实验条件:目标 CTR = 25%
-
小时级别效果

-
天级别效果

-
多次触发 DEAD_ZONE
- <font color=blut size=4.5>
DEAD_ZONE</font> 日志含义说明:表示当前实际 CTR 已进入控制 <font color=blue size=4.5>死区</font>。实际 CTR 与目标 CTR 的偏差在 ±2% 以内

- <font color=blut size=4.5>
实际观测现象:
- CTR 在目标值附近小幅波动(如 0.25)
- error ≈ 0
- 多次触发 DEAD_ZONE
结论:
这是典型的控制系统稳态表现:
- 系统已收敛
- 无明显震荡
- 流量分配稳定
在线流量分配(执行层)
在线流量分配模块是 CTR 控制系统的核心执行层,负责将离线策略与实时反馈结合,实现流量的动态调度与精细化控制。

1.阶梯放量
针对新接入 CTR 控制的媒体代码位,采用渐进式放量机制:
-
初始阶段限制流量规模,避免冷启动阶段数据不稳定导致 CTR 剧烈波动
-
随着数据积累与效果稳定,逐步提升流量上限(阶梯式增长)
核心价值:降低系统初期不确定性风险,保证 CTR 控制过程平滑、可控
2.探索与利用(Exploration vs Exploitation)
在流量分配中引入经典的探索-利用机制:
- 利用(≈95%):优先分配给当前表现稳定、CTR 较高的策略包,保障整体收益
- 探索(≈5%):分配少量随机流量给其他策略包,用于持续评估其潜在效果
本质:这是一个轻量级的在线学习机制,为策略调优提供数据基础
3. 黑白名单机制
【目标】通过引入业务规则,对流量进行先验干预,在模型决策之外增加一层可控的策略约束,实现 CTR 的稳定提升与风险控制。
- 【白名单】(高质量流量)
- 【定义】高价值、高转化潜力的人群或请求
- 【策略】
- 优先分配至高 CTR 策略包(如高出价、强转化策略)
- 提升其参与优质流量竞争的机会
- 【示例】
- 本次竞胜广告出价较高
- 用户历史转化率 / 唤起率较高
- 【黑名单】(低质量 / 风险流量)
- 【定义】低质量或存在风险的流量
- 【策略】
- 降级处理(分配至低 CTR 策略包)
- 或限制参与高价值策略分配
- 【示例】
- 请求历史唤起率长期偏低
- 用户行为异常或疑似无效流量
本质上是将业务经验显式结构化,嵌入在线决策流程中
4.人群分类
基于用户特征进行精细化分层,实现“人群 × 策略”的匹配:
- 【输入特征】
- 用户标签(性别、年龄、地域等)
- 行为数据(点击、转化、活跃度等)
- 用户质量分(LTV、转化概率等)
- 【输出结果】
- 将用户划分为多个等级(高价值 / 中等 / 低价值)
- 匹配对应 CTR 水平的策略包
- 【补充说明】
- 不同人群对广告的响应差异显著
- 通过分层可提升策略命中率与 CTR 表现
本质:从“统一策略”演进为“人群定制策略”
5.Smart-Job(离线支撑)
Smart-Job 作为离线数据处理与策略生成模块,为在线分配提供决策依据
离线职责:
- 统计各策略包历史 CTR、CVR、收益等核心指标
- 构建策略分层(如 CTR 分位:0.1% → 95%)
- 生成策略包组合(如高CTR包、低CTR包)
- 输出黑白名单、人群标签、策略映射关系
补充说明:
- 离线负责“建模与分层”,在线负责“决策与执行”
- 在线效果依赖离线数据质量与更新频率
职责划分:
离线负责 “算”,在线负责”判“
流量分布调控(敏感度机制)
媒体代码位新增 **「敏感度分级」** 机制,用于提升 CTR 控制的精细化程度与稳定性。
-
**【配置设计】**
后台为媒体代码位新增三级敏感度配置:
-
高敏:对 CTR 波动响应快,调节幅度大,适用于对效果要求高、容忍波动低的流量
-
中敏:在稳定性与调节速度之间平衡,作为默认策略
-
低敏:控制节奏平缓,避免频繁调整,适用于对稳定性要求高的流量
说明:敏感度本质上是对“控制系统增益”的抽象,不同敏感度对应不同的调控强度与响应速度。
-
-
**【策略目的】**
当实际 CTR 偏离目标 CTR 时,通过 **动态调整流量分布结构**,驱动整体 CTR 向目标值收敛。
补充说明:
- 不直接修改模型打分或出价,而是通过流量结构调控实现目标控制
- 本质是一种“间接控制策略”,降低对模型稳定性的影响
- 适用于模型短期不可调或存在延迟的场景(如 LR / 大模型在线学习滞后)
-
**【设计思路】**
-
核心设计思想:
-
图中绿色区间表示系统当前可通过流量调控实现的 CTR 可达范围(可调区间)
-
当 目标 CTR 低于当前可调区间下界 时:
为减小偏差,系统会通过流量重分配,逐步降低高 CTR 层级的流量占比(高 CTR 用户下沉),从而推动整体 CTR 向目标值收敛
-
当 目标 CTR 位于可调区间内 时:
当前流量结构已能够覆盖目标值,系统无需进行额外调控,仅需保持现有分布即可稳定逼近目标 CTR
-
当 目标 CTR 高于当前可调区间上界 时:
受限于系统当前能力,仅低敏媒体会进行渐进式调整:通过减少低 CTR 层级流量占比(低 CTR 用户上移),以有限幅度拉升整体 CTR,逐步逼近目标值

-
-
-
**【流量调节策略】**
-
拉升 CTR(CTR < Target)
-
策略原则:提升高 CTR 层的流量占比
-
执行路径:优先从低 CTR 层开始削减流量
-
补充说明:
- 避免直接大幅增加高层流量,防止系统震荡
- 采用“逐层收缩”的方式,控制调节节奏

-
-
打压 CTR(CTR > Target)
-
策略原则:降低高 CTR 层的流量占比
-
执行路径:优先从高 CTR 层开始削减流量
-
补充说明:
- 防止高 CTR 流量过度集中导致成本异常或不稳定
- 通过释放部分流量至低层,实现整体 CTR 下调

-
-
不同敏感度的策略差异
- 不同敏感度对应不同策略包组合:
- 高敏:策略差异明显(高CTR包 vs 低CTR包区分强)
- 中敏:策略差异适中
- 低敏:策略趋同,主要保障稳定性
- 补充说明:
- 敏感度不仅影响“调多少”,还影响“可调空间有多大”
- 本质上是对“策略分层梯度”的控制

- 不同敏感度对应不同策略包组合:
-
-
**【小结】**
该方案通过引入“敏感度分级 + 流量分层”的机制,实现了对 CTR 的结构性调控,具有以下优势:
- 解耦模型与控制:无需频繁调整模型或出价策略
- 稳定性强:通过分层渐进调节,避免系统震荡
- 可解释性高:CTR 变化来源清晰(流量占比变化)
- 扩展性好:可结合 PID、动态阈值等进一步演进为闭环控制系统
从本质上看,这是将广告系统中的 CTR 控制问题,转化为一个“多层流量分配的反馈控制问题”。
总结
该方案的核心价值在于:
1. 控制理论落地
- 使用 PI 控制实现闭环调节
- 支持稳定收敛与抗扰动
2. 工程增强能力
- 快慢调节区(提升收敛速度)
- 死区机制(提升稳定性)
- 爬楼机制(避免饱和失效)
- bias 修正(消除系统偏差)
3. 风险可控
- 分层策略分摊风险
- CTR 上下界约束
这不是一个“追求最高 CTR”的系统,而是一个 在收益、风险与稳定性之间做最优控制的工程系统。