LangChain — 4 - Chat Models

Zeki Ünyildiz
5 min readNov 2, 2023

--

Dijital dünyada, yapay zeka temelli sohbetler artık günlük hayatın bir parçası haline geldi. Bu sohbetleri mümkün kılan şey ise “sohbet modelleri”dir. Peki, bu sohbet modelleri nedir ve dil modellerinden nasıl farklılar?

Aslında sohbet modelleri, dil modellerinin özel bir türüdür. Dil modelleri, kapsamlı veri setlerinden öğrenerek insan gibi konuşmayı taklit edebilen yapay zeka sistemleridir. Sohbet modelleri ise bu dil modellerini temel alır, fakat kullanımları biraz farklıdır. Geleneksel “metin gir, metin çık” şeklinde çalışan API’lerin aksine, sohbet modelleri “sohbet mesajları” ile iletişim kurarlar.

Kullanıcı tarafından girilen sohbet mesajlarını alır, anlamlandırır ve bu mesajlara uygun, akıcı ve doğal yanıtlar üretir. Böylece, insanlarla doğal bir sohbet akışı içinde interaktif bir diyalog kurabilirler. Bu modeller, müşteri hizmetleri, eğitim uygulamaları veya kişisel asistanlar gibi birçok alanda kullanılıyor ve kullanıcı deneyimini zenginleştiriyor.

Kısacası, sohbet modelleri, teknolojinin dilimizi konuşmasını ve bizimle etkileşimde bulunmasını sağlayan ileri düzey yapay zeka uygulamalarıdır. Gelişmiş algoritmaları ve kullanıcı dostu arayüzleri ile günümüzün ve geleceğin dijital iletişimine yön veriyorlar.

Başlamadan önce, OpenAI’nin Python paketini bilgisayarınıza yüklemeniz gerekecek. Bu paket, OpenAI’nin sunduğu yapay zeka yeteneklerine erişim sağlayacak ve dil modeli tabanlı sohbet botlarını kolayca oluşturmanıza olanak tanıyacak bir araçtır. İşte başlamak için izlemeniz gereken adımlar:

  1. Paket Kurulumu: İlk olarak, OpenAI Python paketini kurmak için terminalinize veya komut istemcinize pip install openai yazın ve enter tuşuna basın. Bu, gerekli tüm dosyaların bilgisayarınıza indirilip kurulmasını sağlar.
  2. API Anahtarına Erişim: OpenAI API’sini kullanabilmek için bir API anahtarına ihtiyacınız olacak. Eğer henüz bir API anahtarınız yoksa, bir OpenAI hesabı oluşturarak bu anahtarı elde edebilirsiniz. Anahtarı elde ettikten sonra, bunu bir çevre değişkeni olarak bilgisayarınızda ayarlayabilirsiniz. Bunun için terminalinize export OPENAI_API_KEY="..." komutunu girerek yerine elde ettiğiniz anahtarınızı yazın.
  3. Python Kodunda Kullanım: Eğer çevre değişkeni oluşturmak istemiyorsanız, anahtarı doğrudan Python kodunuzda da kullanabilirsiniz. Bunu yapmak için:
from langchain.chat_models import ChatOpenAI  
chat = ChatOpenAI(openai_api_key="API_ANAHTARINIZ")

şeklinde bir kod bloğu kullanabilirsiniz. Burada "API_ANAHTARINIZ" ifadesinin yerine gerçek API anahtarınızı yazmayı unutmayın.

4. Varsayılan Ayarlarla Başlatma: Eğer bir API anahtarınız zaten çevre değişkeni olarak ayarlıysa veya OpenAI’nin paketi bu anahtarı otomatik olarak bulabiliyorsa, herhangi bir parametre vermeden de sınıfı başlatabilirsiniz:

from langchain.chat_models import ChatOpenAI  chat = ChatOpenAI()

Bu adımlarla, OpenAI’nin sohbet modelini kullanmaya başlayabilir ve kendi sohbet botunuzu oluşturabilirsiniz. Bu işlemler, sohbet modelleri ile etkileşim kurmanın temellerini oluşturur ve size yapay zeka destekli sohbetler yapma gücü verir.

