全部产品
Search
文档中心

Artificial Intelligence Recommendation:Ikhtisar dan konfigurasi pembuatan fitur

更新时间:Jan 16, 2026

FG (FeatureGenerator) adalah proses transformasi data mentah menjadi fitur untuk suatu model. Proses ini memastikan konsistensi antara output pembuatan sampel offline dan online. Pembuatan fitur menggunakan berbagai jenis operator FG untuk mentransformasikan satu atau beberapa fitur.

Pembuatan fitur hanya mencakup transformasi yang diperlukan baik untuk pembuatan sampel offline maupun online. Jika suatu transformasi hanya diperlukan pada tahap offline, jangan mendefinisikannya sebagai operasi FG. Diagram berikut menunjukkan posisi modul FG dalam arsitektur sistem rekomendasi.

image

Proses pembuatan fitur terdiri atas serangkaian operator transformasi fitur (operator FG). Operator-operator tersebut dijalankan secara paralel sesuai dengan topologi grafik asiklik terarah (DAG) yang didefinisikan dalam file konfigurasi.

Contoh file konfigurasi

Daftar features digunakan untuk mengonfigurasi operator fitur. Setiap operator fitur harus menyertakan feature_name dan feature_type. Untuk informasi lebih lanjut mengenai item konfigurasi lainnya, lihat Built-in feature operators.

Item konfigurasi reserves menentukan bidang-bidang yang dilewatkan selama tugas offline. Bidang-bidang tersebut langsung di-output tanpa transformasi fitur apa pun.

{
  "features": [
    {
      "feature_name": "goods_id",
      "feature_type": "id_feature",
      "value_type": "string",
      "expression": "item:goods_id",
      "default_value": "-1024",
      "need_prefix": false
    },
    {
      "feature_name": "color_pair",
      "feature_type": "combo_feature",
      "value_type": "string",
      "expression": ["user:query_color", "item:color"],
      "default_value": "",
      "need_prefix": false
    },
    {
      "feature_name": "current_price",
      "feature_type": "raw_feature",
      "value_type": "double",
      "expression": "item:current_price",
      "default_value": "0",
      "need_prefix": false
    }, 
    {
      "feature_name": "usr_cate1_clk_cnt_1d",
      "feature_type": "lookup_feature",
      "map": "user:usr_cate1_clk_cnt_1d",
      "key": "item:cate1",
      "need_discrete": false,
      "need_key": false,
      "default_value": "0",
      "combiner": "max",
      "need_prefix": false,
      "value_type": "double"
    },
    {
      "feature_name": "recommend_match",
      "feature_type": "overlap_feature",
      "method": "is_contain",
      "query": "user:query_recommend",
      "title": "item:recommend",
      "default_value": "0"
    },
    {
      "feature_name": "norm_title",
      "feature_type": "text_normalizer",
      "expression": "item:title",
      "max_length": 512,
      "parameter": 0,
      "remove_space": false,
      "is_gbk_input": false,
      "is_gbk_output": false
    },
    {
      "feature_name": "title_terms",
      "feature_type": "tokenize_feature",
      "expression": "feature:norm_title",
      "default_value": "",
      "vocab_file": "tokenizer.json",
      "output_type": "word_id",
      "output_delim": ","
    },
    {
      "feature_name": "query_title_match_ratio",
      "feature_type": "overlap_feature",
      "method": "query_common_ratio",
      "query": "user:query_terms",
      "title": "feature:title_terms",
      "default_value": "0"
    },
    {
      "feature_name": "title_term_match_ratio",
      "feature_type": "overlap_feature",
      "method": "title_common_ratio",
      "query": "user:query_terms",
      "title": "feature:title_terms",
      "default_value": "0"
    },
    {
      "feature_name": "term_proximity_min_cover",
      "feature_type": "overlap_feature",
      "method": "proximity_min_cover",
      "query": "user:query_terms",
      "title": "feature:title_terms",
      "default_value": "0"
    }
  ],
  "input_alias": {
    "non_exist_field1": "exist_field1",
    "non_exist_field2": "exist_field2"
  },
  "reserves": [
    "request_id",
    "user_id",
    "is_click",
    "is_pay",
    "sample_weight",
    "event_unix_time"
  ]
}

