In een eerdere post hebben we gezien hoe je OpenAI Embeddings gebruikt om contextuele informatie toe te voegen aan de chatmethoden van OpenAI.
Nu gaan we kijken hoe je het TsgcOpenAIEmbeddings -component uit het sgcWebSockets-package gebruikt om AI-toepassingen te bouwen op basis van je eigen data.
In een eerdere post over Delphi Voice ChatBot hebben we het component TsgcAIOpenAIChatBot gebruikt om een chatbot te bouwen die met spraak wordt aangestuurd. Nu breiden we de chatbot uit zodat hij niet alleen de openAI-data gebruikt die tot en met 2021 is getraind, maar we voegen ook onze eigen data toe en bouwen een Questions & Answers-toepassing op basis van de gegevens uit het helpbestand en de interfaces van het package.
Eigen data omzetten naar vectoren
De eerste stap is om de sgcWebSockets-pdf-handleiding te pakken en om te zetten naar tekst. We gebruiken dit bestand om embeddings te maken met nuttige informatie over hoe je het package configureert, de componenten gebruikt... en deze informatie wordt gebruikt wanneer we vragen stellen aan OpenAI.
Zodra we de pdf-handleiding in tekstformaat hebben, kunnen we het component TsgcAIOpenAIEmbeddings gebruiken om voor elke sectie van het bestand de vectoren bij OpenAI op te halen. In dit geval slaan we ze op in een tekstbestand (voor productie kun je een vectordatabase zoals Pinecone gebruiken).
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 & Embeddings
Zodra we al onze data hebben omgezet naar vectoren, kunnen we beginnen met het bouwen van ons eigen model. Het achterliggende idee is heel eenvoudig: elke keer dat we de bot een vraag stellen, zetten we de vraag eerst om naar een vector, vervolgens zoeken we in onze database welke vector het meest lijkt op de vraag, en tot slot gebruiken we de data die het meest lijkt op de vraag en voegen die als context toe.
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;
Delphi Windows Demo
Hieronder vind je een voorbeeld voor Delphi met behulp van het sgcWebSockets AI-package waarin wordt getoond hoe je een Questions & Answers-toepassing bouwt op basis van aangepaste data. De demo bevat 2 projecten:
1. sgcCreateEmbeddings: dit project laadt een tekstbestand, splitst het in stukken, zet elk stuk om naar een vector en slaat die op in een databasebestand. De demo bevat al de vectordatabase in tekstbestandsformaat zodat je hem gemakkelijk kunt gebruiken.
2. sgcQuestionsAnswers: met behulp van de eerder aangemaakte databaserecords zoekt de toepassing elke keer dat de gebruiker een vraag aan de chatbot stelt eerst in de database welke context het meest lijkt op de vraag, en voegt die toe als contextuele informatie om de chatbot te helpen nauwkeurigere antwoorden te geven.
