20 câu, xếp từ dễ tới khó. Năm câu cuối là về chính dự án Cowork-Local — nhóm câu này gần như chắc chắn sẽ có người hỏi.
Tìm tài liệu liên quan trước, rồi đưa cho LLM đọc và trả lời dựa trên đó — thay vì để LLM trả lời bằng trí nhớ có sẵn.
Ví von: thay vì bắt thí sinh làm bài từ trí nhớ, ta cho thi mở sách — nhưng có thủ thư lật sẵn đúng trang cần đọc.
Quy tắc chọn: câu trả lời phụ thuộc nội dung tài liệu → RAG. Phụ thuộc cách nói / định dạng / kỹ năng → fine-tune. Cần cả hai thì làm cả hai.
Không. Chỉ giảm mạnh. Đây là câu dễ bị hỏi vặn nhất, nên trả lời thẳng.
RAG vẫn sai được ở bốn chỗ:
Mô hình embedding biến một đoạn chữ thành dãy số (768 – 4096 chiều). Nó được huấn luyện sao cho hai đoạn cùng nghĩa cho ra hai điểm gần nhau, kể cả khi không trùng một chữ nào.
Máy đo "gần" bằng cosine similarity — góc giữa hai vector. Nhờ vậy hỏi "xe hơi" vẫn tìm ra tài liệu viết "ô tô".
Không có con số đúng chung — phụ thuộc loại tài liệu. Nhưng có nguyên tắc:
| Loại tài liệu | Cỡ đoạn gợi ý | Vì sao |
|---|---|---|
| FAQ, hỏi đáp ngắn | 100 – 300 chữ | Mỗi mục vốn đã độc lập |
| Chính sách, quy trình | 300 – 600 chữ | Giữ trọn một điều khoản |
| Sách, báo cáo dài | 500 – 1000 chữ | Cần đủ ngữ cảnh xung quanh |
| Mã nguồn | theo hàm / lớp | Cắt giữa hàm là hỏng nghĩa |
Thực tế nên cắt theo cấu trúc trước (theo mục, theo điều, theo hàm) rồi mới giới hạn độ dài — cắt cứng theo số chữ là phương án cuối.
Cắt cứng theo số chữ sẽ có lúc cắt giữa một câu hoặc giữa một ý. Đoạn nào cũng lặp lại một phần đoạn trước thì thông tin ở ranh giới luôn còn nguyên vẹn ở ít nhất một đoạn.
Giá phải trả: kho phình thêm đúng bằng tỉ lệ overlap. 20% overlap → nhiều hơn ~20% vector.
Thường 3 – 10. Cách chọn:
Thực dụng hơn: đặt ngưỡng điểm tương đồng thay vì K cố định — lấy mọi đoạn trên ngưỡng, không có đoạn nào đạt thì trả lời "không tìm thấy".
Ba tiêu chí: hỗ trợ tiếng Việt, số chiều, chạy nội bộ hay gọi API.
| Nhóm | Ví dụ | Ghi chú |
|---|---|---|
| API thương mại | OpenAI text-embedding-3, Cohere |
Chất lượng tốt, nhưng tài liệu phải gửi ra ngoài |
| Đa ngữ, chạy nội bộ | multilingual-e5, BGE-M3 | Tiếng Việt khá tốt, chạy được trên máy công ty |
| Chuyên tiếng Việt | PhoBERT và các bản fine-tune | Cần đánh giá lại trên chính dữ liệu của mình |
Với dữ liệu nội bộ nhạy cảm, nhóm "chạy nội bộ" thường là lựa chọn duy nhất khả thi.
Không. Chọn theo quy mô:
| Quy mô | Giải pháp | Ghi chú |
|---|---|---|
| < 100k vector | FAISS, Chroma, hoặc file numpy | Không cần dựng thêm dịch vụ |
| Đã có PostgreSQL | pgvector |
Dùng luôn DB sẵn có — thường là lựa chọn tốt nhất |
| Triệu vector trở lên | Milvus, Qdrant, Weaviate | Cần index ANN chuyên dụng |
| Không muốn tự vận hành | Pinecone | Dịch vụ đám mây, dữ liệu ra ngoài |
Ví dụ trong slide — 100 file PDF ra 20.000 vector — hoàn toàn không cần Vector DB chuyên dụng. FAISS trên một máy là đủ và nhanh.
Chưa đủ. Vector giỏi bắt ý nghĩa nhưng dở với mã số, tên riêng, ký hiệu — hỏi "điều 7.5.3" hay "mã lỗi FN0101" thì tìm từ khoá lại chính xác hơn hẳn.
Hai cải tiến gần như luôn đáng làm:
Slide đã nêu đúng đây là điểm yếu. Ví dụ: "Nhân viên nào ký hợp đồng với nhà cung cấp có doanh số cao nhất năm ngoái?" — cần tra bảng doanh số trước, rồi mới tra hợp đồng.
RAG một lượt sẽ hỏng, vì một lần tra không thể ra cả hai. Ba hướng xử lý:
Vẫn cần, vì ba lý do:
Context dài có chỗ dùng: khi tổng tài liệu nhỏ (vài chục trang) và bạn muốn giải pháp đơn giản nhất — lúc đó bỏ RAG cho gọn là hợp lý.
Tách làm hai phần, và phần đắt không phải phần người ta hay lo:
| Khoản | Khi nào phát sinh | Mức độ |
|---|---|---|
| Embedding tài liệu | Một lần lúc index + khi tài liệu đổi | Rẻ — embedding rẻ hơn LLM hàng chục lần |
| Lưu trữ vector | Liên tục | Nhỏ, trừ khi kho cực lớn |
| Embedding câu hỏi | Mỗi lượt hỏi | Không đáng kể |
| LLM sinh câu trả lời | Mỗi lượt hỏi | Chiếm phần lớn chi phí |
Vì vậy giảm chi phí RAG thực chất là giảm số token đưa vào LLM — tức chọn top-K gọn và đoạn sạch, chứ không phải tiết kiệm ở khâu embedding.
Bước tra thường tốn vài chục tới vài trăm mili-giây: embedding câu hỏi + tìm trong vector DB. Có rerank thì cộng thêm chút nữa.
So với thời gian LLM sinh câu trả lời (thường vài giây), phần này gần như không đáng kể.
Chỉ cần index lại phần thay đổi, không đụng tới mô hình:
Cách làm thực dụng: lưu kèm hash nội dung mỗi file, chạy định kỳ, chỉ xử lý file có hash đổi. Vài giây cho một lần cập nhật thông thường.
Điểm mấu chốt: đo tách hai khâu, vì hỏng ở đâu thì sửa ở đó khác nhau.
| Khâu | Đo gì | Hỏng thì sửa gì |
|---|---|---|
| Truy hồi | Đoạn đúng có nằm trong top-K không? | Chia đoạn, mô hình embedding, hybrid, rerank |
| Sinh câu trả lời | Câu trả lời có bám vào đoạn đã lấy không? | Prompt, model, yêu cầu trích nguồn |
Cách làm tối thiểu mà hiệu quả: dựng bộ 50–100 câu hỏi mẫu có đáp án đúng lấy từ người dùng thật. Mỗi lần chỉnh tham số thì chạy lại bộ đó và so điểm.
Đây là câu hay bị bỏ quên tới lúc triển khai thật mới lộ ra.
Nguyên tắc: lọc quyền ở bước truy hồi, không phải ở bước trả lời. Tuyệt đối không dựa vào việc nhắc LLM "đừng nói về tài liệu này" — không đáng tin.
Nhóm này gần như chắc chắn được hỏi, vì slide 17 đã tự nêu ra.
Trả lời thẳng như slide 17 đã viết: chưa có RAG theo nghĩa đầy đủ.
Cách nói an toàn khi bị hỏi vặn: "Hiện tại là truy xuất theo cấu trúc, chưa phải truy xuất theo ngữ nghĩa. Phần trình bày hôm nay là kiến thức nền cho bước tiếp theo."
| GraphRAG (Microsoft) | GraphRAG trong Cowork-Local | |
|---|---|---|
| Đồ thị chứa gì | Thực thể và quan hệ do LLM trích từ nội dung | File, lớp, hàm và liên kết import |
| Dựng bằng gì | Gọi LLM nhiều lượt, tốn chi phí | Phân tích cú pháp mã nguồn, không tốn phí gọi AI |
| Trả lời câu hỏi | Đi theo quan hệ + tóm tắt theo cụm | Đọc sơ đồ và nội dung file liên quan |
Cùng tên, khác bản chất. Slide của bạn mô tả đúng cái thứ hai — "quét file, ghi nhận mỗi file có class/hàm gì và liên kết với file nào".
Nói rõ điểm này lại là lợi thế: cách của dự án rẻ và nhanh hơn nhiều vì không phải gọi LLM để dựng đồ thị.
Bốn việc, xếp theo thứ tự nên làm:
| # | Việc | Quyết định phải chốt |
|---|---|---|
| 1 | Chọn mô hình embedding | Chạy nội bộ hay gọi API — quyết định này ràng buộc mọi thứ sau, và đổi về sau là phải index lại toàn bộ |
| 2 | Chia đoạn tài liệu | Cắt theo cấu trúc (mục, điều, hàm) trước khi cắt theo độ dài |
| 3 | Chọn nơi lưu vector | Quy mô hiện tại chỉ cần FAISS hoặc pgvector |
| 4 | Dựng bộ câu hỏi đánh giá | 50–100 câu có đáp án đúng — làm trước khi tối ưu |