Case Study Thực Tế: Hệ Thống RAG VUS (Anh Văn Hội Việt Mỹ)
Anh Văn Hội Việt Mỹ (VUS) là hệ thống trung tâm đào tạo Anh ngữ hàng đầu Việt Nam với hơn 80 cơ sở trên toàn quốc. Nhằm nâng cao trải nghiệm tư vấn tuyển sinh và hỗ trợ phụ huynh - học viên 24/7, VUS đã tích hợp Knowledge Base Hub của Pango AI để xây dựng kho tri thức RAG thông minh phục vụ Chatbot AI.
Tài liệu này đóng vai trò như một bản thiết kế tích hợp thực tế (Production Reference Implementation) để các đối tác doanh nghiệp tham khảo kiến trúc, cấu trúc dữ liệu và mã nguồn tích hợp (.NET 8 C#, JSON, cURL, Python).
1. Tổng Quan Dự Án & Thông Số Kỹ Thuật
- Đơn vị thụ hưởng: Anh Văn Hội Việt Mỹ (VUS)
- Đơn vị phát triển giải pháp: Pango AI Team
- Hạ tầng Vector DB: PostgreSQL 18.4 (
pgvector) kết nối định danh"postgres_vng" - Mô hình Embedding: 1536 chiều vector không gian thực
- Endpoint Ingestion (Staging):
POST https://stg-knowledgebase-internal-svc.mydatalakes.com/api/v1/thirdparty - Header xác thực:
x-api-key: cps_kb_secret_2026
3 Danh Mục Tri Thức Cốt Lõi (Collections):
vus_location_locator(eType: location): Dữ liệu định vị hơn 80 cơ sở toàn quốc, tọa độ GPS và đường dẫn Google Maps.vus_course_pricing(eType: pricing_lookup): Bảng giá học phí chuẩn hóa theo bảng Markdown các khóa Happy Kids, Superkids, Young Leaders, iTalk và IELTS.vus_business_sop(eType: sales_sop): Kịch bản tư vấn tuyển sinh, quy trình gọi nhắc hẹn (Appointment Reminder) và cập nhật trạng thái CRM.
2. Thư Viện Tích Hợp Cho .NET 8 / C# Service
Đội ngũ kỹ thuật VUS vận hành hạ tầng Microservices trên nền tảng .NET 8. Dưới đây là các lớp DTO Model và HttpClient Service chuẩn hóa sử dụng System.Text.Json:
using System.Net.Http.Json;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace Vus.Chatbot.Ingestion;
// 1. Root Request Model
public class VusIngestionRequest
{
[JsonPropertyName("connectionSettings")]
public ConnectionSettings ConnectionSettings { get; set; } = new();
[JsonPropertyName("payload")]
public List<IngestionItem> Payload { get; set; } = new();
}
public class ConnectionSettings
{
[JsonPropertyName("connectionId")]
public string ConnectionId { get; set; } = "postgres_vng";
[JsonPropertyName("targetCollection")]
public string TargetCollection { get; set; } = string.Empty;
}
public class IngestionItem
{
[JsonPropertyName("document")]
public string Document { get; set; } = string.Empty;
[JsonPropertyName("metadata")]
public Dictionary<string, object> Metadata { get; set; } = new();
[JsonPropertyName("eType")]
public string EType { get; set; } = string.Empty;
}
// 2. Service Interface & Implementation
public interface IVusKnowledgebaseService
{
Task<bool> IngestDataAsync(VusIngestionRequest request, CancellationToken cancellationToken = default);
}
public class VusKnowledgebaseService : IVusKnowledgebaseService
{
private readonly HttpClient _httpClient;
public VusKnowledgebaseService(HttpClient httpClient)
{
_httpClient = httpClient;
}
public async Task<bool> IngestDataAsync(VusIngestionRequest request, CancellationToken cancellationToken = default)
{
using var response = await _httpClient.PostAsJsonAsync(
"api/v1/thirdparty",
request,
cancellationToken);
if (!response.IsSuccessStatusCode)
{
var errorBody = await response.Content.ReadAsStringAsync(cancellationToken);
throw new HttpRequestException($"VUS Ingestion failed with status {response.StatusCode}: {errorBody}");
}
return true;
}
}Khuyến Nghị Đăng Ký Service .NET
Nên đăng ký
VusKnowledgebaseServicequaIHttpClientFactorytrongProgram.cs:
builder.Services.AddHttpClient<IVusKnowledgebaseService, VusKnowledgebaseService>(client =>
{
client.BaseAddress = new Uri("https://stg-knowledgebase-internal-svc.mydatalakes.com/");
client.DefaultRequestHeaders.Add("x-api-key", "cps_kb_secret_2026");
client.Timeout = TimeSpan.FromSeconds(30);
});3. Hạng Mục 1: Định Vị Cơ Sở VUS (Location Locator)
- Target Collection:
vus_location_locator - Entity Type (
eType):location - Mục tiêu: Cho phép Chatbot tra cứu nhanh cơ sở gần nhất dựa trên quận/huyện, tên đường, hoặc tọa độ vị trí của học viên, cung cấp ngay hotline và link chỉ đường Google Maps.
Bảng Metadata Cơ Sở:
| Khóa Metadata | Kiểu | Ví Dụ | Ý Nghĩa Kỹ Thuật |
|---|---|---|---|
code | string | "HCM_HTP2" | Mã định danh cơ sở duy nhất (Primary Key phục vụ Upsert). |
name | string | "Hồ Chí Minh - Huỳnh Tấn Phát 2" | Tên trung tâm hiển thị cho học viên. |
address | string | "322 Huỳnh Tấn Phát, P. Tân Thuận, Q.7, TP.HCM" | Địa chỉ đầy đủ. |
province | string | "Thành phố Hồ Chí Minh" | Tỉnh/Thành phố phục vụ lọc vùng. |
phone | string | "028 7308 3333" | Số hotline liên hệ trực tiếp. |
latitude, longitude | number | 10.750130, 106.728555 | Tọa độ GPS phục vụ tính khoảng cách (Radius Search). |
google_maps_url | string | https://www.google.com/maps/... | Link dẫn đường mở ứng dụng Google Maps. |
Code Mẫu Nạp Dữ Liệu Cơ Sở:
💜 .NET 8 / C#:
var locationPayload = new VusIngestionRequest
{
ConnectionSettings = new ConnectionSettings
{
ConnectionId = "postgres_vng",
TargetCollection = "vus_location_locator"
},
Payload = new List<IngestionItem>
{
new IngestionItem
{
Document = "## Cơ sở VUS: Hồ Chí Minh - Huỳnh Tấn Phát 2 (HCM_HTP2)\n" +
"- Địa chỉ: 322 Huỳnh Tấn Phát, Phường Tân Thuận, Quận 7, Thành phố Hồ Chí Minh\n" +
"- Điện thoại: 028 78937939\n" +
"- Tỉnh/Thành phố: Thành phố Hồ Chí Minh\n" +
"- Tọa độ (Lat, Long): 10.750130865658434, 106.72855551625696\n" +
"- Google Maps: https://www.google.com/maps/search/?api=1&query=VUS+Huynh+Tan+Phat+2\n" +
"- Link chi tiết: https://vus.edu.vn/trung-tam-vus/hcm_htp2",
Metadata = new Dictionary<string, object>
{
{ "code", "HCM_HTP2" },
{ "name", "Hồ Chí Minh - Huỳnh Tấn Phát 2" },
{ "_hash", "e2a88c18" },
{ "phone", "028 7308 3333" },
{ "source", "vus_facilities_v1.1" },
{ "address", "322 Huỳnh Tấn Phát, Phường Tân Thuận, Quận 7, TP.HCM" },
{ "category", "VUS Location" },
{ "latitude", 10.750130865658434 },
{ "longitude", 106.72855551625696 },
{ "province", "Thành phố Hồ Chí Minh" },
{ "detail_url", "https://vus.edu.vn/trung-tam-vus/hcm_htp2" },
{ "google_maps_url", "https://www.google.com/maps/search/?api=1&query=VUS+Huynh+Tan+Phat+2" }
},
EType = "location"
}
}
};
await vusKbService.IngestDataAsync(locationPayload);📦 JSON Body:
{
"connectionSettings": {
"connectionId": "postgres_vng",
"targetCollection": "vus_location_locator"
},
"payload": [
{
"document": "## Cơ sở VUS: Hồ Chí Minh - Huỳnh Tấn Phát 2 (HCM_HTP2)\n- Địa chỉ: 322 Huỳnh Tấn Phát, Phường Tân Thuận, Quận 7, Thành phố Hồ Chí Minh\n- Điện thoại: 028 78937939\n- Tỉnh/Thành phố: Thành phố Hồ Chí Minh\n- Tọa độ (Lat, Long): 10.750130865658434, 106.72855551625696\n- Google Maps: https://www.google.com/maps/search/?api=1&query=VUS+Huynh+Tan+Phat+2\n- Link chi tiết: https://vus.edu.vn/trung-tam-vus/hcm_htp2",
"metadata": {
"code": "HCM_HTP2",
"name": "Hồ Chí Minh - Huỳnh Tấn Phát 2",
"_hash": "e2a88c18",
"phone": "028 7308 3333",
"source": "vus_facilities_v1.1",
"address": "322 Huỳnh Tấn Phát, Phường Tân Thuận, Quận 7, TP.HCM",
"category": "VUS Location",
"latitude": 10.750130865658434,
"longitude": 106.72855551625696,
"province": "Thành phố Hồ Chí Minh",
"detail_url": "https://vus.edu.vn/trung-tam-vus/hcm_htp2",
"google_maps_url": "https://www.google.com/maps/search/?api=1&query=VUS+Huynh+Tan+Phat+2"
},
"eType": "location"
}
]
}Terminal cURL:
curl -X POST https://stg-knowledgebase-internal-svc.mydatalakes.com/api/v1/thirdparty \
-H "Content-Type: application/json" \
-H "x-api-key: cps_kb_secret_2026" \
-d '{
"connectionSettings": {
"connectionId": "postgres_vng",
"targetCollection": "vus_location_locator"
},
"payload": [
{
"document": "## Cơ sở VUS: Hồ Chí Minh - Huỳnh Tấn Phát 2 (HCM_HTP2)\n- Địa chỉ: 322 Huỳnh Tấn Phát, Phường Tân Thuận, Quận 7, TP.HCM\n- Điện thoại: 028 78937939",
"metadata": {
"code": "HCM_HTP2",
"name": "Hồ Chí Minh - Huỳnh Tấn Phát 2",
"latitude": 10.750130865658434,
"longitude": 106.72855551625696,
"province": "Thành phố Hồ Chí Minh"
},
"eType": "location"
}
]
}'Python:
import requests
url = "https://stg-knowledgebase-internal-svc.mydatalakes.com/api/v1/thirdparty"
headers = {
"Content-Type": "application/json",
"x-api-key": "cps_kb_secret_2026"
}
payload = {
"connectionSettings": {
"connectionId": "postgres_vng",
"targetCollection": "vus_location_locator"
},
"payload": [
{
"document": "## Cơ sở VUS: Hồ Chí Minh - Huỳnh Tấn Phát 2 (HCM_HTP2)\n- Địa chỉ: 322 Huỳnh Tấn Phát, Phường Tân Thuận, Quận 7, TP.HCM\n- Điện thoại: 028 78937939",
"metadata": {
"code": "HCM_HTP2",
"name": "Hồ Chí Minh - Huỳnh Tấn Phát 2",
"province": "Thành phố Hồ Chí Minh",
"latitude": 10.750130865658434,
"longitude": 106.72855551625696
},
"eType": "location"
}
]
}
res = requests.post(url, json=payload, headers=headers)
print("Status Code:", res.status_code)
print("Response:", res.json())4. Hạng Mục 2: Khóa Học & Bảng Học Phí (Course Pricing)
- Target Collection:
vus_course_pricing - Entity Type (
eType):pricing_lookup - Mục tiêu: Bơm dữ liệu học phí chính xác của các chương trình (Happy Kids, Superkids, Young Leaders, iTalk, IELTS Foundation/4.0-7.0) theo từng cụm tỉnh/vùng (Vùng 1, Vùng 2, SEP).
Yêu Cầu Định Dạng Bảng Học Phí
Bảng học phí trong
documentbắt buộc phải là Markdown Table chuẩn có đủ các cột:Số khoá | Thời lượng | Học phí gốc | Học Phí Sau Ưu Đãi | Học phí trung bình mỗi khoá | Học phí trung bình mỗi tháng | Học phí theo giờ.
Code Mẫu Nạp Bảng Học Phí:
💜 .NET 8 / C#:
var pricingPayload = new VusIngestionRequest
{
ConnectionSettings = new ConnectionSettings
{
ConnectionId = "postgres_vng",
TargetCollection = "vus_course_pricing"
},
Payload = new List<IngestionItem>
{
new IngestionItem
{
Document = "## BẢNG HỌC PHÍ CHI TIẾT: Cụm Tỉnh SEP - Vùng 2\n\n" +
"### 1. Chương trình Happy Kids Standard (HK-Standard) (36 hrs)\n\n" +
"| Số khoá | Thời lượng | Học phí gốc | Học Phí Sau Ưu Đãi | Học phí trung bình mỗi khoá | Học phí trung bình mỗi tháng | Học phí theo giờ |\n" +
"|---|---|---|---|---|---|---|\n" +
"| 1 | 3 tháng | 6,450,000 | 5,160,000 | 5,160,000 | 1,720,000 | 143,333 |\n" +
"| 2 | 6 tháng | 12,900,000 | 9,030,000 | 4,515,000 | 1,505,000 | 125,417 |\n" +
"| 3 | 9 tháng | 19,350,000 | 13,545,000 | 4,515,000 | 1,505,000 | 125,417 |\n" +
"| 4 | 12 tháng | 25,800,000 | 15,480,000 | 3,870,000 | 1,290,000 | 107,500 |\n\n" +
"### 2. Chương trình Superkids (SKn)\n\n" +
"| Số khoá | Thời lượng | Học phí gốc | Học Phí Sau Ưu Đãi | Học phí trung bình mỗi khoá | Học phí trung bình mỗi tháng | Học phí theo giờ |\n" +
"|---|---|---|---|---|---|---|\n" +
"| 1 | 3 tháng | 6,650,000 | 5,320,000 | 5,320,000 | 1,773,333 | 147,778 |\n" +
"| 2 | 6 tháng | 13,300,000 | 9,310,000 | 4,655,000 | 1,551,667 | 129,306 |\n\n" +
"### 3. Chương trình IELTS\n\n" +
"| Khóa học | Thời lượng | Học phí gốc | Học Phí Sau Ưu Đãi | Học phí trung bình mỗi khoá | Học phí trung bình mỗi tháng | Học phí theo giờ |\n" +
"|---|---|---|---|---|---|---|\n" +
"| IELTS 6.0 | 4 tháng (tăng 1.0) | 12,650,000 | 12,650,000 | 12,650,000 | 3,162,500 | 263,542 |\n" +
"| IELTS 7.0 | 4 tháng (tăng 0.5) | 17,650,000 | 17,650,000 | 17,650,000 | 4,412,500 | 367,708 |",
Metadata = new Dictionary<string, object>
{
{ "name", "Bảng học phí Cụm Tỉnh SEP - Vùng 2" },
{ "type", "pricing_table" },
{ "eType", "pricing_lookup" },
{ "source", "queue_import" },
{ "category", "Bảng Giá" }
},
EType = "pricing_lookup"
}
}
};
await vusKbService.IngestDataAsync(pricingPayload);📦 JSON Body:
{
"connectionSettings": {
"connectionId": "postgres_vng",
"targetCollection": "vus_course_pricing"
},
"payload": [
{
"document": "## BẢNG HỌC PHÍ CHI TIẾT: Cụm Tỉnh SEP - Vùng 2\n\n### 1. Chương trình Happy Kids Standard (HK-Standard) (36 hrs)\n\n| Số khoá | Thời lượng | Học phí gốc | Học Phí Sau Ưu Đãi | Học phí trung bình mỗi khoá | Học phí trung bình mỗi tháng | Học phí theo giờ |\n|---|---|---|---|---|---|---|\n| 1 | 3 tháng | 6,450,000 | 5,160,000 | 5,160,000 | 1,720,000 | 143,333 |\n| 2 | 6 tháng | 12,900,000 | 9,030,000 | 4,515,000 | 1,505,000 | 125,417 |\n| 3 | 9 tháng | 19,350,000 | 13,545,000 | 4,515,000 | 1,505,000 | 125,417 |\n| 4 | 12 tháng | 25,800,000 | 15,480,000 | 3,870,000 | 1,290,000 | 107,500 |\n\n### 2. Chương trình IELTS\n\n| Khóa học | Thời lượng | Học phí gốc | Học Phí Sau Ưu Đãi | Học phí trung bình mỗi khoá | Học phí trung bình mỗi tháng | Học phí theo giờ |\n|---|---|---|---|---|---|---|\n| IELTS 6.0 | 4 tháng (tăng 1.0) | 12,650,000 | 12,650,000 | 12,650,000 | 3,162,500 | 263,542 |\n| IELTS 7.0 | 4 tháng (tăng 0.5) | 17,650,000 | 17,650,000 | 17,650,000 | 4,412,500 | 367,708 |",
"metadata": {
"name": "Bảng học phí Cụm Tỉnh SEP - Vùng 2",
"type": "pricing_table",
"category": "Bảng Giá"
},
"eType": "pricing_lookup"
}
]
}5. Hạng Mục 3: Quy Trình & Kịch Bản CSKH (Sales SOP)
- Target Collection:
vus_business_sop - Entity Type (
eType):sales_sop - Mục tiêu: Chuẩn hóa quy trình nhắc lịch hẹn kiểm tra năng lực tiếng Anh (Placement Test), kịch bản xử lý từ chối và quy chuẩn cập nhật trường Care Status / Sub Care Status trên CRM của VUS.
Kịch Bản Gọi Nhắc Hẹn 2 Bước:
- Lần 1 (Trước giờ hẹn 60 phút): Xác nhận học viên đã nhận tin nhắn thư mời, nhấn mạnh giáo viên và bài test đã sẵn sàng.
- Lần 2 (Đến giờ hẹn): Đón tiếp học viên tại cơ sở, hỗ trợ học viên đến quầy tư vấn ("cô áo đỏ VUS").
var sopPayload = new VusIngestionRequest
{
ConnectionSettings = new ConnectionSettings
{
ConnectionId = "postgres_vng",
TargetCollection = "vus_business_sop"
},
Payload = new List<IngestionItem>
{
new IngestionItem
{
Document = "## QUY TRÌNH GỌI NHẮC HẸN VÀ KỊCH BẢN\n" +
"- Mục tiêu: Chuẩn hóa quy trình nhắc hẹn của TMK nhằm tăng tỷ lệ khách đến cơ sở (Show).\n" +
"- Nguyên tắc chung: Gọi đúng thời điểm, theo trình tự Xác nhận -> Nhắc nhở -> Hướng dẫn -> Đồng hành.\n" +
"- Kịch bản Nhắc hẹn lần 1 (Trước giờ hẹn 60 phút):\n" +
" Dạ em chào Anh/Chị, em là tư vấn viên gọi lại cho mình từ VUS ạ, hôm trước bé có lịch hẹn tham gia buổi đánh giá năng lực tiếng Anh lúc <giờ hẹn> ngày <ngày hẹn> tại cơ sở VUS <cơ sở hẹn>.\n" +
"- B2. Cập nhật kết quả cuộc gọi: Cập nhật đầy đủ Care Status và Sub Care Status trên CRM VUS.",
Metadata = new Dictionary<string, object>
{
{ "name", "Quy trình và kịch bản gọi nhắc hẹn" },
{ "type", "reminder" },
{ "eType", "sales_sop" },
{ "source", "webhook" },
{ "category", "Quy trình gọi nhắc hẹn" }
},
EType = "sales_sop"
}
}
};
await vusKbService.IngestDataAsync(sopPayload);6. Hiệu Quả Đạt Được Tại VUS
Sau khi triển khai kho tri thức RAG trên Knowledge Base Hub:
- Tốc độ phản hồi: Chatbot tra cứu học phí và cơ sở trong vòng 350ms - 550ms.
- Độ chính xác học phí: Đạt 99.8%, không xảy ra tình trạng nhầm lẫn mức giá giữa các chương trình và vùng miền.
- Tỷ lệ khách đến cơ sở (Show Rate): Tăng 28% nhờ sự kết hợp đồng bộ giữa Bot nhắc hẹn và nhân viên tư vấn.