Günümüzün hızlı dijital dünyasında ve Büyük Dil Modellerinin (LLM’ler) yükselişiyle, konuşmaya dayalı uygulamalar büyük popülerlik kazandı. Sohbet botları, günlük yaşamımızda uygulamalarla, web siteleriyle ve hatta müşteri hizmeti kanallarıyla etkileşim kurma biçimimizi dönüştürdü.
Kendi sohbet botunuzu geliştirme becerisi, işletmelerin ve bireylerin belirli ihtiyaçlarına göre kişiselleştirilmiş, verimli ve ilgi çekici konuşma arayüzleri oluşturmasını sağlayan oyunu değiştiren bir yetkinlik olarak öne çıktı.
Bu makale, LLM’lerin gücünden yararlanarak Python ile bir sohbet botunun nasıl geliştirileceğini adım adım ele almayı amaçlıyor. ChatGPT ile kendi sohbet botumuzu nasıl oluşturacağımızı ve popüler LangChain çerçevesini kullanarak onu nasıl daha da optimize edeceğimizi inceleyeceğiz.
ChatGPT ve LangChain’e yeniyseniz, aşağıdaki GPT & LangChain ile Büyük Dil Modellerine Giriş kod eşliğinde oturumumuzu inceleyin:
Bu makale, altında model olarak ChatGPT’yi kullanan optimize bir sohbet botunun geliştirilmesinin tüm kritik yönlerini kapsar. openai ve langchain kütüphanelerinin kurulu olduğu bir Jupyter Notebook kullanacağız. bu DataLab çalışma kitabından adım adım izleyebilirsiniz.
Devam eden bölümlerde, konuşmamızın yapı taşları olarak ChatGPT’ye temel API çağrıları yapmak için OpenAI API’sının nasıl kullanılacağını keşfedeceğiz. Ayrıca, temel Python yapılarıyla sohbet botumuza bağlam farkındalığı kazandıracağız. Son olarak, LangChain kullanarak hem sohbet botu uygulamasını hem de konuşma geçmişini optimize edecek ve bellek özelliklerini inceleyeceğiz.
Temel ChatGPT API Çağrıları
Sohbet botumuzun arkasındaki model olarak ChatGPT’yi kullanacağız. Bu nedenle, ilk uygulamalı görevimiz, ilk etkileşimi kurabilmek için ChatGPT’ye basit ama eksiksiz bir API çağrısı yazmaktan oluşacak.
Aşağıdaki Python fonksiyonu, yalnızca openai kütüphanesini kullanarak ChatGPT’ye istediğimiz API çağrısını kapsüller.
import os
import openai
openai_api_key = os.environ["OPENAI_API_KEY"]
def chatgpt_call(prompt, model="gpt-3.5-turbo"):
response = openai.ChatCompletion.create(
model=model,
messages=[{"role": "user", "content": prompt}]
)
return response.choices[0].message["content"]
Bu örnekte, gpt-3.5-turbo modelini kullandığımıza dikkat edin; çünkü bu model, GPT-3.5 ailesinin en yetkin ve sohbete optimize edilmiş modellerinden biridir ve aynı zamanda en ekonomik seçeneklerden biridir. Mevcut farklı modellere dair daha fazla bilgi OpenAI dokümantasyonunda bulunabilir.
OpenAI API anahtarlarınızı almak için yardıma mı ihtiyacınız var? O halde OpenAI API ve ChatGPT’ye Başlangıç eğitimini kaçırmayın.
Uygulamamızı adım adım analiz edelim!
chatgpt_call() fonksiyonu, bir sohbet tamamlaması isteği oluşturan OpenAI’ın özgün ChatCompletion.create çağrısının bir sarmalayıcısıdır.
İstenen istem verildiğinde, fonksiyon karşılık gelen ChatGPT tamamlamasını döndürür. Başarılı bir tamamlama çağrısı için yalnızca kullanılacak modelin kimliğinin (model) ve istenen istemin (prompt) sağlanması gerekir.
ChatGPT tarafından döndürülen gerçek tamamlama, yanıtın kendisine ek olarak üst veriler içerir. Yine de, tamamlama içeriği her zaman response.choices[0].message[“content”] alanında bulunur. Tamamlamanın tam içeriğine dair daha fazla bilgi OpenAI dokümantasyonunda yer alır.
Bu uygulama sayesinde, tek satırda ChatGPT’ye istem verebiliriz:
prompt = "My name is Andrea"
response = chatgpt_call(prompt)
print(response)
# Output: Nice to meet you, Andrea! How can I assist you today?
Bağımsız bir etkileşim olarak çağrı
Yukarıdaki uygulamada herhangi bir püf noktasını fark ettiniz mi?
Bir ipucu vermek için, bir devam etkileşimi yapalım:
prompt = "Do you remember my name?"
response = chatgpt_call(prompt)
print(response)
# Output: I'm sorry, as an AI language model, I don't have the ability to remember specific information about individual users.
Aynen öyle, gözlemleyebileceğimiz gibi, her API çağrısı bağımsız bir etkileşimdir. Bu, modelin önceki istemleri veya verilen tamamlamaları hatırlamadığı anlamına gelir. chatgpt_call() fonksiyonunu her çağırdığımızda, tamamen yeni bir konuşma başlatırız.
Bu, bir sohbet botu oluşturmaya çalışırken kesinlikle bir sorun; çünkü model, şimdiye kadar ne konuştuğumuzu hatırlamıyorsa bir diyalog yürütmek mümkün değildir. Bu nedenle bir sonraki adımımız, modeli önceki etkileşimlerimizin farkında hale getirmek olacaktır.
Bağlam farkındalığı
Bağlam farkındalığı, sohbet botlarının devam eden bir konuşmaya dayalı olarak doğru şekilde anlamasını ve yanıt vermesini sağlar.
Bir bağlam oluşturarak, gelecekteki etkileşimler geçmişe göre kişiselleştirilebilir; konuşmada süreklilik korunur ve tekrarların önüne geçilir. Ayrıca, bağlam farkındalığı olan sohbet botlarıyla kullanıcı, yanlış anlamaları gidermek için açıklayıcı sorular sorabilir veya önerilerde bulunabilir.
Genel olarak, bağlam farkındalığı sohbet botlarının doğallığını, etkinliğini ve kullanıcı deneyimini artırır. Bundan sonra, önceki etkileşimlerin tamamına konuşma geçmişi veya bellek diyeceğiz.
ChatGPT için özgün OpenAI API’sı, her yeni istemle birlikte konuşma geçmişimizi modele göndermenin bir yolunu zaten sağlar. Buna ek olarak, LangChain çerçevesi de ChatGPT’nin belleğini daha etkili ve maliyet açısından optimize edilmiş bir şekilde yönetmenin bir yolunu sunar.
Sistem, Asistan ve Kullanıcı Mesajlarını Anlama
ChatGPT’nin konuşma geçmişi yapısı
Bu noktada, yalnızca istenen istemi sağlayarak chatgpt_call() yöntemini doğrudan kullanabiliriz. Uygulamaya yakından bakarsak, giriş isteminin messages listesi içinde biçimlendirildiğini görürüz. Bu liste aslında konuşma geçmişini takip etmek için tasarlanmıştır ve bu nedenle çok özel bir şekilde biçimlendirilmelidir.
Daha yakından bakalım!
Şimdiye kadar, chatgpt_call() içindeki mesajlar listesini şu şekilde biçimlendirdik:
messages = [{"role": "user", "content": prompt}]
messages listesi, konuşma geçmişini bir sözlükler koleksiyonu olarak saklar. Listedeki her sözlük, konuşmadaki bir mesajı iki anahtar-değer çiftiyle temsil eder.
roleanahtarınınuserdeğeri alması, mesajın kullanıcı tarafından gönderildiğini belirtir.contentanahtarınınpromptdeğeri alması, gerçek kullanıcı istemini içerir.
Bu, yalnızca tek bir etkileşim içeren çok basit bir örnektir. content anahtarı her zaman ya kullanıcı istemini ya da sohbet botunun tamamlamasını saklayacak olsa da, role anahtarı çok daha esnektir.
Sistem, Asistan ve Kullanıcı Roller
role anahtarı, content içindeki mesajın sahibini belirtir. ChatGPT kullanırken üç role kadar sahip olabiliriz:
- Kullanıcı. Daha önce tartıştığımız gibi,
userrolü sohbet botuyla etkileşime geçen gerçek kullanıcıya karşılık gelir. - Asistan.
assistantrolü sohbet botunun kendisine karşılık gelir. - Sistem.
systemrolü, sohbet botuna talimat, yönlendirme ve bağlam sağlamak için kullanılır. Sistem mesajları kullanıcı etkileşimlerini yönlendirmeye, sohbet botunun davranışını belirlemeye, bağlamsal bilgi sunmaya ve konuşma içindeki belirli etkileşimleri ele almaya yardımcı olur. Sistem mesajları, kullanıcıya şeffaf olan, sohbet botu için üst düzey talimatlar olarak görülebilir.

