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.
