Personalizzare OpenAI con i tuoi dati (2 / 2)

· Funzionalità

In un articolo precedente abbiamo visto come usare gli embeddings di OpenAI per aggiungere informazioni contestuali ai metodi chat di OpenAI.

Ora vedremo come usare il componente TsgcOpenAIEmbeddings del pacchetto sgcWebSockets per costruire applicazioni IA usando i nostri dati.

In un articolo precedente sul Delphi Voice ChatBot abbiamo usato il componente TsgcAIOpenAIChatBot per costruire un ChatBot gestito tramite voce; ora estenderemo il ChatBot non solo usando i dati di OpenAI addestrati fino al 2021, ma aggiungeremo i nostri dati personalizzati costruendo un Questions & Answers con i dati ottenuti dal file della guida e dalle interfacce del pacchetto.


Convertire i propri dati in vettori

Il primo passo è prendere il manuale PDF di sgcWebSockets e convertirlo in testo. Useremo questo file per creare embeddings con informazioni utili su come configurare il pacchetto, usare i componenti... e queste informazioni verranno usate quando interrogheremo OpenAI.

Una volta che abbiamo il manuale PDF in formato testo, possiamo usare il componente TsgcAIOpenAIEmbeddings per ottenere i vettori da OpenAI per ogni sezione del file e in questo caso li memorizzeremo in un file di testo (per la produzione puoi usare un database vettoriale come 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 ed embeddings

Una volta convertiti tutti i nostri dati in vettori, possiamo iniziare a costruire il nostro modello: l'idea alla base è molto semplice; ogni volta che interroghiamo il bot, prima convertiamo la domanda in un vettore, poi cerchiamo nel nostro database quale vettore è più simile alla domanda e infine usiamo i dati più simili alla domanda e li aggiungiamo come contesto.

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 Delphi per Windows

Trovi qui sotto un esempio per Delphi che usa il pacchetto sgcWebSockets AI e mostra come costruire un'applicazione Questions & Answers usando dati personalizzati. La demo contiene 2 progetti:

1. sgcCreateEmbeddings: questo progetto carica un file di testo, lo divide in chunk, converte ogni chunk in un vettore e lo memorizza in un file di database. La demo contiene già il database vettoriale in formato testo per facilità d'uso.

2. sgcQuestionsAnswers: usando i record del database precedente, ogni volta che l'utente pone una domanda al chatbot, l'applicazione cerca prima nel database quale è il contesto più simile alla domanda e lo aggiunge come informazione contestuale per aiutare il ChatBot a fornire risposte più accurate.