Generative Ai: Completions API

İsa ÖZGÜR
23 min readMar 31, 2024

--

Görsel Kaynağı: https://www.forbes.com/sites/bernardmarr/2024/01/24/13-ways-writers-should-embrace-generative-ai/

Merhabalar 🖐🏻

Bu yazımda sizlerle birlikte Generative Ai dünyasına bir giriş yapacağız. Generative Ai’ın ne olduğuna kısaca değinip ardından yapay zekanın çıktı üretim tiplerinden “Text Generation” konusuna derinlemesine bir şekilde dalmış olacağız. Text Generation kavramına da hakim olduktan sonra ilk seçeneklerinden olan “Completions API” ile ilgili request parametreleri ve üretilen response’u nasıl işleyebileceğimizi de göreceğiz. Hazırsanız her zamanki gibi tanım kısmımızla başlayalım!

Tanımlar

1.Generative Ai Nedir?

— Metin üretme, resim ve grafik üretimi, ses üretimi gibi hemen hemen her tipte veriyi isteklerimiz doğrultusunda yapay zeka destekli bir biçimde kolayca oluşturmamızı sağlayan süreçler bütünüdür.

— Kısaca aklımıza gelebilecek hemen hemen her veriyi isteklerimize göre işleyerek onlardan farklı anlamlar ve değerler üretebilmemizi sağlar.

2. Text Generation Nedir?

— Doğal dil işleme (Natural Language Processing — NLP) alanındaki bir alt disiplin olup, yapay zeka ve özellikle Generative Ai teknolojilerini kullanarak yeni ve anlamlı metinler oluşturma sürecidir. Bu, insanların yazma tarzını taklit edebilen ve çeşitli konular üzerine metinler yazabilen algoritmaların geliştirilmesi anlamına gelir.

— Bu teknoloji; haber makaleleri, hikayeler, şiirler, raporlar veya sohbet yanıtları gibi çeşitli türlerde içerikler üretmek için kullanılabilir. Text generation sistemleri genellikle büyük metin veri setlerinden öğrenir ve bu bilgileri yeni metinler oluşturmak için kullanır. Bu sistemler, özellikle dil modelleri ve derin öğrenme teknikleri sayesinde metin bağlamını, dilbilgisini ve stilini anlayabilir. Ayrıca bu bilgileri kullanarak gerçekçi ve tutarlı metinler üretebilir.

3. Completions API Nedir?

— OpenAI tarafından sağlanan bir hizmettir ve developerlara, ChatGPT’nin dil modeline web tabanlı bir arayüz aracılığıyla programatik olarak erişim sağlar.

— Bu API, kullanıcıların kendi uygulamalarına, hizmetlerine veya ürünlerine entegre edebilecekleri metin tabanlı yanıtlar üretmek için ChatGPT’yi kullanmalarını sağlar.

— ChatGPT’nin sağlamış olduğu 2 farklı Text Generation API’sinden ilkidir.

NOT:

— Completions API, Open Ai tarafından son güncellemesini Temmuz 2023 tarihinde almıştır.

— Geliştirilmeye devam edilmeyecek olan bu API artık Legacy olarak anılmaya başlanılmış ve popüleritesini yerine Chat Completions API’ye bırakmıştır.

— İlerleyen bölümlerimizde bu yepyeni API’yi de inceliyor olacağız.

4. Completions API Kullanımı:

a) Kullanım Alanları:

  • Genel amaçlı metin üretimi
  • Esnek prompt yapılandırması
  • Çeşitli dillerde ve formatlarda metin oluşturma kapasitesi

şeklinde “metin tabanlı tahminler” geliştirmek amacıyla yaratılmıştır. Yeni GPT modelleri için entegrasyonu maalesef ki yoktur. Yeni modellerle entegre ve sohbet işlemleriyle daha uyumlu olan, ileriki yazılarımda anlatacağım “Chat Completions” geliştirilmiştir.

b) Request Parametreleri:

  • Base Request Endpoint’imiz:
POST

https://api.openai.com/v1/completions
  • Parametreler:(Request Body)

— Toplamda 17 body parametremiz vardır. Aşağıda detaylarıyla birlikte ne işe yaradıklarını görelim.

1. model:

  • string veri tipinde ve body üzerinden verilmesi zorunludur.
  • Bu parametre metin üretimi için kullanacağımız “yapay zeka modeli” dir.

ÖR: “gpt-3.5-turbo-instruct” , “text-davinci-003

2. prompt:

  • string veri tipinde ve body üzerinden verilmesi zorunludur.
  • GPT’den bize sunmasını istediği verileri açıkladığımız, isteklerimizi sunduğumuz parametredir.
  • ÖR: “Bana hayvanlar alemini anlatan bir blog yazısı yaz.

3. best_of:

  • integer veri tipinde ve body üzerinden verilmesi opsiyoneldir. Default değeri 1'dir.
  • İsteklerimiz doğrultusunda “birden fazla çıktı seçeneği” oluşturmamız gerektiği durumlarda kullanılır.
  • Özellikle yüksek kaliteli veya daha az rastgele sonuçlar üretilmesi istendiğinde kullanılır.

4. echo:

  • boolean veri tipinde ve body üzerinden verilmesi opsiyoneldir. Default değeri false’tur.
  • Bu parametre true ayarlandığında response’umuz girdiğimiz promptun çıktıya eklenmiş haliyle bize döner.
  • ÖRNEK:
Prompt:
Son cümlenin yarım bırakılmadan mutlaka anlamlı bir biçimde bitirildiği Türkçe dilinde bir Blog yazısı yaz.\nKonu: Hayvanlar Alemi\nAçıklama: Kedileri anlat\n

Çıktı:
Son cümlenin yarım bırakılmadan mutlaka anlamlı bir biçimde bitirildiği Türkçe dilinde bir Blog yazısı yaz.\nKonu: Hayvanlar Alemi\nAçıklama: Kedileri anlat\n\nKediler, dünyanın en sevimli ve en popüler evcil hayvanlarından biridir. Yumuşak tüyleri, sevimli yüz ifadeleri ve bağımsız kişilikleriyle insanların kalbini kazanmışlardır.
Peki kedilerin hayatı nasıl geçer? Onların dünyasına biraz daha yakından bakalım.\n\nKediler, evcilleştirilmiş türler olmalarına rağmen aslında doğada da çok başarılı avcılardır. İnsanlarla ilk kez Mısır'da tanışmışlardır ve zamanla insanların yaşam alanlarına yerleşmişlerdir.
Ancak hala vahşi doğada yaşayan yüzlerce türü vardır.\n\nKedilerin en dikkat çekici özelliklerinden biri de keskin pençeleri ve esnek vücut yapılarıdır. Bu sayede avlanırken çok hızlı ve çevik hareket edebilirler. Ayrıca tüyleri de onları sıcak ve soğuktan korur. Kedilerin renkli gözleri de oldukça dikkat çekicidir. Kedi ırklarına göre farklı renklerde olabilen gözler, gece görüşlerinin çok iyi olmasını sağlar.\n\nKedilerin en sevilen özelliklerinden biri de bağımsız kişilikleridir. Onlar kendilerini her şeyin en iyisi olarak görür ve bu nedenle egoları oldukça yüksektir. Ancak yine de sahiplerine karşı sevgi ve sadakatleri vardır. Bir kedinin size verdiği sevgiyi başka hiçbir şeyde bulamazsınız.\n\nKediler, uyumayı en çok seven hayvanlardan biridir. Günde ortalama 16 saat uyurlar ve bu uyku periyotlarının büyük bir bölümü rüya görerek geçer. Genellikle gün içinde kısa süreli uykularla enerji depolarlar ve gece avlanmak için uyanık kalırlar.\n\nSon olarak, kedilerin en sevilen özelliklerinden biri de oyun oynamayı çok sevmeleridir. Top, ip veya fare oyuncaklarıyla saatlerce eğlenebilirler. Bu oyunlar hem onların fiziksel hem de zihinsel sağlığı için çok önemlidir.\n\nKısacası kediler, hayvanlar aleminin en sevimli, bağımsız ve oyuncu üyelerinden biridir. Onların dünyasına girdiğinizde size verdiği sevgi ve mutluluk asla unutamayacağınız bir deneyim olacaktır. Siz de bu sevimli yaratıklara bir şans verin, emin olun pişman olmayacaksınız.

