Le SDK FeatureStore pour Go permet de récupérer des données de caractéristiques (features) à partir de magasins de données en ligne lors de l'inférence de modèles, y compris les caractéristiques hors ligne, en temps réel et séquentielles.
Prérequis
Avant de commencer, vérifiez que vous disposez des éléments suivants :
Un projet FeatureStore, des entités de caractéristiques, des vues de caractéristiques et des caractéristiques de modèle créés, avec une synchronisation des données entre les magasins en ligne et hors ligne. Consultez la rubrique Configurer les projets FeatureStore.
Un AccessKey ID et un AccessKey Secret. Consultez la rubrique Créer une paire de clés d'accès.
Une application s'exécutant au sein d'un VPC (Virtual Private Cloud). Le client FeatureStore se connecte aux magasins de données en ligne via un VPC ; par exemple, Hologres n'est accessible que via un VPC spécifique.
Stockez votre AccessKey ID et votre AccessKey Secret en tant que variables d'environnement plutôt que de les coder en dur dans votre code. Consultez la rubrique Configurer les variables d'environnement.
Installer le SDK
go get github.com/aliyun/aliyun-pai-featurestore-go-sdk/v2
Prise en main
Étape 1 : Initialiser le client FeatureStore
API
func NewFeatureStoreClient(regionId, accessKeyId, accessKeySecret, projectName string, opts ...ClientOption) (*FeatureStoreClient, error)
| Paramètre | Description |
|---|---|
regionId |
La région où réside l'instance |
accessKeyId |
L'AccessKey ID utilisé pour accéder aux services de stockage |
accessKeySecret |
L'AccessKey Secret utilisé pour accéder aux services de stockage |
projectName |
Le nom du projet FeatureStore créé dans la console Platform for AI (PAI) |
Exemple
accessId := os.Getenv("AccessId")
accessKey := os.Getenv("AccessKey")
client, err := featurestore.NewFeatureStoreClient("cn-beijing", accessId, accessKey, "project_name")
Étape 2 : Récupérer les données de caractéristiques à partir d'une vue de caractéristiques
Utilisez GetOnlineFeatures pour extraire les caractéristiques d'une vue de caractéristiques par identifiant de jointure (clé primaire).
API
GetOnlineFeatures(joinIds []interface{}, features []string, alias map[string]string) ([]map[string]interface{}, error)
| Paramètre | Description | |
|---|---|---|
joinIds |
Les identifiants de jointure (clés primaires) des caractéristiques à récupérer | |
features |
Les noms des caractéristiques à récupérer. Utilisez []string{"*"} pour récupérer toutes les caractéristiques de la vue de caractéristiques |
|
alias |
Alias pour les caractéristiques récupérées. Ne s'applique pas aux vues de caractéristiques séquentielles | |
Exemple
// Get project by name
project, err := client.GetProject("project_name")
if err != nil {
// t.Fatal(err)
}
// Get feature view by name
user_feature_view := project.GetFeatureView("feature_view_name")
if user_feature_view == nil {
// t.Fatal("feature view not exist")
}
// Retrieve features for two keys
features, err := user_feature_view.GetOnlineFeatures([]interface{}{"key1", "key2"}, []string{"*"}, nil)
Réponse : vue de caractéristiques hors ligne ou en temps réel
Chaque élément de la réponse correspond à un identifiant de jointure. Les champs sans données dans le magasin de données en ligne renvoient une chaîne vide.
[
{
"city": "Hefei",
"follow_cnt": 1,
"gender": "male",
"user_id": "100043186"
},
{
"city": "",
"follow_cnt": 5,
"gender": "male",
"user_id": "100060369"
}
]
Réponse : vue de caractéristiques séquentielles
Les caractéristiques séquentielles sont renvoyées sous forme de chaînes délimitées par des points-virgules. Chaque champ de suffixe (__event, __event_time, __item_id, __playtime, __ts) contient les valeurs d'attribut correspondantes dans le même ordre que la séquence de caractéristiques.
L'exemple suivant utilise cette configuration de caractéristiques séquentielles :
| Champ de caractéristique séquentielle hors ligne | Nom de l'événement | Longueur de la séquence | Nom de la caractéristique séquentielle en ligne |
|---|---|---|---|
| click_seq_50_seq | click | 50 | click_seq_50_seq |
| expr_seq_100_seq | expr | 100 | expr_seq_100 |
[
{
"click_seq_50_seq": "216751275;228787053;220852269;242884721",
"click_seq_50_seq__event": "click;click;click;click",
"click_seq_50_seq__event_time": "1699128398;1699128398;1699118623;1699118623",
"click_seq_50_seq__item_id": "216751275;228787053;220852269;242884721",
"click_seq_50_seq__playtime": "65.40;72.06;104.69;62.74",
"click_seq_50_seq__ts": "389018;389018;398793;398793",
"expr_seq_100": "207474427;216751275;228787053;247136848;270584471;299485479;220852269;242884721;245999124;265863707",
"expr_seq_100__event": "expr;expr;expr;expr;expr;expr;expr;expr;expr;expr",
"expr_seq_100__event_time": "1699128398;1699128398;1699128398;1699128398;1699128398;1699128398;1699118623;1699118623;1699118623;1699118623",
"expr_seq_100__item_id": "207474427;216751275;228787053;247136848;270584471;299485479;220852269;242884721;245999124;265863707",
"expr_seq_100__playtime": "0.00;0.00;0.00;0.00;0.00;0.00;0.00;0.00;0.00;0.00",
"expr_seq_100__ts": "389018;389018;389018;389018;389018;389018;398793;398793;398793;398793",
"user_id": "186569075"
},
{
"click_seq_50_seq": "201741544;236327912;293320498",
"click_seq_50_seq__event": "click;click;click",
"click_seq_50_seq__event_time": "1699178245;1699178245;1699178245",
"click_seq_50_seq__item_id": "201741544;236327912;293320498",
"click_seq_50_seq__playtime": "97.41;70.32;135.21",
"click_seq_50_seq__ts": "339171;339171;339171",
"expr_seq_100": "201741544;224940066;236327912;240253906;247562151;293320498",
"expr_seq_100__event": "expr;expr;expr;expr;expr;expr",
"expr_seq_100__event_time": "1699178245;1699178245;1699178245;1699178245;1699178245;1699178245",
"expr_seq_100__item_id": "201741544;224940066;236327912;240253906;247562151;293320498",
"expr_seq_100__playtime": "0.00;0.00;0.00;0.00;0.00;0.00",
"expr_seq_100__ts": "339171;339171;339171;339171;339171;339171",
"user_id": "186569870"
}
]
Étape 3 : Récupérer les données de caractéristiques à partir des caractéristiques de modèle
Chaque caractéristique de modèle peut être associée à plusieurs entités de caractéristiques. Utilisez GetOnlineFeatures pour récupérer toutes les caractéristiques d'entité en une seule fois, ou GetOnlineFeaturesWithEntity pour récupérer les caractéristiques d'une entité spécifique.
API
// Retrieve features for all entities
GetOnlineFeatures(joinIds map[string][]interface{}) ([]map[string]interface{}, error)
// Retrieve features for a specific entity
GetOnlineFeaturesWithEntity(joinIds map[string][]interface{}, featureEntityName string) ([]map[string]interface{}, error)
| Paramètre | Description | |
|---|---|---|
joinIds |
Une carte des noms d'identifiants de jointure vers leurs valeurs. Spécifiez tous les identifiants de jointure configurés pour la caractéristique de modèle | |
featureEntityName |
Le nom de l'entité de caractéristiques dont les caractéristiques doivent être récupérées | |
Exemple
Une caractéristique de modèle peut être associée à plusieurs entités de caractéristiques. L'exemple suivant spécifie deux identifiants de jointure — user_id et item_id — correspondant à la configuration de la caractéristique de modèle.
// Get project by name
project, err := client.GetProject("fs_test_ots")
if err != nil {
// t.Fatal(err)
}
// Get model feature by name
model_feature := project.GetModelFeature("rank")
if model_feature == nil {
// t.Fatal("model feature not exist")
}
// Retrieve features for all configured join IDs
features, err := model_feature.GetOnlineFeatures(map[string][]interface{}{"user_id": {"100000676", "100004208"}, "item_id": {"238038872", "264025480"}})
Pour récupérer les caractéristiques d'une entité spécifique uniquement :
features, err := model_feature.GetOnlineFeaturesWithEntity(map[string][]interface{}{"user_id": {"100000676", "100004208"}}, "user")
Réponse : caractéristiques de modèle sans caractéristiques séquentielles
[
{
"age": 26,
"city": "Shenyang",
"gender": "male",
"user_id": "100000676"
},
{
"age": 23,
"city": "Xi'an",
"gender": "male",
"user_id": "100004208"
}
]
Réponse : caractéristiques de modèle avec caractéristiques séquentielles
Lorsque vous enregistrez des caractéristiques de modèle, vous pouvez inclure des caractéristiques séquentielles hors ligne pour l'entraînement du modèle. Ces caractéristiques séquentielles sont synchronisées avec le magasin de données en ligne et renvoyées avec les caractéristiques standard.
L'entité séquentielle est généralement l'utilisateur. L'exemple suivant utilise cette configuration de caractéristiques séquentielles :
| Champ de caractéristique séquentielle hors ligne | Nom de l'événement | Longueur de la séquence | Nom de la caractéristique séquentielle en ligne |
|---|---|---|---|
| click_seq_50_seq | click | 50 | click_seq_50_seq |
[
{
"age": 51,
"author": 147848300,
"category": "7",
"city": "",
"click_count": 0,
"click_seq_50_seq": "216751275;228787053;220852269;242884721",
"click_seq_50_seq__event": "click;click;click;click",
"click_seq_50_seq__event_time": "1699128398;1699128398;1699118623;1699118623",
"click_seq_50_seq__item_id": "216751275;228787053;220852269;242884721",
"click_seq_50_seq__playtime": "65.40;72.06;104.69;62.74",
"click_seq_50_seq__ts": "391447;391447;401222;401222",
"duration": 48,
"follow_cnt": 2,
"follower_cnt": 0,
"gender": "female",
"item_cnt": 0,
"item_id": 299485479,
"praise_count": 2,
"pub_time": 1697885713,
"register_time": 1696582012,
"tags": "0",
"title": "#Workout tracking",
"user_id": "186569075"
},
{
"age": 28,
"author": 119734983,
"category": "18",
"city": "",
"click_count": 0,
"click_seq_50_seq": "201741544;236327912;293320498",
"click_seq_50_seq__event": "click;click;click",
"click_seq_50_seq__event_time": "1699178245;1699178245;1699178245",
"click_seq_50_seq__item_id": "201741544;236327912;293320498",
"click_seq_50_seq__playtime": "97.41;70.32;135.21",
"click_seq_50_seq__ts": "341600;341600;341600",
"duration": 15,
"follow_cnt": 0,
"follower_cnt": 2,
"gender": "male",
"item_cnt": 0,
"item_id": 207474427,
"praise_count": 79,
"pub_time": 1697731285,
"register_time": 1699135393,
"tags": "1",
"title": "#Idiom story",
"user_id": "186569870"
}
]