Nguon: Microsoft Learn · .NET 8.0

Mẫu ứng dụng Group Chat tích hợp AI với SignalR và OpenAI

Nguồn: Sample AI-Powered Group Chat with SignalR and 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).

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 endpointkey 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 endpointkey để 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:

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:

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:

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:

Đ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:

csharp
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:

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ì:

csharp
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ì:

csharp
_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.

csharp
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:

  1. 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.
  2. 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.
  3. 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ớ.
  4. 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.