Sau lab này, bạn cần có thể:
- Giải thích cosine similarity và dự đoán điểm tương đồng giữa các văn bản
- Triển khai 3 chiến lược chunking và so sánh ưu nhược điểm
- Xây dựng vector store với search, filter, và delete
- Kết nối knowledge base với agent qua RAG pattern
- Chỉ ra khi nào retrieval giúp ích và khi nào nó thất bại
Mỗi sinh viên tự mình hoàn thành tất cả TODO trong src/chunking.py, src/store.py, và src/agent.py. Document dataclass và FixedSizeChunker đã được implement sẵn làm ví dụ.
Nhóm cùng chọn một bộ tài liệu và thống nhất 5 benchmark queries. Mỗi thành viên thử strategy riêng (chunking, metadata), chạy cùng queries, rồi so sánh kết quả trong nhóm để học từ nhau.
pip install -r requirements.txt
pytest tests/ -v # Phần lớn tests sẽ FAIL (chưa implement)Mặc định, lab vẫn chạy với _mock_embed nên không bắt buộc cài embedder thật.
File .env được tự động nạp khi chạy main.py. Với các Python snippet chạy trực tiếp, hãy export biến môi trường cần thiết hoặc gọi load_dotenv() nếu cần.
Không cần cài gì thêm ngoài:
pip install -r requirements.txtpip install sentence-transformers
python3 - <<'PY'
from src import LocalEmbedder
embedder = LocalEmbedder()
print(embedder._backend_name)
print(len(embedder("embedding smoke test")))
PY- Package
srchỗ trợall-MiniLM-L6-v2quasentence-transformers. - Lần chạy đầu tiên model sẽ được tải về và cache local.
pip install openai
export OPENAI_API_KEY=your-key-here
python3 - <<'PY'
from src import OpenAIEmbedder
embedder = OpenAIEmbedder()
print(embedder._backend_name)
print(len(embedder("embedding smoke test")))
PY- Model mặc định cho lựa chọn này là
text-embedding-3-small - Có thể đổi model bằng:
export OPENAI_EMBEDDING_MODEL=text-embedding-3-small- Nếu không chọn gì, lab dùng
_mock_embed - Nếu chọn
localhoặcopenainhưng setup thiếu, code sẽ tự fallback về_mock_embed - Có thể cấu hình qua
.envmà không cầnsource .env - Script
main.pychạy end-to-end và import public API từ packagesrc
Sau khi cài optional dependencies, có thể verify từng backend riêng:
Verify local embedder
python3 - <<'PY'
from src import LocalEmbedder
embedder = LocalEmbedder()
print(embedder._backend_name, len(embedder("embedding smoke test")))
PYVerify OpenAI embedder
python3 - <<'PY'
from pathlib import Path
from dotenv import load_dotenv
from src import OpenAIEmbedder
load_dotenv(dotenv_path=Path(".env"), override=False)
embedder = OpenAIEmbedder()
print(embedder._backend_name, len(embedder("embedding smoke test")))
PYLưu ý:
OpenAIEmbeddercầnOPENAI_API_KEYhợp lệ trong môi trường hoặc.env.
├── README.md ← Bạn đang đọc file này
├── exercises.md ← Bài tập (4 phần)
├── main.py ← Entry point cho manual demo
├── src/
│ ├── chunking.py ← Chunking classes + similarity helper
│ ├── store.py ← EmbeddingStore
│ ├── agent.py ← KnowledgeBaseAgent
│ └── ... ← Các module nhỏ hơn
├── data/ ← Tài liệu mẫu + tài liệu nhóm (.txt/.md)
├── tests/
│ └── test_solution.py ← Test suite (30+ tests)
├── report/
│ └── REPORT.md ← Báo cáo (1 file/sinh viên)
├── docs/
│ ├── EVALUATION.md ← Evaluation metrics
│ ├── INSTRUCTOR_GUIDE.md ← Instructor notes
│ └── SCORING.md ← Tiêu chí chấm điểm
└── requirements.txt
| Giai Đoạn | Hoạt Động |
|---|---|
| Chuẩn bị tài liệu | Nhóm chọn domain, thu thập tài liệu, chuyển sang .md/.txt |
| Lập trình cá nhân | Warm-up + implement tất cả TODO (cá nhân) |
| Thiết kế strategy | Mỗi người thử strategy riêng, thống nhất 5 queries |
| So sánh trong nhóm | Chạy benchmark, so sánh kết quả, chuẩn bị demo |
| Demo & thảo luận | Trình bày strategy + so sánh, thảo luận liên nhóm |
Documentdataclass — container cho text + metadataFixedSizeChunker— sliding window chunking
SentenceChunker— chia theo ranh giới câuRecursiveChunker— thử từng separator theo thứ tựcompute_similarity— cosine similarityChunkingStrategyComparator— so sánh 3 chiến lượcEmbeddingStore— wrapper quanh vector store (5 methods)KnowledgeBaseAgent— RAG pattern agent
- Chọn bộ tài liệu (5-10 docs): FAQ, SOP, policy, internal docs, hoặc domain bất kỳ
- Chuyển sang .txt/.md nếu cần (xem tips trong exercises.md)
- Thống nhất 5 benchmark queries kèm gold answers
- Mỗi thành viên thử strategy riêng: chunking method, tham số, metadata schema
- So sánh kết quả trong nhóm: strategy nào cho retrieval tốt hơn? Tại sao?
Khi chạy benchmark, đừng chỉ hỏi "code có chạy không?" mà hãy tự kiểm tra 5 góc nhìn sau:
-
Retrieval Precision
- Top-3 có chứa chunk thật sự liên quan không?
- Score có tách được kết quả tốt và nhiễu không?
-
Chunk Coherence
- Chunk có giữ được ý trọn vẹn không?
- Strategy nào làm chunk dễ đọc và dễ retrieve hơn?
-
Metadata Utility
search_with_filter()có giúp tăng độ chính xác không?- Filter có quá chặt, làm mất kết quả tốt không?
-
Grounding Quality
- Câu trả lời của agent có thật sự dựa trên retrieved context không?
- Có thể chỉ ra chunk nào hỗ trợ câu trả lời không?
-
Data Strategy Impact
- Bộ tài liệu nhóm chọn có phù hợp với benchmark queries không?
- Strategy chunking / metadata của bạn có hợp với domain không?
Xem
docs/EVALUATION.mdnếu bạn muốn một checklist chi tiết hơn cho phần này.
Xem chi tiết tại docs/SCORING.md. Tóm tắt:
| Phần | Điểm |
|---|---|
| Cá nhân (code + phân tích) | 60 |
| Nhóm (strategy + so sánh) | 40 |
| Tổng | 100 |
src/— hoàn thành tất cả TODO cần thiếtreport/REPORT.md— một báo cáo/sinh viên (gồm cả phần nhóm và cá nhân)
pytest tests/ -v