Vector Database & Embeddings: Mô hình tư duy 'Bản đồ Ngữ nghĩa'
Spotify biết bạn sẽ thích bài hát này như thế nào? Hướng dẫn chuyên sâu về embeddings, cosine similarity và vector database (Pinecone, Weaviate, pgvector).

Spotify gợi ý một bài hát bạn chưa từng nghe và bạn yêu thích ngay lập tức. Netflix hiển thị bộ phim hoàn hảo cho tâm trạng của bạn. Google tìm đúng tài liệu bạn cần dù bạn dùng từ khác.
Tất cả đều được vận hành bởi Embeddings và Vector Databases.
Đây là Hướng dẫn chuyên sâu về hạ tầng vận hành AI hiện đại - từ khái niệm semantic search đến lựa chọn vector DB cho production.
Phần 1: Nền tảng (Mô hình tư duy)
Tìm kiếm truyền thống = Tìm từ chính xác
Tìm kiếm database truyền thống là từ vựng - nó tìm kiếm khớp ký tự chính xác.
SELECT * FROM docs WHERE content LIKE '%hoàn tiền%';
Cái này tìm “hoàn tiền” nhưng bỏ lỡ: “đảm bảo hoàn tiền”, “điều khoản hủy bỏ”, hoặc “cách trả hàng” - tất cả đều có ý nghĩa tương tự.
Embeddings = Bản đồ Ngữ nghĩa
Embedding là bản dịch toán học của ý nghĩa thành tọa độ trong không gian nhiều chiều (thường 768–3072 chiều).
Hãy nghĩ như một tấm bản đồ (đơn giản hóa sang 2 chiều):
"Vật lý Lượng tử"
│
"Machine Learning" ──────┼──── "Neural Networks"
│
"Deep Learning" "Thiên văn học"
│
"Hố Đen"
"Chó" ──── "Mèo" ──── "Chó con"
"Dân chủ" ─ "Bầu cử" ─ "Chính trị"
Những từ/câu tương đồng về ngữ nghĩa thì gần nhau trên bản đồ. Query “tiền lại” sẽ rơi gần “hoàn tiền” - dù các từ khác nhau.
Điểm mấu chốt: Vector DB không tìm kiếm từ. Nó tìm kiếm tọa độ gần nhau trên bản đồ ngữ nghĩa.
Phần 2: Điều tra (Cosine Similarity)
Cách phổ biến nhất để đo “khoảng cách gần” giữa hai vector là cosine similarity - góc giữa chúng.
import numpy as np
def cosine_similarity(a, b):
a, b = np.array(a), np.array(b)
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
print(cosine_similarity(embed("chó"), embed("chó con"))) # ~0.92
print(cosine_similarity(embed("chó"), embed("database"))) # ~0.15
Phần 3: Chẩn đoán (Chọn Vector DB nào?)
| Database | Tốt nhất cho | Tính năng nổi bật |
|---|---|---|
| pgvector | Scale vừa, đã dùng Postgres | Không cần infra thêm. SQL + vector cùng chỗ. |
| Chroma | Prototype, dev local | Dễ nhất để bắt đầu. Chế độ in-memory. |
| Weaviate | Hybrid search (keyword + semantic) | Tích hợp BM25 + vector search. |
| Qdrant | Hiệu năng cao, self-hosted | Nhanh, Rust-based, filter tốt. |
| Pinecone | Managed, serverless, scale lớn | Zero ops. Đắt khi scale. |
| Milvus | Tỷ vector, open source | Open-source scalable nhất. |
Phần 4: Giải pháp (Sách nấu ăn Python)
pgvector (Đơn giản nhất cho Production)
CREATE EXTENSION IF NOT EXISTS vector;
CREATE TABLE documents (
id SERIAL PRIMARY KEY,
content TEXT,
embedding vector(1536)
);
CREATE INDEX ON documents USING hnsw (embedding vector_cosine_ops);
def search(query: str, top_k: int = 5):
q_vec = embed(query)
cur.execute("""
SELECT content, 1 - (embedding <=> %s::vector) AS score
FROM documents
ORDER BY embedding <=> %s::vector
LIMIT %s
""", (q_vec, q_vec, top_k))
return cur.fetchall()
Qdrant (Hiệu năng cao)
from qdrant_client import QdrantClient
from qdrant_client.models import Distance, VectorParams, PointStruct
client = QdrantClient(":memory:")
client.create_collection("docs", vectors_config=VectorParams(size=1536, distance=Distance.COSINE))
client.upsert("docs", points=[
PointStruct(id=i, vector=embed(chunk), payload={"content": chunk})
for i, chunk in enumerate(chunks)
])
results = client.search("docs", query_vector=embed("chính sách hoàn tiền"), limit=5)
Mô hình tư duy chốt hạ
DB truyền thống -> Tìm đúng từ "chó". Bỏ lỡ "cún", "canine", "thú cưng bốn chân".
Vector DB -> Tìm mọi thứ gần khái niệm "chó". Ngữ nghĩa, không phải cú pháp.
Embedding -> Tọa độ GPS của ý nghĩa trên bản đồ ngữ nghĩa.
Cosine Similarity-> Góc giữa hai vector. (0=ngược chiều, 1=giống hệt).
HNSW Index -> Lối đi tắt trên bản đồ nhiều chiều.
pgvector -> Postgres của bạn mọc thêm cánh. Bắt đầu ở đây.
Pinecone -> Có người khác quản lý. Bạn trả tiền.
Qdrant -> Vua hiệu năng cho self-hosted.
Bộ Stack của 2026:
- Embeddings (OpenAI / Sentence Transformers) → chuyển dữ liệu thành vector.
- Vector DB (pgvector / Qdrant) → lưu trữ và tìm kiếm vector.
- LLM (GPT-4o / Claude) → lý luận trên các vector được truy xuất.
Bộ stack này chính là RAG. Giờ bạn biết các mảnh ghép lại với nhau thế nào rồi.
Bài viết liên quan
- System Design
Python Concurrency: Hiểu GIL, Threading và Multiprocessing từ gốc
Hướng dẫn chuyên sâu về Python Concurrency: Hiểu bản chất GIL, phân biệt Threading vs Multiprocessing, tối ưu I/O vs CPU-bound và tư duy kiến trúc backend.
15 phút đọcĐọc tiếp → - System Design
Caching & Redis: Mô hình tư duy 'Tờ giấy nhớ'
Tại sao Redis làm mọi thứ nhanh hơn? Hướng dẫn chuyên sâu về cache invalidation (vấn đề khó nhất CS), các chiến lược eviction, và Redis data types.
7 phút đọcĐọc tiếp → - System Design
Task Queue & Message Broker: Celery, RabbitMQ và Kafka - Phân biệt rõ ràng
Tại sao gửi email làm đứng API? Hướng dẫn chuyên sâu về xử lý bất đồng bộ: từ Celery/Django-Q (hàng đợi tác vụ) đến RabbitMQ (môi giới) và Kafka (luồng sự kiện).
8 phút đọcĐọc tiếp → - System Design
Observability: Logs vs. Metrics vs. Tracing - Mô hình tư duy 'Bộ dụng cụ Bác sĩ'
App chậm. Tại DB? Queue? Mạng? Hướng dẫn chuyên sâu về ba trụ cột observability và cách chúng phối hợp với nhau.
5 phút đọcĐọc tiếp →