Günümüzde yapay zeka, sohbet robotları ile iletişimimizi kolaylaştıran yenilikçi yöntemler sunuyor. Bu robotlar, dil modellemesinin bir adım ötesinde, sohbet bazlı bir yapı kullanarak insanlarla etkileşime giriyorlar. LangChain’in sohbet modelleri, bu etkileşimde çeşitli mesaj tiplerini destekliyor: insan mesajları (HumanMessage), AI mesajları (AIMessage), sistem mesajları (SystemMessage), işlevsel mesajlar (FunctionMessage) ve rol parametresine sahip genel sohbet mesajları (ChatMessage). Ancak genellikle insan ve AI mesajları ile sistem mesajları en çok kullanılan tiplerdir.

LCEL (LangChain Expression Language), LangChain içindeki sohbet modellerinin temel yapı taşını oluşturan Runnable arayüzünü implemente eder. Bu, sohbet modellerinin invoke, ainvoke, stream, astream, batch, abatch, ve astream_log gibi çağrıları desteklediği anlamına gelir.

Sohbet modelleri, giriş olarak List[BaseMessage] veya mesaja dönüştürülebilen nesneleri kabul eder. Bu, bir str nesnesinin HumanMessage'a dönüştürülmesi ya da PromptValue gibi nesneleri içerir.

İşte bir Python kod parçası örneği:

from langchain.schema.messages import HumanMessage, SystemMessage

# Chat modeline gönderilecek mesajlar listesi oluşturuluyor
messages_to_send = [
SystemMessage(content="I am designed to assist you efficiently"),
HumanMessage(content="How does model regularization prevent overfitting?"),
]

# chat.invoke metodu ile sohbet modelinden asenkron bir şekilde yanıt alınır
async_response = chat.invoke(messages_to_send)

print(async_response.content)
# Bu satır, alınan AIMessage yanıtının içeriğini ekrana yazdırır.

invoke metodunu kullanarak, sohbet modeline bir dizi mesaj gönderirsiniz ve modelden bir AIMessage alırsınız. Bu mesaj, öğrenme modellerinde düzenlileştirme yapılmasının amacını açıklar: modelin aşırı öğrenmesini önlemek ve genelleme yeteneğini artırmak.

# Sohbetin akışını yineleyici olarak almak
for chunk in chat.stream(messages):
print(chunk.content, end="", flush=True)

stream metodunu kullanarak, sohbet modeli, gelen mesajları yineleyici bir biçimde işler ve sonuçları bir akış olarak döndürür. Bu sayede, modelden gelen yanıtları gerçek zamanlı olarak alabilir ve işleyebilirsiniz.

chat.batch ve chat.ainvoke metodları da benzer bir işlevsellik sunar, ancak bu sefer yanıtları toplu halde ya da asenkron bir biçimde alırsınız. Toplu çağrılarda, birden fazla mesaj grubu için bir seferde sonuçlar alabilirsiniz. Asenkron çağrılarda ise, yanıtları beklerken diğer işlemlerinizi sürdürebilirsiniz.

astream ve astream_log asenkron akış metodlarıdır ve stream'in asenkron versiyonları olarak düşünülebilir. Bu çağrılar sayesinde, asenkron bir şekilde mesaj akışı alabilir ve log kayıtlarını inceleyebilirsiniz.

# Asenkron akış ile mesajları almak ve yazdırmak
async for chunk in chat.astream(messages):
print(chunk.content, end="", flush=True)

Son olarak, sohbet modellerini bir fonksiyon gibi çağırarak (__call__ yöntemi ile) kolaylıkla bir mesaj elde edebilirsiniz. Bu çağrı yöntemi, arka planda invoke işlevselliğini kullanır.

# Sohbet modelini fonksiyon olarak kullanarak yanıt al
response = chat([
HumanMessage(content="Please convert this phrase from English to German: Life is beautiful.")
])

print(response.content)
# Beklenen çıktı "Das Leben ist schön." olacaktır.

generate metodunu kullanarak, daha zengin çıktılar elde edebilir ve birden fazla mesaj grubu için sonuçları alabilirsiniz. LLMResult nesnesi, her bir üretim hakkında ek bilgiler içerir.