Item konfigurasi input_alias adalah kamus yang memetakan nama input fitur ke nama bidang yang sebenarnya, termasuk untuk bidang yang mungkin tidak ada. Catatan: Konfigurasi input_alias didukung mulai dari versi 1.0.0. Umumnya, konfigurasi ini dapat dilewati.

  • Kasus penggunaan 1: Menetapkan alias yang lebih pendek untuk nama bidang yang panjang.

  • Kasus penggunaan 2: Menetapkan alias untuk instans kedua ketika operator fitur kustom menggunakan parameter yang sama dua kali.

Bidang input yang sama dapat digunakan ulang di berbagai fitur tetapi tidak dalam satu transformasi fitur. Anda dapat mengonfigurasi input_alias untuk mengatasi keterbatasan ini.

  • Misalnya, jika operator fitur kustom memerlukan bidang yang sama A untuk dua parameter input berbeda, Anda dapat mengonfigurasi dua input, A dan B, lalu mengonfigurasi input_alias untuk memetakan "B": "A". Selama eksekusi, framework mengganti parameter untuk operator fitur kustom dari (A, B) menjadi (A, A).

Domain Masukan

Domain input menunjukkan entitas sumber dari input tersebut. Empat tipe berikut didukung:

  • user: Fitur sisi pengguna, seperti profil pengguna dan fitur statistik berdimensi pengguna.

  • context: Fitur kontekstual yang sering berubah, seperti waktu, lokasi, dan cuaca.

  • item: Fitur sisi item, seperti fitur konten statis dan fitur statistik berdimensi item.

  • feature: Menunjukkan bahwa input saat ini merupakan output dari transformasi fitur lainnya.

Domain input fitur digunakan untuk mengonfigurasi dependensi antar operator fitur, yang membentuk DAG. Framework mengeksekusi transformasi fitur ini secara paralel sesuai urutan topologis. Gambar berikut menunjukkan topologi yang dihasilkan:

image

Secara default, output dari node perantara dalam DAG tidak termasuk dalam output FG akhir. Anda dapat menggunakan item konfigurasi stub_type untuk mengubah perilaku ini.

Tipe multi-nilai dan pemisah

FG mendukung tipe input kompleks, seperti Array dan Map, yang konsisten dengan tipe kompleks di MaxCompute.

Anda dapat menggunakan pemisah chr(29) untuk fitur string multi-nilai.

Misalnya, dalam v1^]v2^]v3, ^] merepresentasikan pemisah multi-nilai. Ini adalah satu karakter dengan kode ASCII "\x1D", bukan dua karakter. Untuk memasukkan karakter ini di Emacs, tekan C-q C-5. Di vi, tekan C-v C-5.

Pengelompokan fitur (diskretisasi)

Framework mendukung enam jenis operasi pengelompokan berikut:

  • hash_bucket_size: Melakukan penghashan terhadap hasil transformasi fitur dan menjalankan operasi modulo.

  • vocab_list: Mengonversi hasil transformasi fitur menjadi indeks dalam daftar.

  • vocab_dict: Mengonversi hasil transformasi fitur menjadi nilai dalam kamus. Nilai tersebut harus dapat dikonversi ke tipe int64.

  • vocab_file: Membaca vocab_list atau vocab_dict dari file.

  • boundaries: Menentukan batas pengelompokan dan mengonversi hasil transformasi fitur menjadi ID bucket yang sesuai.

  • num_buckets: Langsung menggunakan hasil transformasi fitur sebagai ID bucket pengelompokan.

hash_bucket_size

Menjalankan penghashan terhadap hasil transformasi fitur dan melakukan operasi modulo. Ini berlaku untuk semua tipe nilai fitur.

  • Rentang hasil: [0, hash_bucket_size)

  • Hasil pengelompokan untuk fitur kosong adalah hash(default_value)%hash_bucket_size.

{
  "hash_bucket_size": 128000,
  "default_value": "default value"
}

vocab_list

Menjalankan pengelompokan berdasarkan daftar kosakata. Input dipetakan ke indeks dalam kosakata tersebut. Hasil pengelompokan adalah indeks nilai fitur dalam array vocab_list.

  • Tipe elemen array vocab_list harus sama dengan value_type yang dikonfigurasi.

  • num_oov_bucket: Bilangan bulat tak negatif yang menentukan jumlah bucket out-of-vocabulary.

    • Semua input out-of-vocabulary diberi ID dalam rentang [vocabulary_size, vocabulary_size+num_oov_bucket) berdasarkan hash dari nilai input.

    • Anda tidak dapat menentukan num_oov_bucket positif bersamaan dengan default_bucketize_value.

  • default_bucketize_value: Nilai ID integer yang dikembalikan untuk nilai fitur out-of-vocabulary.

    • Nilai ini tidak dapat ditentukan jika num_oov_buckets bernilai positif.

    • Nilai default-nya adalah vocab_list.size().

