FeatureStore SDK untuk Go memungkinkan Anda mengambil data fitur dari penyimpanan data online selama inferensi model—termasuk fitur offline, fitur real-time, dan fitur sekuens.
Prasyarat
Sebelum memulai, pastikan Anda telah:
-
Membuat Proyek FeatureStore, entitas fitur, tampilan fitur, dan fitur model, dengan data yang telah disinkronkan antara offline store dan online store. Lihat Konfigurasikan proyek FeatureStore.
-
Memiliki ID AccessKey dan Rahasia AccessKey. Lihat Buat Pasangan Kunci Akses.
-
Aplikasi Anda berjalan di dalam virtual private cloud (VPC). Klien FeatureStore terhubung ke penyimpanan data online melalui VPC—misalnya, Hologres hanya dapat diakses melalui VPC tertentu.
Simpan ID AccessKey dan Rahasia AccessKey Anda sebagai variabel lingkungan, bukan melakukan hardcoding di dalam kode Anda. Lihat Konfigurasikan variabel lingkungan.
Instal SDK
go get github.com/aliyun/aliyun-pai-featurestore-go-sdk/v2
Mulai
Langkah 1: Inisialisasi klien FeatureStore
API
func NewFeatureStoreClient(regionId, accessKeyId, accessKeySecret, projectName string, opts ...ClientOption) (*FeatureStoreClient, error)
| Parameter | Deskripsi |
|---|---|
regionId |
Wilayah tempat instans berada |
accessKeyId |
ID AccessKey yang digunakan untuk mengakses layanan penyimpanan |
accessKeySecret |
Rahasia AccessKey yang digunakan untuk mengakses layanan penyimpanan |
projectName |
Nama Proyek FeatureStore yang dibuat di Konsol Platform for AI (PAI) |
Contoh
accessId := os.Getenv("AccessId")
accessKey := os.Getenv("AccessKey")
client, err := featurestore.NewFeatureStoreClient("cn-beijing", accessId, accessKey, "project_name")
Langkah 2: Ambil data fitur dari tampilan fitur
Gunakan GetOnlineFeatures untuk mengambil fitur dari tampilan fitur berdasarkan join ID (primary key).
API
GetOnlineFeatures(joinIds []interface{}, features []string, alias map[string]string) ([]map[string]interface{}, error)
| Parameter | Deskripsi | |
|---|---|---|
joinIds |
Join ID (primary key) dari fitur yang akan diambil | |
features |
Nama fitur yang akan diambil. Gunakan []string{"*"} untuk mengambil semua fitur dalam tampilan fitur |
|
alias |
Alias untuk fitur yang diambil. Tidak berlaku untuk tampilan fitur sekuens | |
Contoh
// Dapatkan proyek berdasarkan nama
project, err := client.GetProject("project_name")
if err != nil {
// t.Fatal(err)
}
// Dapatkan tampilan fitur berdasarkan nama
user_feature_view := project.GetFeatureView("feature_view_name")
if user_feature_view == nil {
// t.Fatal("tampilan fitur tidak ada")
}
// Ambil fitur untuk dua kunci
features, err := user_feature_view.GetOnlineFeatures([]interface{}{"key1", "key2"}, []string{"*"}, nil)
Tanggapan: tampilan fitur offline atau real-time
Setiap elemen dalam tanggapan berkorespondensi dengan satu join ID. Bidang yang tidak memiliki data di penyimpanan data online akan mengembalikan string kosong.
[
{
"city": "Hefei",
"follow_cnt": 1,
"gender": "male",
"user_id": "100043186"
},
{
"city": "",
"follow_cnt": 5,
"gender": "male",
"user_id": "100060369"
}
]
Tanggapan: tampilan fitur sekuens
Fitur sekuens dikembalikan sebagai string yang dipisahkan titik koma. Setiap bidang sufiks (__event, __event_time, __item_id, __playtime, __ts) menyimpan nilai atribut yang sesuai dalam urutan yang sama dengan sekuens fitur.
Contoh berikut menggunakan konfigurasi fitur sekuens ini:
| Bidang fitur sekuens offline | Nama Peristiwa | Panjang sekuens | Nama fitur sekuens 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"
}
]
Langkah 3: Ambil data fitur dari fitur model
Setiap fitur model dapat dikaitkan dengan beberapa entitas fitur. Gunakan GetOnlineFeatures untuk mengambil semua fitur entitas sekaligus, atau GetOnlineFeaturesWithEntity untuk mengambil fitur untuk entitas tertentu.
API
// Ambil fitur untuk semua entitas
GetOnlineFeatures(joinIds map[string][]interface{}) ([]map[string]interface{}, error)
// Ambil fitur untuk entitas tertentu
GetOnlineFeaturesWithEntity(joinIds map[string][]interface{}, featureEntityName string) ([]map[string]interface{}, error)
| Parameter | Deskripsi | |
|---|---|---|
joinIds |
Peta nama join ID ke nilai-nilainya. Tentukan semua join ID yang dikonfigurasi untuk fitur model | |
featureEntityName |
Nama entitas fitur yang fiturnya akan diambil | |
Contoh
Fitur model dapat dikaitkan dengan beberapa entitas fitur. Contoh berikut menentukan dua join ID—user_id dan item_id—sesuai dengan konfigurasi fitur model.
// Dapatkan proyek berdasarkan nama
project, err := client.GetProject("fs_test_ots")
if err != nil {
// t.Fatal(err)
}
// Dapatkan fitur model berdasarkan nama
model_feature := project.GetModelFeature("rank")
if model_feature == nil {
// t.Fatal("fitur model tidak ada")
}
// Ambil fitur untuk semua join ID yang dikonfigurasi
features, err := model_feature.GetOnlineFeatures(map[string][]interface{}{"user_id": {"100000676", "100004208"}, "item_id": {"238038872", "264025480"}})
Untuk mengambil fitur hanya untuk entitas tertentu:
features, err := model_feature.GetOnlineFeaturesWithEntity(map[string][]interface{}{"user_id": {"100000676", "100004208"}}, "user")
Tanggapan: fitur model tanpa fitur sekuens
[
{
"age": 26,
"city": "Shenyang",
"gender": "male",
"user_id": "100000676"
},
{
"age": 23,
"city": "Xi'an",
"gender": "male",
"user_id": "100004208"
}
]
Tanggapan: fitur model dengan fitur sekuens
Saat mendaftarkan fitur model, Anda dapat menyertakan fitur sekuens offline untuk pelatihan model. Fitur sekuens tersebut disinkronkan ke penyimpanan data online dan dikembalikan bersama fitur biasa.
Entitas sekuens biasanya adalah pengguna. Contoh berikut menggunakan konfigurasi fitur sekuens ini:
| Bidang fitur sekuens offline | Nama event | Panjang sekuens | Nama fitur sekuens 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"
}
]