Partilhar via


AI-Powered Exemplo de Chat de Grupo com SignalR e OpenAI

O exemplo de Chat de Grupo AI-Powered demonstra como integrar os recursos da OpenAI em um aplicativo de bate-papo em grupo em tempo real usando ASP.NET Core SignalR.

Visão geral

A integração da IA em aplicativos está se tornando essencial para desenvolvedores que visam melhorar a criatividade, a produtividade e a experiência geral do usuário. Recursos baseados em IA, como chatbots inteligentes, recomendações personalizadas e respostas contextuais, agregam valor significativo aos aplicativos modernos. Embora muitos aplicativos baseados em IA, como aqueles inspirados pelo ChatGPT, se concentrem em interações entre um único usuário e um assistente de IA, há um interesse crescente em explorar o potencial da IA em ambientes de equipe. Os desenvolvedores agora estão se perguntando: "Que valor a IA pode agregar a uma equipe de colaboradores?"

Este guia de exemplo destaca o processo de criação de um aplicativo de bate-papo em grupo em tempo real. Neste bate-papo, um grupo de colaboradores humanos pode interagir com um assistente de IA que tem acesso ao histórico de bate-papo. Qualquer colaborador pode convidar a IA para ajudar, iniciando a sua mensagem com @gpt. O aplicativo concluído tem esta aparência:

interface de usuário para o bate-papo em grupo alimentado por IA

Este exemplo usa OpenAI para gerar respostas inteligentes e sensíveis ao contexto e SignalR para fornecer a resposta aos usuários em um grupo. Você pode encontrar o código completo neste repo.

Dependências

O Azure OpenAI ou o OpenAI podem ser usados para este projeto. Certifique-se de atualizar o endpoint e key em appsettings.json. OpenAIExtensions lê a configuração quando o aplicativo é iniciado, e os valores de configuração para endpoint e key são necessários para autenticar e usar qualquer um dos serviços.

Para construir este aplicativo, você precisará do seguinte:

  • ASP.NET Core: Para criar o aplicativo Web e hospedar o hub SignalR.
  • SignalR: Para comunicação em tempo real entre clientes e o servidor.
  • OpenAI Client: Para interagir com a API da OpenAI para gerar respostas de IA.

Execução

Esta seção destaca as principais partes do código que integram SignalR com o OpenAI para criar uma experiência de bate-papo em grupo aprimorada por IA.

Fluxo de dados

O diagrama a seguir destaca a comunicação e o processamento passo a passo envolvidos no uso de serviços OpenAI, empregando uma abordagem iterativa para respostas e tratamento de dados:

diagrama de sequência para o chat de grupo alimentado por IA

No diagrama anterior:

  • O Cliente envia instruções para o Servidor, que então se comunica com a OpenAI para processar essas instruções.
  • O OpenAI responde com dados de conclusão parcial, que o Servidor encaminha de volta para o Cliente. Esse processo se repete várias vezes para uma troca iterativa de dados entre esses componentes.

Integração com SignalR Hub

A GroupChatHub classe gerencia conexões de usuário, transmissão de mensagens e interações de IA.

Quando um usuário envia uma mensagem começando com @gpt:

  • O hub encaminha para a OpenAI, que gera uma resposta.
  • A resposta da IA é transmitida de volta ao grupo em tempo real.

O trecho de código a seguir demonstra como o método CompleteChatStreamingAsync transmite respostas do OpenAI incrementalmente:

var chatClient = _openAI.GetChatClient(_options.Model);

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

No código anterior:

  • chatClient.CompleteChatStreamingAsync(messagesIncludeHistory) inicia a transmissão de respostas de IA.
  • A linha totalCompletion.Append(content) acumula a resposta da IA.
  • Se o comprimento do conteúdo armazenado em buffer exceder 20 caracteres, o conteúdo armazenado em buffer será enviado para os clientes usando Clients.Group(groupName).SendAsync.

Isso garante que a resposta da IA seja entregue aos usuários em tempo real, proporcionando uma experiência de bate-papo contínua e interativa.

Manter o contexto com o histórico

Todas as solicitações para a API de Conclusão de Chat da OpenAI são sem estado. A OpenAI não armazena interações passadas. Em um aplicativo de bate-papo, o que um usuário ou um assistente disse é importante para gerar uma resposta contextualmente relevante. Para conseguir isso, inclua o histórico de bate-papo em todas as solicitações para a API de conclusão.

A classe GroupHistoryStore gere o histórico de conversas de cada grupo. Ele armazena mensagens postadas pelos usuários e assistentes de IA, garantindo que o contexto da conversa seja preservado nas interações. Este contexto é crucial para gerar respostas coerentes em matéria de IA.

O código a seguir demonstra como armazenar mensagens geradas pelo assistente de IA na memória. O método UpdateGroupHistoryForAssistant é chamado para adicionar a mensagem do assistente de IA ao histórico do grupo, garantindo que o contexto da conversa seja mantido:

public void UpdateGroupHistoryForAssistant(string groupName, string message)
{
    var chatMessages = _store.GetOrAdd(groupName, _ => InitiateChatMessages());
    chatMessages.Add(new AssistantChatMessage(message));
}

O método _history.GetOrAddGroupHistory é chamado para adicionar a mensagem do usuário ao histórico do grupo, garantindo que o contexto da conversa seja mantido:

_history.GetOrAddGroupHistory(groupName, userName, message);

Transmitir respostas de IA

O método CompleteChatStreamingAsync transmite respostas do OpenAI incrementalmente, o que permite que o aplicativo envie respostas parciais para o cliente à medida que são geradas.

O código usa a StringBuilder para acumular a resposta da IA. Ele verifica o comprimento do conteúdo armazenado em buffer e envia-o para os clientes quando excede um determinado limite, por exemplo, 20 caracteres. Essa abordagem garante que os usuários vejam a resposta da IA à medida que ela se forma, imitando um efeito de digitação semelhante ao humano.

totalCompletion.Append(content);

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

    lastSentTokenLength = totalCompletion.Length;
}

Explorar mais

Este projeto abre possibilidades interessantes para novas melhorias:

  1. Recursos avançados de IA: Aproveite outros recursos do OpenAI, como análise de sentimento, tradução ou sumarização.
  2. Incorporando vários agentes de IA: você pode introduzir vários agentes de IA com funções ou áreas de especialização distintas dentro do mesmo chat. Por exemplo, um agente pode se concentrar na geração de texto enquanto o outro fornece geração de imagem ou áudio. Isso pode criar uma experiência de usuário mais rica e dinâmica, onde diferentes agentes de IA interagem perfeitamente com os usuários e uns com os outros.
  3. Compartilhar histórico de bate-papo entre instâncias do servidor: implemente uma camada de banco de dados para persistir o histórico de bate-papo entre sessões, permitindo que as conversas sejam retomadas mesmo após uma desconexão. Além de soluções baseadas em SQL ou NO SQL, você também pode explorar usando um serviço de cache como o Redis. Ele pode melhorar significativamente o desempenho armazenando dados acessados com frequência, como histórico de bate-papo ou respostas de IA, na memória. Isso reduz a latência e descarrega as operações do banco de dados, levando a tempos de resposta mais rápidos, especialmente em cenários de alto tráfego.
  4. Aproveitando o Azure SignalR Service: Azure SignalR Service fornece mensagens em tempo real escaláveis e confiáveis para seu aplicativo. Ao descarregar o backplane SignalR para o Azure, você pode expandir o aplicativo de chat facilmente para dar suporte a milhares de usuários simultâneos em vários servidores. O Azure SignalR também simplifica o gerenciamento e fornece recursos internos, como reconexões automáticas.