Site logo
Tác giả
  • avatar Nguyễn Đức Xinh
    Name
    Nguyễn Đức Xinh
    Twitter
Ngày xuất bản
Ngày xuất bản

Kết hợp Fine-tuned Model với RAG để tạo Chatbot trả lời tài liệu nội bộ

🧠 Kết hợp Fine-tuned Model với RAG (Retrieval-Augmented Generation) để tạo Chatbot trả lời tài liệu nội bộ

Trong kỷ nguyên AI hiện nay, Large Language Models (LLMs) như LLaMA, Mistral, hay Falcon đang trở thành “trái tim” của nhiều hệ thống thông minh.
Tuy nhiên, khi áp dụng vào môi trường doanh nghiệp, các mô hình này không thể tự biết về tài liệu nội bộ, quy trình công ty hay dữ liệu bí mật.

Giải pháp cho vấn đề đó chính là kết hợp Fine-tuned LLM với RAG (Retrieval-Augmented Generation) — một kiến trúc cho phép chatbot vừa hiểu, vừa truy cập đúng thông tin nội bộ, vừa đảm bảo tính bảo mật.


1️⃣ Tổng quan: RAG là gì?

RAG (Retrieval-Augmented Generation) là một kiến trúc AI kết hợp giữa:

  • Retriever: Truy xuất các đoạn văn bản liên quan từ cơ sở tri thức (knowledge base) bằng kỹ thuật vector search.
  • Generator: Mô hình ngôn ngữ (LLM) tạo ra câu trả lời dựa trên các đoạn đã được truy xuất.

💬 Nói cách khác: RAG = Retriever + Generator
Thay vì để mô hình “tự nghĩ ra”, ta cung cấp cho nó ngữ cảnh thực tế từ tài liệu nội bộ trước khi trả lời.


2️⃣ Vì sao cần Fine-tune LLM trước khi tích hợp RAG?

Fine-tuning giúp mô hình:

  • Hiểu đúng phong cách, thuật ngữ chuyên ngành nội bộ.
  • Giảm “hallucination” (bịa nội dung).
  • Phản hồi theo giọng điệu, quy chuẩn công ty.

Ví dụ: nếu bạn đang xây chatbot cho công ty phần mềm, bạn có thể fine-tune model để hiểu các thuật ngữ như “deployment pipeline”, “JIRA ticket”, “git rebase”... thay vì trả lời chung chung.

Sau khi fine-tune, mô hình sẽ:

  • Hiểu câu hỏi tự nhiên từ nhân viên.
  • Diễn đạt câu trả lời đúng bối cảnh.
  • Sử dụng ngữ điệu nhất quán trong toàn hệ thống.

3️⃣ Cấu trúc hệ thống RAG kết hợp Fine-tuned Model

Sơ đồ tổng thể:


[User] → [API Gateway] → [RAG Service]
↓
┌─────────────────────────────┐
│  Retriever: Vector Database │
│  (FAISS, Milvus, Pinecone)  │
└─────────────────────────────┘
↓
(Top-K relevant text chunks)
↓
┌─────────────────────────────┐
│  Generator: Fine-tuned LLM  │
│  (LLaMA / Mistral / Falcon) │
└─────────────────────────────┘
↓
[Answer + Sources] ← [Response Formatting & Logging]


4️⃣ Các bước triển khai chi tiết

🧩 Bước 1. Chuẩn bị dữ liệu nội bộ

Thu thập mọi nguồn tài liệu:

  • Quy trình công ty, chính sách nhân sự, hướng dẫn kỹ thuật, SOP, tài liệu dự án.
  • Hỗ trợ định dạng .pdf, .docx, .md, .txt, .html.

Tiếp đó:

  • Tiền xử lý (Preprocessing): Loại bỏ ký tự thừa, OCR nếu cần.
  • Chia nhỏ (Chunking): Mỗi đoạn 200–800 tokens để đảm bảo ngữ cảnh không bị cắt ngang.
  • Lưu metadata: source_id, title, page_number, section, …

🧠 Bước 2. Tạo Embeddings và Index

Dùng mô hình embedding để chuyển văn bản thành vector.

from sentence_transformers import SentenceTransformer
import faiss
import numpy as np

embedder = SentenceTransformer("sentence-transformers/all-mpnet-base-v2")
texts = ["Chính sách nghỉ phép năm 2024 ...", "Quy trình phê duyệt chi phí ..."]
embeddings = embedder.encode(texts, normalize_embeddings=True)

index = faiss.IndexFlatIP(embeddings.shape[1])
index.add(embeddings)
faiss.write_index(index, "company_docs.index")

Các vector này lưu trong Vector Database như:

  • 🧩 FAISS (cục bộ, on-prem)
  • ☁️ Milvus / Weaviate / Pinecone (cloud-managed)

🔍 Bước 3. Retriever — Tìm kiếm theo ngữ nghĩa

