Bạn search "xe ô tô" trong tài liệu công ty. Kết quả:
- Giải thích vấn đề của string-matching search và tại sao meaning-as-a-place thay đổi mọi thứ
- Visualize cách một đoạn text biến thành vector trong không gian 1024 chiều
- Áp dụng similarity search để tìm thông tin liên quan ngữ nghĩa (không phải từ khóa)
- Hiểu tại sao RAG (Retrieval-Augmented Generation) hoạt động — và giới hạn của nó
- Thực hành đặt câu hỏi và dự đoán kết quả similarity trong không gian 2D/3D
Phần 1: 2D encoding — bắt đầu đơn giản
Hãy làm thí nghiệm suy nghĩ. Tưởng tượng bạn có 3 tài liệu:
Score mỗi doc trên 2 trục:
Bạn vừa map meaning in 2D space.
Retrieval — Tìm kiếm trong không gian
Bây giờ, plot câu hỏi của bạn trên cùng graph với cùng logic:
Khoảng cách Euclidean từ câu hỏi đến mỗi doc:
Nearest neighbor: Velocicoaster. Đó là câu trả lời đúng cho câu hỏi.
Đây là similarity search ở dạng thuần nhất: plot câu hỏi, pick k nearest items. Không keyword matching. Không synonym tables. Chỉ multi-dimensional proximity.
- 📖 Sách thiếu nhi về khủng long ("Dinosaurs for Kids")
- 🎢 Trang wiki về Velocicoaster (một roller coaster chủ đề khủng long)
- 📚 Bách khoa toàn thư (general)
- Trục X: liên quan đến roller coaster đến mức nào? (0 = không, 1 = rất)
- Trục Y: liên quan đến khủng long đến mức nào?
| Doc | Tọa độ | Khoảng cách đến (0.80, 0.80) |
|---|---|---|
| 🎢 Velocicoaster | (0.90, 0.50) | ≈ 0.32 |
| 📖 Sách khủng long | (0.05, 0.95) | ≈ 0.76 |
| 📚 Bách khoa | (0.50, 0.20) | ≈ 0.67 |
Câu hỏi: "Best dinosaur-themed roller coaster là gì?"
→ Scoring: roller coaster (0.80), dinosaur (0.80)
→ Plot tại (0.80, 0.80)
Liên quan đến khủng long (Y)
1.0 ┤
│ 📖 Sách thiếu nhi
│ (0.05, 0.95)
0.8 ┤ ❓ Câu hỏi
│ (0.80, 0.80)
0.6 ┤ 🎢 Velocicoaster
│ (0.90, 0.50)
0.4 ┤
│ 📚 Bách khoa
0.2 ┤ (0.50, 0.20)
│
0.0 ┼────────────────────────────────
0.0 0.2 0.4 0.6 0.8 1.0
Liên quan đến roller coaster (X)Phần 2: Thêm trục — nhưng 2 không đủ
2 trục chỉ capture 2 concepts. Thế giới thực nhiều hơn. Thêm trục biology:
3 trục, 3 tọa độ mỗi document. Visualize được trong 3D.
Thí nghiệm: thêm trục 4
Thử tưởng tượng trục thứ 4. Thật khó — vì human brains evolve để thấy 3D.
Nhưng math không quan tâm.
Mỗi chiều mới thêm:
Visual representation dừng ở 3D. Math tiếp tục.
Real embeddings: hàng trăm đến vài nghìn dimensions
Real embedding models khác nhau về số chiều:
Ví dụ dưới đây dùng 1,024 dimensions (theo Voyage AI). Mỗi document và mỗi query trở thành một điểm trong không gian 1,024 chiều. "Find nearest documents" vẫn có nghĩa giống hệt như trên 2D graph — chỉ là distance calculation dài hơn.
Output luôn cùng length (1,024 giá trị trong ví dụ Voyage) — không quan trọng input là 3 từ hay 3 đoạn.
- Một tọa độ cho mỗi điểm
- Một số hạng bình phương thêm vào distance formula
| Model | Dimensions |
|---|---|
| Voyage AI (voyage-3) | 1,024 |
| OpenAI (text-embedding-3-small) | 1,536 |
| OpenAI (text-embedding-3-large) | 3,072 |
| Cohere (embed-v3) | 1,024 |
| Google (gecko) | 768 |
┌──────────────────────────────────────────────────────┐ │ │ │ Text: "work from home" │ │ ↓ │ │ Embedding model │ │ ↓ │ │ Vector: [0.23, -0.87, 0.41, ..., 0.19, -0.03] │ │ └──────────────────────────────────┘ │ │ 1,024 giá trị │ │ │ │ ──────────────────────────────────────────── │ │ │ │ Text: "Employees may work remotely up to two │ │ days per week with manager approval." │ │ ↓ │ │ Embedding model │ │ ↓ │ │ Vector: [0.71, 0.09, -0.33, ..., 0.88, -0.15] │ │ └──────────────────────────────────┘ │ │ 1,024 giá trị │ │ │ └──────────────────────────────────────────────────────┘
3 tài liệu, 3 trục (X=coaster, Y=dino, Z=biology)
📖 Sách khủng long: (0.05, 0.95, 0.85)
← high biology (species, habitat, diet)
🎢 Velocicoaster: (0.90, 0.50, 0.05)
← low biology (chủ đề ride, không phải về con vật)
📚 Bách khoa: (0.50, 0.20, 0.40)
← some biology (jack of all trades)Phần 3: Unlabeled axes (trục không tên)
Ở ví dụ 2D/3D, chúng ta chọn axes: khủng long, roller coaster, biology. Nhưng với real embedding, ai quyết định 1,024 chủ đề nào được chọn làm trục?
Câu trả lời: Không ai.
Meaning của mỗi trục là emergent (nổi lên trong training data) và là black box. Bạn không thể nhìn vào dimension 847 và nói "đây là trục dinosaur". Các chiều không tương ứng với khái niệm nào human đặt tên được.
Hệ quả:
Nhưng Practice vẫn work
Không hiểu từng trục vẫn có thể dùng hiệu quả. Model embed đã học được rằng:
- Không thể dễ dàng interrogate dimension 847 để giải thích tại sao 2 text gần nhau
- Không thể hiểu tại sao một cái expected-to-be-close lại xa
- Research AI interpretability đang cố mở hộp đen này
- "xe ô tô" và "automobile" gần nhau
- "happy" và "joyful" gần nhau
- "python programming" và "software development" gần nhau
- "My Civic needs brakes" và "car maintenance" gần nhau (qua liên kết gián tiếp)
Phần 4: Cosine similarity
"Nearest" trên 2D graph nghĩa là straight-line distance. Trong practice, similarity search dùng cosine similarity.
Cosine similarity là gì?
Đo hướng 2 vectors point đến nhau, không phải khoảng cách.
Tại sao cosine thay vì Euclidean distance?
Lý do thực dụng: vector embedding có thể có magnitude khác nhau tùy length of text. Một đoạn dài có vector "dài hơn" một câu ngắn — nhưng hướng (ý nghĩa) mới là cái đáng quan tâm.
Ví dụ cụ thể
| Pair | Cosine similarity | Diễn giải |
|---|---|---|
| "cat" vs "kitten" | ~0.82 | Rất tương đồng |
| "cat" vs "dog" | ~0.65 | Cùng domain (pets), liên quan |
| "cat" vs "computer" | ~0.05 | Không liên quan |
| "cat" vs "anti-cat" | ~-0.40 | Hơi đối lập (nhưng không hoàn toàn) |
Vector A: [0.42, 0.81, -0.12, ...]
Vector B: [0.85, 0.11, 0.63, ...]
Cosine similarity = (A · B) / (||A|| × ||B||)
Range:
-1 ← opposite direction
0 ← perpendicular (unrelated)
+1 ← same direction (identical meaning)Phần 5: Putting it all together — RAG
Giờ bạn có đủ mảnh ghép để hiểu RAG (Retrieval-Augmented Generation) hoạt động thế nào:
Tại sao RAG quan trọng?
Quay lại Bài 17.5 — Knowledge có cutoff + uneven + miss private data. RAG giải quyết cả 3:
Giới hạn của RAG
RAG không phải silver bullet:
Bù trừ:
- Post-cutoff info → retrieve từ real-time sources
- Niche/specialized → retrieve từ your corpus
- Private/company data → retrieve từ your private database
- Embedding failure: Model embed có thể miss nuance. Hai doc liên quan nhưng embedding khác xa → không retrieve.
- Chunking problem: Docs thường được chia thành chunks 500-2000 tokens. Chunking sai → mất ngữ cảnh.
- Top-k chọn sai: Retrieve top 3 nhưng doc đúng nằm ở top 4.
- Model vẫn có thể bịa: Given retrieved docs, model vẫn có thể ignore docs và sinh từ training memory.
- Dùng re-ranker sau retrieval
- Hybrid search (embedding + keyword BM25)
- Grounding guards trong prompt: "Answer MUST cite passage from provided docs"
┌──────────────────────────────────────────────────────────┐ │ │ │ INDEX TIME (làm 1 lần): │ │ │ │ Corpus of 500 docs │ │ ↓ │ │ Embedding model │ │ ↓ │ │ 500 vectors × 1024 dims │ │ ↓ │ │ Vector database (Pinecone, Weaviate, Chroma...) │ │ │ │ ───────────────────────────────────────────────── │ │ │ │ QUERY TIME (mỗi lần user hỏi): │ │ │ │ User: "Policy về work from home?" │ │ ↓ │ │ Embedding model (cùng cái với corpus) │ │ ↓ │ │ Query vector [0.71, 0.09, -0.33, ...] │ │ ↓ │ │ Search top 3 nearest (cosine similarity) │ │ ↓ │ │ Retrieved: 3 policy docs từ corpus │ │ ↓ │ │ Prompt cho Claude: │ │ "Answer user's question based on these docs: [3 docs]"│ │ ↓ │ │ Claude answer — grounded trên docs thực, │ │ không bịa từ memory │ │ │ └──────────────────────────────────────────────────────────┘
Ví dụ theo ngành
💰 Finance Analyst — RAG trên 10-K library
Use case: Bạn download 50 10-K của 50 công ty bạn cover. Embed chúng.
Workflow:
Kết quả: 2 ngày → 2 giờ. Không bịa — mọi claim grounded trên real 10-K.
⚖️ Legal Counsel — Case law search
Use case: Company's contract database + 50 relevant Supreme Court cases embedded.
Workflow:
Kết quả: Xác định 0 rủi ro precedent mà trước đó miss → save deal worth $2M.
🔍 Research Analyst — Literature database
Use case: 500 academic papers trong research area, embedded.
Workflow:
Kết quả: Discover 3-5 papers relevant không có keyword match với query ban đầu. Networking hiệu quả hơn.
🎧 Customer Support — Knowledge base search
Use case: KB 200 articles + ticket history.
Workflow:
Kết quả: 15 phút/ticket → 5 phút. Agent focus vào validate + personalize.
🛠️ Product Manager — User research synthesis
Use case: 200 user interview transcripts embedded.
Workflow:
Kết quả: Discover 3 pain points đã miss trong manual reading.
- Query: "Which of my companies mentioned supply chain risk in Q4 2025?"
- Retrieve: top 10 paragraphs across 10-K documents matching "supply chain risk"
- Synthesize: Claude viết summary với citations tới doc + paragraph
- Query: "Contract clauses about termination with material breach"
- Retrieve: 10 relevant contract clauses + 3 court cases
- Analysis: grounded trên precedent thực tế
- New research question → query database
- Retrieve top 20 relevant papers
- Each paper: auto-summary + citation tracking
- Đồng nghĩa không phải search keyword → miss quan hệ ngầm
- Incoming ticket: "My laptop won't boot after update"
- Embed ticket → search KB + past tickets
- Retrieve: top 5 related (dù wording khác nhau — "PC not starting", "post-update issues", etc.)
- Suggest draft response to agent
- "Find pain points about onboarding flow"
- Retrieve relevant snippets (bao gồm ngôn từ không dùng chính xác "onboarding")
- Cluster themes — "first-time setup confusion", "missing tutorial", "account creation friction"
- Recommendation grounded trên real user words
Anti-patterns khi dùng embeddings
❌ "Embedding tốt = RAG tốt"
Tại sao sai: Embedding là 1 trong nhiều yếu tố. Quality RAG còn phụ thuộc:
Cách đúng: Treat RAG như system design — optimize toàn bộ pipeline, không chỉ embedding.
❌ "Cosine similarity cao = nội dung trả lời đúng"
Tại sao sai: Similarity cao về meaning ≠ câu trả lời đúng. Một doc có thể match topic nhưng không trả lời câu hỏi cụ thể.
Cách đúng:
❌ "Embed tất cả, retrieve tất cả"
Tại sao sai: Corpus lớn → retrieval chậm, ồn ào, top-k có thể miss.
Cách đúng:
❌ "Embedding model nào cũng như nào"
Tại sao sai: Embedding models được train trên data khác nhau — có cái chuyên legal, medical, multilingual. Dùng model sai → retrieval kém.
Cách đúng:
- Chunking strategy
- Vector database performance
- Re-ranking
- Prompt engineering cho grounding
- UX presentation citations
- Similarity là filter đầu tiên
- Model cần đọc docs retrieved, decide relevance
- Có thể cần re-rank hoặc prompt engineering để ground
- Filter trước retrieval (by metadata: date, type, source)
- Dùng hybrid search (keyword + semantic)
- Chunking optimized cho use case
- Test embedding models trên your data với representative queries
- Chọn model match domain + language của bạn
Mẹo nâng cao
Mẹo 1: Chunking strategy per domain
Mẹo 2: Hybrid search pattern
Mẹo 3: Grounding prompt pattern
| Domain | Chunk size | Overlap | Lý do |
|---|---|---|---|
| Technical docs | 500 tokens | 50 tokens | Code blocks + prose |
| Legal contracts | 1000 tokens | 100 tokens | Context of clauses |
| Academic papers | 2000 tokens | 200 tokens | Preserve argument flow |
| Customer support | 300 tokens | 30 tokens | Short Q&A blocks |
| Meeting transcripts | 1000 tokens | 0 | Speaker separation |
# Semantic + keyword fusion
semantic_results = vector_db.search(query, k=20)
keyword_results = bm25_index.search(query, k=20)
# Fusion với weight
final_results = rrf_fusion(semantic_results, keyword_results,
weights=[0.7, 0.3])
# Re-rank top 10 bằng cross-encoder
final_top_k = reranker.rank(query, final_results[:10], k=3)Mẹo 3: Grounding prompt pattern
Mẹo 4: Embed your metadata, not just content
Thay vì chỉ embed text, embed metadata rich:
You are answering based on retrieved documents.
RULES:
1. Every claim MUST be traceable to one of the retrieved documents
2. If docs don't support an answer, say "The retrieved documents
don't contain this information"
3. Cite by [Doc 1], [Doc 2], etc. after each sentence
4. DO NOT use knowledge from training if it contradicts or
adds to the retrieved docs
Retrieved documents:
[Doc 1]: ...
[Doc 2]: ...
[Doc 3]: ...
User question: ...Mẹo 4: Embed your metadata, not just content
Retrieval precision tăng mạnh.
Instead of: "The Board approved the merger on March 15."
Embed: "CORP_MINUTES_Q1_2024 | Board Meeting 2024-03-15 |
Topic: M&A, Acquisition Approval |
The Board approved the merger on March 15."Áp dụng ngay
Bài tập 1: Mental embedding exercise (~10 phút)
Cho 5 doc sau, plot (ước lượng) trên 2D space với trục:
Các doc:
Plot trên graph. Sau đó, tưởng tượng query:
Bài tập 2: Dùng embedding tool thực tế (~15 phút)
Nếu bạn có Python + API key:
Observation:
Bài tập 3: Setup RAG cho domain của bạn (stretch)
- X: Technical depth (0 = layperson, 1 = expert-only)
- Y: Action-orientation (0 = theory, 1 = actionable)
- Paper: "Attention Is All You Need" (Vaswani et al., 2017)
- Blog: "5 AI Tools for Beginners"
- Tutorial: "Build a chatbot with Claude API"
- Philosophy essay: "Consciousness in machines"
- YouTube video: "How transformers work — ELI5"
- Q1: "Tôi mới bắt đầu với AI, làm gì first?" → nearest 2 là gì?
- Q2: "Explain transformer to my team" → nearest 2 là gì?
- Q3: "Build production AI app" → nearest 2 là gì?
- Câu nào cosine cao nhất? Đã khớp ý nghĩa dù không có keyword match chung?
- Chạy query khác — "How much vacation do I get?" — thử lại
- Pick 10-20 documents bạn reference nhiều (internal wiki, policies, notes)
- Dùng Claude Projects hoặc Custom GPT với file upload
- Query như bạn thường hỏi — observe quality
- So sánh với không có RAG → gap
import voyageai # hoặc openai, cohere
vo = voyageai.Client()
docs = [
"Employees may work remotely up to two days per week.",
"Our benefits package includes health insurance and 401(k).",
"PTO is 20 days per year for full-time employees.",
"All expenses over $500 require manager approval.",
]
# Embed
embeddings = vo.embed(docs, model="voyage-3").embeddings
# Query
query = "Can I work from home?"
query_emb = vo.embed([query], model="voyage-3").embeddings[0]
# Cosine similarity
import numpy as np
sims = [np.dot(query_emb, doc_emb) /
(np.linalg.norm(query_emb) * np.linalg.norm(doc_emb))
for doc_emb in embeddings]
for doc, sim in zip(docs, sims):
print(f"{sim:.3f}: {doc}")Suy ngẫm bài học
- Bạn thấy "meaning as a place" là insight lớn không? Nó thay đổi cách bạn nghĩ về search?
- Với corpus nào trong công việc, RAG sẽ đáng setup? (> 100 docs bạn reference nhiều?)
- Không gian 1024 chiều thật ra chứa cái gì? Một manifold của ngữ nghĩa con người — emerge từ văn bản.
Tóm tắt bài học
🎯 Embeddings = meaning as a place. Text biến thành vector trong không gian high-dimensional (~1024). Text tương đồng → vector gần nhau.
🎯 Similarity search = tìm vectors gần nhất (bằng cosine similarity hoặc Euclidean). Đây là backbone của RAG.
🎯 Axes không được label — emergent từ training data, opaque. Nhưng practice vẫn work.
🎯 RAG = Embedding + Retrieval + Generation. Model retrieve docs từ corpus, rồi ground câu trả lời trên docs đó — tránh hallucination từ memory.
🎯 Giới hạn của RAG: chunking, re-ranking, model có thể ignore docs. RAG là system design, không phải magic.
🎯 Hybrid search (semantic + keyword) thường work tốt hơn pure semantic cho enterprise use case.
- Voyage AI Embeddings — embedding models performance trên Vietnamese + multilingual
- Facebook AI — FAISS — open-source vector similarity library
- "Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks" (Lewis et al., 2020)
- Anthropic — MCP docs — integration protocol cho RAG tools
- Bài 17.5 — Knowledge (tiền đề)
- Bài 17.7 — Working Memory (tiếp theo)