FeatureStore SDK for Go を使用すると、モデル推論中にオンラインデータストアから特徴量データを取得できます。これには、オフライン特徴量、リアルタイム特徴量、シーケンス特徴量が含まれます。
前提条件
開始する前に、以下を準備してください。
FeatureStore プロジェクト、特徴量エンティティ、特徴量ビュー、およびモデル特徴量が作成され、オンラインストアとオフラインストア間でデータが同期されていること。詳細については、「FeatureStore プロジェクトの構成」をご参照ください。
AccessKey ID と AccessKey Secret。詳細については、「AccessKey ペアの作成」をご参照ください。
ご利用のアプリケーションが VPC 内で実行されていること。FeatureStore クライアントは VPC 経由でオンラインデータストアに接続します。たとえば、Hologres は特定の VPC 経由でのみアクセス可能です。
AccessKey ID と AccessKey Secret は、コードにハードコーディングする代わりに環境変数として保存してください。詳細については、「環境変数の構成」をご参照ください。
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 Secret |
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("特徴量ビューが存在しません")
}
// 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": "#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"
}
]