O FeatureStore SDK for Go permite recuperar dados de features de armazenamentos de dados online durante a inferência do modelo, incluindo features offline, features em tempo real e features de sequência.
Pré-requisitos
Antes de começar, verifique se você possui:
Um projeto do FeatureStore, entidades de features, visualizações de features e features de modelo criados, com dados sincronizados entre os armazenamentos online e offline. Consulte Configure FeatureStore projects.
Um AccessKey ID e um AccessKey secret. Consulte Create an AccessKey pair.
Sua aplicação em execução dentro de uma Virtual Private Cloud (VPC). O cliente do FeatureStore conecta-se aos armazenamentos de dados online por meio de uma VPC. Por exemplo, o Hologres é acessível apenas por uma VPC específica.
Armazene seu AccessKey ID e AccessKey secret como variáveis de ambiente em vez de codificá-los diretamente no código. Consulte Configure environment variables.
Instale o SDK
go get github.com/aliyun/aliyun-pai-featurestore-go-sdk/v2
Primeiros passos
Etapa 1: Inicialize o cliente do FeatureStore
API
func NewFeatureStoreClient(regionId, accessKeyId, accessKeySecret, projectName string, opts ...ClientOption) (*FeatureStoreClient, error)
|
Parâmetro |
Descrição |
|
|
A região onde a instância está localizada |
|
|
O AccessKey ID usado para acessar os serviços de armazenamento |
|
|
O AccessKey secret usado para acessar os serviços de armazenamento |
|
|
O nome do projeto do FeatureStore criado no console do Platform for AI (PAI) |
Exemplo
accessId := os.Getenv("AccessId")
accessKey := os.Getenv("AccessKey")
client, err := featurestore.NewFeatureStoreClient("cn-beijing", accessId, accessKey, "project_name")
Etapa 2: Recupere dados de features de uma visualização de features
Use GetOnlineFeatures para buscar features de uma visualização de features pelo join ID (chave primária).
API
GetOnlineFeatures(joinIds []interface{}, features []string, alias map[string]string) ([]map[string]interface{}, error)
| Parâmetro | Descrição | |
|---|---|---|
joinIds |
Os join IDs (chaves primárias) das features a recuperar | |
features |
Os nomes das features a recuperar. Use []string{"*"} para recuperar todas as features da visualização de features |
|
alias |
Aliases para as features recuperadas. Não se aplica a visualizações de features de sequência | |
Exemplo
// 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)
Resposta: visualização de features offline ou em tempo real
Cada elemento na resposta corresponde a um join ID. Campos sem dados no armazenamento de dados online retornam uma string vazia.
[
{
"city": "Hefei",
"follow_cnt": 1,
"gender": "male",
"user_id": "100043186"
},
{
"city": "",
"follow_cnt": 5,
"gender": "male",
"user_id": "100060369"
}
]
Resposta: visualização de features de sequência
As features de sequência são retornadas como strings delimitadas por ponto e vírgula. Cada campo de sufixo (__event, __event_time, __item_id, __playtime, __ts) contém os valores de atributo correspondentes na mesma ordem da sequência de features.
O exemplo a seguir utiliza esta configuração de feature de sequência:
|
Campo de feature de sequência offline |
Nome do evento |
Comprimento da sequência |
Nome da feature de sequência online |
|
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"
}
]
Etapa 3: Recupere dados de features de features de modelo
Cada feature de modelo pode associar-se a múltiplas entidades de features. Use GetOnlineFeatures para recuperar todas as features de entidades simultaneamente ou GetOnlineFeaturesWithEntity para recuperar features de uma entidade específica.
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)
| Parâmetro | Descrição | |
|---|---|---|
joinIds |
Um mapa de nomes de join IDs para seus valores. Especifique todos os join IDs configurados para a feature de modelo | |
featureEntityName |
O nome da entidade de feature cujas features devem ser recuperadas | |
Exemplo
Uma feature de modelo pode associar-se a várias entidades de features. O exemplo a seguir especifica dois join IDs — user_id e item_id — correspondentes à configuração da feature de modelo.
// 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"}})
Para recuperar features apenas de uma entidade específica:
features, err := model_feature.GetOnlineFeaturesWithEntity(map[string][]interface{}{"user_id": {"100000676", "100004208"}}, "user")
Resposta: features de modelo sem features de sequência
[
{
"age": 26,
"city": "Shenyang",
"gender": "male",
"user_id": "100000676"
},
{
"age": 23,
"city": "Xi'an",
"gender": "male",
"user_id": "100004208"
}
]
Resposta: features de modelo com features de sequência
Ao registrar features de modelo, você pode incluir features de sequência offline para treinamento do modelo. Essas features de sequência sincronizam-se com o armazenamento de dados online e retornam juntamente com as features regulares.
A entidade de sequência geralmente é o usuário. O exemplo a seguir utiliza esta configuração de feature de sequência:
|
Campo de feature de sequência offline |
Nome do evento |
Comprimento da sequência |
Nome da feature de sequência online |
|
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"
}
]