Bỏ qua để đến nội dung

Embeddings

Tưởng tượng bạn là thủ thư của một thư viện khổng lồ…

Bạn cần sắp xếp triệu cuốn sách sao cho người đọc có thể tìm nhanh sách họ cần. Bạn sẽ làm gì?

  • Cách cũ (Keyword): Xếp theo alphabet → “AI” xa “Trí tuệ nhân tạo” mặc dù cùng chủ đề!
  • Cách mới (Embedding): Xếp theo chủ đề → Sách về AI nằm cạnh sách về ML, Deep Learning.

Embeddings = Tọa độ của từ ngữ trong không gian ý nghĩa.

flowchart LR
subgraph VectorSpace["🌌 Vector Space (Không gian ngữ nghĩa)"]
direction TB
subgraph Food["🍜 Cluster: Ẩm thực"]
F1["Phở"]
F2["Bún chả"]
F3["Bánh mì"]
end
subgraph Tech["💻 Cluster: Công nghệ"]
T1["Python"]
T2["JavaScript"]
T3["AI"]
end
subgraph Animal["🐾 Cluster: Động vật"]
A1["Mèo"]
A2["Chó"]
end
end
TEXT["📝 Text Input"] --> EMB["🔢 Embedding Model"]
EMB --> VEC["[0.2, 0.8, ..., 0.5]"]
VEC --> VectorSpace
style VectorSpace fill:#f3e5f5,stroke:#9c27b0
style Food fill:#fff3e0,stroke:#ff9800
style Tech fill:#e3f2fd,stroke:#2196f3
style Animal fill:#e8f5e9,stroke:#4caf50

Vector là một danh sách các con số thực. Ví dụ:

# Giả sử chúng ta dùng 3 chiều đơn giản
"mèo" = [0.9, 0.1, 0.5] # [dễ thương, nguy hiểm, gia đình]
"chó" = [0.8, 0.2, 0.7]
"hổ" = [0.6, 0.9, 0.1]
"cá mập" = [0.1, 0.9, 0.0]

Trong thực tế, embedding models dùng hàng nghìn chiều:

  • OpenAI text-embedding-3-small: 1536 chiều
  • OpenAI text-embedding-3-large: 3072 chiều
  • Cohere embed-v3: 1024 chiều

Để so sánh 2 vectors, ta dùng Cosine Similarity:

cosine_similarity(A, B) = (A · B) / (||A|| × ||B||)
  • Kết quả từ -1 (ngược hoàn toàn) đến 1 (giống hoàn toàn)
  • Thường threshold 0.7+ được coi là “liên quan”
import numpy as np
# Giả lập embeddings
vec_king = np.array([0.8, 0.9, 0.1])
vec_queen = np.array([0.75, 0.95, 0.15])
vec_apple = np.array([0.1, 0.2, 0.9])
def cosine_sim(a, b):
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
print(f"King vs Queen: {cosine_sim(vec_king, vec_queen):.3f}") # ~0.99
print(f"King vs Apple: {cosine_sim(vec_king, vec_apple):.3f}") # ~0.35

Điều kỳ diệu của embeddings:

King - Man + Woman ≈ Queen
Paris - France + Japan ≈ Tokyo

Điều này chứng minh embeddings đã capture được quan hệ ngữ nghĩa!


Model Dimensions Giá (per million tokens) Ghi chú
OpenAI ada-002 1536 $0.10 Legacy
OpenAI text-embedding-3-small 1536 $0.02 Recommended
OpenAI text-embedding-3-large 3072 $0.13 Best quality
Cohere embed-v3 1024 $0.10 Multi-lingual
Voyage AI 1024 $0.08 Affordable
BGE (local) 1024 Free Self-hosted

💡 Tip: Với tiếng Việt, text-embedding-3-small hoặc Cohere embed-v3 hoạt động tốt.


from openai import OpenAI
client = OpenAI()
def get_embedding(text: str, model: str = "text-embedding-3-small") -> list:
response = client.embeddings.create(
input=text,
model=model
)
return response.data[0].embedding
# Sử dụng
vec1 = get_embedding("Phở Hà Nội rất ngon")
vec2 = get_embedding("Bún chả thủ đô tuyệt vời")
vec3 = get_embedding("iPhone 15 Pro Max")
# So sánh
import numpy as np
def cosine_sim(a, b):
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
print(f"Phở vs Bún chả: {cosine_sim(vec1, vec2):.3f}") # Cao (~0.85)
print(f"Phở vs iPhone: {cosine_sim(vec1, vec3):.3f}") # Thấp (~0.25)

Hiểu cách embeddings hoạt động bằng cách tự tay tính cosine similarity.

Cho 2 vectors:

  • A = [1, 2, 3]
  • B = [4, 5, 6]

Tính cosine similarity:

  1. A · B = 1×4 + 2×5 + 3×6 = ?
  2. ||A|| = √(1² + 2² + 3²) = ?
  3. ||B|| = √(4² + 5² + 6²) = ?
  4. cosine_sim = (A · B) / (||A|| × ||B||) = ?

Đáp án: 32 / (3.74 × 8.77) ≈ 0.974 → Rất tương đồng!

sentences = [
"Tôi yêu lập trình Python",
"Python là ngôn ngữ yêu thích của tôi",
"Hôm nay trời đẹp quá",
"Thời tiết hôm nay thật tuyệt"
]
# TODO: Embed tất cả sentences
# TODO: Tạo similarity matrix 4x4
# TODO: In ra cặp nào giống nhất
Similarity Matrix:
S1 S2 S3 S4
S1 1.00 0.92 0.31 0.28
S2 0.92 1.00 0.29 0.26
S3 0.31 0.29 1.00 0.95
S4 0.28 0.26 0.95 1.00
Cặp giống nhất: S3-S4 (0.95) - cùng về thời tiết

Khái niệm Ý nghĩa
Embedding Biến text thành vector số
Vector Danh sách số thực (1536+ dimensions)
Cosine Similarity Đo độ giống nhau (0-1)
Semantic Search Tìm theo ý nghĩa, không phải keyword

Bài tiếp theo: Vector Database - Nơi lưu trữ hàng triệu vectors.