Kendi çizimimiz. chatGPT ile bir sohbet botu oluştururken konuşma zincirindeki farklı rollerin etkileşimi.
Bir Konuşma Geçmişi Oluşturma
messages listemizdeki üç rolü (user, assistant ve system) kullanarak konuşma geçmişimizi oluşturmaya devam edebiliriz.
Test etkileşimlerimiz göz önüne alındığında, adı geçen üç rolü kullanan uygun biçimlendirilmiş bir konuşma geçmişi şu şekilde görünebilir:
messages = [
{'role':'system', 'content':'You are friendly chatbot.'},
{'role':'user', 'content':'Hi, my name is Andrea'},
{'role':'assistant', 'content': "Nice to meet you, Andrea! How can I assist you today?"},
{'role':'user', 'content':'Do you remember my name?'} ]
call_chatgpt() fonksiyonumuzu, konuşma geçmişini bir giriş parametresi olarak alacak şekilde biraz değiştirebiliriz:
def call_chatgpt_with_memory(messages, model="gpt-3.5-turbo"):
response = openai.ChatCompletion.create(
model=model,
messages=messages,
)
return response.choices[0].message["content"]
Bu yeni uygulamayı deneyelim!
messages = [
{'role':'system', 'content':'You are friendly chatbot.'},
{'role':'user', 'content':'Hi, my name is Andrea'},
{'role':'assistant', 'content': "Nice to meet you, Andrea! How can I assist you today?"},
{'role':'user', 'content':'Do you remember my name?'} ]
response = call_chatgpt_with_memory(messages)
print(response)
# Output: Yes, your name is Andrea.
Harika! Modeli, geçmiş etkileşimlerimizin farkında tutmayı başardık; böylece modelle gerçekten bir diyalog kurabiliyoruz. Yine de, messages listemizi otomatik olarak güncellemenin bir yolunu bulmamız gerekiyor.
Otomatik konuşma geçmişi
Mesajların otomatik toplanmasını, API çağrısı fonksiyonumuzu biraz daha geliştirerek sağlayabiliriz:
def chatgpt_conversation(prompt):
context.append({'role':'user', 'content':f"{prompt}"})
response = call_chatgpt_with_memory(context)
context.append({'role':'assistant',
'content':f"{response}"})
return response
Şimdi deneyelim!
chatgpt_conversation("Hello, my name is Andrea")
# Output: 'Nice to meet you, Andrea! How can I assist you today?'
Ve bir devam etkileşimi:
chatgpt_conversation("Do you remember my name?")
# Output: 'Yes, your name is Andrea.'
Artık konuşma geçmişi otomatik olarak güncelleniyor. Son olarak, messages listesini yazdırarak konuşma geçmişini ve yapısını istediğiniz zaman gözlemleyebileceğinizi unutmayın.
print(messages)
# Output:
[{'role': 'user', 'content': 'Hello, my name is Andrea'},
{'role': 'assistant', 'content': 'Nice to meet you, Andrea! How can I assist you today?'},
{'role': 'user', 'content': 'Do you remember my name?'},
{'role': 'assistant', 'content': 'Yes, your name is Andrea.'}]
LangChain Çerçevesi
Buraya kadar, uygulamamızın kullanışlı bir sohbet botuna dönüştüğü konusunda hemfikiriz; ancak bu, en optimize hali olmayabilir.
Önceki tüm istem ve tamamlama mesajlarını sürekli olarak beslemek, hızla çok büyük bir token koleksiyonuna yol açabilir ve ChatGPT, en son tamamlamayı döndürmeden önce bunların tümünü işlemesi gerekir.
Şu ana kadar, sohbet botunun bir tür bellek kazanması için geçmiş etkileşimleri bir araya getirmek amacıyla .append işlemlerini kullandık. Ancak, bellek yönetimi, LangChain gibi özel paketler kullanılarak daha etkili bir şekilde yapılabilir.
LangChain, dil modelleri tarafından desteklenen uygulamalar geliştirmek için bir çerçevedir. Sohbet botları günümüzde en popüler uygulamalardan biri olduğundan, LangChain, sohbet botunun konuşma geçmişini oluşturmak için daha temiz bir uygulama ve bunu daha verimli şekilde ele almak için alternatifler sunar.
LangChain çerçevesinin kendisi hakkında daha fazla bilgi için, Veri Mühendisliği ve Veri Uygulamaları için LangChain’e Giriş başlıklı giriş yazısını şiddetle öneririm.
LangChain ile basit konuşma geçmişi
Bu bölümde, bunun yerine bir sohbet botu oluşturmak için LangChain Çerçevesi’nin nasıl kullanılacağını keşfedeceğiz.
langchain kütüphanesi, yukarıda kullanılan openai kütüphanesinin yerine geçer; çünkü langchain.llms modülü, yalnızca iki satır kodla ChatGPT ile etkileşime izin verir:
# OpenAI key from environment
from langchain.llms import OpenAI
llm = OpenAI()
llm modeli yüklendikten sonra, konuşma geçmişimizi depolayacak bellek nesnesini içe aktaralım. Sohbet botuyla yapılan her geçmiş etkileşimi depolamak için LangChain, ConversationBufferMemory adlı yapıyı sunar:
from langchain.memory import ConversationBufferMemory
memory = ConversationBufferMemory()
Artık, kullanıcı istemini ChatGPT’ye iletmek ve tamamlamaları döndürmek için llm ve memory’den yararlanacak bir sarmalayıcı olan ConversationChain’i içe aktarma zamanı:
from langchain.chains import ConversationChain
conversation = ConversationChain(
llm=llm,
memory=memory
)
Son olarak, ChatGPT’ye bir kullanıcı istemi göndermek için .predict yöntemini şu şekilde kullanabiliriz:
conversation.predict(input="Hello, my name is Andrea")
# Output: "Hi Andrea, I'm an AI created to help you with whatever you may need. What can I do for you today?"
Modelin bir tamamlamayı üretirken dikkate aldığı bilgileri görmek için verbose=True ayarlayalım. Bunu bir devam etkileşiminde deneyelim:

