Mini Project – Xây Dựng AI Agent Trả Lời Khách Hàng Tự Động
Sau khi học xong các kiến thức về ML, NLP, Generative AI, đã đến lúc bạn áp dụng để tạo AI Agent thực sự – một trợ lý ảo tự động trả lời khách hàng, tiết kiệm hàng giờ chăm sóc thủ công.
Nội dung bài viết
Bài toán
Doanh nghiệp nhận hàng trăm câu hỏi lặp đi lặp lại mỗi ngày (giờ mở cửa, bảng giá, bảo hành…).
-
Nhân viên phải trả lời thủ công → mất thời gian, tắc nghẽn giờ cao điểm.
-
Tốc độ phản hồi chậm → khách dễ rời đi, mất lead.
-
Kiến thức tản mạn nhiều nơi (file rời, email, PDF) → khó chuẩn hoá.
Mục tiêu: Dùng AI để trả lời chính xác, nhanh, 24/7, và có kiểm soát.
Kiến trúc giải pháp (RAG – Retrieval-Augmented Generation)
✅ Bước 1 – Chuẩn bị dữ liệu
-
Thu thập FAQ, tài liệu sản phẩm, chính sách (docx, PDF, HTML, nội dung CRM).
-
Chuẩn hoá: bỏ trùng lặp, cập nhật phiên bản mới nhất, gắn metadata (loại tài liệu, ngày hiệu lực, sản phẩm liên quan).
-
Chunking: cắt tài liệu thành đoạn 300–800 token để tăng độ khớp khi tìm kiếm.
-
(Optional) Phiên bản đa ngôn ngữ: vi–en nếu cần hỗ trợ KH quốc tế.
✅ Bước 2 – Vector Database & Embedding
-
Dùng OpenAI Embedding (text-embedding-3-small cho chi phí rẻ) hoặc FAISS để lưu & tìm kiếm ngữ nghĩa (semantic search).
-
Lưu thông tin: vector, văn bản gốc, nguồn (source), ngày cập nhật.
-
Thiết lập top_k (ví dụ 3–5) và điểm ngưỡng (similarity threshold) để lọc nhiễu.
✅ Bước 3 – Chat Engine (RAG)
-
Pipeline: User Query → Retrieval (từ vector DB) → LLM tạo câu trả lời dựa trên context đã truy xuất.
-
Prompt có hạn chế phạm vi: “Nếu không đủ thông tin, hãy nói không chắc và bật fallback.”
-
Gắn câu trích dẫn nguồn (source) để tăng độ tin cậy.
✅ Bước 4 – Tích hợp đa kênh
-
Website (widget chat), Facebook Fanpage, Zalo OA, CRM/Helpdesk (Zendesk/Freshdesk).
-
Sử dụng webhook / API để nhận tin nhắn và trả lời tự động.
-
Single brain, multi-channel: cùng 1 kho tri thức, phục vụ nhiều kênh.
Demo code (tối giản mà “ra tiền”)
Minh hoạ ý tưởng: indexing + search + RAG + fallback. Bạn có thể swap FAISS bằng một vector DB khác (Pinecone, Chroma, PGVector…).
# pip install openai faiss-cpu tiktoken pydantic
from openai import OpenAI
import faiss, numpy as np
from dataclasses import dataclass
client = OpenAI()
EMBED_MODEL = "text-embedding-3-small"
CHAT_MODEL = "gpt-4o"
# ===== 1) DỮ LIỆU MẪU =====
docs = [
{
"id": "policy-warranty",
"text": "Chính sách bảo hành sản phẩm A: Bảo hành 12 tháng, 1 đổi 1 trong 30 ngày đầu kể từ ngày mua.",
"source": "docs/warranty_A.pdf",
"effective_date": "2025-01-01"
},
{
"id": "business-hours",
"text": "Giờ mở cửa: Thứ 2–Thứ 6 từ 8:00–18:00, Thứ 7 từ 9:00–16:00, Chủ nhật nghỉ.",
"source": "docs/faq_hours.docx",
"effective_date": "2025-06-01"
},
]
# ===== 2) LẬP CHỈ MỤC (INDEX) =====
def embed_texts(texts: list[str]) -> np.ndarray:
resp = client.embeddings.create(model=EMBED_MODEL, input=texts)
return np.array([d.embedding for d in resp.data], dtype="float32")
emb_matrix = embed_texts([d["text"] for d in docs])
index = faiss.IndexFlatIP(emb_matrix.shape[1])
# Chuẩn hoá vector để dùng cosine với inner-product
faiss.normalize_L2(emb_matrix)
index.add(emb_matrix)
# ===== 3) TRUY XUẤT (RETRIEVE) =====
@dataclass
class RetrievalResult:
text: str
source: str
score: float
def retrieve(query: str, top_k: int = 3, score_threshold: float = 0.28) -> list[RetrievalResult]:
qv = embed_texts([query]).astype("float32")
faiss.normalize_L2(qv)
scores, idx = index.search(qv, top_k) # inner-product ~ cosine sim (vì đã normalize)
out = []
for s, i in zip(scores[0], idx[0]):
if i == -1:
continue
if s < score_threshold:
continue
out.append(RetrievalResult(text=docs[i]["text"], source=docs[i]["source"], score=float(s)))
return out
# ===== 4) TỔ HỢP NGỮ CẢNH + LLM =====
SYS_TEMPLATE = """Bạn là AI Agent hỗ trợ CSKH.
Chỉ trả lời dựa trên THÔNG TIN DƯỚI ĐÂY.
Nếu không đủ dữ liệu, hãy nói 'Mình chưa đủ thông tin' và đề xuất chuyển nhân viên.
Kèm nguồn (source) nếu có."""
def build_context(blocks: list[RetrievalResult]) -> str:
ctx = []
for b in blocks:
ctx.append(f"- {b.text}\n (source: {b.source}; score: {b.score:.2f})")
return "\n".join(ctx) if ctx else "KHÔNG CÓ NGỮ CẢNH PHÙ HỢP."
def answer(query: str):
hits = retrieve(query, top_k=3)
context = build_context(hits)
messages = [
{"role": "system", "content": SYS_TEMPLATE + "\n\nTHÔNG TIN:\n" + context},
{"role": "user", "content": query},
]
resp = client.chat.completions.create(model=CHAT_MODEL, messages=messages)
return resp.choices[0].message.content, hits
# ===== 5) CHẠY DEMO =====
query = "Chính sách bảo hành sản phẩm A là gì?"
reply, hits = answer(query)
print("Q:", query)
print("A:", reply)
Điểm hay trong demo:
-
Chuẩn hoá vector → dùng inner product như cosine.
-
Có score_threshold để tránh “bịa”.
-
System prompt ràng buộc phạm vi, yêu cầu trích nguồn.
-
Output có thể kèm
(source)
giúp đội CS nhìn thấy nguồn gốc.
Giá trị mang lại
🎓 Học viên
-
Thấy rõ end-to-end: từ ML/NLP → Embedding → RAG → tích hợp kênh.
-
Cầm được một mini project deploy được thật, không chỉ lý thuyết.
-
Học cách tối ưu chi phí (chọn embedding rẻ, cache, batch).
🏢 Doanh nghiệp
-
Giảm chi phí CSKH, tăng tốc độ phản hồi, hoạt động 24/7.
-
Tự động hoá câu hỏi lặp lại, nhân sự tập trung case phức tạp.
-
Dễ mở rộng tri thức (thêm file = thêm kiến thức), có log để cải thiện.
Lưu ý khi triển khai (checklist thực chiến)
-
Dữ liệu & chất lượng
-
Luôn log câu hỏi + câu trả lời + nguồn để cải tiến.
-
Chu kỳ cập nhật tài liệu (ví dụ: 2 tuần/lần). Gắn
effective_date
để versioning.
-
Fallback an toàn
-
Nếu điểm thấp hoặc “không chắc”, chuyển người thật (route sang CRM/Zalo OA Inbox).
-
Hiển thị form liên hệ nhanh (sđt/email) để không mất lead.
-
Guardrails & kiểm soát
-
Whitelist domain nguồn, cấm trả lời ngoài phạm vi.
-
Ẩn thông tin nhạy cảm (PII) bằng regex trước khi gửi lên LLM.
-
Triển khai & vận hành
-
Dev: Docker hoá worker RAG; Redis queue cho multi-channel.
-
Prod: Monitor latency, CSAT, deflection rate (tỷ lệ không cần human).
-
Caching embedding & batch hoá request để tối ưu chi phí.
KPI gợi ý:
-
FRT (First Response Time) < 3 giây.
-
Answer Confidence ≥ 0.75 (theo thang nội bộ).
-
Deflection Rate ≥ 40% sau 4 tuần.
-
CSAT ≥ 4.3/5 cho câu hỏi FAQ.
Kết luận
Mini project này giúp bạn đóng trọn vòng học AI: từ nền tảng ML/NLP → RAG thực chiến → tích hợp đa kênh. Đây là bước biến AI từ “môn học” thành “lợi thế cạnh tranh” của doanh nghiệp: nhanh hơn, rẻ hơn, chính xác hơn – và có kiểm soát.
🎓 Chương trình AI Agent tại MCI Academy
-
Dự án tốt nghiệp: Xây AI Agent trả lời khách hàng trên dữ liệu thật của bạn.
-
Mentor review 1:1: Soát pipeline, giảm chi phí, nâng độ chính xác.
-
Tài nguyên đi kèm: Template RAG, Docker compose, checklist bảo trì.
📞 Hotline: 0352.433.233
📧 Email: cskh@mcivietnam.com

Các khóa học
- Mastering AWS : From Basics to Applications Specialized
- Data Engineer Track Specialized
- Combo Data Engineering Professional Hot
- AI & DASHBOARD – CHỈ 990K Hot
- Combo Python Level 1 & Level 2 Bestseller
- Business Intelligence Track Hot
- Data Science Track Bestseller
- Data Analyst Professional (Data Analyst with Python Track) Bestseller
- RPA UiPath Nâng Cao: Chiến Thuật Automation Cho Chuyên Gia Specialized
- RPA UiPath cho Người Mới Bắt Đầu: Thành Thạo Automation Chỉ Trong 1 Ngày Specialized
- Business Analyst Fast Track Bestseller
- Business Analyst Bestseller
Đăng ký tư vấn khóa học
*Vui lòng nhập số điện thoại của bạn
*Vui lòng nhập họ tên của bạn
*Vui lòng chọn giới tính
*Vui lòng chọn 1 trường