FeatureConfs contrôle les fonctionnalités utilisateur et élément que la phase de classement fin charge, ainsi que leur transformation avant le scoring. Il associe les noms de scénario aux configurations de chargement des fonctionnalités, permettant à différents scénarios d'utiliser des ensembles de fonctionnalités distincts.
{
"FeatureConfs": {
"<scene_name>": { ... }
}
}
Concepts clés
| Terme | Description |
|---|---|
FeatureConfs |
Mappage de niveau supérieur. La clé correspond au nom du scénario ; la valeur est un objet de configuration de chargement des fonctionnalités. |
FeatureLoadConfs |
Liste des tâches de chargement des fonctionnalités au sein d'un scénario. Chaque tâche extrait les fonctionnalités d'une source de données unique. |
FeatureDaoConf |
Configuration d'accès aux données pour une tâche de chargement individuelle : spécifie le type de source de données, la connexion et la sélection des champs. |
FeatureKey |
Clé de recherche. Format : <side>:<field>. Par exemple, user:uid recherche le champ uid côté utilisateur ; item:id recherche le champ id côté élément. |
FeatureStore |
Emplacement de stockage des fonctionnalités récupérées. Valeurs valides : user ou item. |
AsynLoadFeature |
Lorsque la valeur est true, toutes les tâches dans FeatureLoadConfs s'exécutent simultanément, réduisant ainsi le temps total de chargement. |
Choisir une source de données
Les fonctionnalités peuvent être chargées depuis Hologres, PAI-FeatureStore, Tablestore (OTS) et Redis. Le tableau ci-dessous résume les principales différences.
| Capacité | Hologres | PAI-FeatureStore | Tablestore (OTS) | Redis |
|---|---|---|---|---|
Valeur AdapterType |
hologres |
featurestore |
tablestore |
redis |
Sélection des champs (UserSelectFields / ItemSelectFields) |
Oui | Oui (avec vue de fonctionnalités) | Oui | Oui (format HASH uniquement) |
Cache local (CacheSize / CacheTime) |
Oui | Oui | Oui | Oui |
| Sélection de vue de fonctionnalités | Non | Oui | Non | Non |
| Options de format de données | — | — | — | string (CSV / JSON) ou hash |
Hologres
Chaque entrée dans FeatureLoadConfs charge les données depuis une table Hologres unique. Configurez des entrées séparées pour les fonctionnalités utilisateur et élément.
{
"FeatureConfs": {
"scene_name": {
"AsynLoadFeature": true,
"FeatureLoadConfs": [
{
"FeatureDaoConf": {
"AdapterType": "hologres",
"HologresName": "holo-pai",
"FeatureKey": "user:uid",
"UserFeatureKeyName": "user_id",
"HologresTableName": "recom_user_features_processed_holo_online",
"UserSelectFields": "rids_count,sex,alladdfriendnum,allpayrosenum",
"FeatureStore": "user"
},
"Features": []
},
{
"FeatureDaoConf": {
"AdapterType": "hologres",
"HologresName": "holo-pai",
"ItemFeatureKeyName": "item_id",
"FeatureKey": "item:id",
"HologresTableName": "recom_user_features_processed_holo_online",
"ItemSelectFields": "rids_count as rids2_count,sex as guestsex,alladdfriendnum as alladdfriendnum2",
"FeatureStore": "item"
},
"Features": []
}
]
}
}
}
Paramètres FeatureLoadConfs/FeatureDaoConf
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
AdapterType |
string | Oui | Définissez sur hologres. |
HologresName |
string | Oui | Nom de l'instance Hologres tel que défini dans HologresConfs. Par exemple, holo_info. |
FeatureKey |
string | Oui | Clé de recherche. Par exemple, user:uid recherche le champ uid côté utilisateur ; item:id recherche le champ id côté élément. |
UserFeatureKeyName |
string | Oui | Champ de clé primaire de la table des fonctionnalités utilisateur. |
ItemFeatureKeyName |
string | Oui | Champ de clé primaire de la table des fonctionnalités élément. |
HologresTableName |
string | Oui | Nom de la table des fonctionnalités dans Hologres. |
UserSelectFields |
string | Non | Fonctionnalités utilisateur à récupérer. Utilisez * pour tout sélectionner, ou une liste séparée par des virgules telle que feature1,feature2. |
ItemSelectFields |
string | Non | Fonctionnalités élément à récupérer. Utilisez * pour tout sélectionner, ou une liste séparée par des virgules telle que feature1,feature2. |
FeatureStore |
string | Oui | Emplacement de stockage des fonctionnalités récupérées. Valeurs valides : user ou item. |
CacheSize |
integer | Non | Nombre d'entrées de fonctionnalités à mettre en cache localement. Valeur par défaut : 0 (pas de mise en cache). |
CacheTime |
integer | Non | Durée d'expiration des entrées mises en cache, en secondes. Prend effet uniquement lorsque CacheSize est supérieur à 0. Valeur par défaut : 3600. |
PAI-FeatureStore
Pour les instructions de configuration, consultez Présentation de FeatureStore.
Charger toutes les fonctionnalités d'une entité
La configuration suivante récupère toutes les fonctionnalités de l'entité user à partir du modèle rank_v1 :
{
"FeatureConfs": {
"scene_name": {
"AsynLoadFeature": true,
"FeatureLoadConfs": [
{
"FeatureDaoConf": {
"AdapterType": "featurestore",
"FeatureStoreName": "pairec-fs",
"FeatureKey": "user:uid",
"FeatureStoreModelName": "rank_v1",
"FeatureStoreEntityName": "user",
"FeatureStore": "user"
}
}
]
}
}
}
Pour charger les fonctionnalités élément à la place, définissez FeatureKey sur item:id, FeatureStoreEntityName sur item, et FeatureStore sur item.
Paramètres FeatureLoadConfs/FeatureDaoConf
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
AdapterType |
string | Oui | Définissez sur featurestore. |
FeatureStoreName |
string | Oui | Nom de l'instance FeatureStore tel que défini dans FeatureStoreConfs. Par exemple, pairec-fs. |
FeatureKey |
string | Oui | Clé de recherche. Par exemple, user:uid ou item:id. |
FeatureStoreModelName |
string | Oui | Nom de la fonctionnalité du modèle dans PAI-FeatureStore. |
FeatureStoreEntityName |
string | Oui | Nom de l'entité dans PAI-FeatureStore. |
FeatureStore |
string | Oui | Emplacement de stockage des fonctionnalités récupérées. Valeurs valides : user ou item. |
CacheSize |
integer | Non | Nombre d'entrées de fonctionnalités à mettre en cache localement. Valeur par défaut : 0 (pas de mise en cache). |
CacheTime |
integer | Non | Durée d'expiration des entrées mises en cache, en secondes. Prend effet uniquement lorsque CacheSize est supérieur à 0. Valeur par défaut : 3600. |
Charger les fonctionnalités depuis une vue de fonctionnalités spécifique
Pour récupérer les fonctionnalités depuis une vue de fonctionnalités nommée plutôt qu'une entité entière, utilisez FeatureStoreViewName. L'exemple suivant récupère toutes les fonctionnalités utilisateur depuis la vue user_table_preprocess_all_feature_v1 et un sous-ensemble de fonctionnalités élément depuis la vue item_table_preprocess_all_feature_v1 :
{
"FeatureConfs": {
"scene_name": {
"AsynLoadFeature": true,
"FeatureLoadConfs": [
{
"FeatureDaoConf": {
"AdapterType": "featurestore",
"FeatureStoreName": "pairec-fs",
"FeatureKey": "user:uid",
"FeatureStoreViewName": "user_table_preprocess_all_feature_v1",
"UserSelectFields": "*",
"FeatureStore": "user"
}
},
{
"FeatureDaoConf": {
"AdapterType": "featurestore",
"FeatureStoreName": "pairec-fs",
"FeatureKey": "item:id",
"FeatureStoreViewName": "item_table_preprocess_all_feature_v1",
"ItemSelectFields": "author,duration,category",
"FeatureStore": "item"
}
}
]
}
}
}
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
FeatureStoreViewName |
string | Oui | Nom de la vue de fonctionnalités. |
UserSelectFields |
string | Non | Fonctionnalités utilisateur à récupérer. Utilisez * pour tout sélectionner, ou une liste séparée par des virgules telle que feature1,feature2. |
ItemSelectFields |
string | Non | Fonctionnalités élément à récupérer. Utilisez * pour tout sélectionner, ou une liste séparée par des virgules telle que feature1,feature2. |
Tablestore (OTS)
{
"FeatureConfs": {
"scene_name": {
"AsynLoadFeature": true,
"FeatureLoadConfs": [
{
"FeatureDaoConf": {
"AdapterType": "tablestore",
"TableStoreName": "tablestore_info",
"FeatureKey": "user:uid",
"UserFeatureKeyName": "uid",
"TableStoreTableName": "",
"UserSelectFields": "*",
"FeatureStore": "user"
},
"Features": []
},
{
"FeatureDaoConf": {
"AdapterType": "tablestore",
"TableStoreName": "tablestore_info",
"FeatureKey": "item:id",
"ItemFeatureKeyName": "item_id",
"TableStoreTableName": "",
"ItemSelectFields": "*",
"FeatureStore": "item"
},
"Features": []
}
]
}
}
}
Paramètres FeatureLoadConfs/FeatureDaoConf
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
AdapterType |
string | Oui | Définissez sur tablestore. |
TableStoreName |
string | Oui | Nom de l'instance Tablestore tel que défini dans TableStoreConfs. Par exemple, tablestore_info. |
FeatureKey |
string | Oui | Clé de recherche. Par exemple, user:uid ou item:pair_id. |
UserFeatureKeyName |
string | Non | Champ de clé primaire de la table des fonctionnalités utilisateur. |
ItemFeatureKeyName |
string | Non | Champ de clé primaire de la table des fonctionnalités élément. |
TableStoreTableName |
string | Oui | Nom de la table des fonctionnalités dans Tablestore. |
UserSelectFields |
string | Non | Fonctionnalités utilisateur à récupérer. Utilisez * pour tout sélectionner, ou une liste séparée par des virgules telle que feature1,feature2. |
ItemSelectFields |
string | Non | Fonctionnalités élément à récupérer. Utilisez * pour tout sélectionner, ou une liste séparée par des virgules telle que feature1,feature2. |
FeatureStore |
string | Oui | Emplacement de stockage des fonctionnalités récupérées. Valeurs valides : user ou item. |
CacheSize |
integer | Non | Nombre d'entrées de fonctionnalités à mettre en cache localement. Valeur par défaut : 0 (pas de mise en cache). |
CacheTime |
integer | Non | Durée d'expiration des entrées mises en cache, en secondes. Prend effet uniquement lorsque CacheSize est supérieur à 0. Valeur par défaut : 3600. |
Redis
Redis prend en charge deux formats de stockage : clé-valeur (KV) et HASH.
KV format : la valeur peut être au format CSV (avec un délimiteur configurable) ou JSON.
Format HASH : récupère tous les champs ou une sélection de champs par leur nom en utilisant
UserSelectFieldsouItemSelectFields.
Format KV
Dans cet exemple, les fonctionnalités utilisateur sont stockées au format CSV et les fonctionnalités élément au format JSON. RedisValueDelimeter spécifie le séparateur CSV.
{
"FeatureConfs": {
"scene_name": {
"AsynLoadFeature": true,
"FeatureLoadConfs": [
{
"FeatureDaoConf": {
"AdapterType": "redis",
"RedisName": "user_redis",
"RedisPrefix": "UF_V2_",
"FeatureKey": "user:uid",
"FeatureStore": "user",
"RedisDataType": "string",
"RedisFieldType": "csv",
"RedisValueDelimeter": ","
},
"Features": []
},
{
"FeatureDaoConf": {
"AdapterType": "redis",
"RedisName": "item_redis",
"RedisPrefix": "IF_V2_FM_",
"FeatureKey": "item:id",
"FeatureStore": "item",
"RedisDataType": "string",
"RedisFieldType": "json"
},
"Features": []
}
]
}
}
}
Format HASH
{
"FeatureConfs": {
"scene_name": {
"AsynLoadFeature": true,
"FeatureLoadConfs": [
{
"FeatureDaoConf": {
"AdapterType": "redis",
"RedisName": "user_redis",
"RedisPrefix": "UF_V2_",
"FeatureKey": "user:uid",
"FeatureStore": "user",
"RedisDataType": "hash",
"UserSelectFields": "*"
},
"Features": []
},
{
"FeatureDaoConf": {
"AdapterType": "redis",
"RedisName": "item_redis",
"RedisPrefix": "IF_V2_FM_",
"FeatureKey": "item:id",
"FeatureStore": "item",
"RedisDataType": "hash",
"ItemSelectFields": "city,author,duration"
},
"Features": []
}
]
}
}
}
Paramètres FeatureLoadConfs/FeatureDaoConf
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
AdapterType |
string | Oui | Définissez sur redis. |
RedisName |
string | Oui | Nom de l'instance Redis tel que défini dans RedisConfs. Par exemple, redis_info. |
RedisPrefix |
string | Oui | Préfixe de la clé. |
FeatureKey |
string | Oui | Clé de recherche. Par exemple, user:uid ou item:pair_id. |
FeatureStore |
string | Oui | Emplacement de stockage des fonctionnalités récupérées. Valeurs valides : user ou item. |
RedisDataType |
string | Oui | Format de stockage des données. Valeurs valides : string ou hash. |
RedisFieldType |
string | Non | Format des champs lorsque RedisDataType est string. Valeurs valides : csv ou json. |
RedisValueDelimeter |
string | Non | Séparateur CSV. Prend effet uniquement lorsque RedisFieldType est csv. |
UserSelectFields |
string | Non | Fonctionnalités utilisateur à récupérer. Utilisez * pour tout sélectionner, ou une liste séparée par des virgules telle que feature1,feature2. Prend effet uniquement lorsque RedisDataType est hash. |
ItemSelectFields |
string | Non | Fonctionnalités élément à récupérer. Utilisez * pour tout sélectionner, ou une liste séparée par des virgules telle que feature1,feature2. Prend effet uniquement lorsque RedisDataType est hash. |
CacheSize |
integer | Non | Nombre d'entrées de fonctionnalités à mettre en cache localement. Valeur par défaut : 0 (pas de mise en cache). |
CacheTime |
integer | Non | Durée d'expiration des entrées mises en cache, en secondes. Prend effet uniquement lorsque CacheSize est supérieur à 0. Valeur par défaut : 3600. |
Transformation des fonctionnalités
Une fois les fonctionnalités chargées, vous pouvez dériver de nouvelles fonctionnalités ou recombiner celles existantes à l'aide de trois types de transformation :
**FeatureType** |
Description |
|---|---|
new_feature |
Génère une nouvelle fonctionnalité à partir de zéro ou d'une expression. |
raw_feature |
Crée une copie renommée d'une fonctionnalité existante. |
compose_feature |
Combine plusieurs fonctionnalités existantes en une seule fonctionnalité composite. |
Les configurations de transformation des fonctionnalités sont définies directement dans chaque entrée FeatureLoadConf , aux côtés de FeatureDaoConf.
new_feature
Utilisez new_feature pour générer des fonctionnalités absentes de la source de données : valeurs temporelles, nombres aléatoires, constantes ou résultats d'expressions.
Valeurs temporelles et aléatoires
{ "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" }
hour_in_day et weekday génèrent des valeurs en temps réel basées sur l'heure système actuelle. random génère un entier dans la plage [0, 100).
Valeur constante
L'exemple suivant génère une fonctionnalité nommée alg avec la valeur statique ALRC :
{
"FeatureType": "new_feature",
"FeatureStore": "user",
"Normalizer": "const_value",
"FeatureValue": "ALRC",
"FeatureName": "alg"
}
Expression (recommandé)
Utilisez Normalizer: "expr" pour les fonctionnalités basées sur des expressions. Cette méthode utilise la bibliothèque expr et offre une syntaxe plus flexible ainsi que de meilleures performances que l'ancienne méthode expression.
Référencez les fonctionnalités côté élément avec le préfixe item. et les fonctionnalités côté utilisateur avec le préfixe user.. Utilisez currentTime pour obtenir l'horodatage Unix actuel en secondes.
L'exemple suivant génère une fonctionnalité booléenne is_retarget (représentée par 1 ou 0) :
{
"FeatureType": "new_feature",
"FeatureStore": "item",
"Normalizer": "expr",
"Expression": "item.recall_name in ['retarget_u2i','realtime_retarget_click']",
"FeatureName": "is_retarget"
}
Pour combiner les fonctionnalités côté utilisateur et côté élément dans la même expression :
{
"FeatureType": "new_feature",
"FeatureStore": "item",
"Normalizer": "expr",
"Expression": "user.user_index - item.index",
"FeatureName": "index_delta"
}
Pour la syntaxe des expressions, consultez la définition du langage expr.
Expression (hérité)
Normalizer: "expression" utilise la bibliothèque govaluate. Utilisez FeatureSource pour spécifier quelle valeur de fonctionnalité transmettre à l'expression. Si l'expression fait référence à plusieurs propriétés d'élément, omettez FeatureSource : toutes les propriétés d'élément sont transmises automatiquement.
{
"FeatureType": "new_feature",
"FeatureStore": "item",
"FeatureSource": "item:recall_name",
"Normalizer": "expression",
"Expression": "recall_name in ('retarget_u2i','realtime_retarget_click')",
"FeatureName": "is_retarget"
}
Pour la syntaxe des expressions, consultez le manuel govaluate.
raw_feature
raw_feature copie une fonctionnalité existante sous un nouveau nom. Définissez RemoveFeatureSource sur true pour supprimer l'original après la copie.
L'exemple suivant renomme la fonctionnalité age de l'utilisateur en age_v2 :
{
"FeatureType": "raw_feature",
"FeatureStore": "user",
"FeatureSource": "user:age",
"RemoveFeatureSource": true,
"FeatureName": "age_v2"
}
Utilisez le préfixe user: pour les fonctionnalités côté utilisateur et le préfixe item: pour les fonctionnalités côté élément dans FeatureSource.
compose_feature
compose_feature joint plusieurs valeurs de fonctionnalités avec un trait de soulignement (_) pour créer une fonctionnalité composite.
L'exemple suivant crée item_author en joignant user:category et item:author. Si user:category vaut category1 et item:author vaut author1, le résultat est category1_author1 :
{
"FeatureType": "compose_feature",
"FeatureStore": "item",
"FeatureSource": "user:category,item:author",
"FeatureName": "item_author"
}
La méthodeexprpournew_featureoffre une alternative plus flexible pour construire des fonctionnalités composites.
Fonctions d'expression intégrées
Les fonctions suivantes sont disponibles dans les expressions expression et expr.
Fonctions de chaîne
| Fonction | Signature | Description | Exemple |
|---|---|---|---|
getString |
getString(a, b) |
Renvoie a si non vide ; sinon renvoie b. |
getString(user.city, "unknown") |
trim |
trim(str, cutset) |
Supprime tous les caractères de début et de fin présents dans cutset de str. |
trim(" hello ", " ") renvoie "hello" |
trimPrefix |
trimPrefix(str, cutset) |
Supprime les caractères de début présents dans cutset de str. |
trimPrefix("UF_uid", "UF_") renvoie "uid" |
replace |
replace(str, old, new) |
Remplace toutes les occurrences de old par new dans str. |
replace("a-b-c", "-", "_") renvoie "a_b_c" |
Fonctions mathématiques
| Fonction | Signature | Description | Exemple |
|---|---|---|---|
round |
round(number) |
Arrondit à l'entier le plus proche. | round(123.5) renvoie 124.0 |
round |
round(number, places) |
Tronque au nombre de décimales spécifié. | round(123.456, 2) renvoie 123.45 |
hash32 |
hash32(str) |
Calcule un hachage 32 bits en utilisant murmur3.Sum32. | hash32(item.id) |
log |
log(number) |
Logarithme naturel (base e). | log(2.718) |
log10 |
log10(number) |
Logarithme décimal (base 10). | log10(100) renvoie 2.0 |
log2 |
log2(number) |
Logarithme binaire (base 2). | log2(8) renvoie 3.0 |
pow |
pow(base, exponent) |
Élève base à la puissance exponent. |
pow(2, 10) renvoie 1024.0 |
Fonctions géospatiales
| Fonction | Signature | Description |
|---|---|---|
s2CellID |
s2CellID(lat, lng)s2CellID(lat, lng, level) |
Renvoie l'ID de cellule S2 (int) pour les coordonnées données. level contrôle la précision (plus élevé = cellule plus petite). Niveau par défaut : 15. |
s2CellNeighbors |
s2CellNeighbors(lat, lng)s2CellNeighbors(lat, lng, level) |
Renvoie une liste d'ID de cellules S2 ([]int) pour les coordonnées données et les 8 cellules adjacentes — soit 9 ID au total. |
geoHash |
geoHash(lat, lng)geoHash(lat, lng, precision) |
Encode les coordonnées sous forme de chaîne Geohash. Précision par défaut : 6. |
geoHashWithNeighbors |
geoHashWithNeighbors(lat, lng)geoHashWithNeighbors(lat, lng, precision) |
Renvoie les chaînes Geohash pour les coordonnées données et les 8 zones adjacentes — soit 9 chaînes au total. |
haversine |
haversine(lng1, lat1, lng2, lat2) |
Calcule la distance sphérique entre deux points en utilisant la formule de Haversine. Renvoie float64 en kilomètres. |
sphereDistance |
sphereDistance(lng1, lat1, lng2, lat2) |
Calcule la distance sphérique entre deux points en utilisant la loi des cosinus sphériques. Renvoie float64 en kilomètres. |