{
  "vocab_list": [
    "",
    "<OOV>",
    "token1",
    "token2",
    "token3",
    "token4"
  ],
  "num_oov_bucket": 0,
  "default_bucketize_value": 1
}

vocab_dict

Hasil pengelompokan adalah nilai dalam kamus vocab_dict yang sesuai dengan nilai fitur. Ini mendukung pemetaan berbagai nilai fitur ke hasil pengelompokan yang sama.

  • Tipe kunci dalam kamus vocab_dict harus sama dengan value_type yang dikonfigurasi.

  • Nilai dalam vocab_dict harus dapat dikonversi ke tipe int64.

  • num_oov_bucket: Bilangan bulat tak negatif yang menentukan jumlah bucket out-of-vocabulary.

    • Semua input out-of-vocabulary diberi ID dalam rentang [vocabulary_size, vocabulary_size+num_oov_bucket) berdasarkan hash dari nilai input.

    • Anda tidak dapat menentukan num_oov_bucket positif bersamaan dengan default_bucketize_value.

  • default_bucketize_value: Nilai ID integer yang dikembalikan untuk nilai fitur out-of-vocabulary.

    • Nilai ini tidak dapat ditentukan jika num_oov_buckets bernilai positif.

    • Nilai default-nya adalah vocab_dict.size().

{
  "vocab_dict": {
    "token1": 1,
    "token2": 2,
    "token3": 3,
    "token4": 1
  },
  "num_oov_bucket": 0,
  "default_bucketize_value": 4
}

vocab_file

Membaca vocab_list atau vocab_dict dari file.

{
  "vocab_file": "vocab.txt",
  "num_oov_bucket": 0,
  "default_bucketize_value": 4
}
  • vocab_file: Jalur file. File berisi daftar kosakata, dengan satu istilah kosakata per baris. Anda dapat secara opsional menentukan nilai yang dipetakan.

    • Jalur relatif didukung. Saat men-deploy layanan online, letakkan file tersebut di direktori yang sama dengan fg.json.

    • Jika hanya token yang ada, token tersebut dipetakan ke nomor baris, dimulai dari 0. Jika nilai disediakan, token dan nilai dipisahkan oleh karakter whitespace, seperti spasi atau tab. Nilai tersebut harus bertipe int64.

  • Makna dari num_oov_bucket dan default_bucketize_value sama seperti yang dijelaskan sebelumnya.

boundaries

Mengelompokkan fitur numerik berdasarkan batas yang ditentukan. Metode ini merepresentasikan input padat yang telah didiskretisasi dan dikelompokkan berdasarkan batas.

  • Tipe elemen array boundaries harus sama dengan value_type yang dikonfigurasi.

  • Bucket bersifat inklusif terhadap batas kiri dan eksklusif terhadap batas kanan.

  • Misalnya, boundaries=[0., 1., 2.] menghasilkan bucket (-inf, 0), [0, 1), [1, 2), dan [2, +inf).

{
  "boundaries": [0.0, 1.0, 2.0],
  "default_value": -1
}

num_buckets

Langsung menggunakan hasil transformasi fitur sebagai ID bucket pengelompokan. Ini cocok untuk kasus di mana nilai fitur dapat dikonversi ke bilangan bulat.

  • Rentang hasil: [0, num_buckets)

  • Jika nilai fitur berada di luar rentang yang dikonfigurasi, nilai tersebut diberi default_bucketize_value.

{
  "num_buckets": 128000,
  "default_bucketize_value": 127999
}

Operator fitur bawaan

Metode konfigurasi untuk setiap operator fitur berbeda-beda. Semua operator fitur yang dapat menjadi node daun DAG mendukung konfigurasi pengelompokan fitur.

Untuk informasi lebih lanjut, lihat Built-in feature operators.

Tipe fitur

Deskripsi

id_feature

Fitur kategorikal

raw_feature

Fitur numerik

expr_feature

Fitur ekspresi

combo_feature

Fitur kombinasi

lookup_feature

