Wanneer we OpenAI een vraag stellen die specifieke context vereist, bijvoorbeeld:
Who is my father?
Dan kan OpenAI gaan hallucineren of antwoorden dat het dat niet weet.
Om OpenAI te helpen specifieke vragen te beantwoorden, kun je extra contextuele informatie meegeven in de prompt zelf.
My father lives in Barcelona and is 50 year's old.
Als we OpenAI dezelfde vraag opnieuw stellen, zal OpenAI antwoorden met behulp van de prompt waarin de contextuele informatie is meegegeven.
Embeddings
OpenAI biedt een functie die bekend staat als text embeddings om de verwantschap tussen tekstreeksen te meten.Voor elk tekstblok, hoofdstuk of onderwerp kunnen we die informatie naar de Embedding-service van OpenAI sturen en krijgen we de bijbehorende embedding-data terug (oftewel een vectorlijst met getallen met drijvende komma). Voorbeeld van een request:
TsgcHTTP_API_OpenAI._CreateEmbeddings('text-embedding-ada-002', 'My father lives in Barcelona and is 50 year's old.');
En het antwoord van OpenAI ziet er ongeveer zo uit:
{
"data": [
{
"embedding": [
-0.006929283495992422,
-0.005336422007530928,
...
-4.547132266452536e-05,
-0.024047505110502243
],
"index": 0,
"object": "embedding"
}
],
}
Zodra we de speciale data hebben verzameld die de verschillende stukjes informatie vertegenwoordigt die we onze chatbot willen laten begrijpen, moeten we die op een veilige plek opslaan (zoals een vectordatabase). Onthoud: deze stap voeren we maar één keer uit. We genereren deze speciale data één keer voor de informatie en werken die alleen bij als de informatie verandert.
Tot slot, wanneer we een vraag aan de chatbot willen stellen, zetten we de vraag eerst om naar een vector. Met dat resultaat zoeken we in de eerder aangemaakte database welke vector het meest lijkt op onze vraag. Zodra die gevonden is, voegen we de prompt van de meest vergelijkbare vector als embedding toe aan de vraag.
Eenvoudig voorbeeld
Laten we een eenvoudig voorbeeld maken om embeddings en de sgcWebSockets-bibliotheek te gebruiken. Eerst beschrijven we onze familie en berekenen we voor iedereen de vector.
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.');
De vorige resultaten kunnen worden opgeslagen in een tabel waar elke rij een embedding is met de prompt en de vectordata.
| Prompt | Vector |
| 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...] |
Nu we onze vectoren hebben opgeslagen, zetten we de vraag die we naar chatgpt sturen om in een vector
oOpenAI := TsgcHTTP_API_OpenAI.Create(nil);
oOpenAI.OpenAIOptions.ApiKey := '<your api key>';
vVectorQuery := oOpenAI._CreateEmbeddings('text-embedding-ada-002', ''Who is my father?'');
Vervolgens zoeken we deze vector in de database om te bepalen welke het meest lijkt op de vraag. Hieronder een pseudocode-voorbeeld:
// 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;
Tot slot stellen we de vraag aan chatgpt waarbij we de gevonden embedding als contextuele informatie meesturen.
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:'));
