Personnaliser OpenAI avec tes données (1 / 2)

· Fonctionnalités

Quand on pose à OpenAI une question qui nécessite un contexte spécifique, exemple :

Who is my father?

OpenAI peut soit halluciner soit répondre qu'il ne sait pas.

Pour aider OpenAI à répondre à des questions spécifiques, tu peux fournir des informations contextuelles supplémentaires dans le prompt lui-même.

My father lives in Barcelona and is 50 year's old.

Si l'on repose la même question à OpenAI, OpenAI répondra en tenant compte du prompt fourni avec les informations contextuelles.

Embeddings

OpenAI propose une fonctionnalité appelée embeddings de texte pour mesurer la similarité entre des chaînes de texte.

Pour chaque bloc de texte, chapitre ou sujet on peut envoyer cette information au service Embedding d'OpenAI pour recevoir en retour ses données d'embedding (c'est-à-dire une liste vectorielle de nombres à virgule flottante). Exemple de requête :

TsgcHTTP_API_OpenAI._CreateEmbeddings('text-embedding-ada-002', 'My father lives in Barcelona and is 50 year's old.');

Et la réponse d'openAI ressemblera à quelque chose comme ça :

{
"data": [
{
"embedding": [
-0.006929283495992422,
-0.005336422007530928,
...
-4.547132266452536e-05,
-0.024047505110502243
],
"index": 0,
"object": "embedding"
}
],
}

Une fois que nous avons collecté les données spéciales qui représentent les différents éléments d'information que nous voulons que notre chatbot comprenne, il faut les sauvegarder dans un endroit sûr (comme une base de données vectorielle). N'oublie pas, nous ne faisons cette étape qu'une seule fois. Nous obtenons ces données spéciales pour l'information une fois, et ce n'est que si l'information change que nous la mettrons à jour.

Enfin, quand on veut poser une question au chatbot, on convertit d'abord la requête en vecteur et avec le résultat on recherche dans la base de données créée précédemment quel vecteur est le plus similaire à notre requête, une fois trouvé, on ajoute le prompt du vecteur le plus similaire à la question comme embedding.

Exemple simple

Créons un exemple simple pour utiliser les embeddings et la bibliothèque sgcWebSockets. Nous allons d'abord décrire notre famille et calculer le vecteur pour chaque personne.

oOpenAI := TsgcHTTP_API_OpenAI.Create(nil);
oOpenAI.OpenAIOptions.ApiKey := '<your api key>';
oOpenAI._CreateEmbeddings('text-embedding-ada-002', 'My father lives in Barcelona and is 50 year''s old.');
oOpenAI._CreateEmbeddings('text-embedding-ada-002', 'My mather lives in Berlin and is 47 year''s old.');
oOpenAI._CreateEmbeddings('text-embedding-ada-002', 'My sister lives in Seoul and is 28 year''s old.');

Les résultats précédents peuvent être stockés dans une table où chaque ligne est un embedding avec le prompt et les données vectorielles. 

Prompt Vecteur
My father lives in Barcelona and is 50 year's old. [0.000742552,-0.0049907574...]
My mather lives in Berlin and is 47 year's old.[-0.027452856,-0.0023051118...]
My sister lives in Seoul and is 28 year's old.[-0.007873567,-0.014787777...]

Maintenant que nous avons stocké nos vecteurs, nous allons convertir en vecteur la question que nous enverrons à chatgpt 

oOpenAI := TsgcHTTP_API_OpenAI.Create(nil);
oOpenAI.OpenAIOptions.ApiKey := '<your api key>';
vVectorQuery := oOpenAI._CreateEmbeddings('text-embedding-ada-002', ''Who is my father?''); 

Ensuite, nous chercherons ce vecteur dans la base de données pour détecter lequel est le plus similaire à la question. Voici un exemple en pseudo-code :

// search the most similar vector using Cosine Similarity
vMostSimilarVector := 0;
Database.First;
While not Database.EOF do
begin
  vCosineSimilarity := VectorCosineSimilarity(vVectorQuery, Database.FieldByName('Vector'));
  if vConsineSimilarity > vMostSimilarVector then
  begin
    vMostSimilarVector := vCosineSimilarity;
    vContext := Database.FieldByName('Prompt');
  end;
  Database.Next;
end;

Enfin, on interroge chatgpt en ajoutant l'embedding trouvé comme information contextuelle. 

vQuestion := 'Who is my father?';
ChatBot := TsgcAIOpenAIChatBot.Create(nil);
ChatBot.OpenAIOptions.ApiKey := '<your api key>';
ShowMessage(ChatBot.ChatAsUser('Answer the question based on the context below.\n\nContext:\n' + vContext + '\nQuestion:' + vQuestion + '\nAnswer:'));