Mẫu ứng dụng Group Chat tích hợp AI với SignalR và OpenAI
Mẫu ứng dụng AI-Powered Group Chat (nhóm chat tích hợp trí tuệ nhân tạo) minh họa cách tích hợp khả năng của OpenAI vào ứng dụng group chat thời gian thực bằng ASP.NET Core SignalR (thư viện giao tiếp thời gian thực).
- Xem hoặc tải về toàn bộ mã nguồn mẫu.
Tổng quan
Việc tích hợp AI (trí tuệ nhân tạo) vào ứng dụng đang trở nên thiết yếu đối với các lập trình viên muốn nâng cao sự sáng tạo, năng suất và trải nghiệm người dùng. Các tính năng AI như chatbot (bot trò chuyện) thông minh, gợi ý cá nhân hóa và phản hồi theo ngữ cảnh mang lại giá trị đáng kể cho các ứng dụng hiện đại. Trong khi nhiều ứng dụng tích hợp AI tập trung vào tương tác giữa một người dùng duy nhất với trợ lý AI, ngày càng có nhiều người quan tâm đến tiềm năng của AI trong môi trường làm việc nhóm. Các lập trình viên đang đặt câu hỏi: "AI có thể mang lại giá trị gì cho một nhóm cộng tác?"
Mẫu này hướng dẫn xây dựng ứng dụng group chat thời gian thực. Trong đó, một nhóm người dùng có thể tương tác với trợ lý AI có quyền truy cập vào lịch sử chat. Bất kỳ thành viên nào cũng có thể mời AI hỗ trợ bằng cách bắt đầu tin nhắn với @gpt. Ứng dụng hoàn chỉnh trông như sau:
!Giao diện người dùng của ứng dụng group chat tích hợp AI
Mẫu này sử dụng OpenAI để tạo các phản hồi thông minh, nhận thức ngữ cảnh và SignalR để phân phối phản hồi đến người dùng trong nhóm. Toàn bộ mã nguồn có trong repo này.
Phụ thuộc
Bạn có thể sử dụng Azure OpenAI hoặc OpenAI cho dự án này. Hãy cập nhật endpoint và key trong appsettings.json. OpenAIExtensions đọc cấu hình khi ứng dụng khởi động. Bạn cần cung cấp giá trị cho endpoint và key để xác thực và sử dụng một trong hai dịch vụ.
Sử dụng OpenAI
Để xây dựng ứng dụng này, bạn cần các tài nguyên sau:
- ASP.NET Core: Để tạo ứng dụng web và host SignalR hub.
- SignalR: Cho giao tiếp thời gian thực giữa client và server.
- OpenAI Client: Để tương tác với OpenAI API nhằm tạo phản hồi AI.
Sử dụng Azure OpenAI
Để xây dựng ứng dụng này, bạn cần các tài nguyên sau:
- ASP.NET Core: Để tạo ứng dụng web và host SignalR hub.
- SignalR: Cho giao tiếp thời gian thực giữa client và server.
- Azure OpenAI: Gói
Azure.AI.OpenAI.
Triển khai
Phần này nêu bật các phần chính của mã tích hợp SignalR với OpenAI để tạo trải nghiệm group chat tích hợp AI.
Luồng dữ liệu
Sơ đồ sau minh họa từng bước giao tiếp và xử lý liên quan đến việc sử dụng OpenAI, sử dụng phương pháp lặp (iterative) để phản hồi và xử lý dữ liệu:
!Sơ đồ tuần tự cho ứng dụng group chat tích hợp AI
Trong sơ đồ trên:
- Client gửi hướng dẫn đến server. Server giao tiếp với OpenAI để xử lý các hướng dẫn này.
- OpenAI phản hồi với dữ liệu completion (hoàn thành) từng phần. Server chuyển tiếp dữ liệu này trở lại client. Quá trình này lặp lại nhiều lần để trao đổi dữ liệu theo từng bước giữa các thành phần.
Tích hợp SignalR Hub
Class GroupChatHub quản lý kết nối người dùng, phát sóng tin nhắn và tương tác AI.
Khi người dùng gửi tin nhắn bắt đầu bằng @gpt:
- Hub chuyển tiếp tin nhắn đến OpenAI, OpenAI sẽ tạo phản hồi.
- Phản hồi của AI được stream (truyền dần) về nhóm theo thời gian thực.
Đoạn mã sau minh họa cách phương thức CompleteChatStreamingAsync stream phản hồi từ OpenAI theo từng phần:
var chatClient = _openAI.GetChatClient(_options.Model);
await foreach (var completion in
chatClient.CompleteChatStreamingAsync(messagesInludeHistory))
{
// ...
// Đệm và gửi phản hồi của AI theo từng chunk
await Clients.Group(groupName).SendAsync(
"newMessageWithId",
"ChatGPT",
id,
totalCompletion.ToString());
// ...
}Trong đoạn mã trên:
chatClient.CompleteChatStreamingAsync(messagesIncludeHistory)bắt đầu stream phản hồi AI.- Dòng
totalCompletion.Append(content)tích lũy phản hồi của AI. - Nếu độ dài nội dung đệm vượt quá 20 ký tự, hub gửi nội dung đệm đến client bằng
Clients.Group(groupName).SendAsync.
Bằng cách này, phản hồi của AI đến người dùng theo thời gian thực, tạo ra trải nghiệm chat liền mạch và tương tác.
Duy trì ngữ cảnh với lịch sử
Mỗi yêu cầu đến OpenAI's Chat Completions API là stateless (không lưu trạng thái). OpenAI không lưu trữ các tương tác trong quá khứ. Trong ứng dụng chat, những gì người dùng hoặc trợ lý nói là quan trọng để tạo phản hồi phù hợp với ngữ cảnh. Để đạt được điều này, hãy bao gồm lịch sử chat trong mỗi yêu cầu đến Completions API.
Class GroupHistoryStore quản lý lịch sử chat cho từng nhóm. Nó lưu trữ các tin nhắn được đăng bởi cả người dùng và trợ lý AI, đảm bảo ngữ cảnh hội thoại được duy trì xuyên suốt các tương tác. Ngữ cảnh này rất quan trọng để tạo ra các phản hồi AI mạch lạc.
Đoạn mã sau minh họa cách lưu trữ tin nhắn do trợ lý AI tạo ra trong bộ nhớ. Phương thức UpdateGroupHistoryForAssistant được gọi để thêm tin nhắn của trợ lý AI vào lịch sử nhóm, đảm bảo ngữ cảnh hội thoại được duy trì:
public void UpdateGroupHistoryForAssistant(string groupName, string message)
{
var chatMessages = _store.GetOrAdd(groupName, _ => InitiateChatMessages());
chatMessages.Add(new AssistantChatMessage(message));
}Phương thức _history.GetOrAddGroupHistory được gọi để thêm tin nhắn của người dùng vào lịch sử nhóm, đảm bảo ngữ cảnh hội thoại được duy trì:
_history.GetOrAddGroupHistory(groupName, userName, message);
Stream phản hồi AI
Phương thức CompleteChatStreamingAsync stream phản hồi từ OpenAI theo từng phần, cho phép ứng dụng gửi các phản hồi một phần đến client khi chúng được tạo ra.
Đoạn mã sử dụng StringBuilder để tích lũy phản hồi của AI. Nó kiểm tra độ dài nội dung đệm và gửi đến client khi vượt quá ngưỡng nhất định, ví dụ 20 ký tự. Cách tiếp cận này đảm bảo người dùng thấy phản hồi của AI khi nó đang được hình thành, mô phỏng hiệu ứng đánh máy của con người.
totalCompletion.Append(content);
if (totalCompletion.Length - lastSentTokenLength > 20)
{
await Clients.Group(groupName).SendAsync(
"newMessageWithId",
"ChatGPT",
id,
totalCompletion.ToString());
lastSentTokenLength = totalCompletion.Length;
}Khám phá thêm
Dự án này mở ra nhiều khả năng thú vị để phát triển thêm:
- Tính năng AI nâng cao: Tận dụng các khả năng khác của OpenAI như phân tích cảm xúc, dịch thuật hoặc tóm tắt.
- Tích hợp nhiều tác nhân AI: Bạn có thể giới thiệu nhiều tác nhân AI với các vai trò hoặc lĩnh vực chuyên môn khác nhau trong cùng một chat. Ví dụ, một tác nhân có thể tập trung vào tạo văn bản trong khi tác nhân khác cung cấp tạo hình ảnh hoặc âm thanh. Cách này tạo ra trải nghiệm người dùng phong phú hơn và năng động hơn.
- Chia sẻ lịch sử chat giữa các instance server: Triển khai một lớp database (cơ sở dữ liệu) để lưu trữ lịch sử chat qua các phiên, cho phép hội thoại tiếp tục ngay cả sau khi ngắt kết nối. Ngoài các giải pháp SQL hoặc NoSQL, bạn cũng có thể khám phá việc sử dụng dịch vụ caching như Redis để cải thiện đáng kể hiệu suất bằng cách lưu trữ dữ liệu thường xuyên truy cập trong bộ nhớ.
- Tận dụng Azure SignalR Service: Azure SignalR Service cung cấp nhắn tin thời gian thực có thể mở rộng và đáng tin cậy cho ứng dụng của bạn. Bằng cách chuyển giao backplane (lớp nền) SignalR cho Azure, bạn có thể dễ dàng scale out (mở rộng theo chiều ngang) ứng dụng chat để hỗ trợ hàng nghìn người dùng đồng thời trên nhiều server.