# Ranking Algorithm

# Ranking Config Tool

## 1\. Introduction

Ranking quyết định người dùng thấy bài nào khi mở feed. Yêu cầu đặt lên ranking ngày càng nhiều: feed phải nhanh và ổn định, team muốn backtest và chạy experiment liên tục, dữ liệu đến từ nhiều nguồn và cập nhật liên tục, mỗi use case lại cần một cách tính riêng.

Từ đó chúng tôi chọn một cách tiếp cận mới cho Ranking: xem nó như một nền tảng để thử nghiệm, nơi mỗi ý tưởng có thể được đưa vào, đo lường và điều chỉnh liên tục.

## 2\. Approach và Iteration

Mọi thay đổi chia làm 2 cấp:

- **Approach:** một cách tính ranking riêng, có thể là một model hay một bộ factor khác hẳn. Các approach được đặt cạnh nhau để so sánh qua A/B testing.
- **Iteration:** một lần điều chỉnh tham số bên trong approach đó. Ví dụ cùng một approach ưu tiên tương tác, iteration 1 tăng trọng số cho bài mới đăng, iteration 2 giữ nguyên trọng số đó nhưng hạ điểm bài chất lượng thấp.

```plaintext
                  A/B Testing
                       │
           ┌───────────┴───────────┐
           ▼                       ▼
      Approach A              Approach B
           │                       │
     ┌─────┴─────┐           ┌─────┴─────┐
     ┆           │           ┆           │
     ▼           ▼           ▼           ▼
Iteration 1 Iteration 2 Iteration 3 Iteration 4

┆  iteration không giữ lại
```

A/B testing chia user thành các nhóm, mỗi nhóm chạy một approach để so sánh với nhau. Trong mỗi approach thử nhiều iteration, cái nào tốt thì giữ, không tốt thì bỏ. Một ý tưởng đi từ backtest, qua experiment, lên production theo cùng một quy trình.

## 3\. Kiến trúc

```plaintext
Client ──▶ API Layer ──▶ Cache Layer ──▶ Calculation Layer ──▶ Storage
```

- **API Layer:** chỗ client gọi vào lấy kết quả ranking.
- **Cache Layer:** giúp API trả kết quả nhanh trong lúc hydration và filtering.
- **Calculation Layer:** tính ranking dựa trên các signal lưu trong storage.

## 4\. Ranking Orchestration

```plaintext
Strategic Operations ──┐
Granular Operations  ──┤
                       ▼
Real-time Inputs ──▶ Algorithmic Ranking ──▶ Results
```

Orchestration là nền tảng cấu hình để chạy các iteration, gồm:

- **Algorithmic Ranking:** các model dạng plug-and-play, cắm vào để backtest, experiment hay đưa lên production.
- **Ranking Operations:** bộ công cụ để onboard factor mới và chỉnh thuật toán cho đúng yêu cầu.

Operations có 2 loại:

- **Strategic operations:** các cân đối lớn về business và growth, như tỷ lệ giữa bài của user, của official account và review, hay ưu tiên giữa quality, interaction và relevance.
- **Granular operations:** cấu hình cho từng use case cụ thể, mỗi task xử lý một use case có cấu hình riêng.

## 5\. Ranking Calculation

```plaintext
Signals
   │
   ├──▶ Factor Model 1 ──┐
   ├──▶ Factor Model 2 ──┤
   │    ...              │
   └──▶ Factor Model n ──┤
                         ▼
               Offline Optimization
                         │
                         ▼
                Online Calculation
                         │
                         ▼
               Strategic Operations
                         │
                         ▼
                      Results
```

Factor model tổng hợp các signal thành các factor, có thể ranking hoặc filtering luôn trước khi đưa vào tính toán. Bước tính toán chạy từng bước một, strategic operations được áp cuối cùng để cân đối kết quả theo các trade-off về business và growth.

## 6\. Data model

Có 4 thành phần chính:

- **Factor:** mô tả một signal và function type dùng để tính điểm, như boolean, linear, threshold hay percentile.
- **Factor instance:** một factor được cấu hình cụ thể trong một iteration. Cùng một factor nhưng mỗi iteration có thể dùng tham số khác nhau.
- **Iteration:** cấu hình để chạy một iteration cho backtesting, experiment hay rollout lên production. Iteration gồm các factor instance, với static configuration cho strategic operations và dynamic configuration cho từng factor instance.
- **Deployment:** gắn một iteration vào một ranking task.

