RAG với Claude — Xây dựng hệ thống truy xuất thông tin từ A đến Z
Điểm nổi bật
Nhấn để đến mục tương ứng
- 1 Bạn có thể bắt đầu ngay với hướng dẫn chi tiết: Claude rất giỏi nhiều tác vụ, nhưng sẽ gặp khó khi trả lời câu hỏi đặc thù cho business của bạn. Mỗi bước được thiết kế để giảm thiểu sai sót và tối ưu kết quả từ lần đầu sử dụng.
- 2 Góc nhìn thực tế: Pipeline cơ bản gồm 3 bước: Chunk tài liệu theo heading — Chia Claude Documentation thành các phần nhỏ theo tiêu đề. Điều quan trọng là hiểu rõ khi nào nên và không nên áp dụng phương pháp này.
- 3 Hiệu quả thực chứng: Dataset đánh giá 100 samples, mỗi sample gồm: Câu hỏi có sample cần tổng hợp từ nhiều chunk Golden chunks — chunks. Người dùng áp dụng đúng cách thường thấy kết quả cải thiện rõ rệt từ những lần đầu tiên.
- 4 Áp dụng ngay: Pipeline 2 giai đoạn Over-retrieve — Lấy 20 chunks thay vì 3 cast a wider net Rerank với Claude — Đưa 20 summaries + — phần này cung cấp quy trình cụ thể giúp bạn triển khai hiệu quả mà không cần thử nghiệm nhiều lần.
- 5 Một điều ít người đề cập: Luôn đánh giá retrieval và end-to-end riêng biệt Retrieval tốt nhưng generation kém hoặc ngược lại cần giải pháp khác. Hiểu rõ bối cảnh áp dụng sẽ quyết định 80% thành công khi triển khai.
Trong bài hướng dẫn này, bạn sẽ xây dựng một hệ thống Retrieval Augmented Generation (RAG) hoàn chỉnh sử dụng Claude. Chúng ta sẽ đi qua 3 cấp độ: RAG cơ bản (71% accuracy) → Summary Indexing (78%) → Reranking (81%), kèm hệ thống đánh giá bài bản với 5 metrics.
Bài viết dựa trên Claude Cookbooks chính thức của Anthropic, sử dụng Claude Documentation làm knowledge base demo.
RAG là gì và tại sao cần thiết?
Claude rất giỏi nhiều tác vụ, nhưng sẽ gặp khó khi trả lời câu hỏi đặc thù cho business của bạn. RAG giải quyết vấn đề này bằng cách cho Claude truy cập vào knowledge base nội bộ — tài liệu hỗ trợ khách hàng, FAQ nội bộ, tài liệu pháp lý, code documentation — khi trả lời câu hỏi.
Doanh nghiệp đang ngày càng xây dựng ứng dụng RAG cho:
- Customer support — Trả lời dựa trên knowledge base sản phẩm
- Q&A nội bộ — Tìm thông tin trong tài liệu công ty
- Phân tích tài chính, pháp lý — Truy xuất điều khoản liên quan
- Code generation — Tham chiếu API docs khi sinh code
Level 1: RAG cơ bản (Naive RAG)
Pipeline cơ bản gồm 3 bước:
- Chunk tài liệu theo heading — Chia Claude Documentation thành các phần nhỏ theo tiêu đề
- Embed mỗi chunk — Chuyển thành vector bằng Voyage AI embeddings
- Cosine similarity — Khi có câu hỏi, tìm chunks tương tự nhất rồi đưa vào prompt Claude
class VectorDB:
def __init__(self, embedding_model="voyage-2"):
self.voyage_client = voyageai.Client()
self.model = embedding_model
self.embeddings = []
self.metadata = []
def add_documents(self, documents):
# Embed theo batch 128 chunks
for batch in chunks(documents, 128):
embeddings = self.voyage_client.embed(
[doc['text'] for doc in batch],
model=self.model
)
self.embeddings.extend(embeddings)
self.metadata.extend(batch)
def search(self, query, k=5):
query_embedding = self.voyage_client.embed(
[query], model=self.model
)[0]
# Cosine similarity
scores = cosine_similarity(
[query_embedding], self.embeddings
)[0]
top_k = np.argsort(scores)[-k:][::-1]
return [self.metadata[i] for i in top_k]
Hệ thống đánh giá — Đo lường trước khi cải tiến
Một sai lầm phổ biến khi xây RAG là đánh giá theo "vibes" — chạy vài câu hỏi, thấy ổn rồi deploy. Cách làm đúng: xây evaluation suite trước khi tối ưu.
Dataset đánh giá
100 samples, mỗi sample gồm:
- Câu hỏi (có sample cần tổng hợp từ nhiều chunk)
- Golden chunks — chunks chính xác cần truy xuất
- Đáp án đúng để so sánh end-to-end
5 metrics quan trọng
Retrieval metrics (đánh giá phần truy xuất):
| Metric | Ý nghĩa | Công thức |
|---|---|---|
| Precision | Trong các chunks truy xuất được, bao nhiêu % là đúng? | True Positives / Total Retrieved |
| Recall | Trong tất cả chunks đúng tồn tại, bao nhiêu % được tìm thấy? | True Positives / Total Correct |
| F1 Score | Trung bình harmonic của Precision và Recall | 2 × (P × R) / (P + R) |
| MRR | Chunk đúng đầu tiên xuất hiện ở vị trí nào? | 1/|Q| × Σ(1/rank_i) |
End-to-end metric:
- Accuracy — Dùng Claude làm judge đánh giá câu trả lời cuối cùng có đúng không
Level 2: Summary Indexing — Embed thông minh hơn
Thay vì embed raw chunks, chúng ta tạo tóm tắt 2-3 câu cho mỗi chunk bằng Claude, rồi embed heading + summary + original content cùng nhau.
def create_summary(chunk_text):
response = client.messages.create(
model="claude-haiku-4-5",
messages=[{
"role": "user",
"content": f"""Tóm tắt đoạn text sau trong 2-3 câu:
{chunk_text}"""
}],
max_tokens=150
)
return response.content[0].text
# Kết hợp khi embed
combined_text = f"{heading}\n{summary}\n{original_text}"
embedding = voyage_client.embed(combined_text)
Summary giúp embeddings capture ý nghĩa chính xác hơn — thay vì chỉ dựa vào từ ngữ thô trong chunk.
Kết quả sau Summary Indexing
| Metric | Basic RAG | + Summary | Thay đổi |
|---|---|---|---|
| Avg Precision | 0.43 | 0.43 | — |
| Avg Recall | 0.66 | 0.67 | +0.01 |
| Avg F1 | 0.52 | 0.52 | — |
| Avg MRR | 0.74 | 0.80 | +0.06 |
| E2E Accuracy | 71% | 78% | +7% |
MRR cải thiện mạnh (+0.06) nghĩa là chunk đúng được xếp hạng cao hơn đáng kể. End-to-end accuracy nhảy từ 71% lên 78%.
Level 3: Reranking với Claude (81%)
Bước cuối: dùng Claude đánh giá lại và sắp xếp thứ tự các chunks đã truy xuất.
Pipeline 2 giai đoạn
- Over-retrieve — Lấy 20 chunks thay vì 3 (cast a wider net)
- Rerank với Claude — Đưa 20 summaries + query cho Claude, yêu cầu chọn và xếp hạng top 3 liên quan nhất
def rerank_results(query, results, k=3):
summaries = "\n".join([
f"[{i}] {r['summary']}" for i, r in enumerate(results)
])
response = client.messages.create(
model="claude-sonnet-4-6",
messages=[{
"role": "user",
"content": f"""Query: {query}
Documents:
{summaries}
Chọn {k} documents liên quan nhất.
Trả về indices theo thứ tự relevance giảm dần.
Format: [index1, index2, index3]"""
}],
max_tokens=100
)
indices = parse_indices(response.content[0].text)
return [results[i] for i in indices[:k]]
Kết quả cuối cùng
| Metric | Basic | + Summary | + Reranking |
|---|---|---|---|
| Avg Precision | 0.43 | 0.43 | 0.44 |
| Avg Recall | 0.66 | 0.67 | 0.69 |
| Avg F1 | 0.52 | 0.52 | 0.54 |
| Avg MRR | 0.74 | 0.80 | 0.87 |
| E2E Accuracy | 71% | 78% | 81% |
Từ 71% lên 81% accuracy — cải thiện 14% tương đối. MRR từ 0.74 lên 0.87 nghĩa là chunk đúng gần như luôn ở vị trí đầu tiên.
Best practices cho production RAG
1. Luôn đánh giá retrieval và end-to-end riêng biệt
Retrieval tốt nhưng generation kém (hoặc ngược lại) cần giải pháp khác nhau. Đánh giá riêng giúp bạn biết cần tối ưu ở đâu.
2. Invest vào evaluation dataset
Dataset đánh giá chất lượng cao là tài sản quan trọng nhất của hệ thống RAG. Dành thời gian tạo dataset đa dạng, bao gồm cả câu hỏi dễ và khó.
3. Summary Indexing cho ROI tốt nhất
Summary Indexing là kỹ thuật cho cải thiện lớn nhất với effort thấp nhất. Bắt đầu từ đây trước khi thêm complexity.
4. Reranking khi cần precision cao
Reranking thêm latency (~200ms) nhưng cải thiện đáng kể precision. Phù hợp khi câu trả lời cần chính xác tuyệt đối (pháp lý, y tế, tài chính).
5. Dùng Promptfoo cho systematic evaluation
Jupyter Notebook tốt cho prototyping, nhưng khi dataset lớn và prompts nhiều, cần tooling chuyên biệt. Promptfoo giúp so sánh models, hyperparameters, và prompts tự động.
Áp dụng cho dự án của bạn
- Customer support bot — RAG trên FAQ + product docs
- Internal knowledge assistant — RAG trên wiki nội bộ
- Legal assistant — RAG trên hợp đồng, luật, quy định
- Code assistant — RAG trên codebase + API documentation
Bước tiếp theo: Đọc thêm về Contextual Retrieval để nâng cấp RAG lên level tiếp theo, và Prompt Engineering nâng cao để tối ưu prompts trong pipeline.
Bai viet co huu ich khong?
Bản quyền thuộc về tác giả. Vui lòng dẫn nguồn khi chia sẻ.




