OpenAI'ye belirli bir bağlam gerektiren bir soru sorduğumuzda, örneğin:
Who is my father?
OpenAI ya halüsinasyon görebilir ya da bilmediğini söyleyebilir.
OpenAI'nin belirli soruları yanıtlamasına yardımcı olmak için, istemin (prompt) kendisinde ek bağlamsal bilgiler sağlayabilirsiniz.
My father lives in Barcelona and is 50 year's old.
OpenAI'ye aynı soruyu tekrar sorarsak, OpenAI bağlamsal bilgilerle sağlanan istemi de dahil ederek yanıt verecektir.
Embeddings
OpenAI, metin dizelerinin ilişkisini ölçmek için metin embeddings olarak bilinen bir yetenek sağlar.Her metin bloğu, bölüm veya konu için bu bilgiyi OpenAI'nin Embedding hizmetine gönderip embedding verisini (yani kayan noktalı sayılardan oluşan bir vektör listesini) geri alabiliriz. İstek örneği:
TsgcHTTP_API_OpenAI._CreateEmbeddings('text-embedding-ada-002', 'My father lives in Barcelona and is 50 year's old.');
Ve OpenAI'den gelen yanıt şuna benzer olacaktır:
{
"data": [
{
"embedding": [
-0.006929283495992422,
-0.005336422007530928,
...
-4.547132266452536e-05,
-0.024047505110502243
],
"index": 0,
"object": "embedding"
}
],
}
Chatbot'umuzun anlamasını istediğimiz farklı bilgi parçalarını temsil eden özel veriyi topladıktan sonra, onu güvenli bir yere (bir vektör veritabanı gibi) kaydetmemiz gerekir. Unutmayın, bu adımı yalnızca bir kez yaparız. Bilgi için bu özel veriyi bir kez alırız ve yalnızca bilgi değişirse onu güncelleriz.
Son olarak, chatbot'a bir soru sormak istediğimizde, önce sorguyu bir vektöre dönüştürürüz ve sonuçla birlikte daha önce oluşturulan veritabanında sorgumuza en benzer vektörün hangisi olduğunu ararız; bulduktan sonra, en benzer vektörün istemini bir embedding olarak soruya ekleriz.
Basit Örnek
Embeddings ve sgcWebSockets kütüphanesini kullanmak için basit bir örnek oluşturalım. Önce ailemizi tanımlayacağız ve her biri için vektörü hesaplayacağız.
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.');
Önceki sonuçlar, her satırın istem ve vektör verisiyle birlikte bir embedding olduğu bir tabloda saklanabilir.
| İstem (Prompt) | Vektör |
| 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...] |
Vektörlerimizi sakladığımıza göre, chatgpt'ye göndereceğimiz soruyu bir vektöre dönüştüreceğiz
oOpenAI := TsgcHTTP_API_OpenAI.Create(nil);
oOpenAI.OpenAIOptions.ApiKey := '<your api key>';
vVectorQuery := oOpenAI._CreateEmbeddings('text-embedding-ada-002', ''Who is my father?'');
Ardından, hangisinin soruyla en benzer olduğunu tespit etmek için bu vektörü veritabanında arayacağız. Aşağıda bir sözde kod (pseudo-code) örneği bulabilirsiniz:
// 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;
Son olarak, bulunan embedding'i bağlamsal bilgi olarak ekleyerek chatgpt'ye soruyu sorarız.
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:'));
