本文介绍PAI-Rec系统中流量调控模块的使用流程。
背景介绍
1.什么是流量调控
流量调控业务就是通过算法、策略、系统的设计和优化,构建考虑平台意志和长期价值的流量分发系统。流量调控类似于国家的宏观经济调控,是一只“看得见的手”,是实现平台短期与长期收益平衡、促进平台生态健康发展的重要手段!

2.为什么要做流量调控
目的1:促进创作者发布内容,增大内容池。 新内容获得的曝光越多,作者创作积极性越高。反映在发布渗透率、人均发布量。
目的2:挖掘优质内容。通过流量调控让每篇新内容都能获得足够曝光,然后根据转化数据评估内容的优劣。 防止平台推荐的内容被热门的内容统治。
目的3:辅助商业化。以流量调控技术为手段,达到低成本撬动商家优质资源,实现平台、商家、用户三方共赢。
3.流量调控解决方案优势
扶持效果好:“流量调控”是基于PAI-Rec推荐系统架构而开发的流量干预功能,在不扰乱推荐系统整体推荐逻辑的基础上对所选物品池进行精准流量干预。
效果可量化:与传统的“加权”方式相比,“流量调控”功能以物品池的曝光次数、曝光次数占比等可量化的指标为调控的目标,更容易实现定量扶持;
易于管理:“流量调控”以任务为功能单元实现业务诉求,针对不同种类的流量干预需求可以建立不同的“流量调控”任务,这种方式便于灵活管理,您可以随时新建或结束一个任务。
操作简单:您只需要新建并配置任务目标等信息,系统将根据您的配置自动干预流量的分发,不需要您持续观察和监测;
4.流量调控的应用场景和目标
流量调控分成调控对象、调控任务和调控目标三个部分,可以根据业务需求组合使用。例如,针对注册30天以上的用户,可进行新物品的曝光测试,每个物品曝光100次。根据物品100次的曝光的点击、评论等转化数据做下一步决策:可以给予更多流量或者停止给予更多曝光流量。也可以指定一个物品集合做流量调控:例如对热卖的top 1000个商品,保证其曝光占比是20%。

