Personalizando o OpenAI com seus Dados (2 / 2)

· Features

Em um post anterior, vimos como usar OpenAI Embeddings para adicionar informações contextuais aos métodos de chat do OpenAI.

Agora, veremos como usar o componente TsgcOpenAIEmbeddings do pacote sgcWebSockets para construir aplicações de IA usando nossos próprios dados.

Em um post anterior sobre o Delphi Voice ChatBot, usamos o componente TsgcAIOpenAIChatBot para criar um ChatBot controlado por voz; agora vamos expandir o ChatBot usando não apenas os dados do OpenAI treinados até 2021 — adicionaremos dados personalizados construindo um sistema de Perguntas e Respostas com dados obtidos do arquivo de ajuda e das interfaces do pacote.


Converter Dados Próprios em Vetores

O primeiro passo é pegar o manual PDF do sgcWebSockets e convertê-lo em texto. Usaremos esse arquivo para criar embeddings com informações úteis sobre como configurar o pacote, usar os componentes... e essas informações serão usadas ao consultar o OpenAI.

Depois de ter o manual PDF em formato de texto, podemos usar o componente TsgcAIOpenAIEmbeddings para obter os vetores do OpenAI para cada seção do arquivo e, neste caso, vamos armazená-los em um arquivo de texto (para produção, você pode usar um banco de dados vetorial como o Pinecone).

procedure ConvertFileToVector;
var
  oDialog: TOpenDialog;
  oEmbeddings: TsgcAIOpenAIEmbeddings;
  oFile: TsgcAIDatabaseVectorFile;  
begin
  oDialog := TOpenDialog.Create(nil);
  Try
    oDialog.Filter := 'TXT Files|*.txt';
    if oDialog.Execute then
    begin
      oEmbeddings := TsgcAIOpenAIEmbeddings.Create(nil);
      Try
        oFile := TsgcAIDatabaseVectorFile.Create(nil);
        Try
          oEmbeddings.Database := oFile;
          oEmbeddings.OpenAIOptions.ApiKey := '<your api key>';
          oEmbeddings.CreateEmbeddingsFromFile(oDialog.FileName);
        Finally
          oFile.Free;
        End;
      Finally
        oEmbeddings.Free;
      End;
    end;
  Finally
    FreeAndNil(oDialog);
  End;
end; 

ChatBot e Embeddings

Depois de converter todos os nossos dados em vetores, podemos começar a construir nosso próprio modelo. A ideia é simples: cada vez que fazemos uma pergunta ao bot, primeiro convertemos a pergunta em um vetor, depois buscamos no banco de dados qual vetor é mais similar à pergunta e, por fim, usamos os dados mais similares à pergunta e os adicionamos como contexto.

procedure AskToChatGPT(const aQuestion: string);
var
  oChatBot: TsgcAIOpenAIChatBot;
  oEmbeddings: TsgcAIOpenAIEmbeddings;
  oFile: TsgcAIDatabaseVectorFile;  
  vContext: string;
begin
  oChatBot := TsgcAIOpenAIChatBot.Create(nil);
  Try
    oChatBot.OpenAIOptions.ApiKey := '<your api key>';
    oEmbeddings := TsgcAIOpenAIEmbeddings.Create(nil);
    Try
      oChatBot.Embeddings := oEmbeddings;
      oFile := TsgcAIDatabaseVectorFile.Create(nil);
      Try
        oEmbeddings.Database := oFile;
        vContext := oChatBot.GetEmbedding(aQuestion);
        oChatBot.ChatAsUser('Answer the question based on the context below.\n\nContext:\n' + 
          vContext + '\nQuestion:' + aQuestion + '\nAnswer:');
      Finally
        oFile.Free;
      End;
    Finally
      oEmbeddings.Free;
    End;
  Finally
    FreeAndNil(oDialog);
  End;
end; 

Demo Windows em Delphi

Veja abaixo um exemplo em Delphi usando o pacote sgcWebSockets AI que mostra como criar uma aplicação de Perguntas e Respostas com dados personalizados. O demo contém 2 projetos:

1. sgcCreateEmbeddings: este projeto carrega um arquivo de texto, divide em partes e converte cada parte em um vetor, armazenando-o em um arquivo de banco de dados. O demo já vem com o banco de dados vetorial em formato de arquivo de texto para facilitar o uso.

2. sgcQuestionsAnswers: usando os registros do banco de dados criado anteriormente, cada vez que o usuário faz uma pergunta ao chatbot, a aplicação primeiro busca no banco de dados qual contexto é mais similar à pergunta e o adiciona como informação contextual para ajudar o ChatBot a fornecer respostas mais precisas.