Skip to main content

RAG giải thích cho người mới bắt đầu

Cập nhật: 2026-07-26

Mục lục


1. Bài toán: AI assistant cần hiểu 500GB tài liệu công ty

Hãy tưởng tượng bạn được giao nhiệm vụ: công ty có 500 gigabyte tài liệu trên server, và bạn phải kết nối một AI assistant giống như ChatGPT để nó trả lời được câu hỏi về đúng những tài liệu đó. Vấn đề là các chat application thông thường không chấp nhận quá một chục file. Vậy cần một phương pháp khác để AI có thể search, đọc, và hiểu toàn bộ số file đó.

💡 Hình dung: Giống như đưa cho một trợ lý cả một kho lưu trữ khổng lồ rồi hỏi "tìm giúp tôi thỏa thuận dịch vụ năm ngoái" — trợ lý không thể đọc hết cả kho mỗi lần được hỏi, mà cần một cách để biết ngay chỗ nào đáng tìm.

The Problem: 500GB of Documents, a Chat App That Can't Read ThemCompany Docs500 GBAI Assistant(like ChatGPT)Chat app limitaccepts only ~a dozen files?Need a different methodto search, read, understand

2. Hai cách tiếp cận không hiệu quả trước khi có RAG

Cách đầu tiên nghĩ tới là tạo một thuật toán để tìm kiếm tiêu đề và nội dung tài liệu rồi xếp hạng theo độ liên quan. Nhưng cách này có nghĩa là mỗi lần user search, hệ thống phải quét lại toàn bộ 500GB tài liệu — rất kém hiệu quả.

Cách thứ hai là làm một bước pre-processing trước: tóm tắt trước toàn bộ tài liệu thành các chunk có thể search được. Nhưng cách này lại không đảm bảo độ chính xác.

Vậy có cách nào lấy được điểm mạnh của cả hai mà không dính điểm yếu của bên nào không? Có — kết hợp cả hai ý tưởng lại.

Two Failed Approaches Before RAGApproach 1: Search EverythingRank titles + contents by relevance✗ Every query scans all 500GB✗ Very inefficientApproach 2: Pre-summarizeSummarize docs into chunks upfront✗ Not accurateLoses detail during summarizationMerge both ideas→ RAG (Retrieval Augmented Generation)

3. Nền tảng của RAG: vector embedding là gì?

Trước khi biết RAG lưu tài liệu ra sao, có một câu hỏi cần trả lời trước: máy tính "hiểu" ý nghĩa của một câu chữ bằng cách nào? Ba khái niệm dưới đây — vector, similarity score, và chunk — là nền tảng bắt buộc phải nắm trước, vì toàn bộ phần còn lại của bài dùng đi dùng lại chúng.

Vì sao máy tính cần biến chữ thành số?

Máy tính không suy nghĩ bằng từ ngữ — nó chỉ tính toán được trên số. Vì vậy, trước khi so sánh được hai câu có ý nghĩa giống nhau hay không, cả hai câu phải được chuyển thành số trước. Quá trình chuyển đổi này gọi là embedding, công cụ thực hiện nó gọi là embedding model.

Kết quả của embedding không phải một con số đơn lẻ, mà là một dãy nhiều con số — gọi là vector. Mỗi câu, mỗi đoạn văn, sau khi qua embedding model sẽ có một vector riêng, giống như một tọa độ trên bản đồ.

💡 Hình dung: Coi mỗi câu là một điểm trên một tấm bản đồ khổng lồ — nhưng thay vì tọa độ kinh độ/vĩ độ, trục của tấm bản đồ này là "ý nghĩa". Câu nào có nghĩa gần nhau thì điểm của chúng nằm gần nhau trên bản đồ; câu nào chẳng liên quan gì thì điểm nằm cách xa nhau. Embedding model chính là công cụ tính ra tọa độ đó.

Ví dụ: "dogs allowed" (cho phép nuôi chó) và "pets permitted" (cho phép nuôi thú cưng) dùng từ ngữ khác nhau hoàn toàn, nhưng ý nghĩa gần nhau — nên vector của chúng nằm gần nhau trên bản đồ. Ngược lại, "remote work" (làm việc từ xa) chẳng liên quan gì tới hai câu trên, nên vector của nó nằm cách xa cả hai.

Vector Space: Similar Meaning = Nearby Pointsmeaning dimension 1 →meaning dimension 2 →"dogs allowed""pets permitted"similarity 0.89"remote work"similarity 0.12Close points → high similarity score · far points → low similarity score

Similarity score: đo độ giống nhau bằng một con số