Fitur pencarian kamus

match_feature

Fitur pencarian kamus kunci primer-sekunder

overlap_feature

Fitur tumpang tindih

sequence_feature

Fitur sekuens

text_normalizer

Normalisasi teks

tokenize_feature

Fitur tokenisasi teks

bm25_feature

Fitur relevansi teks BM25

kv_dot_product

Produk dalam vektor KV

str_replace_feature

Penggantian string

regex_replace_feature

Penggantian ekspresi reguler

slice_feature

Pemotongan array

Kombinasi operator

Anda dapat mengombinasikan berbagai operator bawaan dengan mengonfigurasi DAG untuk melakukan transformasi fitur yang kuat.

Contoh 1: Menghitung rata-rata dari empat elemen pertama dalam sekuens

{
  "features": [
    {
      "feature_name": "top_n_prices",
      "feature_type": "sequence_raw_feature",
      "expression": "user:clk_prices",
      "separator": ",",
      "sequence_length": 4,
      "stub_type": true
    },
    {
      "feature_name": "top_n_avg_price",
      "feature_type": "expr_feature",
      "expression":"reduce_mean(top_n_prices)",
      "default_value": "-1",
      "variables":["feature:top_n_prices"]
    }
  ]
}

Contoh 2: Menghitung rata-rata elemen yang memenuhi kondisi dalam sekuens

{
  "features": [
    {
      "feature_name": "valid_list",
      "feature_type": "expr_feature",
      "expression":"clk_times < 10",
      "variables":["user:clk_times"],
      "value_dimension": 5
    },
    {
      "feature_name": "top_n_prices",
      "feature_type": "bool_mask_feature",
      "expression": ["user:clk_prices", "feature:valid_list"],
      "value_type": "float",
      "separator": ","
    },
    {
      "feature_name": "top_n_avg_price",
      "feature_type": "expr_feature",
      "expression":"reduce_mean(top_n_prices)",
      "default_value": "-1",
      "variables":["feature:top_n_prices"]
    }
  ]
}

Catatan: Pada contoh sebelumnya, clk_prices dan clk_times adalah dua sekuens paralel.

Operator fitur kustom

Operator fitur kustom dapat dimuat dan dieksekusi secara dinamis oleh framework sebagai plugin.

Untuk informasi lebih lanjut, lihat Custom feature operators.

Kiat optimasi performa

Performa modul FG sangat berkaitan erat dengan konfigurasinya. Prinsip umumnya adalah meminimalkan transformasi data (fitur) yang tidak perlu.

Jika manipulasi dan transformasi data dapat dilakukan pada tahap offline atau near-line, hindari melakukannya pada tahap FG (layanan online).

Untuk performa yang lebih baik, ikuti kiat-kiat berikut.

  • Untuk data input terstruktur, utamakan penggunaan tipe kompleks dari tabel MaxCompute, seperti Map dan Array, daripada tipe STRING. Hal ini mengurangi overhead parsing string.

    • Pada layanan online, seperti EasyRec Processor atau TorchEasyRec Processor, gunakan FeatureStore dengan FeatureDB sebagai penyimpanan online untuk mengaktifkan dukungan terhadap tipe kompleks.

    • Untuk lookup_feature, gunakan tipe Map untuk bidang map.

    • Untuk sequence_feature, overlap_feature, dan bm25_feature, gunakan input tipe Array.

    • Hindari penggunaan match_feature karena tidak mendukung tipe kompleks. Gunakan lookup_feature sebagai gantinya dengan mengombinasikan pkey dan skey.

  • Hindari overhead konversi tipe data.

    • Jangan mengatur value_type raw_feature ke tipe selain float kecuali Anda memiliki alasan khusus.

    • Untuk input lookup_feature, pastikan tipe Key dari Map sesuai dengan tipe bidang kueri.

    • Saat mengonfigurasi pengelompokan fitur tipe num_buckets, atur value_type ke int64.

    • Jika tipe optimal untuk kolom data berbeda-beda dalam skenario yang berbeda, pertimbangkan untuk menambahkan salinan dengan tipe berbeda.

      • Misalnya, suatu kolom mungkin perlu bertipe BIGINT saat digunakan sebagai bidang kueri untuk lookup_feature, tetapi bertipe STRING saat digunakan sebagai bagian dari combo_feature.

      • Dalam kasus ini, tambahkan salinan kolom dengan tipe yang sesuai. Satu salinan harus bertipe BIGINT, dan yang lainnya bertipe STRING. Berikut adalah contoh kode SQL:

        • SELECT int_data, int_data as str_data FROM ....

  • Gunakan dependensi fitur (mode DAG) untuk menggunakan ulang komponen sebisa mungkin.