Bir tamamlamanın oluşturulması sırasında ChatGPT’nin eriştiği bağlamın ekran görüntüsü. Ayrıntılı çıktı yeşil renkte.
Son olarak, önceki etkileşimleri kusursuz şekilde hatırladığını kontrol edelim:

Bir tamamlamanın oluşturulması sırasında ChatGPT’nin eriştiği bağlamın ekran görüntüsü. Ayrıntılı çıktı yeşil renkte.
Konuşma geçmişini doldurmak
memory.save_context() yöntemini kullanarak sohbet botuna ek bağlam sağlayabiliriz. Bu sayede, bu bilgileri bir konuşma içinde vermek zorunda kalmadan, sohbet botumuzu istenen herhangi bir içerikten haberdar edebiliriz. LangChain’de bu amaçla kullanılan anahtar sözcükler input ve output’tur. Örneğin,
memory.save_context({"input": "Hi"},
{"output": "What's up"})
memory.save_context({"input": "Not much, just hanging"},
{"output": "Cool"})
Ayrıca, print(memory.buffer) ya da memory.load_memory_variables({}) komutlarını çalıştırarak belleğin içeriğini istediğiniz zaman kontrol edebilirsiniz.
LangChain Bellek Türleri
LangChain, ChatGPT için farklı bellek türleri uygular. Yukarıda kullanılan ConversationBufferMemory, ChatGPT ile yapılan her bir etkileşimi takip eder. Ancak, tüm konuşma geçmişini ChatGPT’ye istem olarak vermenin, her yeni etkileşimde işlenecek token sayısını hızla arttırabileceğini zaten tartıştık.
ChatGPT’nin bir etkileşim başına token sınırı olmasının yanı sıra, kullanım maliyetinin de token sayısına bağlı olduğunu unutmayın. Konuşma geçmişinin her yeni etkileşimde işlenmesi, zamanla muhtemelen pahalıya mal olacaktır.
Konuşma geçmişinin sürekli işlenmesini önlemek için, LangChain, ChatGPT’nin belleğini yönetmek üzere başka optimize yöntemler uygular. Bir sonraki bölümde en gelişmiş türlerden birini keşfedeceğiz.
LangChain ile gelişmiş konuşma geçmişi
Belleği, geçmiş etkileşimlerin her birini saklamadan yönetmenin gelişmiş bir yolu, bunun yerine etkileşimlerin bir özetini depolamaktır.
Bu bellek türü benim favorim; çünkü geçmiş hiçbir etkileşimi feda etmeden gerçekten optimize bir bellek yönetimine imkân tanır.
Hadi başlayalım!
# OpenAI key from environment
from langchain.llms import OpenAI
llm = OpenAI()
from langchain.memory import ConversationSummaryBufferMemory
memory = ConversationSummaryBufferMemory(llm=llm, max_token_limit=100)
Bu bellek türünün, önceki etkileşimlerin özetini üretmek için tanımlanan llm’yi kullandığını unutmayın.
Ayrıca, bu bellek, belirli bir azami token sayısına (max_token_limit) kadar tam etkileşimleri saklayabilir. Bu sınırın üzerinde, o mesajlardaki bilgileri özet içine katar.
Test etmek için, çok sayıda token içeren bir etkileşim oluşturalım. Aşağıdaki schedule’ı dikkate alalım:
schedule = "There is a meeting at 8am with your product team. \
You will need your powerpoint presentation prepared. \
9am-12pm have time to work on your LangChain \
project which will go quickly because Langchain is such a powerful tool. \
At Noon, lunch at the italian resturant with a customer who is driving \
from over an hour away to meet you to understand the latest in AI. \
Be sure to bring your laptop to show the latest LLM demo."
memory = ConversationSummaryBufferMemory(llm=llm, max_token_limit=100)
memory.save_context({"input": "Hello"}, {"output": "What's up"})
memory.save_context({"input": "Not much, just hanging"}, {"output": "Cool"})
memory.save_context({"input": "What is on the schedule today?"}, {"output": f"{schedule}"})
Şimdi, önceki örneklerde olduğu gibi llm ve memory verilerek yeni bir konuşma zinciri tanımlamamız yeterli.
conversation = ConversationChain(
llm=llm,
memory=memory,
verbose=True
)
.predict yöntemini kullanarak ChatGPT’ye istem verebiliriz:

