OpenAI mit deinen eigenen Daten anpassen (2 / 2)

· Funktionen

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.