— Yukarıdaki örnekte görüldüğü gibi gönderdiğimiz prompt çıktınını başına eklenerek bize response dönülmüştür.

— Bu parametrenin true seçilmesi özellikle farklı katmanlar arası taşınan Open Ai isteklerinin debug süreçleri ve ayrıca request ve response’un bir arada loglarının tutulmasında oldukça etkilidir.

— Eğer ki request attığımız ilk katmanda log tutmak istiyorsak zaten prompt daha request atılırken inşaa edildiğinden buradan request’i alarak logladığımız ortama “Prompt” ve “Output” şeklinde kolonlara ayırarak log kaydımızı gerçekleştirebiliriz.

  • GERÇEK HAYAT ÖRNEĞİ: Verilen giriş cümlesine uygun hikaye yazım asistanı
Prompt:
Bir zamanlar uzak bir galakside, cesur bir astronot yeni keşfedilen bir gezegeni keşfetmek üzere yola çıktı...

Çıktı:
Bir zamanlar uzak bir galakside, cesur bir astronot yeni keşfedilen bir gezegeni keşfetmek üzere yola çıktı... Gezegenin adı Zorix'ti ve bilinmeyen bir dünya olarak biliniyordu. Astronot, Zorix'e vardığında etrafına baktı ve şaşkınlıkla karşılaştı.
Daha önce hiç görmediği renkler, şekiller ve canlılarla doluydu.\n\nAstronot, Zorix'in yüzeyini keşfetmeye başladı ve birçok ilginç şey keşfetti. Yürüdükçe, garip bitkiler ve hayvanlarla karşılaştı.
Bazı bitkilerin yaprakları maviden, bazılarının ise turuncudan yapılmıştı. Hayvanlar da en az bitkiler kadar ilginçti. Bazıları uçan, bazıları ise sürüngenlerdi. Ancak hepsi birbirinden renkli ve benzersizdi.\n\n
Astronot, Zorix'i daha da keşfetmeye devam etti ve bir şehir buldu. Ancak bu şehir, dünyadaki hiçbir şehre benzemiyordu. Binaların hepsi farklı renklerdeydi ve yüksek teknoloji ile yapılmışlardı. Astronot, şehirde dolaşırken, Zorix'in yerlileriyle tanıştı. Onlar da en az gezegenleri kadar ilginçti. Uzaylılar, uzun boylu ve renkli tenleriyle dikkat çekiyordu. Astronot, onlarla konuşmaya başladı ve Zorix hakkında daha fazla bilgi edindi.\n\nZorix'te yaşayan uzaylılar, barışçıl ve meraklı bir topluluktu. Astronot, onlarla birlikte birçok aktiviteye katıldı ve yeni şeyler öğrendi.
Uzaylılar, astronotun geldiği dünyadan da çok ilginç şeyler öğrendiler ve birbirlerine karşılıklı olarak kültürlerini paylaştılar.\n\nAstronot, Zorix'te geçirdiği zamanın sonunda geri dönmek zorunda kaldı. Ancak bu deneyim onun hayatını sonsuza dek değiştirdi. Artık uzaydaki hayatın sadece dünya ile sınırlı olmadığını ve farklı gezegenlerde de hayatın mümkün olduğunu biliyordu.\n\nZorix, astronotun gözünde artık bilinmeyen bir dünya değildi. Onun için, bu gezegen yeni bir ev ve yeni bir aile anlamına geliyordu. Astronot, Zorix'e her döndüğünde, yeni şeyler öğrenmeye ve uzaylı dostlarıyla vakit geçirmeye devam etti. Zorix, onun için artık sadece bir gezegen değil, hayatının bir parçasıydı.

5. frequency_penalty:

  • number veri tipinde(integer, double…) ve body üzerinden verilmesi opsiyoneldir. Default değeri 0.
  • -2.0 ile 2.0 aralığındaki değerler üzerinden çalışır.
  • Değer ne kadar daha 2'ye yaklaşırsa o kadar kelime tekrarı azalarak daha özgün içerikler oluşturulurken, -2'ye yaklaştıkça da tam tersi durum geçerlidir.
  • Genellikle 0–1 aralığı kullanılmalıdır.
  • Kullandığımız modelin ürettiği çıktıdaki “tekrar eden bilgilerin” veya “kelimelerin sıklığının” azaltılması veya arttırılması işlemlerini yönetebilmek amacıyla kullanılır.
  • NOT: Bir metnin “yaratıcılık düzeyinin belirlenmesinde” büyük rol oynar.
  • ÖRNEK 1:

— “Yaratıcı bir hikaye” oluşturmak için frequency_penalty değeri 1 seçilebilir.

— Belli başlı önemli terimlerin sıklıkla kullanılması istenen “teknik bir makale” oluşturmak için frequency_penalty değeri 0 seçilebilir.

6. logit_bias:

  • map(JSON) veri tipinde ve body üzerinden alınması opsiyoneldir. Default değeri null.
  • -100 ile 100 aralığında değerler alır.
  • -1 ile 1 aralığında verilen değerler seçim olasılığını “azaltma” veya “arttırmayı” etkilerken, -100 ile 100 aralığına gelen değerlerde ise daha çok “yasaklama” veya “özel olarak seçilmesi” işlevlerini görür.
  • Çıktımızda bulunacak belli token’ların(kelimeler veya karakter dizileri) model tarafından seçilme olasılıklarının manuel bir biçimde ayarlanması sağlanır.
  • ÖRNEK: Sağlıklı yaşam ile ilgili bir blog yazısı yazımı
{
"logit_bias": {
"12345": 100, // "sağlık" kelimesi için token ID ve bias değeri
"23456": 100, // "egzersiz" kelimesi için token ID ve bias değeri
"34567": 100 // "beslenme" kelimesi için token ID ve bias değeri
}
}
  • Yukarıdaki örnekte görüldüğü gibi logit_bias JSON’ında “sağlık”, “egzersiz” ve “beslenme” kelimeleri “kesinlikle geçmelidir” şeklinde bir kısıtlama getirilmiştir.

7. logprobs:

  • integer veri tipinde ve body üzerinden alınması opsiyoneldir. Default değeri null.
  • Modelin üretmiş olduğunu her bir token için “olasılık dağılımını” elde etmemize yarar.
  • ÖRNEK:

Request

{
"model": "text-davinci-003",
"prompt": "Nasılsın?",
"max_tokens": 50,
"temperature": 0.7,
"top_p": 1,
"frequency_penalty": 0,
"presence_penalty": 0,
"logprobs": 10
}

