BİM444 — Hafta 12 · Part 4
2026-05-04
Geçen bölümlerde:
Bu bölümde:
LLM tabanlı sistemler nasıl kurulur?
İstek yapısı: Model + Mesajlar + Parametreler → /chat/completions
| Parametre | Etkisi | Tipik aralık |
|---|---|---|
temperature |
Çıktı rastgeleliği | 0 (deterministik) – 2 |
max_tokens |
Maks. çıktı uzunluğu | Görev bağımlı |
top_p |
Nucleus sampling eşiği | 0.9–1.0 |
stop |
Üretimi kesen dizi | Görev bağımlı |
stream |
Token akışı mı, tam yanıt mı | Boolean |
| Hata | Düzeltme |
|---|---|
rate_limit_error — istek çok hızlı |
Exponential backoff + retry logic ekle |
context_length_exceeded |
Token bütçesi yönetimi (bkz. Bölüm 3) |
| Temperature = 0 ama farklı yanıtlar | seed parametresi ekle [kontrol edilecek] |
| Streaming olmadan uzun çıktı bekleme | UX için stream aç, server-sent events kullan |
| API key koda yazılmış | Environment variable / secret manager kullan |
Prompt = bağlam + görev tanımı + format kısıtı
| Teknik | Kullanım |
|---|---|
| Zero-shot | Doğrudan görev; büyük modeller için |
| Few-shot | 2–5 örnek; küçük/özelleşmiş modeller |
| Chain of Thought (CoT) | “Adım adım düşün”; akıl yürütme görevleri |
| System / user ayrımı | Rol + kısıtlar system’de; görev user’da |
| Output format belirtme | “JSON formatında yanıt ver” veya schema |
| Hata | Düzeltme |
|---|---|
| System prompt’ta çok fazla kural | En kritik 3–5 kısıtı tut; geri kalanı structured output ile kontrol et |
| Few-shot örnekleri dengesiz | Sınıf başına eşit sayıda örnek; edge case ekle |
| “Şunu yapma” talimatı | Pozitif yönlendirme: “Şunu yap” |
| Prompt değişince regresyon | Prompt sürümleme + eval seti tut |
| CoT her görevde açık | CoT yalnızca reasoning görevleri için; basit görevlerde yavaşlatır |
Token ≠ kelime — Türkçe eklemeli yapısı daha fazla token tüketir
Geçmiş yönetimi stratejileri
| Strateji | Açıklama |
|---|---|
| Sliding window | Son N token’ı tut; basit ama bağlam kaybi |
| Özetleme | Geçmişi sıkıştır, bağlamı koru; maliyetli |
| Hata | Düzeltme |
|---|---|
| Tüm konuşma geçmişini her turda göndermek | Sliding window veya geçmiş özetleme uygula |
| Context dolunca hatayı görmezden gelmek | Token sayacı ekle; sınıra yaklaşınca kırp |
| Token ≈ kelime varsaymak | Gerçek token sayısını tiktoken ile say |
| Çıktı token sınırını çok küçük koymak | Görev için gerçek ihtiyaç ölçülmeli |
| RAG chunk boyutunu optimize etmemek | Embedding boyutu ve token etkisini birlikte düşün |
Serbest metin çıktısı downstream sistemlerle entegre olmaz
Prompt’ta “JSON döndür” demek bu garantiyi vermez.
Modern API’lerde response_format parametresiyle schema zorunlu kılınır [kontrol edilecek].
schema = {
"type": "object",
"properties": {
"musteri_adi": {"type": "string"},
"sikayet": {"type": "string"},
"tarih": {"type": "string", "format": "date"},
"oncelik": {"type": "string",
"enum": ["dusuk", "orta", "yuksek"]}
},
"required": ["musteri_adi", "sikayet", "oncelik"]
}
response = client.chat.completions.create(
model="gpt-4o", # [kontrol edilecek]
messages=[...],
response_format={
"type": "json_schema",
"json_schema": {"schema": schema}
}
)| Hata | Düzeltme |
|---|---|
| Schema çok derin / karmaşık | Schema’yı düzleştir; iç içe nesne sayısını azalt |
| Optional alanlara güvenmek | Required alanları minimize et; optional için None kontrolü yap |
| Yalnızca prompt’ta “JSON döndür” demek | API-level schema kullan; güvenilirlik için şart |
| Validation hatasını görmezden gelmek | Parse hatası → retry veya fallback; sessiz hata kabul edilemez |
| Büyük enum listeleri | Enum yerine string + ayrı validation adımı |
Model eylem gerçekleştiremez — ama tetikleyebilir
tools = [{
"type": "function",
"function": {
"name": "get_weather",
"description": "Verilen şehir için güncel hava durumunu döndürür",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "Şehir adı"}
},
"required": ["city"]
}
}
}]
response = client.chat.completions.create(
model="gpt-4o", # [kontrol edilecek]
messages=[{"role": "user", "content": "Ankara'da hava nasıl?"}],
tools=tools
)
# response.choices[0].message.tool_calls kontrol et| Hata | Düzeltme |
|---|---|
| Tool açıklaması belirsiz | Her tool için net, kısa, somut açıklama yaz |
| Araç sonucunu loglamamak | Tool sonuçları loglanmalı; model yanlış argüman döndürebilir |
| Paralel tool call yönetimi eksik | Model birden fazla tool çağırabilir; hepsini handle et |
| Tool sonucunu modele geri göndermemek | Her tool çağrısı için tool_result mesajı eklenmelidir |
| Sonsuz döngü riski | Max iteration sınırı koy |
| Argümanları doğrulamadan execute etmek | Güvenlik: argümanları doğrula; model manipüle edilmiş argüman üretebilir |
Metin → sayısal vektör → anlamsal arama
Benzer anlam → yakın vektör. Bir sorgu için en yakın vektörleri bulmak, semantik arama yapmak demektir.
# Indexleme
chunks = split_text(document, chunk_size=400, overlap=50)
embeddings = [embed(c) for c in chunks]
vector_store.add(chunks, embeddings,
metadata=[{"source": doc_name, "page": i}
for i, _ in enumerate(chunks)])
# Sorgu
query_vec = embed(user_query)
results = vector_store.search(query_vec, top_k=5)
context = "\n".join([r.text for r in results])Teknik araçlar: Chroma · Pinecone · pgvector · FAISS [kontrol edilecek]
| Hata | Düzeltme |
|---|---|
| Chunk boyutu çok büyük | 200–500 token arası dene; overlap ekle |
| Embedding modeli ile LLM’i eşleştirmemek | Aynı sağlayıcının modellerini kullan [kontrol edilecek] |
| Metadata olmadan depolama | Her chunk’a kaynak, sayfa, tarih ekle |
| Yalnızca semantik arama | Hybrid search: keyword + semantik birleştir |
| Vector store’u güncellememeyi unutmak | Belge güncellenince ilgili chunk’ları yeniden embed et |
Model bilgisi eksik veya eski olabilir
| Aşama | Özellik |
|---|---|
| Naive RAG | Sorgu → embed → retrieve → generate |
| Advanced RAG | Query rewriting + hybrid search + reranking + context packing |
| Modular RAG | Retrieval pipeline değiştirilebilir modüllerle |
| Hata | Düzeltme |
|---|---|
| Alakasız chunk retrieve etmek | Similarity threshold ekle; düşük skoru filtrele |
| Context’e çok fazla chunk koymak | Reranking + token bütçesi ile sayıyı sınırla |
| Kaynak göstermeden yanıt vermek | Citation mekanizması ekle |
| Prompt injection görmezden gelmek | Kullanıcı girdisi ve retrieved metin izole edilmeli |
| Belgeleri güncellememeyi unutmak | Güncelleme pipeline’ı ve versiyon kontrolü şart |
Bileşenleri zincire bağlayan framework
| Soyutlama | Karşılık |
|---|---|
ChatModel |
LLM API bağlayıcısı |
PromptTemplate |
Parametrik prompt |
Retriever |
Vector store’dan chunk çekme |
OutputParser |
Çıktı parse etme |
Memory |
Konuşma geçmişi |
Tool |
Dış fonksiyon tanımı |
Chain / LCEL |
Bileşenleri pipe \| ile bağlama |
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
llm = ChatOpenAI(model="gpt-4o") # [kontrol edilecek]
prompt = ChatPromptTemplate.from_messages([
("system", "Sen bir özetleme asistanısın."),
("user", "{text}")
])
chain = prompt | llm | StrOutputParser()
result = chain.invoke({"text": "..."})| Hata | Düzeltme |
|---|---|
| Framework sürümü kırılması | Sürümü sabitle (langchain==x.y.z); sık breaking change gelir [kontrol edilecek] |
| Debug zorluğu | LangSmith tracing aktive et [kontrol edilecek] |
| Her şeyi LangChain ile yapmak | Basit tek-adım görevler için saf Python daha temizdir |
| Memory yönetimini default bırakmak | Memory stratejisini açık seç; default davranış değişebilir |
| Deprecation’ı geciktirmek | langchain_core / langchain_community ayrımını takip et [kontrol edilecek] |
Lineer chain → döngüsel ajan
from langgraph.graph import StateGraph, END
graph = StateGraph(AgentState)
graph.add_node("planner", plan_step)
graph.add_node("executor", execute_step)
def should_continue(state):
return "continue" if state["iterations"] < 5 and not state["done"] \
else "end"
graph.add_conditional_edges(
"executor",
should_continue,
{"continue": "planner", "end": END}
)Kullanım senaryoları: araştırma ajanı · kod yazma ajanı · multi-agent · human-in-the-loop
| Hata | Düzeltme |
|---|---|
| Sonsuz döngü | Max iteration kontrolü şart; recursion_limit belirle |
| State büyümesi | State sadece gerekli alanları içermeli |
| Tool hatasını handle etmemek | Her tool çağrısı try/except içinde; hata state’e kaydedilmeli |
| Multi-agent koordinasyonu eksik | Supervisor pattern veya shared state ile koordinasyon tanımla |
| Tracing olmadan debug | LangSmith veya benzeri tracing zorunlu [kontrol edilecek] |
Problem: Her uygulama araçları kendine özel bağlar → entegrasyon maliyeti katlanır
| Kavram | Açıklama |
|---|---|
| MCP Server | Araç/kaynak/prompt sağlayıcı; bağımsız process |
| MCP Client | LLM host; sunucuya bağlanır, araçları listeler |
| Tool | Fonksiyon çağrısı (tool calling ile örtüşür) |
| Resource | Okunabilir veri kaynağı (dosya, DB, API) |
| Transport | stdio (lokal) veya HTTP/SSE (uzak) [kontrol edilecek] |
| Hata | Düzeltme |
|---|---|
| Server güvenliğini görmezden gelmek | Authentication ekle; yalnızca yetkili client’lara aç |
| Prompt injection vektörü olarak MCP | Resource içerikleri izole edilmeli |
| Transport yanlış seçimi | stdio lokal; HTTP/SSE uzak bağlantı için |
| Tool tanımlarını senkronize etmemek | Server güncellenince client araç listesini yenilemeli |
Kullanıcı
↓
API / UI katmanı
↓
Girdi doğrulama + kimlik doğrulama ← prompt injection sanitize; yetki
↓
Prompt / görev yönlendirici ← hangi chain/agent?
↓
Context manager
├── Konuşma state
├── Retrieved belgeler (RAG)
├── Kullanıcı / görev hafızası
└── Token bütçe yöneticisi
↓
LLM çağrısı
├── Structured output → parse + validate
├── Tool calling → tool dispatcher
└── Serbest üretim → output parser
↓
Araç / veri katmanı
├── İç API'ler
├── Vector store (embedding / RAG)
├── Veritabanı
├── LangChain / LangGraph workflow'ları
└── MCP server'lar
↓
Doğrulama / guardrails ← çıktı policy kontrolü
↓
Nihai yanıt / eylem
↓
Tracing + değerlendirme + log ← LangSmith / benzeri [kontrol edilecek]| Katman | Sorumluluk | Kritik nokta |
|---|---|---|
| API / UI | Girdiyi al, çıktıyı sun | XSS, injection yüzeyi |
| Doğrulama + auth | Kim, ne yapabilir | Her istekte kontrol |
| Yönlendirici | Hangi pipeline? | Yanlış yönlendirme gizli hata |
| Context manager | Token bütçesi + bilgi | En büyük maliyet kaynağı |
| LLM çağrısı | Üretim | Hata yönetimi, retry |
| Araç / veri katmanı | Harici erişim | Yetki, hata, gecikme |
| Guardrails | Çıktı güvenliği | Policy belirgin olmalı |
| Tracing | Görünürlük | Prodüksiyonda zorunlu |
| Kaynak | Hedef | İlişki türü | Açıklama |
|---|---|---|---|
| LLM API modeli | Prompt engineering | Temel | API parametreleri prompt etkisini belirler |
| Prompt engineering | Structured output | Bağımlılık | Prompt görevi tanımlar, schema çıktıyı kilitler |
| Prompt engineering | Token yönetimi | Rekabet | Prompt uzunluğu token bütçesini tüketir |
| Token yönetimi | RAG | Kısıt | Chunk sayısı ve boyutu bütçeye bağlı |
| Structured output | Tool calling | Altyapı | Tool argümanları schema-validated JSON |
| Tool calling | Ajan workflow | Bileşen | Ajan döngüsünde araç execute adımı |
| Embedding / vector search | RAG | Altyapı | Retrieval’ın teknik temeli |
| RAG | LangChain | Pipeline | LangChain RAG chain’i hazır kurar |
| LangChain | LangGraph | Genişleme | LangGraph durum ve döngü ekler |
| MCP server/client | Tool calling | Standartlaşma | Tool’ları protokol düzeyinde standartlaştırır |
| RAG / Tool / MCP | Prompt injection | Güvenlik riski | Dış veri modele girince saldırı yüzeyi artar |
Ana iddia
Prompt engineering bu hattın yalnızca bir halkasıdır.
Güvenilir bir LLM sistemi için tüm halkaların birlikte tasarlanması gerekir.
| Katman grubu | Ne sağlar |
|---|---|
| API · token · structured output · tool calling | LLM’i işlevsel kılar |
| Embedding · RAG | Güncel ve özel bilgiyle donatır |
| LangChain · LangGraph | Ölçeklenebilir pipeline ve ajan |
| MCP | Araç ekosistemini standartlaştırır |