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.
- 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
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
"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:
- Tokenize — chia text thành tokens
- Encode — qua nhiều transformer layers
- 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
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
pip install openai numpy
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")
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