Response

{
"id": "cmpl-XXXXXXX",
"object": "text_completion",
"created": 1589478378,
"model": "text-davinci-003",
"choices": [
{
"text": " İyiyim, teşekkür ederim. Sen nasılsın?",
"index": 0,
"logprobs": {
"tokens": [" İyiyim", ",", " teşekkür", " ederim", ".", " Sen", " nasılsın", "?"],
"token_logprobs": [-1.234, -2.345, -3.456, -0.567, -1.678, -2.789, -3.890, -0.123],
"top_logprobs": [
{
" İyiyim": -1.234,
"Merhaba": -5.678
},
]
},
"finish_reason": "length"
}
]
}

8. max_tokens:

  • integer veri tipinde ve body üzerinden alınması opsiyoneldir. Default değeri 16.
  • Model tarafından üretilen metnin “maksimum token(kelime veya karakter dizisi)” sayısını belirlemek için kullanılır.
  • Üretilecek çıktının metinsel uzunluğunu kontrol etmemize olanak sağlar.
  • İngilizce kelimeler için Open Ai’ın da vermiş olduğu kaba bir hesap yapmamız gerekirse;

— 1000 token yaklaşık olarak en fazla 750 kelime üretir.

  • Türkçe dili ise İngilizce’ye oranla çok daha karmaşık bir dil olduğundan dolayı token maliyeti artış gösterir.

— 1000 token yaklaşık olarak en fazla 500 kelime üretir.

  • Üretilecek metnin içeriği ve kelimelerin token ağırlıkları bakımından değişiklik gösterebilir. Yalnızca aralarındaki oransal farklılığın gösterilmesi amacıyla yukarıdaki karşılaştırmayı verdim.

ÖRNEK:

  1. Türkçe Çıktı:
Prompt:

Son cümlenin yarım bırakılmadan mutlaka anlamlı bir biçimde bitirildiği bir Makale yazısı yaz.
Çıktı Dili: Türkçe
Konu: Satranç
Açıklama: Katalan açılışını detaylı bir şekilde açıkla.

Çıktı:

Satranç, strateji ve zeka oyunu olarak bilinir ve yüzyıllardır insanların ilgisini çekmektedir. Bu oyunun birçok açılışı ve taktiği bulunmaktadır, ancak bugün sizlere Katalan açılışını detaylı bir şekilde açıklayacağım.Katalan açılışı, beyaz taşların d4 ve c4 hamleleriyle başladığı bir açılıştır. Bu açılış, İspanya'nın Katalonya bölgesinden gelmektedir ve son yıllarda popülerliği artmıştır. Katalan açılışı, beyazın merkezi kontrol etmesi ve gelişmiş bir piyon yapısına sahip olması amacıyla oynanır.Bu açılışta, beyazın d4 ve c4 hamleleriyle merkezi kontrol etmesi, siyahın da bu hamlelere karşı savunma yapması gerekir. Siyahın en yaygın hamlesi, d5 hamlesidir. Bu hamleyle siyah, merkezi kontrol etmeye çalışır ve beyazın piyon yapısını bozmaya çalışır.Katalan açılışında beyazın bir sonraki hamlesi, Nc3 hamlesidir. Bu hamle, beyazın atını geliştirir ve siyahın d5 hamlesine karşı merkezi kontrolünü arttırır. Siyahın en yaygın hamlesi ise, Nf6 hamlesidir. Bu hamleyle siyah, beyazın atına baskı yapar ve merkezi kontrolü ele geçirmeye çalışır.Beyazın bir sonraki hamlesi, g3 hamlesidir. Bu hamleyle beyaz, kralını güvence altına alır ve filini geliştirir. Siyahın en yaygın hamlesi ise, g6 hamlesidir. Bu hamleyle siyah, kendi filini geliştirir ve kralını güvence altına alır.Katalan açılışında beyazın bir sonraki hamlesi, Bg2 hamlesidir. Bu hamleyle beyaz, filini geliştirir ve kralını güvence altına alır. Siyahın en yaygın hamlesi ise, Bg7 hamlesidir. Bu hamleyle siyah, kendi filini geliştirir ve kralını güvence altına alır.Beyazın bir sonraki hamlesi, 0-0 hamlesidir. Bu hamleyle beyaz, kralını rok yaparak güvence altına alır ve kalelerini birleştirir. Siyahın en yaygın hamlesi ise, 0-0-0 hamlesidir. Bu hamleyle siyah, kralını rok yaparak güvence altına alır ve kalelerini birleştirir.Katalan açılışında beyazın son hamlesi, Re1 hamlesidir. Bu hamleyle beyaz, kralını daha da güvence altına alır ve aynı zamanda e5 karesini kontrol eder. Siyahın en yaygın hamlesi ise, c6 hamlesidir. Bu hamleyle siyah, d5 karesini güvence altına alır ve beyazın merkezi kontrolünü zorlaştırır.Sonuç olarak, Katalan açılışı, beyazın merkezi kontrolü ele geçirmesi ve gelişmiş bir piyon yapısına sahip olması amacıyla oynanan bir açılıştır. Bu açılışta, her iki taraf da kendi stratejilerini uygulamaya çalışır ve oyunun gidişatı büyük ölçüde merkezi kontrolün kimde olduğuna bağlıdır. Umarım bu yazı, Katalan açılışını daha iyi anlamanıza yardımcı olmuştur. İyi oyunlar dilerim.
  • max_tokens parametresi 1000 verildi ve yaklaşık olarak 350 kelime.

2. İngilizce Çıktı:

Prompt:

Son cümlenin yarım bırakılmadan mutlaka anlamlı bir biçimde bitirildiği bir Makale yazısı yaz.
Çıktı Dili: İngilizce
Konu: Satranç
Açıklama: Katalan açılışını detaylı bir şekilde açıkla.

Çıktı:

Chess is a game that has been played for centuries, with its origins dating back to ancient India. Over time, it has evolved into a complex and strategic game, with various openings and moves that players can use to gain an advantage over their opponents. One such opening is the Catalan opening, which has gained popularity among chess players in recent years. In this article, we will delve into the details of the Catalan opening and explore its intricacies.The Catalan opening is a chess opening that begins with the moves 1.d4 Nf6 2.c4 e6 3.g3. It is named after the Catalan region of Spain, where it was first played in the early 20th century. The main idea behind this opening is to control the center with the pawn on d4 and the bishop on g2, while also preparing for a kingside attack.One of the key features of the Catalan opening is the fianchetto of the bishop on g2. This allows the bishop to control the long diagonal, putting pressure on the opponent's king and creating potential threats. Additionally, the pawn on c4 supports the pawn on d5, making it difficult for the opponent to break through the center.After the initial moves, Black has several options to respond. One of the most common is 3...d5, which leads to a symmetrical pawn structure. White can then continue with 4.Nf3, developing the knight and preparing to castle kingside. Another option for Black is 3...c6, which aims to control the center with the pawn on d5. In this case, White can continue with 4.Bg2, maintaining the pressure on the long diagonal.One of the main advantages of the Catalan opening is its flexibility. White has various plans and ideas depending on how Black responds. For example, if Black plays 3...Nc6, White can continue with 4.Nf3, preparing to push the pawn to e4 and gain control of the center. On the other hand, if Black plays 3...dxc4, White can respond with 4.Qa4+, attacking the c4 pawn and forcing Black to make a decision.The Catalan opening is also known for its solid and positional nature. It allows White to slowly build up their position and create pressure on the opponent's position. This makes it a popular choice among players who prefer a more strategic approach to the game.In conclusion, the Catalan opening is a versatile and dynamic opening that offers a wide range of possibilities for both sides. Its solid and positional nature makes it a popular choice among chess players of all levels. By understanding its key ideas and variations, you can add this powerful opening to your repertoire and surprise your opponents on the chessboard.
  • max_tokens parametresi 1000 verildi ve yaklaşık olarak 460 kelime.

