# Context Window: Chiến lược quản lý bộ nhớ AI

> **Tóm tắt:** Mỗi lần gọi LLM, bạn chỉ có giới hạn ~128K-200K tokens. Nếu nhét quá nhiều → tốn tiền, chậm, AI quên. Nếu nhét quá ít → AI mất ngữ cảnh, trả lời sai. Tài liệu này phân tích chiến lược tối ưu context window cho Canifa Chatbot.

---

## 1. Vấn đề: Context Budget

### 1.1. Token = Tiền

| Model | Context window | Cost per 1M input tokens | 10K tokens/request × 1000 requests/ngày |
|-------|---------------|------------------------|--------------------------------------|
| GPT-4o | 128K | $2.50 | $25/ngày |
| Claude 3.5 Sonnet | 200K | $3.00 | $30/ngày |
| Gemini 2.0 Flash | 1M | $0.10 | $1/ngày |

**Insight:** Giảm 50% token per request = giảm 50% chi phí. Với 1000 request/ngày, đây là khác biệt $15/ngày = **$450/tháng**.

### 1.2. Context Rot — Khi AI "quên"

Nghiên cứu **"Lost in the Middle"** (Stanford, 2023) chỉ ra:

| Vị trí thông tin trong prompt | Khả năng AI nhớ |
|------------------------------|----------------|
| **Đầu prompt** (first 20%) | 95% recall |
| **Giữa prompt** (middle 40-60%) | 42% recall |
| **Cuối prompt** (last 20%) | 87% recall |

→ Thông tin quan trọng nhất phải nằm ở **đầu hoặc cuối** prompt.

---

## 2. Chiến lược của Canifa

### 2.1. Phân tầng thông tin

Canifa chia context thành 4 tầng, ưu tiên từ cao xuống thấp:

| Tầng | Nội dung | Kích thước | Vị trí trong prompt |
|------|---------|-----------|-------------------|
| **T1: System** | System prompt + rules + persona | ~2K tokens (cố định) | ĐẦU (always) |
| **T2: Tool Results** | Data thật từ search/DB | ~1-3K tokens (dynamic) | GIỮA-CUỐI |
| **T3: InsightJSON** | Profile khách (nếu có) | ~500 tokens | GIỮA |
| **T4: Chat History** | Lịch sử hội thoại | ~1-5K tokens (growing) | GIỮA |

**Tổng budget:** Target ~5-8K tokens/request (tối ưu cost + quality).

### 2.2. Kỹ thuật nén từng tầng

#### T1: System Prompt Compression

| Kỹ thuật | Trước | Sau | Tiết kiệm |
|----------|-------|-----|----------|
| Remove redundant examples | 3K tokens | 2K tokens | 33% |
| Structured rules (bảng) thay vì prose | 2.5K | 1.8K | 28% |
| Conditional injection (chỉ inject rule liên quan) | 2K | 1.2K | 40% |

#### T2: Tool Results — 16-field Compression

Product Search Engine chỉ trả về **16 trường cốt lõi** thay vì 50+ trường raw từ StarRocks:

```python
# Data already compressed (only 16 core fields)
# — no need to filter here
CORE_FIELDS = [
    "product_id", "name", "price", "sale_price",
    "material", "category", "color", "size_available",
    "image_url", "stock_status", "description_cut",
    "rating", "sold_count", "brand", "gender", "season"
]
```

Kết quả multi-product mode: **Truncate long strings** >200 chars để giữ ngắn.

#### T3: InsightJSON — Structured Profile

Thay vì lưu toàn bộ chat history, InsightJSON tóm tắt khách hàng thành ~500 tokens:

```json
{
  "ten": "Anh Minh",
  "gioi_tinh": "nam",
  "do_tuoi": "30-35",
  "style": "smart casual",
  "size": "L",
  "mua_gan_nhat": ["áo polo", "quần kaki"],
  "budget": "300-500k",
  "ghi_chu": "Thích màu trung tính, dị ứng len"
}
```

#### T4: Chat History — Sliding Window

| Chiến lược | Mô tả | Khi nào dùng |
|-----------|-------|-------------|
| **Last-N** | Giữ 10 tin nhắn gần nhất | Conversation đơn giản |
| **Summarize-and-trim** | Tóm tắt lịch sử cũ thành 1 đoạn ngắn | Conversation dài >20 tin |
| **Key-turn extraction** | Chỉ giữ các turn có thông tin quan trọng | Conversation phức tạp |

---

## 3. Token Budget Management

### 3.1. Budget Allocation

```
Total Budget: 8,000 tokens (target)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

[System Prompt]     2,000 tokens  (25%)  — cố định
[InsightJSON]         500 tokens  ( 6%)  — nếu có
[Tool Results]      3,000 tokens  (38%)  — dynamic
[Chat History]      2,000 tokens  (25%)  — sliding window
[Buffer]              500 tokens  ( 6%)  — dự phòng
```

### 3.2. Dynamic Adjustment

| Tình huống | Điều chỉnh |
|-----------|-----------|
| Tool trả về nhiều SP (>5) | Truncate descriptions, chỉ giữ name + price + size |
| Chat history dài (>15 turns) | Summarize turns 1-10, giữ nguyên 11-15 |
| Khách mới (no InsightJSON) | Dùng budget thừa cho Tool Results |
| Khách VIP (InsightJSON đầy) | Giảm chat history, ưu tiên profile |

---

## 4. Kỹ thuật nâng cao

### 4.1. Semantic Caching

Cache kết quả search để tránh gọi Tool lặp:

| Query | Cache key | TTL |
|-------|----------|-----|
| "áo polo nam size L" | `product_search:polo_nam_L` | 5 phút |
| "store Hà Nội" | `store_search:hanoi` | 30 phút |
| "khuyến mãi tháng 5" | `promotion:2025-05` | 1 giờ |

### 4.2. Early Exit

Classifier phân loại xong → nếu là FAQ đơn giản → **không cần gọi Tool** → tiết kiệm ~3K tokens:

```
Khách: "Canifa có ship COD không?"
  → Classifier: FAQ
  → Response từ RAG (không cần Product Search)
  → Token used: ~3K thay vì ~8K
```

---

## 5. Monitoring & Optimization

| Metric | Target | Cách đo |
|--------|--------|--------|
| **Avg tokens/request** | < 8K | Langfuse tracing |
| **Cost/conversation** | < $0.05 | Token × price |
| **Response quality** | > 4.0/5 | User feedback |
| **Latency (TTFB)** | < 2s | Server logs |

---

## References

- Liu et al. (2023) — *"Lost in the Middle: How Language Models Use Long Contexts"* (Stanford)
- OpenAI (2024) — *"Best practices for prompt engineering"*
- Canifa Engineering — `product_search_engine.py` (16-field compression)
- Canifa Engineering — `summarize_results()` (auto-summarization)
