Featured image of post Vector Database & Embeddings: Mô hình tư duy 'Bản đồ Ngữ nghĩa'

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 EmbeddingsVector 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.

1
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):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
                  "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.

1
2
3
4
5
6
7
8
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?)

DatabaseTốt nhất choTính năng nổi bật
pgvectorScale vừa, đã dùng PostgresKhông cần infra thêm. SQL + vector cùng chỗ.
ChromaPrototype, dev localDễ nhất để bắt đầu. Chế độ in-memory.
WeaviateHybrid search (keyword + semantic)Tích hợp BM25 + vector search.
QdrantHiệu năng cao, self-hostedNhanh, Rust-based, filter tốt.
PineconeManaged, serverless, scale lớnZero ops. Đắt khi scale.
MilvusTỷ vector, open sourceOpen-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)

1
2
3
4
5
6
7
8
9
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);
1
2
3
4
5
6
7
8
9
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)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
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ạ

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
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.

Được tạo với sự lười biếng tình yêu 🦥

Subscribe to My Newsletter