Retriever nhận câu hỏi, tạo embedding tương ứng, sau đó tìm Top-K đoạn văn bản tương đồng nhất.

query = "Quy trình xin nghỉ phép ở công ty như thế nào?"
query_vector = embedder.encode([query], normalize_embeddings=True)
D, I = index.search(query_vector, k=3)

Kết quả trả về 3 đoạn liên quan nhất từ tài liệu nội bộ.


💬 Bước 4. Generator — Sinh câu trả lời bằng Fine-tuned LLM

Sau khi có các đoạn context, ta ghép lại thành prompt và đưa vào mô hình đã fine-tune:

from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline
import torch

model_path = "./fine_tuned_llama"
tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoModelForCausalLM.from_pretrained(model_path, torch_dtype=torch.float16, device_map="auto")

generator = pipeline("text-generation", model=model, tokenizer=tokenizer)

context = "[1] Công ty cho phép nghỉ phép 12 ngày/năm ...\n[2] ..."
prompt = f"""
Bạn là trợ lý nội bộ. Dựa trên thông tin sau, hãy trả lời chính xác câu hỏi.
Nếu không có thông tin, hãy nói "Tôi không rõ".

Context:
{context}

Question: Quy trình xin nghỉ phép như thế nào?
Answer:
"""

output = generator(prompt, max_new_tokens=256, do_sample=False)
print(output[0]["generated_text"])

⚡ Bước 5. Triển khai thành Chatbot

Gắn pipeline RAG vào backend (ví dụ FastAPI):

POST /query
{
  "question": "Chính sách OT có tính phụ cấp không?"
}

Hệ thống thực hiện:

  1. Embed câu hỏi → tìm context trong vector DB.
  2. Kết hợp context + prompt → gọi LLM.
  3. Trả về answer + nguồn tài liệu.

Kết quả:

{
  "answer": "Theo quy định, nhân viên được tính phụ cấp 150% lương cho giờ làm thêm vào ngày thường.",
  "sources": ["policy_hr_2024.pdf#page=5"]
}

5️⃣ Các kỹ thuật nâng cao để cải thiện độ chính xác

Kỹ thuật Mục đích
Cross-Encoder Reranker Rerank lại kết quả retrieval để tăng độ chính xác.
Hybrid Search (BM25 + Vector) Kết hợp tìm kiếm theo từ khóa và ngữ nghĩa.
Context Compression Giảm độ dài prompt nhưng vẫn giữ thông tin quan trọng.
Caching Layer Lưu kết quả các câu hỏi phổ biến.
Prompt Guardrail Ngăn model “bịa” khi không có context.

6️⃣ Bảo mật và quyền riêng tư

Vì chatbot truy cập tài liệu nội bộ, bảo mật là bắt buộc:

  • 🔒 Triển khai on-premise (hoặc private VPC).
  • 🔐 Mã hóa dữ liệu và vector (AES hoặc disk encryption).
  • ⚙️ RBAC (Role-Based Access Control): chỉ nhân viên có quyền mới truy xuất được tài liệu.
  • 🧾 Audit logging: ghi lại truy vấn (ẩn danh hoặc mã hóa).
  • ⚠️ Không gửi dữ liệu nhạy cảm ra ngoài OpenAI API hoặc dịch vụ công cộng.

7️⃣ Tối ưu hiệu năng và chi phí

  • Quantization (4-bit / 8-bit) giúp mô hình chạy nhanh hơn trên GPU nhỏ.
  • LoRA / QLoRA giúp fine-tune nhanh, tiết kiệm VRAM.
  • Batch Retrieval & Generation giảm latency.
  • Top-K tuning: thử nghiệm K = 3–8 để cân bằng giữa tốc độ và độ chính xác.

8️⃣ Đánh giá và giám sát

Theo dõi các chỉ số quan trọng:

Loại Metric
Retrieval Recall@K, MRR
Generation Accuracy, F1, Hallucination rate
System Latency, GPU utilization, Token/s
User Feedback Satisfaction score, Upvote/Downvote

Dùng các công cụ như Prometheus + Grafana, TensorBoard, hoặc Langfuse để giám sát.


9️⃣ Kết luận

Sự kết hợp giữa Fine-tuned LLM + RAG mang lại một thế hệ chatbot hoàn toàn mới — hiểu sâu ngữ cảnh nội bộ, trả lời chính xác, bảo mật dữ liệu tuyệt đối.

Với kiến trúc này, doanh nghiệp có thể xây dựng:

  • Chatbot hỏi đáp chính sách nhân sự
  • Trợ lý kỹ thuật đọc hiểu tài liệu dự án
  • Hệ thống tìm kiếm tri thức nội bộ cho toàn công ty

🎯 Kết hợp RAG và Fine-tuned Model chính là “chiếc cầu nối giữa AI tổng quát và tri thức riêng của doanh nghiệp.”


🔗 Tài nguyên tham khảo