Personalizzare OpenAI con i tuoi dati (1 / 2)

· Funzionalità

Quando facciamo a OpenAI una domanda che richiede un contesto specifico, ad esempio:

Who is my father?

OpenAI può allucinare o rispondere che non lo sa.

Per aiutare OpenAI a rispondere a domande specifiche, puoi fornire informazioni contestuali aggiuntive nel prompt stesso.

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

Se chiediamo di nuovo a OpenAI la stessa domanda, OpenAI risponderà includendo il prompt fornito con le informazioni contestuali.

Embeddings

OpenAI fornisce una funzionalità chiamata text embeddings per misurare la correlazione tra stringhe di testo.

Per ogni blocco di testo, capitolo o argomento possiamo inviare quell'informazione al servizio Embedding di OpenAI per ricevere indietro i suoi dati di embedding (cioè una lista vettoriale di numeri in virgola mobile). Esempio di richiesta:

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

E la risposta di OpenAI sarà qualcosa del genere:

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

Una volta raccolti i dati speciali che rappresentano le diverse informazioni che vogliamo far comprendere al nostro chatbot, dobbiamo salvarli in un posto sicuro (come un database vettoriale). Ricorda che questo passo si fa una sola volta. Otteniamo questi dati speciali per l'informazione una volta e li aggiorneremo solo se l'informazione cambia.

Infine, quando vogliamo porre una domanda al chatbot, prima convertiamo la query in un vettore e con il risultato cerchiamo nel database creato in precedenza quale vettore è il più simile alla nostra query; una volta trovato, aggiungiamo come embedding alla domanda il prompt del vettore più simile.

Esempio semplice

Creiamo un esempio semplice per usare gli embeddings e la libreria sgcWebSockets. Prima descriveremo la nostra famiglia e calcoleremo il vettore per ciascuna persona.

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.');

I risultati precedenti possono essere memorizzati in una tabella in cui ogni riga è un embedding con il prompt e i dati del vettore. 

Prompt Vettore
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...]

Ora che abbiamo memorizzato i nostri vettori, convertiremo in un vettore la domanda che invieremo a ChatGPT 

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

Poi cercheremo questo vettore nel database per individuare quale è il più simile alla domanda. Trovi qui sotto un esempio in pseudo-codice:

// 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;

Infine chiediamo a ChatGPT aggiungendo l'embedding trovato come informazione contestuale. 

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:'));