创建流量调控任务
介绍如何创建流量调控任务,相关术语解释
准备工作
创建的流量调控任务会生成实时统计被调控目标数量的Flink SQL,该SQL在任务发布时会部署到Flink平台。所以这里需要手动上传JAR包。
在具体创建流量调控任务前,需要做以下准备工作(该配置做一次即可):
下载JAR包基础JAR包,若使用了FeatureStore则还需要下载FeatureStore JAR 包,详细可以参考下FeatureStore的设置Flink Connector文档。
进入对应工作空间的Flink控制台,点击 ETL => 函数 => 点击+号,这里注册的UDF的JAR就是我们下载的基础JAR包,这里规定UDF名称为traffic-ctrl,点击确定。此处可查看已注册的UDF函数列表,确认函数注册成功。注册时需在弹窗中指定UDF的类名称并关联已上传的JAR文件。
业务所需,需要上传自定义连接器。点击连接器 => 创建自定义连接器,点击下一步。上传对应的连接器JAR包并完成连接器配置,这里注册的Connector不止一个,需要全部注册。每个连接器需按照相同方式逐一创建并注册。示例的这五个需要都注册:traffic-ctrl-sink、traffic-ctrl-lookup、rest-lookup、http-sink和rest-logic。如果涉及到FeatureStore的部分,就需要上传前面提到的FeatureStore JAR 包,勾选上Lookup开关。
1. 新建流量调控任务
1.1 设置基础信息
在设置基础信息步骤中,填写任务名称、选择任务类型,并单击DSN数据源按钮配置数据源信息,包括行为表、物品表和用户表。
1.2 圈选干预人群
干预人群是流量调控任务的作用范围,如不选择则默认对整个场景的流量都做干涉。
在干预人群配置面板中,可选择设置筛入条件或输入表达式方式。设置筛入条件时,需配置筛入特征、取值类型和取值范围(例如 gender=1 表示筛选男性用户)。
行为统计条件配置用户实时行为的过滤条件,只对符合条件的流量进行统计。
在行为统计条件配置面板中,可选择设置统计口径或输入表达式方式。设置统计口径时,需配置行为字段、取值类型和取值范围(例如 event=expose 表示统计曝光行为)。
圈人条件与行为统计条件都可以配置多个子项,系统保证各个子项的条件都必须满足。
如果需要配置更加复杂的条件,比如“或”关系的条件,可以输入自定义表达式。
自定义表达式支持多种运算符,包含数学运算符、逻辑运算符、比较运算符及集合运算符等。
数学运算符包括加(
+)、减(-)、乘(*)、除(/)和取模(%)。逻辑运算符包括逻辑与(
&&)、逻辑或(||)和逻辑非(!)。比较运算符有相等(
==)、不等(!=)、小于(<)、小于等于(<=)、大于(>)和大于等于(>=)。操作集合的运算符,如
in用于检查元素是否在集合中。
自定义表达式的语法在下文中保持不变。
1.3 设置调控目标
术语解释:
执行逻辑
保量:调控任务致力于让目标物品集获得大于等于设定目标值的流量
逼近:调控任务致力于让目标物品集获得约等于设定目标值的流量,; 注意,当多个“逼近”类型的调控任务关联了相同的物品子集时可能会存在因目标冲突而无法达成目标的情况
目标类型
按比例调控:控制目标的流量在整个任务的流量中的比例;整个任务的流量定义为与任务关联的物品集的总流量,若没有配置任务的关联物品集则为当前调控场景的总流量
按量/次数调控:控制目标物品集的能够获得的绝对流量多少
目标颗粒度
全局:设定的流量目标为物品集合需要达成的总流量
单品:设定的流量目标为物品集合中每个物品需要达成的流量
物品范围
一般为在线所有生效的物品集合,您当前设置为比例型调控任务时,物品范围圈定的物品集合的流量将作为分母,核算调控比例。
目标容错范围
记为
,如果当前任务的流量落在 区间,暂停该目标的调控任务直到流量值不满足该区间的约束范围为止。 是设定的流量目标值, 的值可正可负。 针对按比例调控的“逼近”型任务,设定容错范围的好处是当发生超调时不用做反向调控,有助于减轻对大盘指标的干扰。
新品调控
新品调控属于冷启动场景,新品无法从已有召回链路中产出,需新建一路单独的召回。
每个调控任务可以关联多个调控目标。根据需求选择目标类型
1.3.1 按比例调控
在按比例调控配置中,需设置以下参数:调控类型(保量/逼近)、调控目标、时间周期、指标条件、期望调控比例、多目标调控排序以及是否为持续调控任务。
1.3.2 按量或按次数调控
在按量或按次数调控配置中,参数与按比例调控类似,额外需设置目标名称(例如「单品曝光量超300」),并配置具体的指标条件和期望调控值。
1.4 发布任务
Flink任务的目的是实时统计被调控目标的数量。
重置datahub/kafka的行为数据的点位到当天的0点(重置点位旨在校准消费起点,以消除历史状态干扰,确保数据在时间窗口和处理逻辑上的严格对齐,从而保障统计结果的完整与准确。)
发布任务时可能出现提示弹窗,请按照界面文档提示完成Datahub配置及Debug配置。
弹窗中显示Datahub配置和Debug配置的完成状态,单击前往写配置按钮可跳转至对应配置页面完成设置。
2. 生成的统计SQL在运行时需要用到ak信息,首次创建流控任务需要点击创建Flink项目变量,然后在发布任务前需要前往Flink平台配置您的ak信息。页面中红色提示区域显示需要配置ACCESS_KEY_ID和ACCESS_KEY_SECRET两个变量。
提示创建变量成功之后,在Flink控制台变量管理会新增以下两个变量,请设置您的AK信息。
这两个变量分别为ACCESS_KEY_ID和ACCESS_KEY_SECRET,类型均为密文,请在此处填入您的AK凭证。
以上做完后点击发布Flink任务即可(预发环境发布完成,生产环境方可发布)。 发布需要等待一段时间,可点击查看Flink发布状态观测具体发布流程,在Flink平台ETL=>作业草稿可以看到对应的SQL草稿(后缀为任务ID)以及作业运维中当前作业运行情况(启动中=>运行中)。
在流量调控任务页面,切换到预发环境,单击发布Flink任务按钮。系统提示「已触发发布,部署中需稍等3min再查看」。任务列表中可查看各Flink作业的部署状态。发布Flink任务成功如下:
在Flink平台ETL > 作业运维中,可以看到已部署的Flink作业,状态为RUNNING表示任务正常运行。
在任务列表中,可通过启动开关控制流量调控任务的启停状态。
发布Flink任务操作,可能会出现err,您根据报错提示调整后可点击重试按钮重新执行后续阶段流程或去前往Flink平台详细排查原因并部署启动对应Flink作业。
2. 启动任务
启动预发流量调控任务,查看流量调控报表,预发任务达到目标后,再开启生产环境任务。
在流量调控页面中,切换到预发环境,在任务列表中单击目标任务的启动按钮开启调控任务。
添加PAI-Rec引擎
在原来的引擎配置上,根据业务情况,添加下面的配置。
任务启动后,Flink任务需要跑一段时间,建议第二天再配置引擎(流量调控任务要重置消费位点到当天0点,从0点开始消费数据,业务延时很高,直到flink消费到当前时间。flink 业务延时正常情况一般是1s以内)
1.流量调控配置
该配置在预发环境和预发环境上都要配置
DefaultKp, DefaultKi, DefaultKd 为 PID 算法的三个默认参数值:Kp,Ki,Kd,可通过A/B实验配置覆盖
DiversityRuleSort 为多样性重排(DiversityRuleSort)
"SortConfs": [
{
"Name": "TrafficControlSort",
"SortType": "TrafficControlSort",
"Debug": true,
"PIDConf": {
"SyncPIDStatus": false,
"AllocateExperimentWise": false,
"DefaultKp": 5,
"DefaultKi": 1,
"DefaultKd": 1
}
},
{
"Name": "TrafficDiversityRuleSort",
"SortType": "DiversityRuleSort",
"DiversitySize": 20,
"DiversityRules": [
{
"Dimensions": [
"__traffic_control_id__"
],
"WindowSize": 10,
"FrequencySize": 5
}
]
}
],
"SortNames": {
"home_feed": [
"TrafficControlSort",
"TrafficDiversityRuleSort"
]
},TrafficControlSort 是PaiRec引擎中流量调控的模块名,这个模块执行后,会给每个item添加一个特殊字段:
__traffic_control_id__。__traffic_control_id__的含义 :标记当前item的位置是否被“向前移动”,如果被“向前移动”,则该字段的值固定为 0,否则被赋值为它在列表中的原本的位置
DiversityRuleSort 是PaiRec引擎中打散规则的模块名,可以针对
__traffic_control_id__这个字段配置打散约束,比如输出列表中, 每10个位置中最多只能出3个被调控“向前移动”的item。如果没有DiversityRuleSort,那么很有可能用户满屏看到的都是被调控后,从排序靠后的位置移到前面的item,这些item的相关性一般比较弱,导致系统失去个性化,对用户体验有一定的损伤,严重影响大盘指标。
2.其他配置
2.1 按比例调控
无额外配置
2.2 按量\次数调控
该配置在预发环境和预发环境上都要配置,配置完流量调控后,还需添加下面的配置。直接召回所有的被调控物品会给排序造成很大压力,所以需要自定义一个PipelineConfs,每次请求从召回表里取RetainNum:300个物品,进行排序,然后合并到主pipeline里,配置详情参考自定义 Pipeline 流程
"PipelineConfs": {
"home_feed": [
{
"Name": "newitem",
"FilterNames": [
"UniqueFilter",
"UserExposureFilter15Min",
"UserExposureFilterReal",
"adjust_count_filter"
],
"RecallNames": [
"new_item_1500_recall"
],
"RankConf": {
"RankAlgoList": [
"fs_dbmtl_v4"
],
"RankScore": "${fs_dbmtl_v4_probs_is_click}+${fs_dbmtl_v4_probs_is_collect_like_comment}",
"BatchCount": 400,
"Processor": "EasyRec"
},
FeatureLoadConfs": [
{
"FeatureDaoConf": {
"AdapterType": "hologres",
"HologresName": "holo_info",
"ItemFeatureKeyName": "item_id",
"FeatureKey": "item:id",
"HologresTableName": "xxx_home_feed_new_item_1500_v2_online",
"ItemSelectFields": "item_id,is_1500_new_item",
"FeatureStore": "item"
},
"Features": []
}
]
}
]
},
"RecallConfs": [
{
"Name": "new_item_1500_recall",
"RecallType": "ColdStartRecall",
"RecallCount": 1500,
"ColdStartDaoConf": {
"AdapterType": "hologres",
"HologresName": "holo_info",
"HologresTableName": "xxx_home_feed_new_item_1500_v2_online",
"WhereClause": "is_complated='1'",
"PrimaryKey": "\"item_id\""
}
}
],
"FilterConfs": [
{
"Name": "adjust_count_filter",
"FilterType": "AdjustCountFilter",
"ShuffleItem": true,
"RetainNum": 300
}
]FQA
1. TrafficControlSort 和 DiversityRuleSort,为什么要配合起来用?
TrafficControlSort 是PaiRec引擎中流量调控的模块名,这个模块执行后,会给每个item添加一个特殊字段:__traffic_control_id__。
__traffic_control_id__的含义 :标记当前item的位置是否被“向前移动”,如果被“向前移动”,则该字段的值固定为 0,否则被赋值为它在列表中的原本的位置
DiversityRuleSort 是PaiRec引擎中打散规则的模块名,可以针对__traffic_control_id__这个字段配置打散约束,比如输出列表中, 每10个位置中最多只能出3个被调控“向前移动”的item。
如果没有DiversityRuleSort,那么很有可能用户满屏看到的都是被调控后,从排序靠后的位置移到前面的item,这些item的相关性一般比较弱,导致系统失去个性化,对用户体验有一定的损伤,严重影响大盘指标。
2. PID 参数一般怎么调整?
参考文章:《流量调控PID算法调参指南》
查看链接:https://zhuanlan.zhihu.com/p/643275184