Trust Score
Hai phiên bản đặc tả không thay thế nhau — dùng tab V1 / V2 để đối chiếu. Routing band ≥80 / 50–79 / <50 giống nhau; khác về công thức listing, hard block, và V2 bổ sung Broker Trust Score + audit log.
Để AI tính Trust Score (0–100) cho tin đăng cào về, số hóa nhận định cảm tính thành Ma trận trọng số lập trình được. Chuẩn Data Sạch (BR-DAT-02) — pipeline 4 bước.
flowchart TD
A[Tin đăng cào về] --> B{Bước 1: Hard block?}
B -->|Có| Z[Trust Score = 0 → Data Lake]
B -->|Không| C[Bước 2: Baseline score]
C --> D[Bước 3: Bonus & Penalty]
D --> E[Chốt điểm 0–100]
E --> F{Bước 4: Routing}
F -->|≥ 80| G[VIP Auction / HUB]
F -->|50–79| H[Data Marketplace]
F -->|< 50| I[REJECTED / Cold Storage]Bước 1: Lọc thô (Hard block) — trước khi tính điểm
Trước khi đưa vào hàm tính điểm, dữ liệu qua cửa hải quan. Vi phạm → Trust Score = 0, Data Lake, không chạy AI thêm:
- Thiếu dữ liệu cốt lõi: không bóc tách được
pricehoặcarea. - Trùng lặp 100% (spam): pHash + SĐT trùng tin đã Blacklist.
Ma trận trọng số (Weighted Scoring Matrix)
4 chỉ số thành phần, tối đa 100:
Total_Trust_Score = (Trust_Score × 0.3) + (Content_Score × 0.2) + (AVM_Delta_Score × 0.4) + (Geo_Score × 0.1)Bước 2: Baseline — 6 tiêu chí (100 điểm)
| # | Tiêu chí | Trọng số | Logic chấm điểm (If/Else) |
|---|---|---|---|
| 1 | Tính xác thực vật lý | 25 điểm | +25đ: GPS chuẩn hoặc EXIF. +15đ: không GPS, đường/hẻm + ảnh thường. +0đ: không địa chỉ + ảnh 3D/render. |
| 2 | Minh bạch pháp lý | 25 điểm | +25đ: ảnh Sổ hồng, OCR khớp 100%. +10đ: “Vi bằng / Sổ chung”. +0đ: mập mờ / “Khác”. |
| 3 | Định giá AVM Delta | 20 điểm | +20đ: chênh < 10% median. +10đ: 10%–25%. +0đ: > 30% (không giải thích “ngộp”, “nợ”). |
| 4 | Tính duy nhất | 15 điểm | +15đ: căn mới lần đầu Opco. +5đ: trùng nhà, khác người đăng (Master Record). |
| 5 | Cấu trúc dữ liệu | 10 điểm | +10đ: đủ Hướng, Diện tích, Tầng, Hẻm. +5đ: thiếu thứ cấp. +0đ: NLP không bóc được. |
| 6 | Độ tươi mới | 5 điểm | +5đ: trong 7 ngày. +0đ: quá 30 ngày (ghost listing). |
Bước 3: Bonus & Penalty
| Loại | Điều kiện | Điểm |
|---|---|---|
| Bonus | Chính chủ: SĐT mới hoặc < 2 tin / 90 ngày | +15 |
| Bonus | Video / VR360 thực tế | +10 |
| Penalty | Môi giới: SĐT > 5 tin/tháng, “Hoa hồng MG”, … | −15 |
| Penalty | Ảnh rác, watermark Chotot/Batdongsan | −20 |
| Penalty | Clickbait (> 3 từ mồi) không khớp AVM | −10 |
Điểm cuối: min 0, max 100.
Bước 4: Routing
≥ 80 — VVIP / Kèo sập hầm
- Khóa, không đẩy Data Pool chung.
- Push → Đấu giá VIP 5 phút (BR-OUT-04).
- UC-L06: Pháp lý viên HUB thực địa.
50–79 — Public stock
- Data Marketplace (UC-A06); masking SĐT; mở khóa V-Credits.
< 50 — Spam / Fake
- REJECTED → Cold Storage; không hiển thị UI.
Mã giả (Python) — V1
def calculate_final_trust_score(listing_data): baseline_score = 0 baseline_score += eval_legal(listing_data) # Max 25 baseline_score += eval_physical(listing_data) # Max 25 baseline_score += eval_avm_delta(listing_data) # Max 20 baseline_score += eval_uniqueness(listing_data) # Max 15 baseline_score += eval_structure(listing_data) # Max 10 baseline_score += eval_freshness(listing_data) # Max 5
adjuster = 0 if is_owner_likelihood(listing_data["phone"]): adjuster += 15 if has_video_tour(listing_data): adjuster += 10 if is_broker_spam(listing_data["phone"]): adjuster -= 15 if has_trash_images(listing_data): adjuster -= 20 if has_clickbait_keywords(listing_data): adjuster -= 10
final_score = max(0, min(100, baseline_score + adjuster))
if final_score >= 80: return "VIP_AUCTION_HUB" elif 50 <= final_score <= 79: return "DATA_MARKETPLACE" else: return "TRASH"| Mã / UC | Vai trò |
|---|---|
| BR-DAT-02 | Data Sạch, routing theo band |
| BR-OUT-04 | Đấu giá VIP 5 phút |
| UC-L06 | HUB thực địa |
| UC-A06 | Data Marketplace |
Feature liên quan
flowchart TB
subgraph L[Phần 1 — Listing Trust Score]
L1[Tính 1 lần khi cào / đổi giá]
L2[4 biến → 0–100]
L3{Routing}
end
subgraph B[Phần 2 — Broker Trust Score]
B1[Base 50 sau eKYC]
B2[Event +/- điểm]
B3{Punishment}
end
L --> BListing Trust Score
Tính một lần khi bot cào tin hoặc có biến động giá. Quyết định phân khúc trên chợ dữ liệu.
1.1. Công thức (Total max = 100)
| Biến số | Tối đa | Input | Logic cộng điểm |
|---|---|---|---|
| 1. Độc quyền & minh bạch | 30đ | SĐT + pHash ảnh | +30: chính chủ (SĐT ≤ 2 tin BĐS ever) + ảnh duy nhất. +15: môi giới (> 5 tin/tháng) nhưng lần đầu thấy căn này. +0: copy pHash 100%, SĐT spam. |
| 2. AVM Delta (ngộp) | 40đ | Giá rao / Giá AVM (%) | +40: rẻ hơn AVM ≥ 15% (Δ ≤ −15%). +20: rẻ 1–14%. +10: bằng AVM. +0: cao hơn AVM. |
| 3. Chất lượng dữ liệu thô | 20đ | Metadata + Vision | +10: ảnh thực tế trong nhà (không watermark web, không 3D). +10: đủ Lat/Lng, diện tích, tầng, hẻm/mặt tiền. |
| 4. Độ tươi mới | 10đ | Timestamp | +10: ≤ 48h. +5: 3–7 ngày. +0: > 7 ngày. |
1.2. Routing (sau Total_Score)
| Band | Nhãn | Hành động |
|---|---|---|
| ≥ 80 | VIP / FLASH DEAL | Không ra kho chung. WebSocket/Push → đồng hồ 5 phút đấu giá ngược (Dutch Auction) cho Broker nạp nhiều. |
| 50–79 | PUBLIC STOCK | Chợ đại trà; search bình thường; xem SĐT tốn V-Credits cơ bản. |
| < 50 | REJECTED | Ẩn tự động; Cold Storage only — data sạch 100% trên App. |
Broker Trust Score (động)
Điểm User/Broker tăng/giảm theo hành vi trên nền tảng (V1 không mô tả phần này).
2.1. Khởi tạo
Sau đăng ký + eKYC thành công: broker_trust_score = **50** (mặc định).
2.2. Event-driven scoring
Webhook / Event Listener — ví dụ:
| Loại | Hành vi | Điểm |
|---|---|---|
| Thưởng | Nạp V-Credits ≥ 1.000.000 VNĐ | +5 |
| Thưởng | Feedback tử tế sau mở khóa tin (VD: “hẻm cụt”) | +2 |
| Thưởng | Đăng nhập 7 ngày liên tiếp | +1 |
| Phạt | Bỏ qua Feedback tin VIP đã mua > 48h | −5 |
| Phạt | Report tin ảo sai (Admin xác nhận láo) | −15 |
| Phạt | Tool/script: API Search > 50 lần/phút | −30 |
Tối đa 100đ.
2.3. Punishment rules
| Band | Chế tài |
|---|---|
| ≥ 80 | Elite Broker: giảm 10% phí V-Credits; Flash Deal sớm hơn 10 giây. |
| 30–79 | Standard: hoạt động bình thường. |
| < 30 | Banned/Frozen: user_status = FROZEN; cấm search/mua tin; khóa V-Credits; liên hệ Admin. |
Triển khai Backend (MVP 1.0)
Audit trail (bắt buộc)
Không chỉ ghi đè điểm — lưu lịch sử cộng/trừ khi Broker khiếu nại.
Yêu cầu dữ liệu:
- Cột
trust_scoretrênusers(mặc định 50). - Bảng log:
user_id,score_change(±),reason,created_at.
Pseudo-code Listing — V2
def calculate_listing_trust_score(listing_data, avm_price): score = 0
# 1. Authenticity (30đ) if is_owner_phone(listing_data.phone) and is_unique_phash(listing_data.images): score += 30 elif is_first_time_seen(listing_data): score += 15
# 2. AVM Delta (40đ) delta_percent = (listing_data.price - avm_price) / avm_price * 100 if delta_percent <= -15: score += 40 elif -14 <= delta_percent <= 0: score += 20 elif 0 < delta_percent <= 5: score += 10
# 3. Data quality (20đ) if has_real_indoor_photos(listing_data.images): score += 10 if has_full_attributes(listing_data): score += 10
# 4. Freshness (10đ) hours_since_post = get_hours_diff(listing_data.posted_at) if hours_since_post <= 48: score += 10 elif hours_since_post <= 168: score += 5
return min(score, 100)So sánh nhanh V1 ↔ V2 (Listing)
| Khía cạnh | V1 | V2 |
|---|---|---|
| Hard block trước tính | Có (price/area, blacklist) | Không (0đ trong ma trận) |
| Công thức | 6 tiêu chí + weighted sub-scores + adjusters | 4 biến cộng trực tiếp (30+40+20+10) |
| AVM | Max 20đ, ngưỡng 10%/25%/30% | Max 40đ, ngộp ≥15% |
| Pháp lý / GPS | Có (25+25đ) | Gộp vào chất lượng ảnh + attributes |
| Broker score | Không | Có (event + FROZEN < 30) |
| VIP action | BR-OUT-04, UC-L06 | Dutch Auction 5 phút + WS |
Feature / đặc tả liên quan
- user-upgrade-to-broker — eKYC, base score 50
- wallet-topup-create — thưởng nạp V-Credits
- masking-unlock — PUBLIC STOCK
- admin-user-ban-unban — FROZEN / mở khóa
- CRUD User (AI) — Trust Score trên hồ sơ động