# Toplu çağrılar için generate metodunu kullanmak
result = chat.generate(batch_messages)
print(result.llm_output)
# Token kullanımı ve diğer API çağrı bilgilerini içeren bilgileri yazdırır.

Her bir bu yöntem, sohbet modelinin farklı senaryolarda nasıl kullanılabileceği konusunda size esneklik sağlar ve ihtiyacınıza göre senkron veya asenkron işlemleri gerçekleştirmenize olanak tanır.

LangChain ile Sohbet Modelleri için Belleğe Alma (Caching) ve Performans Optimizasyonu

LangChain, chat modellerinde zeka ve hızı bir araya getiren yenilikçi bir özellik sunarak bu alanda önemli bir adım attı: opsiyonel bir önbellekleme katmanı. Önbellekleme, hem finansal açıdan tasarruf etmenizi hem de uygulamanızın hızını artırmanızı sağlar.

Nasıl mı? 😊

İşte bu iki temel nedenle önbellekleme bu kadar önemli:

  1. Maliyet Tasarrufu: Eğer sık sık aynı yanıtları talep ediyorsanız, LangChain’in önbellek katmanı, yapay zeka servis sağlayıcısına yapılacak API çağrılarının sayısını azaltarak bütçenize katkı sağlar.
  2. Hız Artışı: API çağrı sayısını düşürerek uygulamanızın tepki süresini iyileştirir. Sonuçta, kullanıcı deneyiminiz daha akıcı ve etkileyici hale gelir.
from langchain.globals import set_llm_cache
from langchain.chat_models import ChatOpenAI

# Yapay zeka sohbet modelini başlatıyoruz.
llm = ChatOpenAI()

# Bellekte önbellek kullanımı için gerekli modülü import ediyoruz.
from langchain.cache import InMemoryCache
# InMemoryCache nesnesini global önbellek olarak ayarlıyoruz.
set_llm_cache(InMemoryCache())

# Bir şaka talep ediyoruz. İlk seferde önbellekte olmadığı için daha uzun sürüyor.
response = llm.predict("Tell me a joke")
print(response) # İlk cevap

# Aynı talebi tekrarlıyoruz. Bu kez önbellekte olduğu için yanıt hızlı geliyor.
response = llm.predict("Tell me a joke")
print(response) # İkinci cevap, önbellekten dolayı daha hızlı

Bu kısım, ChatOpenAI modelini kullanarak bir şaka talep eder ve cevabın önbelleğe alınmasını sağlar. İlk çağrı önbellekte olmadığı için daha uzun sürerken, ikinci çağrı önbelleğe alınmış olduğundan çok daha hızlı bir yanıt verir.

SQLite tabanlı bir önbellek kullanmak da benzer bir avantaj sağlar. İlk sorgu biraz zaman alır çünkü veritabanına yazılması gerekir. Ancak ikinci sorguda veriler hızla alınır, çünkü artık yerel bir SQLite veritabanında depolanmıştır.

rm .langchain.db  # SQLite önbellek veritabanı dosyasını siler.
from langchain.cache import SQLiteCache
# SQLite önbelleğini ayarlıyoruz.
set_llm_cache(SQLiteCache(database_path=".langchain.db"))

# Bir şaka talep ediyoruz. İlk seferde önbellekte olmadığı için daha uzun sürüyor.
response = llm.predict("Tell me a joke")
print(response) # İlk cevap, önbellekte olmadığı için yavaş

# Aynı talebi tekrarlıyoruz. Bu kez önbellekte olduğu için yanıt hızlı geliyor.
response = llm.predict("Tell me a joke")
print(response) # İkinci cevap, önbellekten dolayı daha hızlı

Burada ise SQLiteCache kullanılarak bir önbellekleme mekanizması oluşturulur ve bu, önbellek olarak bir SQLite veritabanı dosyası kullanır. İlk çağrı, veritabanına kaydedilene kadar normal sürede gerçekleşir. İkinci çağrı ise önbellekten anında alınır, bu yüzden çok daha hızlı bir yanıta sahip olursunuz.

Kaynakça:

--

--