Embedding — Vector Embeddings Explained

Hiểu cách AI biểu diễn text thành số (vectors) — nền tảng của search, RAG, clustering, recommendation, và mọi hệ thống AI hiện đại.

NLP Vector Semantic Search Foundation
Sau bài này bạn sẽ
  • Hiểu embedding là gì (ví dụ trực quan)
  • Biết cách text → vector hoạt động
  • So sánh các embedding models 2025
  • Tạo embeddings bằng Python
  • Hiểu cosine similarity và ứng dụng
Dành cho
Developers, data scientists, AI beginners
Yêu cầu trước
Python cơ bản, hiểu khái niệm vector/array
⏱️ Thời gian
~20 phút

1. Embedding là gì?

Máy tính không hiểu chữ, chỉ hiểu số. Embedding là cách biến text thành mảng số (vector) sao cho:

  • Câu có nghĩa gần nhau → vectors gần nhau
  • Câu khác nghĩa → vectors xa nhau
ví dụ trực quan
"Con mèo nằm trên ghế"  → [0.23, -0.45, 0.67, ...]  (1536 số)
"Chú mèo ngồi trên sofa" → [0.22, -0.44, 0.68, ...]  ← GẦN!
"Giá bitcoin hôm nay"    → [-0.89, 0.12, -0.34, ...] ← XA!

→ 2 câu đầu gần nhau vì cùng chủ đề "mèo + đồ nội thất"
→ Câu 3 xa vì khác hoàn toàn

Tưởng tượng: Mỗi câu là 1 điểm trong không gian nhiều chiều. Embedding model học cách đặt câu giống nghĩa gần nhau. Semantic search = tìm điểm gần nhất.

2. Text → Vector: Cách hoạt động

Embedding model (neural network) được training trên hàng tỷ câu text, học cách:

  1. Tokenize — chia text thành tokens
  2. Encode — qua nhiều transformer layers
  3. Pool — gom thành 1 vector cố định (VD: 1536 dimensions)

Kết quả: 1 mảng số đại diện cho ý nghĩa (semantics), không phải từ ngữ chính xác.

Keyword search vs Semantic search:
Keyword: “mèo ngồi ghế” chỉ match chính xác từ “mèo”, “ngồi”, “ghế”
Semantic (embedding): match cả “cat on chair”, “chú miu trên sofa” → cùng nghĩa!

3. Cosine Similarity

Đo độ “gần” giữa 2 vectors bằng cosine similarity:

  • 1.0 → giống nhau hoàn toàn
  • 0.0 → không liên quan
  • -1.0 → ngược nghĩa
python
import numpy as np

def cosine_similarity(a, b):
    return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))

# Ví dụ
sim = cosine_similarity(vec_meo1, vec_meo2)
print(f"Similarity: {sim:.4f}")
# Output: Similarity: 0.9523 → rất gần!

4. Embedding Models 2025

Model Provider Dims Đặc điểm Chi phí
text-embedding-3-small OpenAI 1536 Rẻ, tốt cho hầu hết tasks $0.02/1M tokens
text-embedding-3-large OpenAI 3072 Chính xác nhất OpenAI $0.13/1M tokens
Cohere embed-v4 Cohere 1024 Multilingual, multimodal $0.10/1M tokens
Jina v3 Jina AI 1024 Task-specific LoRA adaptors Free/paid
Qwen3-Embedding Alibaba Flexible MTEB #1, instruct tuning $0.02/1M
nomic-embed-text Nomic 768 Open-source, local Free

Bắt đầu với: text-embedding-3-small (OpenAI, rẻ, tốt). Cần local: nomic-embed-text qua Ollama.

5. Hands-on: Tạo Embeddings

terminal
pip install openai numpy
python — embedding_demo.py
from openai import OpenAI
import numpy as np

client = OpenAI()

texts = [
    "Con mèo nằm trên ghế",
    "Chú mèo ngồi trên sofa",
    "Giá bitcoin hôm nay",
    "Thời tiết Hà Nội",
]

# Tạo embeddings
response = client.embeddings.create(
    model="text-embedding-3-small",
    input=texts
)

vectors = [d.embedding for d in response.data]

# So sánh
def cosine_sim(a, b):
    a, b = np.array(a), np.array(b)
    return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))

for i in range(len(texts)):
    for j in range(i+1, len(texts)):
        sim = cosine_sim(vectors[i], vectors[j])
        print(f"  {texts[i]}")
        print(f"  {texts[j]}")
        print(f"  → Similarity: {sim:.4f}\n")
📤 Kết quả mong đợi
  Con mèo nằm trên ghế
  Chú mèo ngồi trên sofa
  → Similarity: 0.9523    ← VERY SIMILAR

  Con mèo nằm trên ghế
  Giá bitcoin hôm nay
  → Similarity: 0.1247    ← NOT RELATED

  Con mèo nằm trên ghế
  Thời tiết Hà Nội
  → Similarity: 0.1589    ← NOT RELATED

  Giá bitcoin hôm nay
  Thời tiết Hà Nội
  → Similarity: 0.3812    ← Slightly related (both "news")

6. 5 Ứng dụng thực tế

Ứng dụng Cách dùng Embedding Ví dụ
Semantic search Tìm documents gần query vector Google, Notion AI
RAG Retrieve relevant chunks cho LLM Chatbot hỗ trợ KH
Clustering Nhóm texts giống nhau Phân loại ticket hỗ trợ
Recommendation Tìm items tương tự Gợi ý sản phẩm/bài viết
Anomaly detection Phát hiện text bất thường Content moderation

7. Best Practices & Sai lầm

Nên

  • Chọn model phù hợp ngôn ngữ — nếu xử lý tiếng Việt, ưu tiên multilingual (Cohere, Qwen3)
  • Normalize vectors — chuẩn hóa trước khi lưu vào DB
  • Cache embeddings — không re-embed cùng text nhiều lần
  • Batch requests — gửi nhiều texts 1 lần, giảm latency

❌ Sai lầm

  • Mix embedding models — query và document PHẢI dùng cùng model
  • Embed quá dài — mỗi model có max tokens (8192), text dài cần chia chunks
  • Chỉ dùng cosine — một số DB hỗ trợ L2 (Euclidean), inner product nhanh hơn

8. Bước tiếp theo

  • RAG — ứng dụng embedding vào pipeline RAG
  • Graph RAG — kết hợp embedding + knowledge graph
  • OpenClaw Skills — tạo skill dùng embedding