Nếu ý nghĩa được biểu diễn bằng tọa độ trên bản đồ, thì "hai câu giống nhau tới đâu" chính là khoảng cách giữa hai tọa độ đó, quy về một con số cụ thể gọi là similarity score. Con số này thường nằm trong khoảng 0 đến 1: càng gần 1 nghĩa là càng giống nhau về ý nghĩa, càng gần 0 là càng không liên quan — như minh họa ở diagram trên.

Đây chính là con số bạn sẽ gặp lại xuyên suốt phần sau của bài, dưới nhiều tên gọi khác nhau như "similarity", "threshold" — nhưng bản chất vẫn luôn là một: mức độ gần nhau giữa hai vector.

Chunk: mảnh nhỏ để lưu và tìm tài liệu

Một tài liệu dài — ví dụ một hợp đồng vài chục trang — không thể nhét nguyên văn vào một vector duy nhất mà vẫn giữ được độ chính xác. Vì vậy trước khi embedding, tài liệu được cắt thành các mảnh nhỏ hơn gọi là chunk (thường vài trăm ký tự mỗi mảnh), rồi mỗi chunk mới được chuyển thành một vector riêng.

Cắt nhỏ như vậy giải quyết cùng lúc hai vấn đề: mỗi vector chỉ đại diện cho một ý tương đối trọn vẹn nên so sánh chính xác hơn, và khi cần đưa dữ liệu cho AI trả lời, chỉ cần đưa đúng vài chunk liên quan nhất — chứ không phải nhét cả tài liệu 500GB vào, điều mà không AI assistant nào làm được, đúng như vấn đề đặt ra ở mục 1.

Từ nền tảng đó: RAG lưu tài liệu như thế nào?

Nắm được ba khái niệm trên, ý tưởng của RAG trở nên đơn giản: tài liệu được cắt thành chunk, mỗi chunk được embedding thành vector, và toàn bộ vector đó được lưu sẵn vào một vector database. Việc này chỉ cần làm một lần — mọi câu hỏi sau đó đều tái sử dụng lại "bản đồ ý nghĩa" đã dựng sẵn, thay vì quét lại từ đầu 500GB tài liệu.

Phương pháp này gọi là RAG — Retrieval Augmented Generation.

Ví dụ use case xuyên suốt phần còn lại của bài: công ty muốn AI assistant trả lời được câu hỏi kiểu "Can you tell me about last year's service agreement with CodeCloud?" (Cho tôi biết về thỏa thuận dịch vụ năm ngoái với CodeCloud).

Storing Documents as Vector EmbeddingsDocuments(text, meaning)Embedding Modelword → numbersVectorspreserve semanticsVector Databasechunked for retrievalComputers think in numbers, not words — this is how RAG makes 500GB searchable by meaning

4. Ba bước của RAG: Retrieval, Augmentation, Generation

Vậy RAG thực sự hoạt động ra sao? Cần chia nhỏ thành ba bước: Retrieval, Augmentation, và Generation.

Retrieval (Truy xuất)

Giống hệt cách tài liệu được chuyển thành vector embedding để lưu vào database, câu hỏi của user cũng được chuyển đổi y hệt như vậy — qua cùng một embedding model, ra cùng một dạng vector. Nhờ vậy, embedding của câu hỏi và embedding của từng chunk tài liệu nằm chung trên một "bản đồ ý nghĩa", và có thể so sánh trực tiếp bằng similarity score đã nói ở mục 3: chunk nào có similarity score cao nhất với câu hỏi, chunk đó được coi là liên quan nhất.

Kiểu tìm kiếm này gọi là semantic search — thay vì search bằng keyword tĩnh, hệ thống tìm nội dung liên quan dựa trên việc khớp ý nghĩa và ngữ cảnh của câu query với tài liệu.

Augmentation (Tăng cường)

Augmentation trong RAG là quá trình dữ liệu vừa truy xuất được injected (chèn) vào prompt ngay tại runtime.

Vì sao điều này đặc biệt? Vì AI assistant thông thường chỉ dựa vào kiến thức tĩnh học được lúc pre-training — và kiến thức đó có thể lỗi thời rất nhanh. Mục tiêu ở đây là để AI assistant dựa vào thông tin cập nhật trong vector database. Vậy nên tại runtime, cần cung cấp cho AI assistant những chi tiết quan trọng có thể giúp trả lời câu hỏi.

Trong RAG, kết quả semantic search được gắn thêm vào prompt, đóng vai trò như một "augmented knowledge" (kiến thức được tăng cường). Với công ty, AI assistant được cung cấp chi tiết về tài liệu công ty — dữ liệu thật, cập nhật, và riêng tư. Tất cả việc này diễn ra mà không cần fine-tune AI model hay chỉnh sửa large language model.

