LangChain'e Giriş ve Kapsam
LangChain, dil modelleriyle (LLM) çalışırken tekrar eden işleri (model çağrısı, istem şablonu, çıktı ayrıştırma, zincirleme) standart bileşenlere ayıran bir çerçevedir. Bu rehber orta seviye geliştiriciler için hazırlandı: Python ve temel LLM API kullanımına aşina olduğunuzu, sanal ortam oluşturabildiğinizi varsayıyorum.
LangChain hızlı değişen bir kütüphanedir; sürüm numarası vermek yerine çalışma anında kendi ortamınızdaki sürümü kontrol etmenizi öneririm:
pip show langchain langchain-core
Kurulum:
pip install langchain langchain-core
Model sağlayıcısına özel paketler ayrıdır (örneğin bir sağlayıcı için langchain-<sağlayıcı>). Sağlayıcı seçiminize göre ilgili paketi kurun ve API anahtarını ortam değişkeni üzerinden verin; anahtarı koda gömmeyin.
Temel Bileşenler
LangChain'de akış genellikle şu parçalardan oluşur:
- Chat model: Mesaj listesi alır, mesaj döndürür.
- Prompt template: Değişkenleri yerleştirip istemi üretir.
- Output parser: Model çıktısını yapılandırılmış veriye çevirir.
- Chain: Bu adımları sırayla bağlar.
Bu ayrım, istemi kodun içine dağıtmak yerine tek bir yerde tutmanızı sağlar. İstem değiştiğinde yalnızca şablonu düzenlersiniz.
İstem Şablonu ve Zincir
Aşağıdaki örnek, bir sohbet modelini istem şablonu ve çıktı ayrıştırıcıyla birleştirir. Sınıf ve import yolları sürüme göre değişebileceği için çalıştırmadan önce kendi sürümünüzün belgeleriyle doğrulayın.
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
prompt = ChatPromptTemplate.from_messages([
("system", "Sen kısa ve net yanıt veren bir asistansın."),
("human", "{soru}"),
])
chain = prompt | model | StrOutputParser()
cevap = chain.invoke({"soru": "Önbellek nedir?"})
print(cevap)
Burada | işleci bileşenleri sırayla bağlar: şablon istemi üretir, model yanıtlar, ayrıştırıcı metni düz string'e indirir. Model nesnesi (model) sağlayıcıya göre oluşturulur; bu rehberde sağlayıcıya özel kurulum ayrıntısına girmiyorum.
İstem Mühendisliği Pratikleri
İstem kalitesi, çoğu zaman model seçiminden daha belirleyicidir. Uygulanabilir kurallar:
Rolü ve görevi ayırın. Sistem mesajında davranışı, kullanıcı mesajında görevi tanımlayın. Sistem mesajına "sen deneyimli bir kod inceleyicisisin" gibi bir çerçeve koymak, yanıtın tonunu ve odak noktasını sabitler.
Çıktı biçimini açıkça belirtin. "JSON döndür" demek yerine beklenen alanları ve tiplerini yazın. Modelin serbest metin üretip sonra ayrıştırmada kırılması yerine, baştan yapı dayatın.
Örnek verin (few-shot). Girdi-çıktı çiftinden birkaç örnek, özellikle biçim ve sınıflandırma görevlerinde belirsizliği azaltır. Örnekleri istemin içine sabit metin olarak koyabilirsiniz.
Belirsizliği sınırlayın. "Emin değilsen 'bilmiyorum' de" gibi bir kural, modelin uydurma eğilimini azaltmaya yardımcı olur. Bu, güvenilirliği artıran basit bir tekniktir.
İstemi sürümleyin. Şablonları kod deposunda tutun ve değişiklikleri kaydedin. İstem, kod kadar bakım gerektiren bir varlıktır.
Yapılandırılmış Çıktı
Modelden yapı bekliyorsanız, çıktıyı şemayla doğrulamak zorunludur. Ayrıştırıcılar bunu kolaylaştırır, ancak modelin geçerli biçim üretmesi garanti değildir; doğrulama hatasını yakalayıp yeniden deneme (retry) mantığı kurun.
from langchain_core.output_parsers import JsonOutputParser
parser = JsonOutputParser()
chain = prompt | model | parser
try:
veri = chain.invoke({"soru": "..."})
except Exception as hata:
# Ayrıştırma hatasını burada ele alın; ham çıktıyı loglayın.
print("Ayrıştırma başarısız:", hata)
Beklenen davranış: model geçerli JSON döndürürse veri bir sözlüktür; döndürmezse ayrıştırıcı hata fırlatır. Bu hatayı yutmayın; ham çıktıyı loglayarak istemi iyileştirmek için veri toplayın.
Yaygın Hatalar
- Sürüm uyumsuzluğu: LangChain sık güncellenir; import yolları ve sınıf adları değişebilir. Bir örneği kopyalamadan önce kendi sürümünüzle deneyin.
- İstemi koda gömmek: Aynı istemin birden çok yerde tekrarlanması, tutarsızlığa yol açar. Şablonları merkezîleştirin.
- Ayrıştırma hatasını yok saymak: Model her zaman beklenen biçimi üretmez; doğrulama ve yeniden deneme olmadan üretime çıkmayın.
- Bağlam penceresini aşmak: Uzun geçmişi olduğu gibi göndermek maliyeti artırır ve hata verir. Geçmişi özetleyin veya budayın.
- Sıcaklık ayarını görmezden gelmek: Yaratıcılık gerektiren görevle kesin çıktı gerektiren görev aynı ayarla çalışmaz.
Güvenlik Etkileri
İstem enjeksiyonu: Kullanıcı girdisi isteme karıştığında, kötü niyetli girdi sistem talimatlarını geçersiz kılmaya çalışabilir. Kullanıcı verisini sistem mesajından ayrı tutun ve modelin çıktısına körü körüne güvenmeyin.
Veri sızıntısı: İsteme hassas veri (kimlik bilgisi, kişisel veri) koymayın; bu veriler sağlayıcıya gider. Gerekliyse maskeleyin.
Çıktıyı çalıştırma: Modelin ürettiği kodu veya komutu doğrudan çalıştırmayın. Ayrıştırın, doğrulayın, gerekiyorsa izole bir ortamda çalıştırın.
Yetki sınırı: Modele araç (tool) bağlıyorsanız, her aracın yetkisini en az ayrıcalık ilkesine göre kısıtlayın. Modelin çağırabileceği işlemleri dar tutun.
Toparlama
LangChain'de sağlam bir akış; net bir istem şablonu, doğrulanan çıktı ve sınırlandırılmış yetkilerden geçer. İstem mühendisliğini tek seferlik bir ayar değil, sürümleyip test ettiğiniz bir süreç olarak ele alın. Sürüme bağlı ayrıntılar için kendi ortamınızdaki paket belgelerini esas alın; kopyaladığınız her örneği çalıştırmadan üretime taşımayın.