猜你喜欢推荐场景的引擎配置单案例

为了帮助用户全面了解一个推荐场景如何配置引擎配置单,本文以猜你喜欢场景为例介绍召回、过滤、特征加载、精排和重排的基础配置,以及如何配置在线数据源Hologres和FeatureStore。

代码示例(单击展开查看详情)

{
    "HologresConfs": {
        "holo_info": {
            "DSN": "postgres://${AccessKey}:${AccessSecret}@hgpostcn-cn-xxxx-cn-shanghai-vpc-st.hologres.aliyuncs.com:80/test_db?sslmode=disable&connect_timeout=1"
        }
    },
    "FeatureStoreConfs": {
        "fs_info": {
            "RegionId": "cn-shanghai",
            "AccessId": "${AccessKey}",
            "AccessKey": "${AccessSecret}",
            "ProjectName": "projectName"
        }
    },
    "RecallConfs": [
        {
            "Name": "etrec_u2i2i_recall_v1",
            "RecallType": "UserCustomRecall",
            "RecallCount": 300,
            "DaoConf": {
                "AdapterType": "hologres",
                "HologresName": "holo_info",
                "HologresTableName": "home_feed_etrec_u2i2i_score_holo_v1"
            }
        },
        {
            "Name": "user_global_hot_recall_v1",
            "RecallType": "UserGlobalHotRecall",
            "RecallCount": 200,
            "DaoConf": {
                "AdapterType": "hologres",
                "HologresName": "holo_info",
                "HologresTableName": "home_feed_global_hot_holo_v1"
            }
        }
    ],
    "FilterConfs": [
        {
            "Name": "UserExposureFilter",
            "FilterType": "User2ItemExposureFilter",
            "MaxItems": 50,
            "TimeInterval": 604800,
            "WriteLog": true,
            "DaoConf": {
                "AdapterType": "hologres",
                "HologresName": "holo_info",
                "HologresTableName": "exposure_history"
            }
        },
        {
            "Name": "ItemStateFilter",
            "FilterType": "ItemStateFilter",
            "ItemStateDaoConf": {
                "AdapterType": "hologres",
                "HologresName": "holo_info",
                "HologresTableName": "item_status_table_v1",
                "ItemFieldName": "item_id",
                "SelectFields": "is_online"
            },
            "FilterParams": [
                {
                    "Name": "is_online",
                    "Type": "int",
                    "Operator": "equal",
                    "Value": 1
                }
            ]
        }
    ],
    "AlgoConfs": [
        {
            "Name": "home_feed_dbmtl_v1",
            "Type": "EAS",
            "EasConf": {
                "Processor": "EasyRec",
                "ResponseFuncName": "easyrecMutValResponseFunc",
                "Url": "http://xxx.vpc.cn-shanghai.pai-eas.aliyuncs.com/api/predict/home_feed_dbmtl_v1",
                "EndpointType": "DIRECT",
                "Auth": "xxxxx"
            }
        }
    ],
    "SortConfs": [
        {
            "Name": "BoostScoreSortByAuthor",
            "SortType": "BoostScoreSort",
            "Debug": false,
            "BoostScoreConditions": [
                {
                    "Conditions": [
                        {
                            "Name": "author_status",
                            "Domain": "item",
                            "Type": "string",
                            "Value": "teacher",
                            "Operator": "equal"
                        }
                    ],
                    "Expression": "score * 10"
                }
            ]
        }
    ],
    "SortNames": {
        "home_feed": [
            "BoostScoreSortByAuthor"
        ]
    },
    "FilterNames": {
        "default": [
            "UniqueFilter",
            "UserExposureFilter"
        ]
    },

    "RankConf": {
        "home_feed": {
            "RankAlgoList": [
                "home_feed_dbmtl_v1"
            ],
            "RankScore": "${home_feed_dbmtl_v1_probs_is_click}+${home_feed_dbmtl_v1_probs_is_collect_like_comment}",
            "BatchCount": 100,
            "Processor": "EasyRec"
        }
    },
    "FeatureConfs": {
        "home_feed": {
            "AsynLoadFeature": true,
            "FeatureLoadConfs": [
                {
                    "FeatureDaoConf": {
                        "AdapterType": "hologres",
                        "HologresName": "holo_info",
                        "FeatureKey": "user:uid",
                        "UserFeatureKeyName": "user_id",
                        "HologresTableName": "user_table_v1_all_feature_v1_online",
                        "UserSelectFields": "*",
                        "FeatureStore": "user"
                    },
                    "Features": []
                },
                {
                    "FeatureDaoConf": {
                        "AdapterType": "hologres",
                        "HologresName": "holo_info",
                        "ItemFeatureKeyName": "item_id",
                        "FeatureKey": "item:id",
                        "HologresTableName": "item_table_v1_all_feature_v1_online",
                        "ItemSelectFields": "item_id,author",
                        "FeatureStore": "item"
                    },
                    "Features": []
                }
            ]
        }
    },
    "SceneConfs": {
        "home_feed": {
            "default": {
                "RecallNames": [
                    "etrec_u2i2i_recall_v1",
                    "user_global_hot_recall_v1"
                ]
            }
        }
    }
}

