다음을 통해 공유


Azure SignalR 및 OpenAI Completion API를 사용하여 AI 기반 그룹 채팅 빌드

AI의 애플리케이션 통합은 사용자가 창의성을 발휘하고 생산성을 올리며 상태 목표를 달성할 수 있도록 돕고자 하는 개발자에게 빠른 속도로 필수 요소가 되고 있습니다. 지능형 챗봇, 개인 설정된 권장 사항, 상황에 맞는 응답과 같은 AI 기반 기능은 최신 앱에 상당한 가치를 더합니다. ChatGPT가 우리의 상상력을 사로잡은 이후 나온 AI 기반 앱은 주로 한 명의 사용자와 하나의 AI 도우미 사이를 지원합니다. AI 기능에 점차 익숙해짐에 따라 개발자들은 팀 컨텍스트에서 AI 기반 앱을 탐색하고 있습니다. 이들은 "AI가 협력자로 이뤄진 팀에 어떤 가치를 더할 수 있을까?"와 같은 질문을 던집니다.

이 자습서에서는 실시간 그룹 채팅 애플리케이션을 빌드하는 방법을 설명합니다. 채팅에 있는 인간 협력자로 이뤄진 그룹 중에는 채팅 기록에 액세스할 수 있는 AI 도우미가 있으며, @gpt을(를) 사용하여 메시지를 시작할 때 모든 협력자가 AI 도우미를 초대하여 도움을 받을 수 있습니다. 완성된 앱은 다음과 같이 표시됩니다.

AI 기반 그룹 채팅의 사용자 인터페이스 스크린샷.

당사는 OpenAI를 사용하여 컨텍스트를 인식한 지능적인 응답과 SignalR을 생성하여 그룹의 사용자에게 응답을 전달합니다. 전체 코드는 이 리포지토리에서 찾을 수 있습니다.

종속성

이 프로젝트에는 Azure OpenAI 또는 OpenAI를 사용할 수 있습니다. appsetting.json에서 endpointkey을(를) 업데이트하세요. OpenAIExtensions이(가) 앱이 시작될 때 구성을 읽고 두 서비스 중 하나를 인증하고 사용해야 합니다.

이 애플리케이션을 빌드하려면 다음이 필요합니다.

  • ASP.NET Core: 웹 애플리케이션을 만들고 SignalR 허브를 호스트하는 방법
  • SignalR: 클라이언트와 서버 간 실시간 통신
  • Azure SignalR: 대규모 SignalR 연결 관리
  • OpenAI 클라이언트: AI 응답을 생성하기 위해 OpenAI의 API와 상호 작용하는 방법

구현

이 섹션에서는 SignalR과 OpenAI를 통합하여 AI가 향상된 그룹 채팅 환경을 만드는 코드의 주요 부분을 살펴보겠습니다.

데이터 흐름

AI 기반 그룹 채팅의 시퀀스 다이어그램.

SignalR 허브 통합

GroupChatHub 클래스는 사용자 연결과 메시지 브로드캐스팅, AI 상호 작용을 관리합니다. 사용자가 @gpt(으)로 시작하는 메시지를 보내면 허브는 OpenAI에 메시지를 전달하고, 그러면 OpenAI에서 응답을 생성합니다. AI의 응답은 실시간으로 그룹에 다시 스트리밍됩니다.

var chatClient = _openAI.GetChatClient(_options.Model);
await foreach (var completion in chatClient.CompleteChatStreamingAsync(messagesIncludeHistory))
{   
    // ...
    // Buffering and sending the AI's response in chunks
    await Clients.Group(groupName).SendAsync("newMessageWithId", "ChatGPT", id, totalCompletion.ToString());
    // ...
}

기록을 사용하여 컨텍스트 유지 관리

OpenAI의 Chat Completions API에 대한 모든 요청은 상태 비저장입니다. OpenAI는 과거 상호 작용을 저장하지 않습니다. 채팅 애플리케이션에서 사용자 또는 도우미가 말한 내용은 상황에 맞는 응답을 생성하는 데 중요합니다. Completions API에 대한 모든 요청에 채팅 기록을 포함하여 이를 달성할 수 있습니다.

GroupHistoryStore 클래스는 각 그룹에 대한 채팅 기록을 관리합니다. 사용자와 AI 도우미가 게시한 메시지를 모두 저장하여 상호 작용 전반에서 대화 컨텍스트가 유지되도록 합니다. 이 컨텍스트는 일관된 AI 응답을 생성하는 데 매우 중요합니다.

// Store message generated by AI-assistant in memory
public void UpdateGroupHistoryForAssistant(string groupName, string message)
{
    var chatMessages = _store.GetOrAdd(groupName, _ => InitiateChatMessages());
    chatMessages.Add(new AssistantChatMessage(message));
}
// Store message generated by users in memory
_history.GetOrAddGroupHistory(groupName, userName, message);

스트림 AI 응답

CompleteChatStreamingAsync() 메서드는 OpenAI의 응답을 증분 방식으로 스트리밍하므로 응답이 생성될 때 애플리케이션에서 클라이언트에 부분 응답을 보낼 수 있습니다.

이 코드는 StringBuilder을(를) 사용하여 AI의 응답을 누적합니다. 버퍼링된 콘텐츠의 길이를 확인하고 특정 임계값(예: 20자)을 초과하면 클라이언트에 보냅니다. 이 방법을 사용하면 사용자가 AI의 응답을 형성하면서 볼 수 있고 사람과 같은 타이핑 효과를 얻을 수 있습니다.

totalCompletion.Append(content);
if (totalCompletion.Length - lastSentTokenLength > 20)
{
    await Clients.Group(groupName).SendAsync("newMessageWithId", "ChatGPT", id, totalCompletion.ToString());
    lastSentTokenLength = totalCompletion.Length;
}

자세히 살펴보기

이 프로젝트는 향상된 기능을 위한 흥미로운 가능성을 열어줍니다.

  • 고급 AI 기능: 감정 분석, 번역 또는 요약과 같은 다른 OpenAI 기능을 사용합니다.
  • 여러 AI 에이전트 통합: 동일한 채팅 내에서 고유한 역할 또는 전문 지식 영역을 가진 여러 AI 에이전트를 소개할 수 있습니다. 예를 들어 한 에이전트는 텍스트 생성에 집중하고 다른 에이전트는 이미지 또는 오디오 생성을 제공할 수 있습니다. 이러한 상호 작용은 다양한 AI 에이전트가 사용자와 서로 원활하게 상호 작용하는, 더욱 풍부하고 역동적인 사용자 환경을 만들 수 있습니다.
  • 서버 인스턴스 간 채팅 기록 공유: 데이터베이스 계층을 구현하여 여러 세션 전반에서 채팅 기록을 유지하여 연결이 끊긴 후에도 대화를 재개할 수 있습니다. SQL 또는 NO SQL 기반 솔루션 외에도 Redis와 같은 캐싱 서비스를 사용하는 방법도 살펴볼 수 있습니다. 채팅 기록 또는 AI 응답과 같이 자주 액세스하는 데이터를 메모리에 저장하여 성능을 크게 향상할 수 있습니다. 이로 인해 대기 시간이 줄어들고 데이터베이스 작업이 오프로드되어 특히 트래픽이 많은 시나리오에서 응답 시간이 빨라집니다.