回调接口也是 pairec 内置的 API 接口。 回调接口主要用来落实时特征日志。单独拿出来介绍。
背景
实时特征是推荐中很重要的一环,尤其是其中的实时序列特征,一般来说能达到较明显的推荐效果提升。然而实时特征对准确性的要求很高,如通过离线卡时间窗口关联的方式,由于很难估计系统各链路间的延时,很容易就出现特征不准确、特征穿越的问题,加上这些不准确的特征达到适得其反的效果。
如何定义准确性?一个训练样本S_i(对应推荐请求R_i)中的实时特征,需要是推荐请求R_i时刻的user和item特征,因此最佳保证实时特征是在推荐请求达到推荐服务的时候,在算法计算推荐结果的同时,把recomid+user的实时特征+item的实时特征落入日志中(如Kafka等),然后再导入到Odps中。
然而往往因为AB实验的原因,一个推荐服务不是接受所有的实验流量的,没有办法给所有的实验流量来落实时特征,训练的时候又往往需要全量的训练样本进行训练,这些样本都需要有实时特征才能发挥实时特征的效果。因此,最佳近似实时的方式是通过callback接口,简单来说,A服务如果想落实时特征(f1,f2,f3...),B服务在下发之前,会异步调用A服务的callback接口,告诉A服务下发列表,让A服务把这些特征给落下来。该方案灵活性也较高,A服务想落的实时特征不会跟B服务想落的产生冲突,且实时性有保障,下发时刻和算法获取特征的时刻是近似同时的,不会出现特征穿越的问题。
接口定义
接口名称
/api/callback
请求参数
参数名称 | 参数类型 | 是否必须 | 参数说明 | 用例 |
scene_id | string | 是 | 场景ID | homepage |
uid | string | 是 | 用户注册ID | 85578510 |
request_id | string | 是 | 请求的唯一标识 | d9cb1c8d-4d3f-491b-9ea3-380481dabde3 |
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":{}, "item_list":[{"item_id":"113939841"},{"item_id":"113764910"}],"request_info":{"recom_id":"1111111"}}'返回数据
{
"code":200,
"msg":"success",
}字段 | 类型 | 描述 | 示例 |
code | integer | 返回码标识 | 接口状态码,200成功 |
msg | string | 提示信息 | 成功为success |