9. n:

  • integer veri tipinde ve body üzerinden alınması opsiyoneldir. Default değeri 1'dir.
  • Tek bir prompt girişiyle modelden kaç farklı çıktı üretilmesini belirttiğimiz parametredir.
  • Örneğin n = 3 değerini request modelimize eklersek, girdiğimiz prompt’a karşılık 3 farklı versiyonda çıktı kullanımımıza sunulur.
  • ÖRNEK:

Request

{
"model": "text-davinci-003",
"prompt": "Geleceğin teknolojileri hakkında iki farklı perspektifte kısa paragraflar yazın:",
"max_tokens": 100,
"n": 2,
"temperature": 0.7
}

Response

{
"id": "cmpl-XXXXX",
"object": "text_completion",
"created": 1616516516,
"model": "text-davinci-003",
"choices": [
{
"text": "Geleceğin teknolojileri, sürdürülebilir enerji ve çevre dostu inovasyonlarla şekillenecek. Güneş panelleri ve rüzgar türbinleri daha verimli hale gelecek, büyük şehirlerdeki binaların çatıları yeşil alanlara dönüşecek. Bu teknolojiler, iklim değişikliğiyle mücadelede önemli bir rol oynayacak.",
"index": 0,
"logprobs": null,
"finish_reason": "length"
},
{
"text": "Geleceğin teknolojileri, yapay zeka ve makine öğrenimi alanlarında devrim yaratacak. Otomasyon ve akıllı sistemler, günlük yaşamın her alanını daha etkili ve verimli hale getirecek. Sağlık hizmetlerinden ulaşıma, eğitimden üretim süreçlerine kadar her şey bu teknolojilerle şekillenecek.",
"index": 1,
"logprobs": null,
"finish_reason": "length"
}
]
}
  • Request parametremiz olarak n = 2 gönderdiğimizde response’da “choices” array’inden 2 farklı response döndüğünü gözlemleyebiliyoruz.

10. presence_penalty:

  • number veri tipinde(double, integer…) body üzerinden alınması opsiyoneldir. Default değeri 0'dır.
  • Model içerisinde öncesin kullanılmış olan token’ın(kelime, kelime grubu) “tekrardan kullanılma şansını” azaltır.
  • NOT: Bir metnin “yaratıcılık düzeyinin belirlenmesinde” büyük rol oynar.
  • frequency_penalty’ye işlevi bakımında benzerlik gösterir ama;

—” frequency_penalty” parametresi üretilmekte olan metinde kullanılan kelimelerin “tekrar kullanılma sıklığını” düzenler. Pozitif değer ise kelime tekrarı azalır, negatif değerde ise kelime tekrarı artar.

— Yani bir kelime bir kere kullanıldıysa tekrardan da kullanılabilir ama daha az sayıda veya daha fazla sayıda kullanılması ayarlanır.

— “presence_penalty” ise, üretilen bir kelimenin “tekrar kullanılma şansını” düzenler. Pozitif değerler ilgili kelime yerine başka bir kelime kullanılmasını teşvik ederken negatif değerler ise önceden kullanılan bir kelimenin tekrardan üretilme şansının yüksek olmasını sağlar.

ÖZETLE:

— frequency_penalty bir çıktıdaki “kelime sıklığını” düzenleyerek metnin daha özgün ve yaratıcı olmasına katkı sağlarken presence_penalty ise metinde doğrudan “yeniliğe ve çeşitliliğe” teşvik sağlayarak yaratıcılığa katkıda bulunur.

— Her ikisi de örnek senaryomuzda göreceğimiz “Yaratıcılık Düzeyi” nin belirlenmesinde etkili unsurlardandır.

11. seed:

  • Genellikle “tutarlı çıktılar” üretebilmek için kullanılır.
  • Fakat bu parametre yerine “temperature”, “top_b” gibi parametrelerin kullanımı daha yaygındır.

12. stop:

  • string/array veri tiplerinde ve body üzerinden alınması opsiyoneldir. Default değeri null’dır.
  • Modelin üretmiş olduğu çıktıda “bu kelime(string) veya kelime grubunu(array) görünce çıktıyı bitir” şeklinde ihtiyaçlarımız olduğunda kullanırız.
  • ÖRNEK: OpenAI’ı anlatan tek cümlelik bir çıktı üretimi

Request

{
"model": "text-davinci-003",
"prompt": "OpenAI API nedir?",
"max_tokens": 50,
"stop": ["."]
}

Response

{
"choices": [
{
"text": " OpenAI API, geliştiricilerin yapay zeka modellerini kolayca entegre edebilmeleri için tasarlanmış bir platformdur."
}
]
}

— stop parametresine “.” verdiğimiz için bu karakter görülünce çıktı durdurulur ve response dönülür. İlk “.” görüldüğünde de tek bir cümle tamamlanmış olacağından isteğimize uygun bir çıktı elde etmiş oluruz.

13. stream:

  • boolean veri tipinde ve body üzerinden alınması opsiyoneldir. Default değeri false’tur.
  • stream parametresi true seçildiği taktirde Open Ai’ın üretmekte olduğu çıktıyı “parça parça ve gerçek zamanlı olarak” almamıza yarar.
  • Özellikle uzun metinler üretilirken kullanıcının ekranda tüm metnin üretilmesini beklemek yerine metin üretildikçe bu parçaların sırayla ekrana yazılarak deneyiminin arttırılmasını hedefler.
  • ChatGPT’nin kendi sitesinden yaptığımız isteklerde de stream özelliği true biçimde setlendiğinden dolayı anlık olarak generate edilen verileri görebiliriz tamamını beklemek yerine.
  • Aşağıda bir örneğini görebiliriz. Gerçek hayat uygulamasını ise ilerleyen yazılarımda yapıyor olacağım :)
stream ile metin çıktısı görünümü

14. suffix:

  • string veri tipinde ve body üzerinden alınması opsiyoneldir.Default değeri null’dır.
  • NOT: Yalnızca “gpt-3.5-turbo-instruct” modelinde bu parametre kullanılabilmektedir.
  • Bir çıktının sonuna “spesifik bir açıklama eklemek için” kullanılır.
  • ÖRNEK: Yemek tarifi sonuna “Afiyet olsun!” yazalım.

Request

{
"model": "gpt-3.5-turbo-instruct",
"prompt": "Bir çikolatalı kek tarifi yazın:",
"max_tokens": 150,
"temperature": 0.7,
"suffix": "\nAfiyet olsun!"
}

Response

