2 数据流程
sRTA 平台支持两种角色的数据上传和使用模式:
客户模式:将自有数据上传到 sRTA 平台,sRTA 在每次广告决策时通过 Lua 脚本引用客户数据,实现广告决策干预。
服务商模式:将自有数据上传到 sRTA 平台,通过授权机制授权给客户使用,帮助客户提升广告效果。
整体过程可描述为:账号申请-->数据生产-->数据写入-->脚本编写-->脚本测试-->脚本上线-->效果验证
2.1 写入流程简述
本示例演示如何通过 sRTA 平台实现根据用户设备ID的安装状态决策拉活拉新,并根据活跃用户级别调节竞争力系数。
客户拥有最为全面准确的已安装状态及价值数据,该类信息需要客户上传。
示例用户
| 用户ID | 已安装态 | 用户级别 |
|---|---|---|
| 张三 | 已安装 | 低价值 |
| 李四 | 已安装 | 中价值 |
| 王五 | 已安装 | 高价值 |
| 其他 | 未安装 | -- |
策略: acitve=拉活,new=拉新
逻辑:
- 拉活广告:未安装用户不出。低价值用户降权、中等价值用户维持、高价值用户提权。无价值分数用户以不调节作为兜底。
- 拉新广告:未安装可出。
数据准备:准备 JSONL 数据文件
数据定义规划
- 数据空间(DS):
did - 字节1:已安装态(
0=未安装/未知,1=已安装) - 字节2:用户级别(
1=低价值、2=中等价值、3=高价值、0=未知)
由客户规划各编号字段所指代的意义,生产 users.jsonl 文件,每行包含一个用户的数据:
例如下面将 U8区第1字节作为已安装态,第2字节作为用户级别
{"userid":"张三","bytesKv":{"1":1,"2":1}}
{"userid":"李四","bytesKv":{"1":1,"2":2}}
{"userid":"王五","bytesKv":{"1":1,"2":3}}
数据格式说明
userid:设备号(MD5值小写)bytesKv:字节数据映射表(key为字节索引1-64,value为字节值0-255){"1":1,"2":1}:字节索引1=1(已安装),字节索引2=1(低价值){"1":1,"2":2}:字节索引1=1(已安装),字节索引2=2(中等价值){"1":1,"2":3}:字节索引1=1(已安装),字节索引2=3(高价值)
数据准备:通过 saastool 写入服务端
使用命令行工具将数据写入 sRTA 平台:
write 功能用于少量数据写入,如需大量数据写入,请使用 saastool task 能力。
saastool write -ds did -source ./users.jsonl
输出示例
写入成功时,命令会显示处理进度和统计信息:
[./users.jsonl] err_batch = 0, err_total = 0, total_processed = 3
err_batch: 当前批次写入失败的记录数err_total: 累计写入失败的记录数total_processed: 已处理的记录总数
如果有用户写入失败,失败的用户ID会被记录到 WriteRes.failedUserid 字段中
数据准备:DS 中的数据存储
写入成功后,数据在 Redis 中的存储格式为字节数据。sRTA lua在查询时会自动取出当前用户下的数据转换为 dataspace Table变量 供 Lua 脚本使用:
"张三" = {[srta.U8] = {[1] = 1, [2] = 1}} --字节索引1=1 (已安装),字节索引2=1(低价值)
"李四" = {[srta.U8] = {[1] = 1, [2] = 2}} --字节索引1=1(已安装),字节索引2=2(中价值)
"王五" = {[srta.U8] = {[1] = 1, [2] = 3}} --字节索引1=1(已安装),字节索引2=3(高价值)
脚本:编写 Lua 实现拉活与调权
创建 sample.lua 脚本,实现根据用户安装态及级别判断的拉活和调节系数:
-- sample.lua:
-- 已安装:根据用户级别调节系数
-- 未安装:出拉新广告
IDXU8_USER_INSTALLED = 1 -- 字节索引1:已安装态
IDXU8_USER_LEVEL = 2 -- 字节索引2:用户级别
-- 主函数:在每次用户决策时被调用
function main()
-- 从DID数据空间获取用户信息,此处无须填写用户ID,该映射关系由sRTA平台自动处理为当前用户
didData = srta.get_dsdata(srta.DS_DID)
installed = didData[srta.U8][IDXU8_USER_INSTALLED] == 1 -- 是否已安装
userLevel = didData[srta.U8][IDXU8_USER_LEVEL] == 1 -- 用户级别
local results = {} -- 定义返回结果
local targets = srta.get_targets() -- 获取所有策略ID
for _, targetid in ipairs(targets) do
print("installed", installed) -- 打印已安装状态。在手工调试时会输出,在正式运行时自动被禁止。
if targetid == "active" and installed then -- 拉活策略
if userLevel == 3 then
results[targetid] = {
[srta.TARGETINFO_ENABLE] = true,
[srta.TARGETINFO_USER_WEIGHT_FACTOR]= 1.3 -- 高价值用户提权
}
elseif userLevel == 2 then
results[targetid] = {
[srta.TARGETINFO_ENABLE] = true,
[srta.TARGETINFO_USER_WEIGHT_FACTOR]= 1.0 -- 中价值用户维持
}
elseif userLevel == 1 then
results[targetid] = {
[srta.TARGETINFO_ENABLE] = true,
[srta.TARGETINFO_USER_WEIGHT_FACTOR]= 0.8 --低价值用户降权
}
else
results[targetid] = {
[srta.TARGETINFO_ENABLE] = true -- 其他情况不调节
}
end
else if targetid=="new" and not installed then -- 拉新策略
results[targetid] = {
[srta.TARGETINFO_ENABLE] = true
}
end
end
return results
end
脚本:测试
本地测试脚本逻辑:
# 测试 USERID1(低价值用户)
saastool script debug -lua ./sample.lua -did 张三 -os 2
# 测试 USERID2(中等价值用户)
saastool script debug -lua ./sample.lua -did 李四 -os 2
# 测试 USERID3(高价值用户)
saastool script debug -lua ./sample.lua -did 王五 -os 2
脚本:上线
确认脚本测试无误后,上线脚本:
脚本创建后,需要 sRTA 平台管理员审批通过才可被使用 (use)
# 创建脚本
saastool script create -lua ./sample.lua -name sample
# 设置为默认脚本
saastool script use -name sample
回收:效果验证
脚本上线后,可以通过以下方式验证效果:
# 查询实验数据
saastool exp get -beginday 20250101 -endday 20250131 -target active
2.2 数据底层
sRTA决策依赖数据源包括:来自于广告主的一方数据、来自于平台的二方数据、来自于服务商的三方数据。通过调用 API 或者使用 saastool 工具,可以将数据写入到 sRTA 数据存贮中。基本概念请参考写入流程简述。
2.2.1 一方数据
以下是一方数据存储中的结构示意.
2.2.1.1 数据空间
每个账号下可以有多个数据空间,数据空间有多种类型:
- DID存储区:以设备号为key的存储区。设备号为OAID MD5 / CAID 20230330版 MD5。用于基于设备号的数据存储。
- WUID存储区:以WUID为key的存储区。用于基于
手机号/OpenID/UnionID的数据存储,原始ID会在后台会转换为WUID。 - GEO存储区:以门店ID为key的存储区。用于基于经纬度的门店数据存储。
- GEOIP存储区:以行政区划码为key的存储区。用于基于IP映射城市编码的数据存储。
- GEOFAC存储区:以行政区划码为key的存储区。用于基于常住地城市编码的数据存储。
当数据空间容量不足时,可申请更多独立空间。
2.2.1.2 数据空间内存储
每种存储区有三种类型的字段,可满足不同场景的诉求。
- uint8:共 64 个。
- uint32:共 8 个。
- flagWithExpire:共 4 个。
2.2.1.3 字段使用
每个数组的一个值可视为 一列 或 一个维度,除有特别约定的GEO区外,其他情况下每一列存贮什么内容由使用方自由发挥。
2.2.1.4 使用示例
例如我们可将uint8 的第 0列用于App 的已安装状态,当该值为 1 时,即表示已安装。
2.2.1.5 底层存储结构示意
// 仅作伪代码示意,非真实存储结构
#include <stdint.h>
#include <stdbool.h>
struct FlagWithExpire {
bool flag; // 标志位
bool default_flag; // 默认值
uint32_t expire; // 过期时间戳
};
struct StoreValue{
uint8_t bytes[64]; // byte型存储
uint32_t uint32s[8]; // uint32型存储
struct FlagWithExpire flag_with_expire[4]; // flag型存储
};
2.2.1.6 默认值
- uint8默认值:0
- uint32默认值:0
- flagWighExpire默认值:flag = false, default_flag = false,expire = 0
2.2.2 二方数据
二方数据通过 srta 库函数获取。
2.2.2.1 获取安装态
一次可以获得多个App安装态,每个返回值为 true(已安装)/false(未安装)/nil(无权限或不可靠)中的一个状态,参考函数srta.get_apps。
2.2.3 三方数据
三方数据通过 srta 库函数获取,每个维度的数据均需要独立授权。某些三方数据需要收费,请与数据提供方洽淡。