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.
