Thiết kế kiến trúc chatbot tư vấn khách hàng với .NET Web API và tích hợp AI bên ngoài
1. Vấn đề khi xây chatbot theo hướng đơn giản
Nhiều ví dụ chatbot hiện nay chỉ dừng ở mức:
- Xử lý bằng if/else
- Hard-code câu trả lời
- Không lưu ngữ cảnh hội thoại
- Gắn chặt vào một nền tảng AI cụ thể
Cách tiếp cận này chỉ phù hợp cho demo hoặc thử nghiệm, nhưng không thể sử dụng lâu dài trong hệ thống thực tế.
Trong môi trường production, chatbot cần:
- Tách biệt rõ nghiệp vụ và AI
- Có khả năng thay đổi nhà cung cấp AI
- Có cơ chế fallback khi AI lỗi
- Dễ tích hợp vào CRM hoặc hệ thống bán hàng
2. Kiến trúc tổng thể theo hướng production
Một kiến trúc chatbot linh hoạt có thể được thiết kế như sau:
Client (Web / Chat UI)
↓
Chat API (.NET Web API)
↓
Application Layer
↓
Domain Logic
↓
External AI Provider
Nguyên tắc chính:
- Chat API không phụ thuộc vào AI cụ thể
- AI chỉ đóng vai trò là adapter
- Logic tư vấn và nghiệp vụ vẫn nằm trong hệ thống của bạn
3. Thiết kế domain cho chatbot
3.1. Entity ChatMessage
public class ChatMessage
{
public Guid SessionId { get; init; }
public string UserMessage { get; init; }
public string BotReply { get; init; }
public DateTime CreatedAt { get; init; }
}
3.2. ChatContext (ngữ cảnh hội thoại)
public class ChatContext
{
public Guid SessionId { get; set; }
public List<string> ConversationHistory { get; set; } = new();
}
ChatContext giúp chatbot giữ được ngữ cảnh, tránh trả lời rời rạc và thiếu liên kết.
4. Định nghĩa abstraction cho AI provider
Đây là bước quan trọng để tránh phụ thuộc vào một nhà cung cấp AI duy nhất.
public interface IChatbotAiClient
{
Task<string> GenerateReplyAsync(
string userMessage,
ChatContext context,
CancellationToken cancellationToken
);
}
Với cách này, bạn có thể thay thế OpenAI, Azure OpenAI, Rasa hoặc các nền tảng chatbot khác mà không ảnh hưởng đến logic chính.
5. Triển khai AI client (ví dụ gọi API bên ngoài)
public class ExternalAiChatClient : IChatbotAiClient
{
private readonly HttpClient _httpClient;
public ExternalAiChatClient(HttpClient httpClient)
{
_httpClient = httpClient;
}
public async Task<string> GenerateReplyAsync(
string userMessage,
ChatContext context,
CancellationToken cancellationToken)
{
var payload = new
{
message = userMessage,
history = context.ConversationHistory
};
var response = await _httpClient.PostAsJsonAsync(
"/chat",
payload,
cancellationToken
);
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadFromJsonAsync<AiResponse>();
return result!.Reply;
}
}
API bên ngoài chỉ là một dependency, không ảnh hưởng đến kiến trúc tổng thể.
6. Application Service điều phối logic
public class ChatApplicationService
{
private readonly IChatbotAiClient _aiClient;
public ChatApplicationService(IChatbotAiClient aiClient)
{
_aiClient = aiClient;
}
public async Task<string> HandleAsync(
string message,
ChatContext context,
CancellationToken cancellationToken)
{
if (string.IsNullOrWhiteSpace(message))
return "Bạn có thể mô tả rõ hơn nhu cầu của mình không?";
var reply = await _aiClient.GenerateReplyAsync(
message,
context,
cancellationToken
);
context.ConversationHistory.Add(message);
context.ConversationHistory.Add(reply);
return reply;
}
}
Toàn bộ logic nghiệp vụ nằm ở Application Layer, controller chỉ đóng vai trò nhận và trả dữ liệu.
7. API Controller gọn nhẹ
[ApiController]
[Route("api/chat")]
public class ChatController : ControllerBase
{
private readonly ChatApplicationService _chatService;
public ChatController(ChatApplicationService chatService)
{
_chatService = chatService;
}
[HttpPost]
public async Task<IActionResult> Chat(
ChatRequest request,
CancellationToken cancellationToken)
{
var context = new ChatContext
{
SessionId = request.SessionId
};
var reply = await _chatService.HandleAsync(
request.Message,
context,
cancellationToken
);
return Ok(new { reply });
}
}
8. Vì sao kiến trúc này phù hợp cho hệ thống thực tế?
- Có thể thay đổi AI provider mà không sửa logic nghiệp vụ
- Dễ mở rộng thêm lưu lịch sử, phân loại khách hàng, gắn tag
- Có thể tích hợp vào CRM hoặc hệ thống bán hàng
- Phù hợp cho chatbot tư vấn, CSKH hoặc chatbot nội bộ
9. Ứng dụng thực tế
Kiến trúc tương tự đang được áp dụng trong các hệ thống hỗ trợ tư vấn khách hàng cho doanh nghiệp Việt, nơi mà AI chỉ là một phần trong toàn bộ quy trình vận hành.
Một hướng triển khai thực tế có thể tham khảo tại: https://evoka.vn (tham khảo kiến trúc và cách tiếp cận, không mang tính quảng cáo)
10. Kết luận
Chatbot trong hệ thống thực tế không nên bắt đầu từ AI, mà nên bắt đầu từ:
- Nghiệp vụ
- Kiến trúc
- Khả năng mở rộng
AI chỉ thực sự hiệu quả khi được đặt đúng vị trí trong hệ thống.
All rights reserved