PAI-Rec menyediakan filter bawaan untuk menghapus item yang tidak diinginkan dari hasil recall sebelum proses ranking. Konfigurasikan filter menggunakan parameter FilterConfs, lalu tetapkan ke skenario tertentu melalui FilterNames.
Jenis filter
| Jenis filter | Fungsinya |
|---|---|
User2ItemExposureFilter | Memblokir item yang sudah ditampilkan kepada pengguna agar tidak muncul kembali |
User2ItemCustomFilter | Mengecualikan item berdasarkan tabel kustom user-to-item (U2I) |
AdjustCountFilter | Mengacak hasil recall dan menyimpan jumlah item tertentu |
PriorityAdjustCountFilter | Mengontrol jumlah item yang diambil dari setiap tautan recall berdasarkan skor |
ItemStateFilter | Menghapus item yang status waktu nyatanya tidak memenuhi kondisi filter Anda |
ItemCustomFilter | Mengecualikan item berdasarkan logika kustom tingkat item |
CompletelyFairFilter | Memilih item dari setiap tautan recall secara adil berdasarkan skor |
GroupWeightCountFilter | Mengontrol pemilihan item berdasarkan bobot kelompok |
DimensionFieldUniqueFilter | Menghapus item yang memiliki nilai duplikat pada bidang tertentu |
UniqueFilter | Menghapus duplikat berdasarkan ID item di seluruh tautan recall. Tidak memerlukan entri terpisah di FilterConfs; cukup referensikan langsung berdasarkan nama di FilterNames. |
Konfigurasi umum
Semua filter dikonfigurasi dalam array FilterConfs. Setiap entri mendefinisikan satu kebijakan filter.
"FilterConfs": [
{
"Name": "",
"FilterType": "",
"Dimension": "",
"DaoConf": {},
"AdjustCountConfs": [{}],
"ItemStateDaoConf": {},
"FilterParams": [{}],
"DiversityDaoConf": {},
"FilterVal": {}
}
]| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
Name | string | Ya | Nama kustom untuk filter tersebut. Referensikan nama ini di FilterNames. |
FilterType | string | Ya | Jenis filter bawaan. Lihat tabel jenis filter di atas. |
Dimension | string | Tidak | Dimensi item. |
DaoConf | DaoConfig | Tidak | Konfigurasi sumber data. |
AdjustCountConfs | array | Tidak | Sub-konfigurasi untuk PriorityAdjustCountFilter. |
ItemStateDaoConf | object | Tidak | Konfigurasi sumber data untuk ItemStateFilter. |
FilterParams | array | Tidak | Kondisi yang diterapkan untuk memfilter hasil kueri. |
User2ItemExposureFilter
Gunakan filter ini untuk mencegah item yang telah ditampilkan kepada pengguna muncul kembali dalam rekomendasi berikutnya.
Cara Kerja Pelacakan Eksposur
Karena log waktu nyata memiliki latensi inheren, kumpulan item yang benar-benar telah dilihat pengguna tidak dapat ditentukan secara instan. PAI-Rec memperlakukan semua item yang dikembalikan oleh mesin rekomendasi sebagai pseudo-exposed—mesin itu sendiri yang menulis data ini. Data eksposur aktual (berdasarkan interaksi pengguna sungguhan) tiba melalui pipeline komputasi waktu nyata seperti Realtime Compute for Apache Flink dan ditulis ke database agar dapat dikonsumsi oleh PAI-Rec.
Parameter filter
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
Name | string | Ya | Nama kustom untuk filter tersebut. |
FilterType | string | Ya | Diatur ke User2ItemExposureFilter. |
MaxItems | int | Ya | Jumlah maksimum batch terbaru yang diambil dari tabel eksposur. Setara dengan LIMIT ${MaxItems} dalam SQL. Satu batch merepresentasikan satu permintaan rekomendasi—parameter ini mengontrol jumlah batch, bukan jumlah total item. |
TimeInterval | int | Ya | Jendela lookback untuk catatan eksposur, berdasarkan stempel waktu. Satuan: detik. |
WriteLog | bool | Ya | Apakah akan menulis log eksposur setelah setiap permintaan rekomendasi. |
ClearLogIfNotEnoughScene | string | Tidak | Skenario di mana data tabel eksposur dihapus. |
GenerateItemDataFuncName | string | Tidak | Fungsi kustom untuk menulis data item ke tabel eksposur. Jika dibiarkan kosong, fungsi bawaan digunakan dan hanya ID item yang ditulis. |
WriteLogExcludeScenes | []string | Tidak | Skenario di mana log eksposur tidak ditulis. |
Hologres
"FilterConfs": [
{
"Name": "holo_exposure_filter",
"FilterType": "User2ItemExposureFilter",
"MaxItems": 100,
"TimeInterval": 172800,
"WriteLog": true,
"DaoConf": {
"AdapterType": "hologres",
"HologresName": "holo_info",
"HologresTableName": "exposure_history"
}
}
]Parameter DaoConf:
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
AdapterType | string | Ya | Diatur ke hologres. |
HologresName | string | Ya | Nama sumber data Hologres yang didefinisikan di HologresConfs. Contoh: holo_info. |
HologresTableName | string | Ya | Nama tabel eksposur. |
Buat tabel eksposur dengan skema berikut. Atur time_to_live_in_seconds sesuai dengan nilai TimeInterval Anda—172.800 detik (48 jam) dalam contoh ini.
BEGIN;
CREATE TABLE "exposure_history" (
"uid" text NOT NULL,
"item" text NOT NULL,
"create_time" int4 NOT NULL,
PRIMARY KEY ("uid", "create_time")
);
CALL SET_TABLE_PROPERTY('"exposure_history"', 'orientation', 'column');
CALL SET_TABLE_PROPERTY('"exposure_history"', 'clustering_key', '"uid","create_time"');
CALL SET_TABLE_PROPERTY('"exposure_history"', 'segment_key', '"create_time"');
CALL SET_TABLE_PROPERTY('"exposure_history"', 'bitmap_columns', '"uid","item"');
CALL SET_TABLE_PROPERTY('"exposure_history"', 'dictionary_encoding_columns', '"uid","item"');
CALL SET_TABLE_PROPERTY('"exposure_history"', 'time_to_live_in_seconds', '172800');
COMMENT ON TABLE "exposure_history" IS 'the table that stores exposure records';
COMMIT;ApsaraDB for Redis
"FilterConfs": [
{
"Name": "redis_exposure_filter",
"FilterType": "User2ItemExposureFilter",
"MaxItems": 100,
"TimeInterval": 172800,
"WriteLog": true,
"DaoConf": {
"AdapterType": "redis",
"RedisName": "redis_info",
"RedisPrefix": "exposure_"
}
}
]Parameter DaoConf:
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
AdapterType | string | Ya | Diatur ke redis. |
RedisName | string | Ya | Nama sumber data Redis yang didefinisikan di RedisConfs. Contoh: redis_info. |
RedisPrefix | string | Tidak | Awalan kunci untuk catatan eksposur. Setiap kunci dibentuk sebagai {RedisPrefix}{UID}. |
Tablestore
"FilterConfs": [
{
"Name": "ots_exposure_filter",
"FilterType": "User2ItemExposureFilter",
"MaxItems": 100,
"TimeInterval": 172800,
"WriteLog": true,
"DaoConf": {
"AdapterType": "tablestore",
"TableStoreName": "tablestore_info",
"TableStoreTableName": "exposure_history"
}
}
]Parameter DaoConf:
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
AdapterType | string | Ya | Jenis sumber data. Nilai yang valid: hologres, mysql, dan tablestore. |
TableStoreName | string | Ya | Nama sumber data Tablestore yang didefinisikan di TableStoreConfs. Contoh: tablestore_info. |
TableStoreTableName | string | Ya | Nama tabel eksposur. |
Skema tabel eksposur:
| Kolom | Kategori | Tipe | Deskripsi | Contoh |
|---|---|---|---|---|
user_id | Kunci primer | string | UID pengguna. | 10944750 |
auto_id | Kunci primer | integer | Kolom auto-increment. | — |
item_ids | Properti | string | ID item, dipisahkan koma. Beberapa item yang diekspos dalam satu permintaan disimpan sebagai satu catatan. | 17019277,17019278 |
Atur time_to_live_in_seconds untuk mengontrol durasi penyimpanan catatan eksposur. Nilai ini harus dikonfigurasi secara eksplisit.
User2ItemCustomFilter
Gunakan filter ini jika Anda memiliki tabel user-to-item (U2I) sendiri yang menentukan item mana yang harus dikecualikan untuk setiap pengguna.
Tablestore
"FilterConfs": [
{
"Name": "u2i_custom_filter",
"FilterType": "User2ItemCustomFilter",
"DaoConf": {
"AdapterType": "tablestore",
"TableStoreName": "tablestore_info",
"TableStoreTableName": "u2i_table"
}
}
]Parameter DaoConf:
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
AdapterType | string | Ya | Jenis sumber data. Nilai yang valid: hologres, mysql, dan tablestore. |
TableStoreName | string | Ya | Nama sumber data Tablestore yang didefinisikan di TableStoreConfs. Contoh: tablestore_info. |
TableStoreTableName | string | Ya | Nama tabel U2I. |
Skema tabel U2I:
| Kolom | Kategori | Tipe | Deskripsi | Contoh |
|---|---|---|---|---|
user_id | Kunci primer | string | UID pengguna. | 10944750 |
item_ids | Properti | string | ID item yang akan dikecualikan, dipisahkan koma. | 17019277,17019278 |
AdjustCountFilter
Gunakan filter ini untuk mengacak hasil recall secara acak dan membatasi jumlah total item sebelum proses ranking. Filter ini berguna ketika tautan recall mengembalikan jauh lebih banyak item daripada yang dibutuhkan.
"FilterConfs": [
{
"Name": "adjust_count_filter",
"FilterType": "AdjustCountFilter",
"ShuffleItem": true,
"RetainNum": 500
}
]| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
ShuffleItem | bool | Ya | Apakah akan mengacak item dari tautan recall secara acak sebelum menyimpan. |
RetainNum | int | Ya | Jumlah item yang disimpan setelah pengacakan. |
PriorityAdjustCountFilter
Gunakan filter ini jika Anda ingin mengontrol jumlah item dari setiap tautan recall, dengan item diurutkan berdasarkan skor dalam setiap tautan.
Parameter Type mengatur perilaku saat tautan recall mengembalikan lebih sedikit item daripada target Count-nya:
accumulator: Kekurangan tersebut dikompensasi dengan mengambil item tambahan dari tautan recall berikutnya hingga mencapai total kumulatif yang ditentukan.fix: Jumlah item setiap tautan bersifat tetap. Kekurangan pada satu tautan tidak memengaruhi tautan lainnya.
"FilterConfs": [
{
"Name": "priority_adjust_count_filter",
"FilterType": "PriorityAdjustCountFilter",
"AdjustCountConfs": [
{
"RecallName": "recall_1",
"Count": 125,
"Type": "accumulator"
},
{
"RecallName": "recall_2",
"Count": 250,
"Type": "accumulator"
},
{
"RecallName": "recall_3",
"Count": 400,
"Type": "accumulator"
}
]
}
]Dalam contoh ini, ketiga tautan menggunakan accumulator. Jika recall_1 mengembalikan kurang dari 125 item, PAI-Rec mengambil lebih banyak item dari recall_2 hingga total gabungan mencapai 250.
Parameter AdjustCountConfs:
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
RecallName | string | Ya | Nama tautan recall. |
Count | int | Ya | Jumlah maksimum item yang dipilih dari tautan recall ini. |
Type | string | Tidak | Strategi alokasi. Nilai yang valid: accumulator dan fix. |
ItemStateFilter
Gunakan filter ini jika item memiliki bidang status waktu nyata (seperti ketersediaan atau status tinjauan) yang disimpan di tabel terpisah, dan Anda ingin mengecualikan item yang tidak memenuhi kondisi tertentu.
Alih-alih menghapus item dari katalog—yang akan menghilangkan riwayat interaksinya dan memengaruhi kualitas rekomendasi—atur statusnya untuk menunjukkan ketidaktersediaan, lalu keluarkan item tersebut menggunakan filter ini.
"FilterConfs": [
{
"Name": "ItemStateFilter",
"FilterType": "ItemStateFilter",
"ItemStateDaoConf": {
"AdapterType": "hologres",
"HologresName": "",
"HologresTableName": "",
"ItemFieldName": "",
"WhereClause": "",
"SelectFields": ""
},
"FilterParams": []
}
]Parameter ItemStateDaoConf:
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
AdapterType | string | Ya | Jenis sumber data. Nilai yang valid: hologres, mysql, dan tablestore. |
HologresName | string | Ya | Nama sumber data Hologres yang didefinisikan di HologresConfs. Contoh: holo_info. |
HologresTableName | string | Ya | Nama tabel yang menyimpan status item di Hologres. |
ItemFieldName | string | Ya | Kolom kunci primer dari tabel status item. |
WhereClause | string | Tidak | Ekspresi kondisional SQL yang diterapkan pada permintaan kueri. |
SelectFields | string | Ya | Kolom yang diambil dari tabel status item. |
Parameter FilterParams:
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
Name | string | Ya | Nama bidang yang akan dievaluasi. |
Domain | string | Tidak | Entitas tempat bidang tersebut berada. Nilai yang valid: user dan item. |
Operator | string | Ya | Operator perbandingan. Nilai yang valid: equal, not_equal, in, greater, greaterThan, less, dan lessThan. |
Type | string | Ya | Tipe data bidang tersebut. |
Value | object | Ya | Nilai yang dibandingkan. |
Contoh FilterParams berikut hanya melewatkan item yang terlihat publik (publicStatus = 0), aktif (state = 1), telah disetujui (checkStatus != 2), dan tidak dikecualikan dari rekomendasi (norec != 1):
"FilterParams": [
{ "Name": "publicStatus", "Type": "int", "Operator": "equal", "Value": 0 },
{ "Name": "state", "Type": "int", "Operator": "equal", "Value": 1 },
{ "Name": "checkStatus", "Type": "int", "Operator": "not_equal", "Value": 2 },
{ "Name": "norec", "Type": "int", "Operator": "not_equal", "Value": 1 }
]WhereClause dan FilterParams memiliki tujuan berbeda dan dapat digunakan bersamaan. WhereClause diterapkan sebagai kondisi SQL dalam kueri database—mengurangi jumlah baris yang diambil dari tabel status item. FilterParams diterapkan setelah kueri mengembalikan hasil—menyaring set hasil di memori. Gunakan WhereClause untuk kondisi kolom yang diindeks guna meningkatkan performa kueri, dan FilterParams untuk penyaringan tingkat bidang pasca-kueri.
Untuk contoh operator, lihat Lampiran.
CompletelyFairFilter
Gunakan filter ini untuk memilih item dari setiap tautan recall secara proporsional terhadap skornya, sehingga tidak ada satu tautan pun yang mendominasi set hasil akhir.
"FilterConfs": [
{
"Name": "CompletelyFairFilter",
"FilterType": "CompletelyFairFilter",
"RetainNum": 500
}
]DimensionFieldUniqueFilter
Gunakan filter ini untuk menghapus item yang memiliki nilai yang sama pada bidang tertentu. Berbeda dengan UniqueFilter yang menghapus duplikat berdasarkan ID item, DimensionFieldUniqueFilter menghapus duplikat berdasarkan nilai bidang—misalnya, untuk menghindari merekomendasikan beberapa item dari merek atau kategori yang sama.
"FilterConfs": [
{
"Name": "DimensionFieldUniqueFilter",
"FilterType": "DimensionFieldUniqueFilter",
"Dimension": ""
}
]UniqueFilter
UniqueFilter menghapus duplikat berdasarkan ID item di seluruh tautan recall. Jika ID item yang sama muncul di beberapa tautan recall, hanya kemunculan pertama yang dipertahankan.
UniqueFilter tidak memerlukan entri di FilterConfs. Referensikan langsung berdasarkan nama di FilterNames.
Terapkan filter ke skenario
Setelah mendefinisikan filter di FilterConfs, tetapkan ke skenario menggunakan FilterNames. FilterNames adalah peta di mana setiap kunci merupakan nama skenario dan setiap nilai adalah daftar nama filter yang akan diterapkan.
"FilterNames": {
"default": [
"UniqueFilter"
]
}default: Skenario fallback yang digunakan ketika tidak ada skenario lain yang cocok dengan permintaan.UniqueFilter: Nilai dari bidangNamepada entriFilterConfs, atauUniqueFiltersecara langsung jika menggunakan filter deduplikasi bawaan.
Beberapa filter dapat dicantumkan untuk satu skenario dan diterapkan secara berurutan:
"FilterNames": {
"default": [
"UniqueFilter",
"holo_exposure_filter",
"adjust_count_filter"
]
}Lampiran
Referensi operator
Semua operator berikut digunakan dalam FilterParams.
equal — mencocokkan nilai persis:
{ "Name": "publicStatus", "Type": "int", "Operator": "equal", "Value": 0 }not_equal — mengecualikan nilai persis:
{ "Name": "checkStatus", "Type": "int", "Operator": "not_equal", "Value": 2 }greater — lebih besar dari nilai yang ditentukan:
{ "Name": "checkStatus", "Type": "int", "Operator": "greater", "Value": 2 }greaterThan — lebih besar dari atau sama dengan nilai yang ditentukan:
{ "Name": "checkStatus", "Type": "int", "Operator": "greaterThan", "Value": 2 }less — kurang dari nilai yang ditentukan:
{ "Name": "checkStatus", "Type": "int", "Operator": "less", "Value": 2 }lessThan — kurang dari atau sama dengan nilai yang ditentukan:
{ "Name": "checkStatus", "Type": "int", "Operator": "lessThan", "Value": 2 }in — mencocokkan salah satu nilai dalam array (mendukung int dan string):
{ "Name": "state", "Type": "int", "Operator": "in", "Value": [2, 4, 6] }{ "Name": "state", "Type": "string", "Operator": "in", "Value": ["success", "ok"] }