Konfigurasi global

Item konfigurasi

Tipe

Nilai default

Deskripsi

USE_CITY_HASH_TO_BUCKETIZE

string

'false'

Menentukan apakah akan menggunakan CityHash sebagai fungsi hash untuk pengelompokan fitur.

USE_MULTIPLICATIVE_HASH

string

'false'

Menentukan apakah akan menggunakan penghashan multiplikatif alih-alih operasi modulo untuk penghashan fitur. Disarankan untuk mengaktifkan opsi ini.

DISABLE_FG_PRECISION

string

'true'

Menentukan apakah akan menonaktifkan batasan presisi untuk fitur floating-point. Jika tidak dinonaktifkan, FG hanya menyimpan 6 tempat desimal untuk fitur floating-point.

DISABLE_STRING_TRIM

string

'false'

Menentukan apakah akan menonaktifkan pemangkasan spasi awal dan akhir setelah memisahkan fitur string multi-nilai.

MONITOR_CUSTOM_OP_EVERY_N_SECONDS

string

'0'

Menentukan apakah akan memantau performa operator kustom. Ini adalah interval dalam detik untuk mencetak data performa.

IGNORE_CUSTOM_OP_EXCEPTION

string

'false'

Menentukan apakah akan mengabaikan pengecualian yang dilemparkan dalam operator kustom.

Catatan: Konfigurasi di atas harus konsisten di semua lingkungan eksekusi, termasuk offline dan online, serta pelatihan dan inferensi. Jika tidak, ketidakkonsistenan skor antara lingkungan offline dan online dapat terjadi.

Laju tabrakan hash

Pada dataset tertentu dengan 26 fitur yang memiliki kardinalitas berbeda, hash_bucket_size diatur menjadi 10 kali kardinalitas untuk setiap fitur. Hasil pengujian sebagai berikut:

Tipe hash

Total kardinalitas fitur

Total jumlah bucket

Laju tabrakan hash

std::hash

882774549

840065238

4,8381%

cityhash

882774549

840072446

4,8373%

std+cityhash

882774549

840075948

4,8369%

cityhash+multiplicative

882774549

840072195

4,8373%

std+multiplicative

882774549

840077306

4,8367%

Secara ringkas, Anda dapat mengombinasikan std::hash dan MultiplicativeHash untuk mengoptimalkan performa model. std::hash diaktifkan secara default. MultiplicativeHash dinonaktifkan secara default untuk memastikan kompatibilitas mundur. Untuk menggunakannya, Anda harus mengaktifkannya secara manual.

Selain itu, CityHash secara teoretis merupakan metode penghashan yang lebih seragam, tetapi tidak menunjukkan keunggulan signifikan pada dataset ini. Anda dapat mengujinya lebih lanjut pada dataset Anda sendiri.

Konfigurasi layanan skor online

Anda dapat mengonfigurasi ini melalui variabel lingkungan sisi server. Anda dapat menyetelnya dalam konfigurasi layanan EasyRec Processor atau TorchEasyRec Processor.

{
  "processor_envs": [
    {
      "name": "USE_MULTIPLICATIVE_HASH",
      "value": "true"
    }
  ]
}

Konfigurasi pekerjaan offline

Untuk mengeksekusi tugas FG offline di lingkungan MaxCompute, lihat Use FG in offline tasks.

Lihat kode berikut:

from pyfg100 import run_on_odps

fg_task = run_on_odps.FgTask(...)
fg_task.add_fg_setting('USE_CITY_HASH_TO_BUCKETIZE', 'false')
fg_task.add_fg_setting('USE_MULTIPLICATIVE_HASH', 'true')
fg_task.run(o)

Konfigurasi saat menggunakan API pyfg

Saat Anda menggunakan pyfg API, misalnya, untuk melakukan FG selama pelatihan, Anda dapat mengonfigurasinya sebagai berikut.

import pyfg
pyfg.set_env('USE_MULTIPLICATIVE_HASH', 'true')
pyfg.set_env('USE_CITY_HASH_TO_BUCKETIZE', 'false')