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.
