LangChain: Dil Modellerinin Gücünden Yararlanmak İçin Bir Başlangıç Kılavuzu
Dil modelleri (LLM’ler – Large Language Models), yapay zeka alanında son yılların en çığır açıcı gelişmelerinden biri olmuştur. ChatGPT, GPT-4, LLaMA gibi modeller, metin anlama, üretme, çeviri ve özetleme gibi karmaşık görevleri insan benzeri bir başarıyla yerine getirebilme yetenekleriyle hem teknoloji dünyasını hem de genel kamuoyunu büyülemiştir. Bu modellerin potansiyeli sınırsız gibi görünse de, onları gerçek dünya uygulamalarına entegre etmek ve karmaşık iş akışları oluşturmak, tek başına bir LLM çağrısından çok daha fazlasını gerektirir. İşte tam bu noktada LangChain devreye giriyor. LangChain, dil modellerini kullanarak güçlü, bağlamsal ve etkileşimli uygulamalar geliştirmeyi kolaylaştıran açık kaynaklı bir çerçevedir. Bu makalede, LangChain’in ne olduğunu, neden önemli olduğunu, temel bileşenlerini ve dil modellerinin gücünden tam olarak yararlanmak için nasıl kullanılabileceğini adım adım inceleyeceğiz.
Giriş: Yapay Zeka ve Dil Modellerinin Yükselişi
Yapay zeka, özellikle derin öğrenme tekniklerinin gelişimiyle birlikte, son on yılda inanılmaz bir ilerleme kaydetti. Bu ilerlemenin en belirgin alanlarından biri de doğal dil işleme (NLP) oldu. Transformer mimarisi ve büyük ölçekli veri setleri üzerinde eğitilen dil modelleri, makine çevirisinden duygu analizine, metin özetlemeden içerik üretimine kadar geniş bir yelpazede devrim niteliğinde yetenekler sergiledi. Bu modeller, sadece verilen bir metni anlamakla kalmıyor, aynı zamanda mantık yürütebiliyor, bilgi sentezleyebiliyor ve hatta yaratıcı metinler üretebiliyorlar.
Ancak, bu modellerin ham gücünü bir uygulamaya dönüştürmek, genellikle birden fazla adımı, farklı veri kaynaklarını ve karmaşık etkileşim mantıklarını bir araya getirmeyi gerektirir. Örneğin, bir kullanıcının sorusuna yanıt verirken, sadece genel bilgiye dayanmak yerine, belirli bir doküman setinden bilgi çekmek, bu bilgiyi özetlemek ve ardından kullanıcıya uygun bir formatta sunmak isteyebilirsiniz. Veya bir ajanın, bir görevi yerine getirmek için internette arama yapması, bir API’yi çağırması ve elde ettiği bilgiyi kullanarak bir sonraki adımı belirlemesi gerekebilir. Bu tür karmaşık senaryolar, dil modellerini “orkestra” etmeyi gerektirir ve LangChain, bu orkestrasyonu sağlamak için tasarlanmış güçlü bir araçtır.
LangChain Nedir ve Neden Önemlidir?
LangChain, dil modelleriyle çalışan uygulamalar geliştirmeyi basitleştiren ve standartlaştıran bir çerçevedir. Temel olarak, bir dil modelinin tek başına yapamayacağı veya yapması zor olan görevleri, birden fazla bileşeni bir araya getirerek gerçekleştirmeyi sağlar. LangChain, sadece LLM’leri çağırmakla kalmaz, aynı zamanda bu çağrıları bağlamsal hale getirmek, dış veri kaynaklarıyla etkileşim kurmak, karmaşık mantık yürütmek ve hatta LLM’lerin kendi başlarına “düşünmesini” sağlamak için bir dizi modüler bileşen sunar.
LangChain’in önemi birkaç ana noktada toplanabilir:
* Modülerlik: LangChain, her biri belirli bir işlevi yerine getiren küçük, bağımsız bileşenlerden oluşur. Bu modüler yapı, geliştiricilerin ihtiyaçlarına göre bu bileşenleri birleştirerek özelleştirilmiş ve esnek çözümler oluşturmasına olanak tanır.
* Esneklik: Çerçeve, farklı dil modelleri (OpenAI, Hugging Face, Cohere vb.), farklı veri kaynakları (dokümanlar, veritabanları, API’ler) ve farklı araçlarla entegrasyon için geniş bir destek sunar. Bu sayede, geliştiriciler belirli bir teknolojiye bağlı kalmadan en uygun çözümleri seçebilirler.
* Karmaşık İş Akışları: LangChain, zincirler (Chains) ve ajanlar (Agents) gibi kavramlar aracılığıyla, birden fazla adımı içeren karmaşık iş akışlarını tanımlamayı ve yönetmeyi kolaylaştırır. Bu, LLM’lerin sadece metin üretmekle kalmayıp, aynı zamanda problem çözme ve karar verme yeteneklerini kullanmasını sağlar.
* Geliştirme Hızlandırma: Tekerleği yeniden icat etmek yerine, LangChain, sıkça karşılaşılan LLM uygulama desenleri için hazır çözümler ve entegrasyonlar sunar. Bu, geliştirme süresini önemli ölçüde kısaltır ve geliştiricilerin uygulamanın iş mantığına odaklanmasına olanak tanır.
LangChain’in Temel Bileşenleri
LangChain’in gücü, iyi tanımlanmış ve birbiriyle entegre olabilen temel bileşenlerinden gelir. Bu bileşenler, bir LLM uygulamasının farklı katmanlarını temsil eder ve birlikte çalışarak karmaşık görevleri yerine getirir.
Model I/O (Giriş/Çıkış)
Bu bölüm, LangChain’in dil modelleriyle nasıl etkileşim kurduğunu tanımlar.
* LLMs (Büyük Dil Modelleri) ve Chat Models (Sohbet Modelleri): LangChain, OpenAI’nin GPT serisi, Google’ın PaLM modelleri, Hugging Face’deki açık kaynaklı modeller ve daha birçok LLM sağlayıcısıyla entegrasyon sağlar. LLM arayüzü, metin tabanlı girişlere metin tabanlı çıktılar üretirken, Chat Models arayüzü, mesaj listeleri (kullanıcı, sistem, asistan mesajları) ile çalışarak sohbet tabanlı etkileşimler için daha uygundur. Bu modüller, farklı LLM API’lerine tutarlı bir arayüz sunar.
* Prompt Templates (İstek Şablonları): Dil modellerine gönderilen istemler (prompt’lar), çıktının kalitesi için kritik öneme sahiptir. Prompt şablonları, dinamik olarak değişen girdilere göre önceden tanımlanmış istemler oluşturmayı sağlar. Bu sayede, istemler tutarlı hale gelir ve kullanıcı girdileri veya diğer uygulama verileri kolayca istem içine yerleştirilebilir. Örneğin, bir “soru-cevap” şablonu, kullanıcının sorusunu ve ilgili bağlamı otomatik olarak birleştirerek modele gönderebilir.
* Output Parsers (Çıktı Ayrıştırıcılar): Dil modelleri genellikle serbest metin formatında çıktı üretir. Ancak, birçok uygulama bu çıktıyı yapılandırılmış bir formatta (örneğin, JSON, liste veya belirli bir veri tipi) bekler. Çıktı ayrıştırıcılar, LLM’den gelen ham metin çıktısını alarak, uygulamanın beklediği yapılandırılmış formata dönüştürür. Bu, model çıktısının kolayca işlenmesini ve diğer uygulama bileşenleriyle entegre edilmesini sağlar.
Retrieval (Bilgi Edinme)
Bu bölüm, LangChain’in dış veri kaynaklarından bilgi çekme ve bu bilgiyi LLM’lere sunma yeteneğini açıklar. Retrieval-Augmented Generation (RAG) mimarisinin temelini oluşturur.
* Document Loaders (Doküman Yükleyiciler): Farklı formatlardaki (PDF, metin dosyaları, web sayfaları, CSV, veritabanları vb.) verileri LangChain’in işleyebileceği Document nesnelerine dönüştürür. Bu, LLM’lerin kendi eğitim verileri dışındaki özel verilerle çalışmasını sağlar.
* Text Splitters (Metin Ayırıcılar): Büyük dokümanlar, genellikle tek bir LLM istemine sığmayacak kadar uzundur. Metin ayırıcılar, bu dokümanları daha küçük, yönetilebilir parçalara (chunks) böler. Bu parçalama işlemi, anlamsal bütünlüğü koruyarak ve LLM’lerinin token limitlerini aşmadan yapılmalıdır.
* Embeddings (Gömülmeler): Metin parçalarını sayısal vektörlere dönüştüren modellerdir. Bu vektörler, metinlerin anlamsal anlamını temsil eder. Benzer anlama sahip metinler, vektör uzayında birbirine yakın konumlanır. Embeddings, vektör veritabanlarında arama yapmak ve anlamsal benzerliğe dayalı ilgili bilgiyi bulmak için kritik öneme sahiptir.
* Vector Stores (Vektör Veritabanları): Oluşturulan embedding vektörlerini saklayan ve hızlı bir şekilde anlamsal arama yapmayı sağlayan özel veritabanlarıdır (örneğin, Chroma, Pinecone, FAISS, Weaviate). Bir kullanıcı sorgusu geldiğinde, sorgunun embedding’i oluşturulur ve bu veritabanında en benzer doküman parçaları aranır.
* Retrievers (Bilgi Getiriciler): Vektör veritabanlarından veya diğer bilgi kaynaklarından, bir sorguya en uygun doküman parçalarını veya bilgileri çeken bileşenlerdir. Bu getirilen bilgiler daha sonra LLM’ye bağlam olarak sunulur.
Chains (Zincirler)
Zincirler, birden fazla LangChain bileşenini veya diğer zincirleri belirli bir sırayla bir araya getirerek karmaşık iş akışları oluşturan yapılardır.
* LLMChain: En temel zincirdir. Bir PromptTemplate ve bir LLM veya ChatModel‘i birleştirir. Kullanıcı girdisini prompt şablonuna uygular, LLM’i çağırır ve çıktıyı döndürür.
* SequentialChain: Bir dizi zinciri art arda çalıştırır, bir önceki zincirin çıktısını bir sonraki zincirin girdisi olarak kullanır. Bu, çok adımlı, doğrusal iş akışları oluşturmak için idealdir. Örneğin, bir metni özetleyen bir zincir, ardından bu özeti kullanarak bir soruya cevap veren başka bir zincir.
* RouterChain: Birden fazla alt zincir arasında dinamik olarak seçim yapar. Gelen sorguya veya girdiye bağlı olarak, hangi alt zincirin çalıştırılacağına karar verir. Bu, daha esnek ve koşullu iş akışları oluşturmak için kullanılır.
Agents (Ajanlar)
Ajanlar, dil modellerinin dinamik olarak karar verme ve eylemde bulunma yeteneğini sağlar. Bir ajanın ana fikri, bir LLM’in hangi “aracı” (tool) ne zaman kullanacağına karar vermesini sağlamaktır.
* Tools (Araçlar): Ajanların kullanabileceği işlevlerdir. Bir araç, harici bir API çağrısı (örneğin, hava durumu API’si, arama motoru API’si, veritabanı sorgusu) veya belirli bir Python fonksiyonu olabilir. LangChain, birçok yaygın araç için hazır entegrasyonlar sunar (SerpAPI, Wikipedia, Python REPL vb.).
* Agent Executors (Ajan Yürütücüler): Ajanın asıl “beyni”dir. Bir sorgu aldığında, LLM’i kullanarak hangi aracı kullanacağına, hangi argümanlarla çağıracağına ve sonucun nasıl yorumlanacağına karar verir. Bu, LLM’in bir döngü içinde düşünmesini, gözlem yapmasını ve eylemde bulunmasını sağlar. Ajanlar, kullanıcının karmaşık bir soruyu adım adım çözmesine yardımcı olabilir, örneğin “New York’taki hava durumu nedir ve bu bilgiye dayanarak bana bir seyahat planı öner?” gibi.
* Agent Types: LangChain, farklı karar verme stratejilerine sahip çeşitli ajan türleri sunar (örneğin, zero-shot-react-description, conversational-react-description).
Memory (Hafıza)
Hafıza, ajanların ve zincirlerin önceki etkileşimleri hatırlamasını sağlar, bu da sohbet robotları ve diyalog sistemleri için kritik öneme sahiptir.
* ConversationBufferMemory: Sohbet geçmişini olduğu gibi saklar ve belirli bir sayıda önceki etkileşimi LLM’e sunar.
* ConversationSummaryMemory: Sohbet geçmişini özetleyerek saklar, bu da uzun sohbetlerde token limitlerini aşmayı önlerken bağlamın korunmasına yardımcı olur.
* EntityMemory: Sohbet içinde bahsedilen belirli varlıklar (kişiler, yerler, nesneler) hakkında bilgi saklar ve bu varlıkların zaman içindeki durumunu takip eder.
LangChain ile İlk Uygulamanızı Geliştirmek: Adım Adım Rehber
Şimdi LangChain’in temel bileşenlerini öğrendiğimize göre, basit bir uygulamadan başlayarak daha karmaşık senaryolara nasıl geçileceğini inceleyelim.
1. Kurulum ve Ortam Ayarları
LangChain’i kullanmaya başlamak için Python ortamınızda gerekli kütüphaneleri kurmanız gerekir:
pip install langchain openai # OpenAI kullanıyorsanız
veya
pip install langchain huggingface_hub # Hugging Face modelleri için
Ardından, kullanacağınız LLM sağlayıcısının API anahtarını ortam değişkeni olarak ayarlamanız önemlidir. Örneğin, OpenAI için:
import os
os.environ["OPENAI_API_KEY"] = "sk-..."
2. Basit Bir LLM Çağrısı
En temel LangChain kullanımı, bir LLM’i doğrudan çağırmaktır:
from langchain_openai import OpenAI
llm = OpenAI(temperature=0.7) # temperature, modelin yaratıcılığını ayarlar
response = llm.invoke("Bana Türkiye'nin başkenti hakkında kısa bir bilgi ver.")
print(response)
Bu kod parçası, OpenAI’nin bir modelini başlatır ve doğrudan bir istemle çağırır.
3. Prompt Template Kullanımı
İstemleri daha dinamik hale getirmek için PromptTemplate kullanırız:
from langchain.prompts import PromptTemplate
from langchain_openai import OpenAI
llm = OpenAI(temperature=0.7)
prompt_template = PromptTemplate.from_template(
"Ülke {country} hakkında 3 maddelik kısa bir özet yaz."
)
formatted_prompt = prompt_template.format(country="Fransa")
response = llm.invoke(formatted_prompt)
print(response)
Burada, country değişkeni ile istemi dinamik olarak doldurabiliriz.
4. Zincir Oluşturma (LLMChain)
Bir PromptTemplate ve bir LLM‘i birleştirerek bir LLMChain oluşturabiliriz:
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
from langchain_openai import OpenAI
llm = OpenAI(temperature=0.7)
prompt_template = PromptTemplate.from_template(
"Bir şirket için yaratıcı bir slogan bul: Şirket Adı: {company_name}, Ürün: {product_description}"
)
slogan_chain = LLMChain(llm=llm, prompt=prompt_template)
Zinciri çalıştırma
response = slogan_chain.invoke({
"company_name": "Güneş Enerjisi Çözümleri",
"product_description": "Evler için yenilenebilir enerji panelleri"
})
print(response)
invoke metodu, zincirin girdilerini bir sözlük olarak alır ve çıktıyı döndürür.
5. Veri Alma (Retrieval) Entegrasyonu: RAG Uygulaması
Kendi verileriniz üzerinde soru-cevap yapmak için RAG (Retrieval Augmented Generation) mimarisini kullanabiliriz. Bu, LangChain’in en güçlü kullanım alanlarından biridir.
Önce bir dokümanı yükleyelim, parçalayalım, embedding’lerini oluşturalım ve bir vektör veritabanına kaydedelim:
from langchain_community.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
1. Doküman Yükleme (Örnek bir metin dosyası olduğunu varsayalım)
content.txt dosyasında "LangChain, LLM uygulamaları için bir çerçevedir..." gibi bir metin olduğunu varsayalım.
loader = TextLoader("content.txt")
documents = loader.load()
2. Metin Parçalama
text_splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=0)
texts = text_splitter.split_documents(documents)
3. Embeddings Oluşturma ve Vektör Veritabanına Kaydetme
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(texts, embeddings)
4. Retriever Oluşturma
retriever = vectorstore.as_retriever()
5. Soru-Cevap Zinciri Oluşturma (RAG)
from langchain.chains import RetrievalQA
from langchain_openai import OpenAI
llm = OpenAI(temperature=0)
qa_chain = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=retriever)
query = "LangChain nedir?"
response = qa_chain.invoke({"query": query})
print(response)
Bu örnekte, RetrievalQA zinciri, kullanıcının sorgusunu alır, retriever aracılığıyla vektör veritabanından ilgili doküman parçalarını çeker ve bu parçaları LLM’e bağlam olarak sunarak soruyu yanıtlamasını sağlar.
6. Ajan Kullanımı
Ajanlar, dinamik problem çözme yeteneği sunar. Örneğin, internette arama yapabilen bir ajan oluşturalım. Bunun için serpapi gibi bir arama motoru API’sine ihtiyacınız olacak.
import os
from langchain_openai import OpenAI
from langchain_community.utilities import SerpAPIWrapper
from langchain.agents import AgentExecutor, create_react_agent
from langchain.tools import Tool
from langchain.prompts import PromptTemplate
SerpAPI anahtarını ayarlayın
os.environ["SERPAPI_API_KEY"] = "your_serpapi_key"
llm = OpenAI(temperature=0)
Araç tanımlama
search = SerpAPIWrapper()
tools = [
Tool(
name="SerpAPI Search",
func=search.run,
description="Harici bilgiye ihtiyaç duyduğunuzda kullanışlı bir araçtır."
)
]
Ajan için Prompt Template oluşturma (ReAct deseni için)
prompt = PromptTemplate.from_template("""
Cevaplamanız gereken bir soru verildi.
Araçlara erişiminiz var:
{tools}
Soruya doğrudan cevap veremiyorsanız, araçları kullanmalısınız.
Bir aracı kullanmanız gerektiğinde, aşağıdaki formatı kullanın:
Thought: Aracı kullanmam gerekiyor mu? Evet ise, hangi aracı ve hangi argümanlarla?
Action: tool_name
Action Input: tool_input
Araç kullanıldıktan sonra, gözlemi bekleyin ve ardından soruyu yanıtlayın.
Thought: Soruyu yanıtlamam gerekiyor mu? Evet ise, cevabım ne?
Final Answer: Cevabınız burada.
Başlamadan önce, soruyu anlamak için dikkatlice düşünün ve hangi araca ihtiyacınız olabileceğini belirleyin.
Soru: {input}
{agent_scratchpad}
""")
Ajanı oluşturma
agent = create_react_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
Ajanı çalıştırma
response = agent_executor.invoke({"input": "Bugün İstanbul'da hava durumu nasıl?"})
print(response["output"])
Bu örnekte, ajan, kullanıcının hava durumu sorusunu alır, SerpAPI Search aracını kullanarak internette arama yapar, elde ettiği bilgiyi yorumlar ve nihai cevabı üretir. verbose=True sayesinde ajanın düşünme sürecini (Thought, Action, Observation) görebiliriz.
LangChain’in Gelişmiş Kullanım Senaryoları ve İpuçları
LangChain, yukarıdaki temel bileşenlerin ötesinde, daha karmaşık ve güçlü uygulamalar geliştirmek için birçok gelişmiş özellik sunar.
* RAG (Retrieval Augmented Generation) Optimizasyonu: RAG uygulamalarının performansını artırmak için farklı metin parçalama stratejileri, farklı embedding modelleri ve vektör veritabanları denemek önemlidir. Ayrıca, “re-ranking” algoritmaları ile getirilen dokümanların alaka düzeyini artırabilirsiniz.
* Çoklu Ajan Sistemleri: Birden fazla ajanın, her birinin belirli bir uzmanlık alanına sahip olduğu ve karmaşık bir görevi yerine getirmek için işbirliği yaptığı sistemler oluşturulabilir. Örneğin, biri araştırma yapan, diğeri özetleyen, diğeri ise nihai raporu yazan ajanlar.
* Güvenlik ve Etik Hususlar: LLM uygulamaları geliştirirken hallüsinasyonlar (modelin yanlış bilgi üretmesi), veri gizliliği ve güvenlik gibi konuları göz önünde bulundurmak kritik öneme sahiptir. LangChain, model çıktısını denetlemek ve filtrelemek için araçlar sunabilir.
* Performans Optimizasyonu: Prompt mühendisliği, model seçimi (daha küçük ve daha hızlı modeller), çıktıyı önbelleğe alma (caching) ve paralel işlem gibi tekniklerle LLM uygulamalarının performansını ve maliyetini optimize edebilirsiniz.
* LangServe ve LangSmith: LangChain ekosisteminin iki önemli bileşeni de LangServe ve LangSmith’tir.
* LangServe: LangChain uygulamalarını kolayca bir API olarak sunmayı sağlar. Bu, geliştirilen LLM uygulamalarının web servisleri olarak dağıtılmasını ve diğer uygulamalarla entegre edilmesini basitleştirir.
* LangSmith: LLM uygulamalarının geliştirme, test etme, izleme ve hata ayıklama süreçlerini kolaylaştıran bir platformdur. Zincirlerin ve ajanların adımlarını görselleştirmeye, performans metriklerini izlemeye ve model çıktılarındaki sorunları tespit etmeye yardımcı olur.
Gelecek ve Sonuç
LangChain, dil modellerinin gücünü gerçek dünya uygulamalarına taşımak isteyen geliştiriciler için vazgeçilmez bir araç haline gelmiştir. Modüler yapısı, geniş entegrasyon yelpazesi ve karmaşık iş akışlarını basitleştirme yeteneği sayesinde, geliştiricilerin yenilikçi LLM uygulamalarını hızla oluşturmasına olanak tanır.
Yapay zeka ve dil modelleri alanı hızla gelişmeye devam ederken, LangChain gibi çerçeveler, bu teknolojilerin potansiyelini tam olarak açığa çıkarmak için köprü görevi görecektir. Kendi verilerinizle kişiselleştirilmiş asistanlar oluşturmaktan, dinamik karar verme yeteneğine sahip otomasyon ajanları geliştirmeye kadar, LangChain’in sunduğu olanaklar sınırsızdır. Bu kılavuz, LangChain yolculuğunuza başlamanız için size sağlam bir temel sağlamıştır. Şimdi sıra sizde; bu güçlü çerçeveyi keşfedin ve dil modellerinin büyülü dünyasında kendi uygulamalarınızı yaratmaya başlayın!