{
"id": "cmpl-XXXXX",
"object": "text_completion",
"created": 1616516516,
"model": "gpt-3.5-turbo-instruct",
"choices": [
{
"text": "Malzemeler:\n- 1 su bardağı şeker\n- 2 su bardağı un\n- 1 su bardağı süt\n- Yarım su bardağı kakao\n- 3 yemek kaşığı tereyağı\n- 2 adet yumurta\n- 1 paket vanilya\n- 1 paket kabartma tozu\n\nYapılışı:\n1. Şeker ve yumurtaları bir kaba alın ve köpürene kadar çırpın.\n2. Eritilmiş tereyağı, süt ve vanilyayı ekleyip karıştırmaya devam edin.\n3. Un, kakao ve kabartma tozunu eleyerek karışıma yavaşça ekleyin ve homojen bir karışım elde edene kadar karıştırın.\n4. Karışımı yağlanmış kek kalıbına dökün ve önceden ısıtılmış 180 derece fırında 40 dakika pişirin.\n\nAfiyet olsun!"
}
]
}

15. temperature:

  • number veri tipinde(integer, double…) ve body üzerinden alınması opsiyoneldir. Default değeri 1'dir.
  • 0 ile 2 aralığında değerler alabilir.
  • Modelin üretmekte olduğu metnin “tahmin edilebilirliğini” ve “rastgeleliğini” kontrol etmek için kullanılır.
  • Bu parametre çıktıların “yaratıcılığını” etkileyen en önemli parametredir.
  • ÖRNEK KULLANIMLAR:
  1. Temel düzeyde temperature:(0 ile 0.2 aralığında)
  • Müşteri Hizmetleri Uygulamaları: Standart ve beklenen yanıtları gerektiren durumlar için kullanılır.
  • Teknik Dokümantasyon: Teknik ve spesifik bilgiler gerektiren açıklamalar için kullanılır.

— Yukarıdaki bilgiler “kesin ve geçerli” veriler elde edilmek istendiğinde temperature değerinin düşük tutulmasıyla elde edilirler.

2. Gelişmiş düzeyde temperature:(0.3 ile 0.7 aralığında)

  • Eğitim Materyalleri: Hem bilgilendirici hem de dikkat çekici öğretim materyalleri için kullanılır. Öğreticiliğin daha etkili olması adına daha “gelişmiş” bir metin üretim yapısı gerektirir.
  • Gelişmiş Düzeyde Yazım: Belirli bir yaratıcılık seviyesi gerektiren ama tamamen rastgele olmayan senaryolar için kullanılır. Tamamen teknik bilgi değil de biraz özgünlük ve farklılık içeren yazı tipleri için geçerlidir.

3. Yaratıcı Düzeyde temperature:(0.8 ile 2 aralığında)

  • NOT: Genellikle 0.8 ile 1.5 aralığında kullanılır.(ChatGPT önerisi)
  • Yaratıcı Senaryolar: Özgün ve beklenmedik içerik üretimi için kullanılır.
  • Reklam ve Pazarlama: Dikkat çekici, yenilikçi fikirler ve ifadeler için kullanılır.

16. top_b:

  • number veri tipinde(inter,double…) ve body üzerinden alınması opsiyoneldir. Default değeri 1'dir.
  • Modelin bir sonraki parametreyi seçerken “hangi olasılık dağılımını kullanacağını” belirler.
  • Örneğin top_b değeri 0.9 olarak ayarlandığında, model bir sonraki sıradaki kelimeyi seçmek için en olası kelime grubunu kullanır ve bu grubun toplam olasılığı %90 seviyesine ulaştığında durur. Böylece çok daha düşük olasılığa sahip kelimeleri dikkate almayarak “daha kaliteli ve tutarlı” içerikler üretmemize yardımcı olur.
  • Yaratıcılık için önemli bir parametredir.
  • ÖNEMLİ: Genellikle temperature’ın kullanımı yeterlidir kelime kalitesi artışı için. Hem temperature hem de top_b’nin aynı request için kullanımı Open Ai tarafından önerilmez.
  • NOT: Metnin yaratıcılık ve zenginlik seviyesini belirlemede 4 parametre kullanılır. İlk üçü bizim için genellikle yeterlidir.

— frequency_penalty

— presence_penalty

— temperature

— top_b(temperature ile beraber değiştirme!)

17. user:

  • string veri tipinde ve body üzerinden alınması opsiyoneldir. Default değeri 1'dir.
  • Hangi kullanıcının nasıl bir biçimde Open Ai ile etkileşime geçtiği, nasıl prompt’lar girdiği gibi veriler Open Ai tarafında analiz edilmektedir.
  • Servislerimizden girilen inputlarda “kötüye kullanım” , “politika ihlali” gibi durumlar tespit edildiğinde kullanıcı bazlı bu şekilde “UserId” parametresini gönderirsek, Open Ai bizlere ulaştığında hangi kullanıcı için aksiyon alacağımız çok daha kolay olur.

ÖRNEK:

{
"model": "text-davinci-003",
"prompt": "Bu kullanıcı için önceki etkinliklerine dayanarak haber önerileri sunun.",
"user": "unique_user_id_7777"
}

c) Response Parametreleri:

1. id:

  • string veri tipindeki response olarak dönen completion’a ait unique identifier’dır.

2. choices:

  • array(List) veri tipindedir.
  • Request parametrelerindeki “n” değeri default değeri olan 1'den büyük girilirse birden fazla completion seçeneği, eğer ki değiştirilmezse de yalnızca tek elemanı bir array bizleri karşılar.
  • Oluşturduğumuz prompt ve completion request’den dönen response’ları buradan alabiliriz.

3. created:

  • integer(C#’da DateTime?) veri tipindedir.
  • Bir completion request’in “ne zaman yapıldığını gösteren Unix zaman damgasıdır” ve saniye cinsinden ifade edilir.
  • Bu bilgi, bir isteğin ne zaman oluşturulduğunu takip etmek için kullanılabilir ve özellikle “isteklerin zaman sırasına göre sıralanması” veya “belirli bir zaman aralığında yapılan isteklerin incelenmesi” gibi durumlarda yararlıdır.

4. model:

  • string veri tipindeki response olarak dönen completion’ın üretimi için kullanılan model’dir.

5. system_fingerprint:

  • string veri tipindedir.
  • Bu, modelin çalıştığı arka uç yapılandırmasını temsil eden benzersiz bir tanımlayıcıdır. Sistem yapılandırmasında yapılan değişikliklerin belirli isteklerin deterministik (yani tekrarlanabilir) doğasını nasıl etkileyebileceğini anlamak için kullanılabilir.
  • Örneğin, eğer seed parametresini kullanıyorsanız ve sistemin yapılandırmasında bir değişiklik olduysa, system_fingerprint değişikliği yansıtacaktır ve bu, aynı seed değerini kullansanız bile farklı sonuçlar alabileceğiniz anlamına gelebilir.

6. object:

  • string veri tipindedir.
  • Bu veri, API’nin ürettiği nesne tipini belirtir ve OpenAI için bu genellikle “text_completion” olur. Bu, API’nin ne tür bir işlem yaptığını tanımlar; bu durumda, bir metin tamamlama isteği yapıldığını gösterir.

7. usage:

  • object veri tipindedir.
  • Completion isteğinden dönecek olan response’un “kullanılan token maliyet istatistikleri” buradan gözlemlenebilir.

ÖRNEK:

"usage": {
"prompt_tokens": 15,
"completion_tokens": 30,
"total_tokens": 45
},
  • prompt_tokens: input için kullanılan token sayısı
  • completion_tokens: response için kullanılan token sayısı
  • total_tokens: input + response için kullanılan token sayısı

Tüm parametreler ve detayları öğrendikten sonra Completions API kullanımı ve daha nicesini bir “Metin Üretim Asistanı” uygulaması yaparak pekiştirelim!

Senaryo:

  • Konu, açıklama alanı, yazı tipi gibi alanlar alarak istenilen formata uygun “metin üretim asistanı” yapımı

NOT:

  • Örneğimiz içerisinde .NET projeleri içerisinde Open Ai API’leriyle uyumlu bir kütüphane olan “OpenAI” kullanılacaktır.
OpenAI library by OkGoDolt
  • Yazımın sonunda “Meraklısına” ismindeki bölümümde “Fiddler” tool’unu kullanarak kütüphane üzerinden Open Ai API’lerine atılan ağ isteklerimizi monitor ederek kütüphanenin soyutlamış olduğu request ve response’ları açarak inceleyeceğiz :)
  • Senaryo entegrasyonu için kullanacağım platform .NET Core 7 olacaktır.
  • Proje içeriğiyle ilgili bir ön bilgiye sahip olmak için öncesinde aşağıdaki yazımı okumanızı tavsiye ediyorum;

