回調接口
PAI-Rec包含內置的回調接口。回調接口主要用來記錄推薦請求時刻的實時特征日志,包括請求參數、用戶和物品的實時特征,可以用于后續的數據分析、離線模型訓練或在線學習。
背景
實時特征是推薦中很重要的一環,包括實時統計特征和實時序列特征,尤其是用戶實時序列特征。一般來說,增加實時特征能明顯的提升推薦系統的指標效果。然而實時特征對準確性的要求很高,如通過離線卡時間窗口關聯的方式(指通過離線日志反推在推薦時刻用戶和物品的實時特征),由于很難估計系統各鏈路間的延時,很容易就出現特征不準確、特征穿越的問題,在召回和排序模型中加上這些不準確的特征得到適得其反的效果。
如何定義準確性?一個訓練樣本S_i(對應推薦請求R_i)中的實時特征,需要是推薦請求R_i時刻的user和item特征,因此最佳記錄實時特征是在推薦請求打到推薦服務的時候,在算法計算推薦結果的同時,把requestId(請求標識)+user的實時特征+item的實時特征落入日志中(如datahub/kafka等),然后再同步到 MaxCompute(ODPS) 中。
接口定義
接口名稱
/api/callback
請求參數
參數名稱 | 參數類型 | 是否必須 | 參數說明 | 用例 |
scene_id | string | 是 | 首頁推薦 | homepage |
uid | string | 是 | 用戶注冊ID | 85578510 |
request_id | string | 是 | 請求的唯一標識 | d9cb1c8d*** |
features | json string | 否 | 用戶特征 | {"age":25, "city":"beijing"} |
item_list | json list | 是 | 推薦的uid列表 | [{"item_id":"99886867"}, {"item_id":"99888623"}] |
request_info | json string | 否 | 請求信息 | {"recom_id":"12334234"} |
請求樣例
curl 'http://host/api/callback' -d '{"uid":"84603208","request_id":"d9cb1c8d-4d3f-491b-9ea3-380481dabde3","scene_id":"homepage","features":{"age":25, "city":"beijing"}, "item_list":[{"item_id":"113939841"},{"item_id":"113764910"}],"request_info":{"recom_id":"1111111"}}'
返回數據
{
"code":200,
"msg":"success",
}
字段 | 類型 | 描述 | 示例 |
code | integer | 返回碼標識 | 接口狀態碼,200成功 |
msg | string | 提示信息 | 成功為success |
回調配置
Callback 流程主要分兩部分
加載 user/item 特征,
很多情況下如果使用 EasyRec 模型, item 特征是與模型綁定到一起的。 需要請求 easyrec 模型,拿到模型生成的 FG 特征
把上面的特征數據寫入到消息隊列(datahub) 中。
"CallBackConfs": {
"home_feed": {
"DataSource": {
"Name": "pairec_callback_dh",
"Type": "datahub"
},
"RankConf": {
"RankAlgoList": [
"ali_rnk_v2_woid_callback_public_v2"
],
"ContextFeatures": [
"none"
],
"Processor": "EasyRec"
}
}
}
home_feed 是場景名稱,針對哪個場景落日志
DataSource
Type 消息隊列類型,目前支持 datahub
pairec_callback_dh datahub 的數據源名稱, 在 DatahubConfs 能找到
RankConf 配置的模型信息,和正常的引擎服務的模型配置一樣,如果沒有模型產生的特征信息,可以不配置
數據源配置
"DatahubConfs": {
"pairec_callback_dh": {
"Endpoint": "http://dh-cn-hangzhou-int-vpc.aliyuncs.com",
"AccessId": "${AccessId}",
"AccessKey": "${AccessKey}",
"ProjectName": "<ProjectName>",
"TopicName": "pairec_callback_log",
"Schemas": [
{
"Field": "request_id",
"Type": "string"
},
{
"Field": "module",
"Type": "string"
},
{
"Field": "scene",
"Type": "string"
},
{
"Field": "request_time",
"Type": "integer"
},
{
"Field": "user_features",
"Type": "string"
},
{
"Field": "item_features",
"Type": "string"
},
{
"Field": "request_info",
"Type": "string"
},
{
"Field": "user_id",
"Type": "string"
},
{
"Field": "item_id",
"Type": "string"
},
{
"Field": "raw_features",
"Type": "string"
},
{
"Field": "generate_features",
"Type": "string"
},
{
"Field": "context_features",
"Type": "string"
}
]
}
}
注:如果使用 PAI-Rec 控制臺進行配置,為了保持安全性,${AccessId}與${AccessKey} 可以不用替換,引擎會自動替換。
在上面的配置中, topic name 可以不用手動創建, PAI-Rec 可以根據 topic name 及 schema 自動創建。
特征加載配置
配置參考 特征配置。這里不同一點就是場景名稱 + _callback 作為特征加載的場景別名。
home_feed_callback 的場景名稱是 home_feed + _callback 來的。
"FeatureConfs": {
"home_feed_callback": {
"AsynLoadFeature": true,
"FeatureLoadConfs": [
{
"FeatureDaoConf": {
"AdapterType": "hologres",
"HologresName": "pairec-holo",
"FeatureKey": "user:uid",
"UserFeatureKeyName": "client_str",
"HologresTableName": "dwd_ali_user_all_feature_v2_holo",
"UserSelectFields": "*",
"FeatureStore": "user"
},
"Features": [
{
"FeatureType": "new_feature",
"FeatureName": "day_h",
"Normalizer": "hour_in_day",
"FeatureStore": "user"
},
{
"FeatureType": "new_feature",
"FeatureName": "week_day",
"Normalizer": "weekday",
"FeatureStore": "user"
},
{
"FeatureType": "new_feature",
"FeatureName": "rand_int_v",
"Normalizer": "random",
"FeatureStore": "user"
}
]
},
{
"FeatureDaoConf": {
"AdapterType": "hologres",
"HologresName": "pairec-holo",
"FeatureKey": "user:uid",
"UserFeatureKeyName": "client_str",
"HologresTableName": "dwd_ali_user_table_v3_expo_static_feature_v2_holo",
"UserSelectFields": "*",
"FeatureStore": "user"
}
}
]
}
}
日志格式
callback 請求數據包含一個 uid + item 列表。 很多請求下, user 的特征比較大,為了省空間,我們會把 user 特征和 item 特征分開落下來。
user 特征日志,包含下面數據
request_id 請求ID, callback 請求里獲得
scene 場景名稱,callback 請求里獲得
request_time 請求時間
user_features user 特征, json string
user_id 用戶ID標識
request_info 額外的請求信息, callback 請求里獲得
module 固定值 user , 表明是 user 特征
item 特征日志,包含下面數據
request_id 請求ID, callback 請求里獲得
scene 場景名稱,callback 請求里獲得
request_time 請求時間
module 固定值 item , 表明是 item 特征
item_id item ID 標識
user_id 用戶ID標識
raw_features easyrec 模型返回raw features
generate_features easyrec 模型返回的 FG 之后的特征信息
context_features easyrec 模型返回的上下文特征
item_features item 特征, json string
若有收獲,就點個贊吧