Deployment có 2 loại:

- **Global:** áp dụng cho toàn bộ task.
- **Partial:** áp dụng cho một phạm vi hẹp, đi kèm một bộ lọc. Partial ưu tiên hơn global, nếu có nhiều partial cùng khớp thì lấy cái mới nhất.

Partial dùng khi muốn áp dụng một iteration cho một số sản phẩm hay một số group trước, sau đó mới apply global.

Vì hàm và tham số nằm trong cấu hình nên đổi một ngưỡng hay một hệ số chỉ là sửa dữ liệu.

## 7\. Luồng chạy

- **Write config:** người vận hành chỉnh factor, iteration, deployment qua configuration website, cấu hình được lưu xuống storage.
- **Load config:** một cron job định kỳ đọc config và build sẵn deployment theo từng task trong memory. Request không cần đọc config từ storage, config mới có hiệu lực sau lần load tiếp theo mà không cần redeploy.
- **Serve request:**
  1. Request vào API, xác định user thuộc nhánh A/B nào.
  2. Task tương ứng chọn deployment: có partial khớp thì dùng partial, không thì dùng global.
  3. Lấy iteration và các factor instance của nó.
  4. Lấy giá trị signal cá nhân hóa của user, đưa qua các hàm trong cấu hình để ra điểm.
  5. Áp strategic operations, trả kết quả và cache lại.

## 8\. Future work: thêm topic vào các stage

Hiện tại ranking đoán user thích gì qua hành vi. Bước tiếp theo là để user tự nói: quan tâm cái này, không muốn thấy cái kia. Muốn mọi stage hiểu chung một ngôn ngữ thì cần topic.

### Gán topic cho bài

Mỗi bài được gán vào một topic dựa trên nội dung. Bộ topic được giữ ổn định theo thời gian, để những gì đã lưu theo topic không bị mất nghĩa. Phía user, sở thích cũng được lưu theo topic, từ cả hành vi lẫn những gì user tự chọn.

### Từng stage

```plaintext
Retrieval            ◀┄┄ Lấy bài theo topic quan tâm
    │
    ▼
Early-stage ranking  ◀┄┄ Lọc bài quá giống thứ bị từ chối
    │
    ▼
Late-stage ranking   ◀┄┄ Boost topic mới
    │                ◀┄┄ Hạ điểm bài gần giống
    ▼
Re-ranking           ◀┄┄ Cân bằng giữa các topic
```

- **Retrieval:** thêm một nguồn lấy bài riêng theo các topic user thích hoặc vừa chọn quan tâm, thêm một ít từ các topic gần đó để khám phá. Không có bước này thì sở thích mới không vào được funnel.
- **Early-stage ranking:** lọc sớm những bài quá giống thứ user đã nói không muốn xem, bằng cách so embedding.
- **Late-stage ranking:** boost topic user vừa chọn, giảm dần theo thời gian để sở thích mới có cửa cạnh tranh với sở thích cũ. Bài gần giống thứ bị từ chối thì hạ điểm thay vì bỏ hẳn.
- **Re-ranking:** giữ cân bằng giữa các topic để feed không bị một chủ đề chiếm hết.

### Dùng lại những gì đã có

Phần này không cần dựng một hệ ranking mới. Điểm sở thích theo topic, boost topic mới, hạ điểm bài gần giống đều là factor. Giới hạn tỷ lệ topic là một strategic operation, nằm cùng chỗ với tỷ lệ bài user, official account và review. Vẫn là khai báo factor, gom vào iteration, gắn deployment, đo bằng A/B như mọi thay đổi khác.

Phần mới thực sự chỉ có: gán topic cho bài, nguồn retrieval theo topic, và một chút dữ liệu phía user.

## 9\. Tóm lại

Ranking giờ là cấu hình: factor mô tả signal, hàm biến signal thành điểm, iteration gom lại thành một bộ cấu hình thử được, deployment quyết định nó chạy ở đâu. Approach, iteration và A/B testing đưa một ý tưởng từ backtest lên production theo cùng một cách.

Topic là bước tiếp theo, và nó cắm vào đúng những chỗ đã mở sẵn: thêm factor, thêm strategic operation, thêm một nguồn retrieval.