Design Patterns: Builder -> https://medium.com/@ChessWizard/design-patterns-builder-26b84be3f48e

Kullanacağım kütüphane ve teknolojileri gördükten sonra senaryomuzun detaylarıyla devam edelim.

a) Metin Üretimi İçin Request’imiz:(FullTextCompletionQuery)

public class FullTextCompletionQuery : IRequest<Result<FullTextCompletionQueryResult>>
{
public string Subject { get; set; }

public string? Description { get; set; }

public int? WordCount { get; set; }

public PromptType PromptType { get; set; }

public CreativityType CreativityType { get; set; }

public LanguageType LanguageType { get; set; }

public int RequestedOption { get; set; } = 3;
}

Request parametrelerimize göz attığımızda;

  • Subject:

Üreteceğimiz metin için belirttiğimiz konu bilgisi.

Bu input’un girilmesi zorunludur, metnimiz genel olarak buradan üretilmeye başlanır.

  • Description:

Üreteceğimiz metin için belirttiğimiz açıklama bilgisi.

Bu input’un girilmesi zorunlu değildir, eğer ki kullanıcı üretmek istediği metinle alakalı detaylar girmek istiyorsa bu alanı doldurur ve daha zengin sonuçlar üretebilir.

  • WordCount:

Üretilecek metin ile alakalı kelime uzunluğu kısıtlaması koymak içindir.

NOT:

— GPT 3.5 modellerinde genellikle istenildiği gibi bir sonuç vermemektedir.

— Belirli bir karakter sınırlaması için “maksimum token sayısı kısıtlaması” vermemiz daha sağlıklı olur.

  • PromptType:

Üretilecek metnin tipidir.

Aşağıdaki gibi bir görünüme sahiptir.

public enum PromptType
{
[Display(Name = "Açıklama")]
None = 0,

[Display(Name = "Makale")]
Article = 1,

[Display(Name = "Blog")]
Blog = 2
}
  • CreativityType:

Yapay zeka modelinin girdiğimiz inputlar doğrultusunda üreteceği metnin “yaratıcılık düzeyinin” kullanıcı tarafından belirlenmesini sağlar.

Aşağıdaki gibi bir görünüme sahiptir.

public enum CreativityType
{
Basic = 1,
Advanced = 2,
Creative = 3
}
  • LanguageType:

Üretilecek metnin “dil seçeneğinin” ayarlanmasını sağlar.

Çıktımızın client’tan gelecek dil seçeneğine uygun bir biçimde getirilmesi filtresi prompt üzerinden uygulanır.

Aşağıdaki gibi bir görünüme sahiptir.

public enum LanguageType
{
[Display(Name = "Türkçe")]
TR = 1,

[Display(Name = "İngilizce")]
US = 2
}
  • RequestedOption:

Üretilecek metinlerle ilgili ChatGPT’den toplamda kaç farklı seçenek istediğimizi belirttiğimiz parametredir.

Default olarak ChatGPT girdiğimiz inputlar doğrultusunda bize 3 farklı metin seçeneği verecektir.

b) Metin Üretimi İçin Response’umuz:(FullTextCompletionQueryResult)

public class FullTextCompletionQueryResult
{
public List<TextCompletionOptionDto> Options { get; set; }
}
public class TextCompletionOptionDto
{
public string Message { get; set; }

public int WordCount { get; set; }
}
  • Request atan client’a birden fazla metin seçeneği dönebileceğimizden dolayı “list of TextCompletionOptionDto” tipinde bir liste dönülür.
  • Bu dto içerisinde üretilen metin(Message) ve client’ın kaç kelimelik metin olduğunu da kullanıcıya gösterebilmesi adına kelime sayısı(WordCount) bulunur.

c) Metin Üretim Operasyonumuz:(FullTextCompletionQueryHandler)

public class FullTextCompletionQueryHandler : IRequestHandler<FullTextCompletionQuery, Result<FullTextCompletionQueryResult>>
{
private readonly IOpenAiService _openAiService;

public FullTextCompletionQueryHandler(IOpenAiService openAiService)
{
_openAiService = openAiService;
}

public async Task<Result<FullTextCompletionQueryResult>> Handle(FullTextCompletionQuery request, CancellationToken cancellationToken)
{
var prompt = new PromptBuilder()
.SetSubject(request.Subject)
.SetDescription(request.Description)
.SetPromptType(request.PromptType)
.SetWordCount(request.WordCount)
.SetLanguageType(request.LanguageType)
.Build();

var completionRequest = CompletionHelper.GenerateCompletionRequestByCreativity(request.CreativityType, prompt);

var completion = await _openAiService.CreateTextCompletionsAsync(completionRequest, request.RequestedOption);

if (completion is null || !completion.Completions.Any())
return Result<FullTextCompletionQueryResult>.Error("İsteğinize uygun bir cevap üretilemedi!", (int)HttpStatusCode.BadRequest);

var options = completion.Completions
.Select(completion => new TextCompletionOptionDto
{
Message = completion.Text.Replace("\n", ""),
WordCount = completion.Text.Replace("\n", "").GetWordCount()
}).ToList();

FullTextCompletionQueryResult result = new()
{
Options = options,
};

return Result<FullTextCompletionQueryResult>.Success(result, (int)HttpStatusCode.OK);
}
}
  • Önceki kısımlarda Request ve Response objelerimizi gördükten sonra asıl kısım olan Handler metodumuz içerisine gelerek metin üretimi işlemimizi parça parça inceleyelim.

Parça-1: Prompt İnşaası

var prompt = new PromptBuilder()
.SetSubject(request.Subject)
.SetDescription(request.Description)
.SetPromptType(request.PromptType)
.SetWordCount(request.WordCount)
.SetLanguageType(request.LanguageType)
.Build();
  • Builder pattern kullanarak kullanıcının istekleri doğrultusunda girdiği verileri kullanarak prompt’umuzu inşaa ediyoruz.
  • ÖRNEK PROMPT:
Son cümlenin yarım bırakılmadan mutlaka anlamlı bir biçimde bitirildiği bir Makale yazısı yaz.\nÇıktı Dili: Türkçe Konu: Satranç\nAçıklama: Katalan açılışını tüm detaylarıla birlikte açıklar mısın?\n

Parça-2: Yaratıcılık Düzeyine Göre Completion Request

  • Aşağıda görülen helper metot sayesinde kullanıcının seçmiş olduğu “yaratıcılık düzeyi” ile uyumlu bir biçimde Completion Request nesnesi oluşturuyoruz.