Generation (Sinh câu trả lời)

Đây là bước AI assistant sinh ra câu trả lời dựa trên dữ liệu liên quan về mặt ngữ nghĩa đã truy xuất từ vector database.

Với prompt ban đầu "Can you tell me about last year's service agreement with CodeCloud?", AI assistant sẽ thể hiện sự hiểu biết về knowledge base của công ty bằng cách dùng các tài liệu liên quan tới thỏa thuận dịch vụ với CodeCloud. Vì prompt ban đầu có nêu rõ tiêu chí "năm ngoái", bước generation sẽ dùng khả năng reasoning của chính nó để xử lý dữ liệu được cung cấp và đưa ra câu trả lời tốt nhất cho câu hỏi.

RAG in Action: Retrieval → Augmentation → GenerationQuestion: "Can you tell me about last year's service agreement with CodeCloud?"1. RetrievalQuestion → embeddingCompare vs documentvectors (semantic search)2. AugmentationRetrieved docs injectedinto prompt at runtime= "augmented knowledge"3. GenerationLLM reasons overretrieved data+ "last year" filterAnswer grounded in CodeCloud agreement docsWhy Augmentation mattersAI assistants normally rely on static pre-training knowledge, which goes stale fastRAG lets it use real, up-to-date, private data — no fine-tuning needed

5. Calibrate RAG: chunking, embedding, và retrieval strategy

RAG là một hệ thống rất mạnh, có thể ngay lập tức cải thiện chiều sâu kiến thức vượt ra ngoài dữ liệu training. Nhưng cũng như bất kỳ hệ thống nào khác, biết cách calibrate (hiệu chỉnh) là một kỹ năng cần học để có kết quả tốt hơn.

Ba khái niệm nền tảng ở mục 3 — chunk, embedding, similarity score — chính là ba chỗ cần calibrate. Để setup một hệ thống RAG, cần áp dụng các chiến lược khác nhau:

  • Chunking strategy: xác định size (kích thước mỗi chunk) và overlap (phần nội dung lặp lại giữa hai chunk liền kề, để không cắt đứt ý ngay giữa câu).
  • Embedding strategy: quyết định dùng embedding model nào để chuyển chunk thành vector.
  • Retrieval strategy: đặt threshold — similarity score tối thiểu mà một chunk phải đạt được thì mới được coi là liên quan — cùng các filter bổ sung muốn thêm vào dataset.

Nhưng liệu một chiến lược chunking có dùng chung được cho mọi loại dữ liệu không? Không hẳn. Setup một hệ thống RAG sẽ khác nhau giữa hệ thống này với hệ thống khác, vì nó phụ thuộc nặng vào dataset đang lưu trữ. Ví dụ, tài liệu pháp lý (legal documents) sẽ cần chunking strategy khác với tài liệu transcript hỗ trợ khách hàng. Lý do là tài liệu pháp lý thường có đoạn văn dài, có cấu trúc, cần được giữ nguyên vẹn. Trong khi đó, transcript hội thoại có thể chunk ở cấp độ câu (sentence level) với overlap cao để giữ context vẫn ổn.

Chunking Strategy Depends on the DatasetLegal DocumentsLong structured paragraph — 1 chunkStructure must be preserved→ larger, paragraph-level chunksCutting mid-clause breakslegal meaningConversational Transcriptsentence-level chunks, high overlapFine to chunk at sentence level→ smaller chunks OKHigh overlap keepsconversational context

6. Thực hành: xây dựng RAG system trong lab TechCorp

Sau khi nắm các yếu tố khái niệm của RAG, hãy thử bắt tay vào một lab thực hành để xem RAG trông như thế nào ở mức thực tế. Nhiệm vụ đặt ra cho bạn: 500GB tài liệu của TechCorp cần được chuyển thành câu trả lời chính xác tức thì thông qua một hệ thống RAG.

Chuẩn bị: môi trường và dữ liệu

Bước đầu tiên là setup development environment: tạo Python virtual environment, activate nó, cài UV, rồi cài thêm ChromaDB, Sentence Transformers, OpenAI, và Flask.

# UV tạo virtual environment
uv venv
source .venv/bin/activate

# Cài các package cần cho lab
uv pip install chromadb sentence-transformers openai flask

Tiếp theo là review document vault của TechCorp — một repo mô phỏng gồm các tài liệu Markdown: employee handbook, product specs, meeting notes, và frequently asked questions. Điểm mấu chốt là xử lý các tài liệu này như một enterprise corpus thật, và làm cho chúng search được theo ý nghĩa (meaning), không chỉ theo keyword.

Xây dựng knowledge base: vector database, chunking, và embedding

