In einem früheren Beitrag haben wir gesehen, wie OpenAI-Embeddings genutzt werden, um den OpenAI-Chat-Methoden Kontextinformationen hinzuzufügen.
Jetzt sehen wir uns an, wie sich die Komponente TsgcOpenAIEmbeddings aus dem sgcWebSockets-Paket einsetzen lässt, um KI-Anwendungen mit eigenen Daten zu bauen.
In einem früheren Beitrag zum Delphi-Voice-ChatBot haben wir die Komponente TsgcAIOpenAIChatBot verwendet, um einen sprachgesteuerten ChatBot zu erstellen. Nun erweitern wir den ChatBot: Wir verwenden nicht nur die bis 2021 trainierten OpenAI-Daten, sondern fügen unsere eigenen Daten hinzu und bauen ein Fragen-und-Antworten-System mit den Inhalten aus der Hilfedatei und den Schnittstellen des Pakets.
Eigene Daten in Vektoren umwandeln
Der erste Schritt besteht darin, das sgcWebSockets-PDF-Handbuch in Text umzuwandeln. Wir verwenden diese Datei, um Embeddings mit nützlichen Informationen darüber zu erzeugen, wie das Paket konfiguriert und die Komponenten verwendet werden. Diese Informationen kommen anschließend bei der Anfrage an OpenAI zum Einsatz.
Sobald das PDF-Handbuch als Text vorliegt, können wir mit der Komponente TsgcAIOpenAIEmbeddings die Vektoren von OpenAI für jeden Abschnitt der Datei beziehen. In diesem Beispiel speichern wir sie in einer Textdatei (im Produktivbetrieb kannst du eine Vektordatenbank wie Pinecone verwenden).
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
Sobald alle Daten in Vektoren umgewandelt sind, können wir unser eigenes Modell bauen. Die Idee ist sehr einfach: Bei jeder Anfrage an den Bot wandeln wir zunächst die Frage in einen Vektor um, suchen dann in unserer Datenbank nach dem Vektor, der der Frage am ähnlichsten ist, und nutzen schließlich den ähnlichsten Datensatz als Kontext.
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
Hier findest du ein Beispiel für Delphi mit dem sgcWebSockets-KI-Paket, das zeigt, wie sich eine Fragen-und-Antworten-Anwendung mit eigenen Daten umsetzen lässt. Die Demo enthält 2 Projekte:
1. sgcCreateEmbeddings: Dieses Projekt lädt eine Textdatei, zerlegt sie in Abschnitte, wandelt jeden Abschnitt in einen Vektor um und speichert ihn in einer Datenbankdatei. Die Demo enthält bereits die Vektordatenbank im Textdateiformat zur einfachen Nutzung.
2. sgcQuestionsAnswers: Anhand der zuvor angelegten Datenbankdatensätze sucht die Anwendung bei jeder Frage an den Chatbot zuerst in der Datenbank nach dem Kontext, der der Frage am ähnlichsten ist, und fügt ihn als Kontextinformation hinzu, damit der ChatBot präzisere Antworten geben kann.