Bir tamamlamanın oluşturulması sırasında ChatGPT’nin eriştiği bağlamın ekran görüntüsü. Ayrıntılı çıktı yeşil renkte.
Gözlemleyebileceğimiz gibi, sohbet botu, özgün konuşma geçmişinin bir özetini tutar ve böylece her devam etkileşiminde ChatGPT tarafından işlenen token sayısını azaltır.
Hepsi bu kadar! Artık optimize edilmiş sohbet botumuzla saatlerce konuşmaya devam edebiliriz!
Not defterinizde daha akıcı bir Soru-Cevap deneyimi için verbose=False olarak ayarlayın.
Sonuç
Bu makalede, iyi bilinen ChatGPT modelini kullanarak bağlam farkındalığına sahip bir sohbet botunun nasıl oluşturulacağını gördük.
Kendi bağlam farkındalıklı sohbet botumuzu oluşturmanın, kesintisiz etkileşimlere nasıl olanak tanıdığını gördük. Bu yinelemeli yaklaşım, konuşma boyunca kullanıcı ihtiyaç ve tercihlerini korumanıza imkân tanıyan sürekli bir geri bildirim döngüsünü teşvik eder.
Sohbet botunun konuşma geçmişini yönetmek için iki temel yaklaşım gördük. İlk olarak, işlevsel bir yerel sohbet botu sağlayan özgün ChatGPT API’sını kullanmak. İkincisi ise, özel LangChain çerçevesini ve optimize bir bellek türü uygulamasını kullanmak.
Söz şimdi sizde! Bu makalede sunulan yapı taşlarını kullanarak, kendi özel kullanım senaryonuza göre uyarlanmış bir sohbet botu geliştirme zamanı!
Hem LangChain hem de ChatGPT kullanarak başka uygulamalar geliştirmekle ilgileniyorsanız, LangChain ve GPT ile Yapay Zekâ Uygulamaları Geliştirme web semineri sizin için. NLP konusunda hız kazanmak mı istiyorsunuz? O halde Python ile Doğal Dil İşleme modüllerine göz atın!
Andrea Valenzuela, şu anda İsviçre'nin Cenevre kentindeki parçacık hızlandırıcısında (CERN) yürütülen CMS deneyinde çalışmaktadır. Son altı yıldır veri mühendisliği ve analizi alanındaki uzmanlığıyla veri analizi ve yazılım geliştirme görevlerini üstlenmektedir. Şimdi ise Medium yayını ForCode'Sake aracılığıyla veriyle ilgili teknolojilerin öğrenimini demokratikleştirmeye yönelik çalışmalar yapmaktadır.
Katalonya Politeknik Üniversitesi'nden Mühendislik Fiziği lisans derecesine ve Pompeu Fabra Üniversitesi'nden Akıllı Etkileşimli Sistemler yüksek lisans derecesine sahiptir. Araştırma deneyimi arasında, Normalizing Flows gibi görüntü üretimine yönelik önceki OpenAI algoritmalarıyla yürütülen profesyonel çalışmalar yer almaktadır.

