FeatureStore SDK for Go を使用すると、モデル推論中にオンラインデータストアからオフライン特徴量、リアルタイム特徴量、シーケンス特徴量などの特徴量データを取得できます。
前提条件
開始する前に、以下が用意されていることを確認してください。
-
FeatureStore プロジェクト、特徴量エンティティ、特徴量ビュー、モデル特徴量が作成され、オンラインストアとオフラインストア間でデータが同期されていること。 詳細については、「FeatureStore プロジェクトの設定」をご参照ください。
-
AccessKey ID と AccessKey シークレット。 詳細については、「AccessKey ペアの作成」をご参照ください。
-
仮想プライベートクラウド (VPC) 内で実行されているアプリケーション。 FeatureStore クライアントは VPC 経由でオンラインデータストアに接続します。たとえば、Hologres は特定の VPC 経由でのみアクセスできます。
AccessKey ID と AccessKey シークレットは、コードにハードコーディングするのではなく、環境変数として保存してください。 詳細については、「環境変数の設定」をご参照ください。
SDK のインストール
go get github.com/aliyun/aliyun-pai-featurestore-go-sdk/v2
クイックスタート
ステップ 1: FeatureStore クライアントの初期化
API
func NewFeatureStoreClient(regionId, accessKeyId, accessKeySecret, projectName string, opts ...ClientOption) (*FeatureStoreClient, error)
| パラメーター | 説明 |
|---|---|
regionId |
インスタンスが存在するリージョン |
accessKeyId |
ストレージサービスへのアクセスに使用される AccessKey ID |
accessKeySecret |
ストレージサービスへのアクセスに使用される AccessKey シークレット |
projectName |
Platform for AI (PAI) コンソールで作成された FeatureStore プロジェクトの名前 |
例
accessId := os.Getenv("AccessId")
accessKey := os.Getenv("AccessKey")
client, err := featurestore.NewFeatureStoreClient("cn-beijing", accessId, accessKey, "project_name")
ステップ 2: 特徴量ビューからの特徴量データの取得
GetOnlineFeatures を使用して、ジョイン ID (プライマリキー) を指定して特徴量ビューから特徴量を取得します。
API
GetOnlineFeatures(joinIds []interface{}, features []string, alias map[string]string) ([]map[string]interface{}, error)
| パラメーター | 説明 | |
|---|---|---|
joinIds |
取得する特徴量のジョイン ID (プライマリキー) | |
features |
取得する特徴量名。 特徴量ビュー内のすべての特徴量を取得するには、[]string{"*"} を使用します |
|
alias |
取得した特徴量のエイリアス。 シーケンス特徴量ビューには適用されません | |
例
// 名前でプロジェクトを取得
project, err := client.GetProject("project_name")
if err != nil {
// t.Fatal(err)
}
// 名前で特徴量ビューを取得
user_feature_view := project.GetFeatureView("feature_view_name")
if user_feature_view == nil {
// t.Fatal("feature view not exist")
}
// 2 つのキーの特徴量を取得
features, err := user_feature_view.GetOnlineFeatures([]interface{}{"key1", "key2"}, []string{"*"}, nil)
レスポンス: オフラインまたはリアルタイム特徴量ビュー
レスポンスの各要素は 1 つのジョイン ID に対応します。 オンラインデータストアにデータがないフィールドは、空の文字列になります。
[
{
"city": "Hefei",
"follow_cnt": 1,
"gender": "male",
"user_id": "100043186"
},
{
"city": "",
"follow_cnt": 5,
"gender": "male",
"user_id": "100060369"
}
]
レスポンス: シーケンス特徴量ビュー
シーケンス特徴量は、セミコロンで区切られた文字列として返されます。 各サフィックスフィールド (__event、__event_time、__item_id、__playtime、__ts) には、特徴量シーケンスと同じ順序で対応する属性値が格納されます。
次の例では、このシーケンス特徴量設定を使用します:
| オフラインシーケンス特徴量フィールド | イベント名 | シーケンス長 | オンラインシーケンス特徴量名 |
|---|---|---|---|
| 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"
}
]
ステップ 3: モデル特徴量からの特徴量データの取得
各モデル特徴量は、複数の特徴量エンティティに関連付けることができます。 GetOnlineFeatures を使用してすべてのエンティティ特徴量を一度に取得するか、GetOnlineFeaturesWithEntity を使用して特定のエンティティの特徴量を取得します。
API
// すべてのエンティティの特徴量を取得
GetOnlineFeatures(joinIds map[string][]interface{}) ([]map[string]interface{}, error)
// 特定のエンティティの特徴量を取得
GetOnlineFeaturesWithEntity(joinIds map[string][]interface{}, featureEntityName string) ([]map[string]interface{}, error)
| パラメーター | 説明 | |
|---|---|---|
joinIds |
ジョイン ID 名とその値のマップ。 モデル特徴量に設定されているすべてのジョイン ID を指定します | |
featureEntityName |
特徴量を取得する特徴量エンティティの名前 | |
例
モデル特徴量は、複数の特徴量エンティティに関連付けることができます。次の例では、モデル特徴量設定に一致する 2 つの結合 ID である user_id と item_id を指定します。
// 名前でプロジェクトを取得
project, err := client.GetProject("fs_test_ots")
if err != nil {
// t.Fatal(err)
}
// 名前でモデル特徴量を取得
model_feature := project.GetModelFeature("rank")
if model_feature == nil {
// t.Fatal("model feature not exist")
}
// 設定されたすべてのジョイン ID の特徴量を取得
features, err := model_feature.GetOnlineFeatures(map[string][]interface{}{"user_id": {"100000676", "100004208"}, "item_id": {"238038872", "264025480"}})
特定のエンティティの特徴量のみを取得するには:
features, err := model_feature.GetOnlineFeaturesWithEntity(map[string][]interface{}{"user_id": {"100000676", "100004208"}}, "user")
レスポンス: シーケンス特徴量を含まないモデル特徴量
[
{
"age": 26,
"city": "Shenyang",
"gender": "male",
"user_id": "100000676"
},
{
"age": 23,
"city": "Xi'an",
"gender": "male",
"user_id": "100004208"
}
]
レスポンス: シーケンス特徴量を含むモデル特徴量
モデル特徴量を登録する際に、モデルトレーニング用にオフラインシーケンス特徴量を含めることができます。 これらのシーケンス特徴量はオンラインデータストアに同期され、通常の特徴量とともに返されます。
通常、シーケンスエンティティはユーザーです。 次の例では、このシーケンス特徴量設定を使用します:
| オフラインシーケンス特徴量フィールド | イベント名 | シーケンス長 | オンラインシーケンス特徴量名 |
|---|---|---|---|
| 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": "#ワークアウト記録",
"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": "#慣用句の物語",
"user_id": "186569870"
}
]