Khởi tạo vector database: chạy ChromaDB cục bộ bằng persistent client, tạo một collection tên techcorp_docs. Đây chính là nơi lưu trữ "bộ não AI".

import chromadb

client = chromadb.PersistentClient(path="./chroma_db")
collection = client.get_or_create_collection(name="techcorp_docs")

Về chunking strategy: viết một script nhỏ để chunk text với size 500 và overlap 100. Cách này giữ được context xuyên qua các ranh giới đoạn, cải thiện chất lượng retrieval. Script in ra thống kê chunk và ghi một file verification kèm số lượng chunk.

Về embedding: load model all-MiniLM-L6-v2 từ sentence-transformers, encode một vài câu ngắn, rồi tính similarity. Ý tưởng lớn ở đây: cả câu hỏi lẫn tài liệu đều trở thành vector, nên có thể đo được ý nghĩa (meaning) chứ không chỉ từ ngữ. Ví dụ: "dogs allowed" và "pets permitted" có similarity cao, trong khi "remote work" thì không có similarity với hai câu trên.

from sentence_transformers import SentenceTransformer

model = SentenceTransformer("all-MiniLM-L6-v2")
embeddings = model.encode(["dogs allowed", "pets permitted", "remote work"])

Bước tiếp theo là "feed the AI brain" — pipeline ingest dữ liệu: lặp qua từng tài liệu của TechCorp, chunk với file size 500 và stride 400, embed từng chunk bằng all-MiniLM-L6-v2, rồi lưu vector cùng metadata vào collection techcorp_docs. Pipeline log tiến trình theo từng file và ghi ra một summary.

Kích hoạt tìm kiếm ngữ nghĩa và giao diện web

Kích hoạt semantic search: xây một search engine script nhỏ, load collection, embed ba câu query kiểu CEO hay hỏi, rồi lấy top kết quả theo semantic similarity. Script ghi kết quả ra file và in ra output có cấu trúc.

Sau đó, launch một giao diện web đơn giản: chạy một Flask app ở port 5000.

if __name__ == "__main__":
app.run(port=5000)

Kiểm thử như CEO

Mở app lên và thử các câu hỏi như "What's the pet policy?" (Chính sách về thú cưng là gì?), quan sát luồng RAG hoạt động: retrieve, augment, generate kèm nguồn (sources). Đây chính là lúc giá trị demo thể hiện rõ nhất: câu trả lời được "ground" (bám chắc) vào tài liệu riêng của công ty.

Với retrieval, augmentation, và generation đã sẵn sàng cùng một UI để đặt câu hỏi, kết quả là một hệ thống RAG end-to-end: nhanh, có căn cứ (grounded), và có thể mở rộng.

TechCorp Lab: End-to-End RAG PipelineIngest (offline)TechCorp docsChunksize 500 / stride 400Embedall-MiniLM-L6-v2ChromaDBtechcorp_docsQuery (online)"What's the pet policy?"Embed querySemantic searchFlask UI :5000retrieve · augment · generatevector search hitsIngest builds the AI brain once — every query reuses it instead of re-scanning 500GB

7. Những điểm cần lưu ý khi triển khai thực tế

  • Model: all-MiniLM-L6-v2 — nhỏ gọn và hiệu quả.
  • Chunking: size 500, overlap 400 cho phần test, stride 400 lúc ingestion — cả hai đều giữ context tốt hơn cho khả năng recall.
  • Storage: ChromaDB dùng persistent client, với collection techcorp_docs.
  • Web: Flask app đơn giản trên port 5000 để đánh giá nhanh.
  • Safety: similarity threshold giữ cho các kết quả khớp chất lượng thấp không lọt vào, giảm hallucination.
Similarity Threshold: Filtering Out Low-Quality MatchesQuery embeddingThreshold linesimilarity 0.91 ✓ keptsimilarity 0.84 ✓ keptsimilarity 0.31 ✗ discardedOnly matches abovethe threshold reachthe promptLow-quality matches never reach the LLM → fewer hallucinated answers

Bạn nên tự khám phá thêm các câu hỏi trong lab và quan sát chất lượng retrieval cùng độ hữu ích của câu trả lời thay đổi thế nào khi tinh chỉnh những tham số nhỏ.

8. Kết luận

Từ con số 0, đã có được một hệ thống RAG hoạt động được, có test thật đi kèm, cấu trúc rõ ràng, và một giao diện demo. Bạn cũng có thể tự làm điều tương tự — hãy thử tự tay xây dựng một hệ thống RAG của riêng mình.


Nguồn tham khảo

Nguồn gốc: RAG Explained For Beginners — kênh KodeKloud

Ghi chú kỹ thuật (fact-check bổ sung):