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