回調介面
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"
},
"RawFeatures": false,
"RawFeaturesRate": 0,
"ItemSize": 100,
"ItemSizeRate": 10,
"UseUserFeatures": true
}
}home_feed 是情境名稱,針對哪個情境落日誌
DataSource
Type 訊息佇列類型,目前支援 datahub
pairec_callback_dh datahub 的資料來源名稱, 在 DatahubConfs 能找到
RankConf 配置的模型資訊,和正常的引擎服務的模型配置一樣,如果沒有模型產生的特徵資訊,可以不配置
RawFeatures 是否記錄item側的raw features 特徵。只有設定為true才會記錄。設定為true的同時,RawFeaturesRate設定採樣比例(可取值的範圍是0 ~ 100)。
ItemSize 控制調用callback的item數量。如果推薦介面返回的item數量過多,可以此參數控制數量,截取前ItemSize個item數量。不設定此值的話,預設按推薦鏈路的下發item數量。
ItemSizeRate 按採樣比例取得item數量,可取值範圍是1 ~ 100。如果ItemSize和ItemSizeRate同時設定的話,先用ItemSize進行截取,然後按ItemSizeRate比例採樣。
UseUserFeatures 使用 AutoInvokeCallBack時,是否使用推薦鏈路擷取的user特徵進行調用。設定之後,callback鏈路中FeatureConfs可以不用額外取user特徵。
資料來源配置
"DatahubConfs": {
"pairec_callback_dh": {
"Endpoint": "http://dh-cn-hangzhou-int-vpc.aliyuncs.com",
"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"
}
]
}
}在上面的配置中, 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
情境自動回調
通常 callback 作為單獨的服務進行部署,使用者需要自己組裝資料進行調用。目前PAI-Rec引擎裡也支援自動調用callback鏈路。在配置單裡配置上callback相關的配置,只需要在SceneConfs裡開啟AutoInvokeCallBack標識即可。推薦請求完成後,會進行一次callback介面的回調。
當AutoInvokeCallBack = true 開啟的情況下,如果設定 AutoInvokeCallBackRate 也能控制回調callback介面的比例。可取值範圍1~100。如果不設定AutoInvokeCallBackRate, 或者 AutoInvokeCallBackRate = 0 全部流量進行回調。
"SceneConfs": {
"${scene_name}": {
"default": {
"RecallNames": [
"collaborative_filter"
],
"AutoInvokeCallBack": true,
"AutoInvokeCallBackRate": 100
}
}
}若有收穫,就點個贊吧