RAG của bạn đang nghe nhạc mono

RAG của bạn đang nghe nhạc mono

Hầu hết pipeline RAG chỉ dùng một vector cho mỗi tài liệu — như nghe nhạc một bên tai. Multi-vector search mở ra chiều sâu mới.

Một vector, một hy vọng — rồi lệch target

Bạn ơi, mình hỏi thật: pipeline RAG của team bạn đang dùng bao nhiêu vector cho mỗi tài liệu? Nếu câu trả lời là "một" — chào mừng bạn đến câu lạc bộ đông nhất ngành. Một tài liệu, một embedding, một similarity score. Chấm hết.

Cách này giống nghe nhạc mono vậy — vẫn có giai điệu, vẫn nghe được lời hát. Nhưng bạn mất toàn bộ chiều không gian, mất sự tách bạch giữa guitar và trống, mất cái depth mà bản phối gốc cố tình tạo ra. Search một vector cũng thế: nó "nghe" được đại ý tài liệu, nhưng bỏ qua những chi tiết token-level mà đôi khi chính là thứ bạn đang tìm.

Multi-vector search là bật stereo lên. Và khi bật rồi, bạn sẽ ngạc nhiên vì những thứ pipeline cũ đã bỏ lỡ.

Câu chuyện phức tạp hơn tưởng

Với single-vector, toàn bộ tài liệu — dù dài hàng nghìn từ — được nén vào MỘT vector duy nhất. Dịch sang tiếng người: bạn đang bắt AI đọc cả cuốn sách rồi ghi nhớ bằng MỘT con số, sau đó dùng con số đó so với câu hỏi.

Multi-vector thì mỗi token (hoặc mỗi patch trong ảnh) có vector riêng. Khi search, hệ thống so sánh từng token trong query với từng token trong tài liệu — gọi là late interaction. Model tiêu biểu nhất cho hướng này là ColBERT, và biến thể ColPali dành cho tài liệu có hình ảnh.

Hình dung thế này: bạn là giảng viên chấm luận văn. Single-vector là lướt qua rồi cho điểm cảm tính. Multi-vector là chấm từng chương, từng luận điểm, rồi tổng hợp — chính xác hơn hẳn, nhưng tốn thời gian hơn.

Qdrant — vector database open-source viết bằng Rust — vừa ra khóa học miễn phí về multi-vector search, lần đầu hệ thống hóa cách triển khai late interaction trong production. Cùng lúc đó, Google ra mắt Gemini Embedding 2 — model embedding multimodal đầu tiên xử lý được text, ảnh, video trong cùng một không gian vector. Qdrant hỗ trợ từ ngày đầu.

Khi nào mono thật sự không đủ?

Không phải lúc nào bạn cũng cần multi-vector. Nhưng hai kịch bản sau sẽ khiến single-vector bó tay:

Kịch bản 1 — Wiki nội bộ "nói gì cũng ra bài tổng quan":
Giả sử team bạn 8 người, có khoảng 2.000 trang wiki — API docs, runbook, post-mortem, meeting notes. Ai đó search "cách xử lý khi Redis cluster bị split-brain". Single-vector trả về bài tổng quan Redis, không phải cái runbook có bước xử lý cụ thể. Tại sao? Vì vector tổng của hai bài quá giống nhau khi nhìn từ "xa". Multi-vector so sánh ở cấp token — "split-brain" + "xử lý" match chính xác hơn với runbook chứa đúng ngữ cảnh đó.

Như mình đã chia sẻ trong các bài trước về RAG, tìm đúng thông tin quan trọng không kém việc có model giỏi.

Kịch bản 2 — E-commerce muốn search bằng ảnh + text:
Một startup thời trang muốn khách upload ảnh rồi hỏi "có cái tương tự nhưng tay dài không?". Với pipeline cũ, bạn cần một model embed text, một model embed ảnh, rồi viết logic thủ công cân bằng kết quả. Với Gemini Embedding 2, một model duy nhất xử lý cả hai modality trong cùng không gian — giảm đáng kể độ phức tạp pipeline.

30 phút setup — bắt tay vào thôi

Qdrant là open-source, chạy local bằng Docker trong vài phút:

docker pull qdrant/qdrant
docker run -p 6333:6333 qdrant/qdrant

Bước 1: Cài Python client:

pip install qdrant-client

Bước 2: Tạo collection với named vectors — đây là cách Qdrant hỗ trợ multi-vector:

from qdrant_client import QdrantClient
from qdrant_client.models import VectorParams, Distance

client = QdrantClient("localhost", port=6333)
client.create_collection(
    collection_name="docs",
    vectors_config={
        "title": VectorParams(size=768, distance=Distance.COSINE),
        "content": VectorParams(size=768, distance=Distance.COSINE),
    }
)

Bước 3: Index vài chục tài liệu test, search thử, so sánh kết quả với pipeline single-vector hiện tại.

Bước 4: Đăng ký khóa multi-vector search miễn phí của Qdrant — đi từ lý thuyết late interaction đến triển khai end-to-end, hoàn thành có chứng chỉ.

Bốn bước, chưa tới nửa tiếng cho bước chân đầu tiên.

Cái bẫy mà mình suýt rơi vào

Chuyện thật: lần đầu thử multi-vector, mình hào hứng convert TOÀN BỘ pipeline sang ColBERT. Kết quả? Storage phình lên gấp nhiều lần — thay vì 1 vector mỗi document, giờ có hàng trăm. Latency cũng tăng rõ rệt. Pipeline nhanh nhẹn bỗng thành ông cụ đi bộ.

Bài học nằm ở chữ hybrid: dùng single-vector cho first-stage retrieval (lọc thô top N kết quả), rồi multi-vector cho re-ranking. Cách này giữ tốc độ mà vẫn tăng precision ở bước quyết định.

Một bẫy nữa mà dân mới hay mắc: tưởng multi-vector thay được việc làm sạch data. Bạn có bao nhiêu vector đi nữa, garbage in vẫn garbage out. Đừng skip bước chunking và cleaning.

Tín hiệu từ bức tranh lớn

Qdrant vừa raise 50 triệu USD Series B — đặt cược vào "composable vector search", ý tưởng rằng bạn cần lắp ghép nhiều kiểu search (single-vector, multi-vector, sparse, hybrid) thay vì cố ép mọi thứ vào một pipeline cứng. Cùng thời điểm, Meta ra SAM 3.1 cho video tracking real-time với object multiplexing, Ollama thêm subagent cho Claude Code — tất cả chỉ cùng một hướng: AI đang dịch chuyển từ "một thành phần làm tất cả" sang "nhiều module chuyên biệt phối hợp".

Pipeline search cũng vậy. Thời kỳ "một embedding model, một vector, done" đang nhường chỗ cho kiến trúc mà mỗi tầng retrieval được tối ưu riêng.

Nếu RAG của bạn đang chạy ổn với single-vector — tuyệt, đừng sửa cái đang không hỏng. Nhưng khi bạn thấy kết quả search "gần đúng mà vẫn trật", đó là lúc bật stereo.

Spoiler: không có silver bullet — nhưng multi-vector là nốt nhạc bạn nên có trong tay trước khi buổi diễn bắt đầu.

---

Bụi Wire — nghiện đọc release notes lúc 2 giờ sáng

Nguồn tham khảo