引擎配置的定义逻辑:先定义召回(RecallConfs)、过滤(FilterConfs)、排序(AlgoConfs)、重排(SortConfs)的配置,然后再在场景中进行引用。如先在FilterConfs中定义过滤配置,配置的名称为唯一标识符,配置好之后可以在FilterNames中进行引用。召回配置在SceneConfs中引用,排序配置在RankConfs中引用,重排配置在SortNames中引用。home_feed为场景名称。但是FilterNames中的场景名称为default,代表如果找不到要走的场景配置,则会走default(默认)。

示例详细说明如下:

项目

说明

数据源

本案例配置了Hologres和FeatureStore两种数据源,主要存储供线上服务使用的数据,如用户特征和物品特征、热门召回和i2i召回数据、某个用户已经看过的物品ID作为曝光过滤的依据等。

如果FeatureStore使用FeatureDB作为线上数据源,需要配置FeatureDB的用户名(FeatureDBUsername)和密码(FeatureDBPassword);如果FeatureStore使用其他数据源,则不需配置这两个参数。两个数据源中的${AccessKey}${AccessSecret}不需要替换,引擎中会自动完成替换。

召回

本案例在RecallConfs中配置了两路召回,分别是U2I召回和全局热门召回,两种召回的数据来源于Hologres。不同召回参数说明如下:

  • Name:召回的自定义名称,是当前召回配置的唯一标识符。

  • RecallType:召回的类型,枚举值,目前以及内置的召回类型可参考召回配置

  • RecallCount:召回数量。

  • AdapterType:召回数据的数据源类型,我们这里使用Hologres举例。

  • HologresName:已配置的数据源的名称。

  • HologresTableName:召回数据来自于哪个表。

过滤

本案例在FilterConfs中配置了以下两种过滤方式:

  • 曝光过滤:需要提前在Hologres中创建曝光表,详情请参见曝光过滤(User2ItemExposureFilter)

  • 状态过滤:可以根据item的状态进行过滤。如配置中的FilterParams部分,表示只有is_online=1的item才会保留,其他的则会丢弃。

一些参数的解释:

  • Name:自定义的过滤名称。

  • FilterType:内置的过滤类型,所支持类型可参考过滤配置

  • MaxItems:曝光过滤时数据条目的限制,对应SQL中的limit。

  • TimeInterval:曝光过滤的时间范围,比如要过滤一小时以内的曝光,则为3600。单位秒。

  • WriteLog:曝光过滤时是否把本次推荐的item列表写入到曝光表中。

  • AdapterType:数据源类型,此处以Hologres举例。

  • HologresName:Hologres的配置名称,对应配置中的第三行。

  • HologresTableName:曝光表的表名称。

  • ItemStateDaoConf:是状态过滤时的一些参数。HologresTableName 此处则要填写状态表的表名称,ItemFieldName 为表的主键,SelectFields 为要查询的字段。

特征加载

将user特征和item特征加载到引擎中。其中,user特征参与模型的打分,item特征则多用来进行重排。

  • AsynLoadFeature: 是否异步加载特征。

  • AdapterType:数据源类型,此处以Hologres举例。

  • HologresName:Hologres配置的名称,对应代码中第三行。

  • FeatureKey:如user:uid,是一种固定写法,代表使用user的uid属性值在数据库中查询。

  • UserFeatureKeyName:用户数据表中的主键字段。

  • HologresTableName:用户数据表的表名。

  • UserSelectFields:查询时需要查找的字段,多个字段使用逗号分隔,可以使用`*`代替全部字段。

  • FeatureStore:枚举值为user/item,对应查询出来的特征存在user侧还是item侧。

排序

排序服务先在AlgoConfs中进行配置,可以定义多个精排服务。在RankConf中设置某个推荐场景引用AlgoConfs中定义的精排服务,以及打分公式和权重调整,可以设置多个目标预测分加权之后再相加或者相乘的方式。

AlgoConfs:

  • Name:自定义名称。

  • Type:EAS,固定值,当前基本都在EAS上部署模型服务。

  • Processor:固定值,Processor的类型。

  • ResponseFuncName:固定值。

  • Url:模型服务的地址信息。

  • EndpointType:是否采用直连的方式,直连的方式网络损耗更小。

  • Auth:模型服务的Token信息。

RankConf:

  • RankAlgoList:使用哪些模型服务进行打分。

  • RankScore:打分的公式,规则为RankAlgoList中的名称+模型实际的目标值。

  • BatchCount:打分的批次数量。

  • Processor:固定值,Processor的类型。

重排

本案例在SortConfs中配置了如下两个重排策略:

  • 提权策略:可以根据item的属性进行提权。如BoostScoreSort配置是指,如果item的author_status属性值为teacher,则将模型打分的分数再乘以10。

  • 打散策略:表示在长度为20的窗口中,以item的author为维度,不同维度值的item只能出现一次。

配置参数的一些解释:

  • Name:重排策略的自定义名称。

  • SortType:内置的重排策略类型,所支持的类型可参考重排配置

  • Debug:是否开启Debug模型,开启之后,会在控制台上多打印一些日志,方便排查问题。

  • Conditions:Conditions中则为 item 的条件,满足此条件的会按照Expression的表达式进行处理。

  • DiversityRules:此参数为多样性参数,Dimensions为维度字段,会按照item的这个字段进行多样性打散,WindowSize为窗口大小,FrequencySize为不同维度值最多出现的次数。