Dostosowywanie OpenAI do twoich danych (2 / 2)

· Funkcje

W poprzednim wpisie pokazaliśmy, jak używać OpenAI Embeddings do dodawania informacji kontekstowych do metod czatu OpenAI.

Teraz zobaczymy, jak używać komponentu TsgcOpenAIEmbeddings  z pakietu sgcWebSockets do budowania aplikacji SI wykorzystujących nasze własne dane.

W poprzednim wpisie o Delphi Voice ChatBot używaliśmy komponentu TsgcAIOpenAIChatBot do zbudowania ChatBota obsługiwanego głosem; teraz rozszerzymy ChatBota, korzystając nie tylko z danych openAI wytrenowanych do 2021 roku, ale dodamy także własne dane, budując Pytania i odpowiedzi na podstawie danych pozyskanych z pliku pomocy oraz interfejsów pakietu.


Konwersja własnych danych do wektorów

Pierwszym krokiem jest pobranie podręcznika sgcWebSockets w pdf i przekonwertowanie go na tekst. Użyjemy tego pliku do utworzenia embeddingów zawierających przydatne informacje o tym, jak skonfigurować pakiet, korzystać z komponentów... a te informacje zostaną wykorzystane przy zadawaniu pytań do OpenAI.

Gdy mamy podręcznik pdf w formacie tekstowym, możemy użyć komponentu TsgcAIOpenAIEmbeddings, aby uzyskać z OpenAI wektory dla każdej sekcji pliku — w tym przypadku zapiszemy je do pliku tekstowego (na środowisku produkcyjnym możesz użyć bazy wektorowej, takiej jak 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 i embeddingi

Gdy już przekonwertujemy wszystkie nasze dane do wektorów, możemy zacząć budować nasz własny model — idea jest bardzo prosta: za każdym razem, gdy pytamy bota, najpierw konwertujemy pytanie na wektor, następnie przeszukujemy naszą bazę danych, aby znaleźć wektor najbardziej podobny do pytania, a na koniec wykorzystujemy dane najbardziej podobne do pytania i dodajemy je jako kontekst.

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 dla Windows

Poniżej znajdziesz przykład dla Delphi z użyciem pakietu sgcWebSockets AI, który pokazuje, jak zbudować aplikację Pytania i odpowiedzi z wykorzystaniem dostosowanych danych. Demo zawiera 2 projekty:

1. sgcCreateEmbeddings: ten projekt wczytuje plik tekstowy, dzieli go na fragmenty i konwertuje każdy fragment do wektora oraz zapisuje go w pliku bazy. Demo zawiera już bazę wektorową w formacie pliku tekstowego dla łatwości użycia.

2. sgcQuestionsAnswers: korzystając z wcześniej utworzonych rekordów bazy, za każdym razem, gdy użytkownik zadaje pytanie chatbotowi, aplikacja najpierw przeszukuje bazę, aby ustalić, który kontekst jest najbardziej podobny do pytania, i dodaje go jako informację kontekstową, pomagając ChatBotowi udzielać dokładniejszych odpowiedzi.