RAG (Retrieval-Augmented Generation): trước khi hỏi model, tìm các đoạn tài liệu liên quan nhất rồi đưa vào prompt. Model trả lời dựa trên tài liệu của bạn (runbook, MOP, design doc) thay vì kiến thức chung, và có thể trích nguồn.
Pipeline
flowchart LR D["Runbook / MOP / config"] --> C[Chunking] C --> E1["Embedding (offline)"] E1 --> V[(Vector store)] Q[Câu hỏi] --> E2[Embedding] E2 --> R["Retrieve top-k"] V --> R R --> RR[Rerank] RR --> L["LLM + context"] L --> A["Trả lời + nguồn"]
Thành phần
| Bước | Việc cần quyết định | Gợi ý khởi điểm |
|---|---|---|
| Chunking | Kích thước, overlap, cắt theo cấu trúc | Cắt theo heading Markdown; 300-800 token, overlap 10-15%; giữ tiêu đề cha trong mỗi chunk |
| Metadata | Lọc trước khi tìm | vendor, os, site, doc_type, updated |
| Embedding | Model, số chiều, đa ngôn ngữ | Chọn model hỗ trợ tiếng Việt; dùng cùng model cho index và query |
| Vector store | Nơi lưu và tìm | pgvector (đã có Postgres), Qdrant, Chroma (dev) |
| Retrieval | Dense, keyword (BM25) hay hybrid | Hybrid: tên lệnh, mã lỗi (%BGP-5-ADJCHANGE) cần keyword match |
| Rerank | Sắp lại top-k bằng cross-encoder / LLM | Lấy 20-50, rerank còn 5 |
| Generation | Prompt yêu cầu bám nguồn | "Chỉ trả lời từ tài liệu, không có thì nói không biết, ghi nguồn" |
Chunking cho tài liệu mạng
- Không cắt giữa code block cấu hình: một khối
router bgpbị cắt đôi là vô nghĩa. - Bảng lỗi: mỗi dòng (triệu chứng, nguyên nhân, cách xử lý) có thể là một chunk riêng kèm tiêu đề trang.
- Config thiết bị: thường không nên embed nguyên file; tra trực tiếp bằng tool (grep, Batfish, NetBox) chính xác hơn.
Đánh giá
| Đo gì | Cách |
|---|---|
| Retrieval có tìm đúng đoạn không | Bộ 30-50 câu hỏi thật kèm đoạn đúng, đo recall@k |
| Trả lời có bám nguồn không | Kiểm tra trích dẫn, chấm thủ công hoặc LLM-as-judge |
| Tài liệu cũ | Lọc theo updated, xoá chunk của tài liệu đã thay thế |
Khi nào KHÔNG cần RAG
| Tình huống | Làm thay |
|---|---|
| Tài liệu tổng cộng nhỏ (vài chục trang, vừa context) | Đưa thẳng vào prompt, bật prompt caching |
| Dữ liệu có cấu trúc, cần chính xác (inventory, IPAM, trạng thái BGP) | Tool gọi API/DB (thiết kế tool), không embed |
| Cần số liệu realtime (telemetry, flow) | Tool truy vấn ClickHouse/Prometheus |
| Agent làm việc trong repo (Claude Code) | Để agent tự grep/đọc file; CLAUDE.md cho quy ước |
| Câu hỏi kiến thức chung (BGP là gì) | Model đã biết, RAG chỉ thêm nhiễu |
Bắt đầu đơn giản: một tool search_docs(query) dùng full-text search (ripgrep/Postgres FTS) trên thư mục Markdown thường đã đủ tốt. Chỉ thêm embedding + vector store khi đo được là keyword search bỏ sót.
Khi nào dùng
- Kho runbook/MOP/postmortem lớn, câu hỏi dạng ngôn ngữ tự nhiên, cần trích nguồn.
- Kết hợp với agent: RAG là một tool (
search_runbook) bên cạnh tool đọc thiết bị, thay vì một pipeline cố định. Khái niệm tool/server xem MCP tổng quan.