var completionRequest = CompletionHelper.GenerateCompletionRequestByCreativity(request.CreativityType, prompt);
  • Completion Request Nesnesi Oluşturma İşlemi:
public static class CompletionHelper
{
/// <summary>
/// Yaratıcılık düzeyine göre Completion oluşturur
/// </summary>
/// <param name="creativityType"></param>
/// <param name="maxTokens"></param>
/// <param name="prompt"></param>
/// <returns></returns>
public static CompletionRequest GenerateCompletionRequestByCreativity(CreativityType creativityType, string prompt, int maxTokens = 1000)
{
var (Temperature, FrequencyPenalty, PresencePenalty) = GetCreativitySettings(creativityType);

CompletionRequest completionRequest = new()
{
Model = OpenAI_API.Models.Model.ChatGPTTurboInstruct,
MaxTokens = maxTokens,
Temperature = Temperature,
FrequencyPenalty = FrequencyPenalty,
PresencePenalty = PresencePenalty,
Prompt = prompt
};

return completionRequest;
}

private static (double Temperature, double FrequencyPenalty, double PresencePenalty) GetCreativitySettings(CreativityType creativityType)
{
return creativityType switch
{
CreativityType.Basic => (0.3, 0, 0),
CreativityType.Advanced => (0.7, 0.2, 0.2),
CreativityType.Creative => (1.2, 0.5, 0.5),
_ => (0.5, 0, 0),
};
}
}
  • Kodda görüldüğü üzere Temel, Gelişmiş ve Yaratıcı şeklindeki 3 farklı düzey için modelin yaratıcılık düzeyini etkilemek adına 3 farklı parametreye yazımın başlarında anlattığım bilgiler doğrultusunda değerler verdim.
  • Yaratıcılık düzeyi belirlemek için temperature, frequency_penalty ve presence_penalty parametrelerini kullanmamız yeterlidir.
  • Bu metodu helper seçmemim sebebine gelecek olursak; birden fazla şekilde Open Ai’a istek atacağımız durumlarda yaratıcılık düzeyi üzerinden bir request oluşturulabilir ve herhangi bir nesne manipülasyonu gerektirmeden yalnızca static olarak ulaşmamızın yeterli olduğu bir işlemdir.

Parça-3: Completions Api’ye İstek Atalım

var completion = await _openAiService.CreateTextCompletionsAsync(completionRequest, request.RequestedOption);

if (completion is null || !completion.Completions.Any())
return Result<FullTextCompletionQueryResult>.Error("İsteğinize uygun bir cevap üretilemedi!", (int)HttpStatusCode.BadRequest);
  • OpenAi kütüphanesine giden metodumuzu proje içerisinde IOpenAiService içerisine aldıktan sonra içerisinde önceki kısımda yaratıcılık düzeyi üzerinden oluşturduğumuz CompletionRequest nesnesini ve kaç farklı metin seçeneği(request.RequestedOption : integer) dönmesini istediğimizi de parametre olarak geçerek kütüphane üzerinden Open Ai’a istek atıyoruz.
  • OpenAiService İçeriğimiz:
 public class OpenAiService : IOpenAiService
{
private readonly AiConfigurations _aiConfigurations;
private readonly OpenAIAPI _openAIAPI;
public OpenAiService(IOptions<AiConfigurations> aiConfigurations)
{
_aiConfigurations = aiConfigurations.Value;
_openAIAPI = new(_aiConfigurations.OpenAi.SecretKey);
}

public async Task<CompletionResult> CreateTextCompletionsAsync(CompletionRequest request, int optionCount = 3)
=> await _openAIAPI.Completions
.CreateCompletionsAsync(request, optionCount);

public async Task<AudioResultVerbose> GetSpeechToTextDetailsAsync(byte[] audioArray)
{
using MemoryStream stream = new(audioArray);
var audioDetails = await _openAIAPI.Transcriptions
.GetWithDetailsAsync(stream, "audio.mp3", "tr");

return audioDetails;
}
}
  • OpenAI kütüphanesinden gelen OpenAIAPI nesnesi üzerinden entegrasyonlarımızı gerçekleştireceğiz.
  • Bu nesneyi kullanabilir hale getirmek için Open Ai tarafıyla haberleşebilmemizi sağlayan bir “Secret Key” parametresi üretip bu nesnenin contructor’ına vermemiz gerekir. Open Ai hesabınızı açtıktan sonra aşağıda verecek olduğum link üzerinden siz de bir Secret Key oluşturarak ve kullanacağınız model için belirli bir ücret ödeyerek Open Ai entegrasyonunu etkin hale getirebilirsiniz.

Secret Key Üretim Kısmı: https://platform.openai.com/api-keys

  • Best Practise olarak şifreli veya uygulama içerisindeki sabit parametrik verileri appsettings.json üzerine yazarak Options Pattern aracılığıyla bu kısma çektim.

Parça-4: Metin Üretim Asistanı Response’umuz

var options = completion.Completions
.Select(completion => new TextCompletionOptionDto
{
Message = completion.Text.Replace("\n", ""),
WordCount = completion.Text.Replace("\n", "").GetWordCount()
}).ToList();

FullTextCompletionQueryResult result = new()
{
Options = options,
};

return Result<FullTextCompletionQueryResult>.Success(result, (int)HttpStatusCode.OK);
  • Kullanıcı birden fazla metin seçeneği isteyebileceğinden dolayı List veri tipi içerisinde “metin seçeneği(Message)” ve metnin “kaç karakterden oluştuğu(WordCount)” bilgisini dönüyoruz.

Hadi hep birlikte bir deneme yapalım!

ÖRNEK:

1.Request Url:

{{environment_name}}/api/Completions/fullText?Subject=Satranç&Description=Son cümlenin yarım bırakılmadan mutlaka anlamlı bir biçimde bitirildiği bir Makale yazısı yaz.\nÇıktı Dili: Türkçe Konu: Satranç\nAçıklama: Katalan açılışını tüm detaylarıla birlikte açıklar mısın?\n&PromptType=Article&CreativityType=Advanced&LanguageType=TR&RequestedOption=1

2. Prompt:

Son cümlenin yarım bırakılmadan mutlaka anlamlı bir biçimde bitirildiği  bir Makale yazısı yaz.\nÇıktı Dili: Türkçe Konu: Satranç\nAçıklama: Katalan açılışını tüm detaylarıla birlikte açıklar mısın?\n

3. Response:

{
"data": {
"options": [
{
"message": "Satranç, strateji ve zeka gerektiren bir masa oyunudur. Binlerce yıllık tarihi geçmişi ve dünya çapında milyonlarca oyuncusuyla popülerliğini korumaya devam etmektedir. Her ne kadar çok sayıda açılış stratejisi olsa da, bu yazıda özellikle Katalan açılışından bahsedeceğim.Katalan açılışı, beyaz taşların ilk hamlesiyle d4 ve sonra da c4 yapmasıyla başlar. Bu hamleler, merkezdeki dört karesini kontrol eden beyazın avantajlı bir konuma gelmesini sağlar. Siyahın da aynı şekilde merkezi kontrol etme amacıyla c5 yapması yaygın bir hamledir.Beyazın ikinci hamlesi olan c4, atın merkeze doğru hareket etmesini engeller ve bu sayede siyahın atının gelişimini kısıtlar. Ayrıca beyazın c4 hamlesinden sonra dama taşı da serbest bir şekilde hareket edebilir. Bu da beyaz için daha fazla avantaj sağlar.Katalan açılışının en önemli özelliği, beyazın hızlı bir şekilde kalelerini güvence altına almasıdır. Beyazın hızlı bir şekilde kralını koruması, siyah oyuncunun atak girişimlerine karşı savunmasını güçlendirir. Bu sayede beyaz oyuncu, oyunu kontrol etme ve istediği hamleleri yapma şansına sahip olur.Katalan açılışı, orta oyunda da etkisini sürdürür. Beyazın c4 hamlesi, siyahın merkezdeki piyonlarını zayıflatır ve böylece beyazın atak girişimlerine fırsat verir. Beyazın merkezi kontrolü sayesinde, oyunun ilerleyen safhalarında da avantajını koruması daha kolay olur.Ancak Katalan açılışı her zaman beyaz için avantajlı bir strateji değildir. Siyah oyuncu, doğru hamlelerle bu açılışa karşı savunmasını güçlendirebilir ve hatta beyazın avantajını ele geçirebilir. Bu nedenle her satranç oyuncusunun Katalan açılışına karşı hazırlıklı olması ve iyi bir savunma stratejisi geliştirmesi önemlidir.Sonuç olarak, Katalan açılışı satranç oyununda oldukça etkili bir stratejidir. Beyaz oyuncuya merkezi kontrol avantajı sağlar ve hızlı bir şekilde kalelerini güvence altına almasını sağlar. Ancak siyah oyuncunun da doğru hamlelerle bu stratejiye karşı savunması güçlendirilebilir. Bu nedenle, her iki oyuncunun da Katalan açılışını iyi bilmesi ve oyunu doğru bir şekilde yönetmesi önemlidir. ",
"wordCount": 284
}
]
},
"httpStatusCode": 200
}

Tüm detaylarıyla birlikte Completions Api’yi ve kullanımı öğrenerek örnek senaryomuzla birlikte de kullanımını gördük.

Şimdi de “Meraklısına” bölümümüzle birlikte kütüphane üzerinden aslında Open Api tarafına nasıl bir istek gittiğini “Fiddler” uygulaması üzerinden ağı monitör ederek görelim!

Meraklısına :)

  • Kütüphane üzerinden dış servislere attığımız request’leri monitör etmek istediğimizde “Fiddler” ismindeki uygulamayı kullanabiliriz.
  • Fiddler, internet üzerindeki HTTP ve HTTPS trafiğini yakalamamıza olanak tanıyan bir “web debugging tool” dur.
  • Web uygulamalarının ve servislerinin ağ trafiğinin izlenmesinde sıklıkla kullanılır.
  • Kütüphane üzerinden atılan isteklerde de doğrudan istek atılan url ve içeriğini göremediğimizden dolayı Fiddler ile debug edebiliriz :)

Fiddler İndirme Linki: https://www.telerik.com/download/fiddler

a) OpenAi Request

  1. Request JSON:
{"model":"gpt-3.5-turbo-instruct","prompt":"Son cümlenin yarım bırakılmadan mutlaka anlamlı bir biçimde bitirildiği  bir Makale yazısı yaz.\nÇıktı Dili: Türkçe Konu: Satranç\nAçıklama: Katalan açılışını tüm detaylarıyla birlikte açıklar mısın?\n","max_tokens":1000,"temperature":0.7,"presence_penalty":0.2,"frequency_penalty":0.2,"n":1,"stream":false}

2. Request Fiddler Görünümü:

Fiddler Completion Request

b) OpenAi Response

  1. Response JSON:
{
"id": "cmpl-98p8c2Beg9iSu9YhZqaQ5OGhCYbsC",
"object": "text_completion",
"created": 1711890226,
"model": "gpt-3.5-turbo-instruct",
"choices": [
{
"text": "\nSatranç, strateji ve zeka gerektiren bir masa oyunudur. Binlerce yıllık tarihi geçmişi ve dünya çapında milyonlarca oyuncusuyla popülerliğini korumaya devam etmektedir. Her ne kadar çok sayıda açılış stratejisi olsa da, bu yazıda özellikle Katalan açılışından bahsedeceğim.\n\nKatalan açılışı, beyaz taşların ilk hamlesiyle d4 ve sonra da c4 yapmasıyla başlar. Bu hamleler, merkezdeki dört karesini kontrol eden beyazın avantajlı bir konuma gelmesini sağlar. Siyahın da aynı şekilde merkezi kontrol etme amacıyla c5 yapması yaygın bir hamledir.\n\nBeyazın ikinci hamlesi olan c4, atın merkeze doğru hareket etmesini engeller ve bu sayede siyahın atının gelişimini kısıtlar. Ayrıca beyazın c4 hamlesinden sonra dama taşı da serbest bir şekilde hareket edebilir. Bu da beyaz için daha fazla avantaj sağlar.\n\nKatalan açılışının en önemli özelliği, beyazın hızlı bir şekilde kalelerini güvence altına almasıdır. Beyazın hızlı bir şekilde kralını koruması, siyah oyuncunun atak girişimlerine karşı savunmasını güçlendirir. Bu sayede beyaz oyuncu, oyunu kontrol etme ve istediği hamleleri yapma şansına sahip olur.\n\nKatalan açılışı, orta oyunda da etkisini sürdürür. Beyazın c4 hamlesi, siyahın merkezdeki piyonlarını zayıflatır ve böylece beyazın atak girişimlerine fırsat verir. Beyazın merkezi kontrolü sayesinde, oyunun ilerleyen safhalarında da avantajını koruması daha kolay olur.\n\nAncak Katalan açılışı her zaman beyaz için avantajlı bir strateji değildir. Siyah oyuncu, doğru hamlelerle bu açılışa karşı savunmasını güçlendirebilir ve hatta beyazın avantajını ele geçirebilir. Bu nedenle her satranç oyuncusunun Katalan açılışına karşı hazırlıklı olması ve iyi bir savunma stratejisi geliştirmesi önemlidir.\n\nSonuç olarak, Katalan açılışı satranç oyununda oldukça etkili bir stratejidir. Beyaz oyuncuya merkezi kontrol avantajı sağlar ve hızlı bir şekilde kalelerini güvence altına almasını sağlar. Ancak siyah oyuncunun da doğru hamlelerle bu stratejiye karşı savunması güçlendirilebilir. Bu nedenle, her iki oyuncunun da Katalan açılışını iyi bilmesi ve oyunu doğru bir şekilde yönetmesi önemlidir. ",
"index": 0,
"logprobs": null,
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 86,
"completion_tokens": 762,
"total_tokens": 848
}
}

2. Response Fiddler Görünümü:

Fiddler Completion Response

Completions Api ile ilgili tüm bilgiler ve detaylarını öğrendikten sonra ardından üstüne bir örnek senaryo ile kullanımını pekiştiriyoruz ve finalimizde de Fiddler ile kütüphane üzerinden atmış olduğumuz Open Ai isteğini ağ trafiğini monitör ederek açık halini görüyoruz.

Github Repo Linki: https://github.com/ChessWizard/WizardAi

Umarım sizler için faydalı olmuştur, önümüzdeki yazılarımda görüşmek üzere :)

KAYNAKLAR:

--

--

İsa ÖZGÜR

Software Developer Intern & Professional Chess Player/Trainer