LLM - Pratik Mimari

BİM444 — Hafta 12 · Part 4

Öğr. Gör. Oktay Cesur

2026-05-04

LLM Pratik Mimarisi

Geçen bölümlerde:

  • Part 1: Dil teknolojilerinin tarihsel gelişimi
  • Part 2: Transformer, pretraining, modern LLM
  • Part 3: LLM kullanım rehberi — prompt, doğrulama, etik

Bu bölümde:

LLM tabanlı sistemler nasıl kurulur?

1 · LLM API Kullanım Modeli

İ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

1 · API — Akış ve Örnek

Uygulama kodu

HTTP POST /chat/completions
    {model, messages, temperature, max_tokens}

LLM API (OpenAI / Anthropic / vb.) [kontrol edilecek]

Response: {choices[0].message.content, usage}
response = client.chat.completions.create(
    model="gpt-4o",              # [kontrol edilecek]
    messages=[
        {"role": "system", "content": "Sen bir özetleme asistanısın."},
        {"role": "user",   "content": f"Şunu özetle: {text}"}
    ],
    temperature=0.3,
    max_tokens=500
)
print(response.choices[0].message.content)

1 · API — Hata Kalıpları

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

2 · Prompt Engineering

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

2 · Prompt — Mimari ve Örnek

System prompt: [Rol + kısıtlar + format]
    +
User prompt:   [Görev + bağlam + örnek (few-shot)]
    +
Parametre:     temperature, max_tokens

Model

Çıktı (doğrulanmamış)

Validation / parse
System: Sen bir veri çıkarım asistanısın.
        Yalnızca verilen metne dayan.
        Bilgi yoksa "bulunamadı" yaz. Türkçe yanıt ver.

User:   Metinden müşteri adını, şikayeti ve tarihi çıkar.
        Metin: "Ahmet Bey 12 Mart'ta bize ulaşarak
        ürünün hasarlı geldiğini bildirdi."

2 · Prompt — Hata Kalıpları

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

3 · Token ve Context Yönetimi

Token ≠ kelime — Türkçe eklemeli yapısı daha fazla token tüketir

Context penceresi = input tokens + output tokens

Input  = system prompt + geçmiş + belgeler + user mesajı
Output = max_tokens parametresi

Kalan kapasite = context limit − input − max_tokens

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

3 · Token — Mimari ve Örnek

Mesaj geçmişi (tümü)

Token sayacı  (tiktoken / sağlayıcı API'si) [kontrol edilecek]

Bütçe kararı:
    ├── Geçmiş kırpma  (sliding window / summarization)
    ├── Belge parçalama (chunking)
    └── Çıktı token sınırı

LLM çağrısı
import tiktoken

enc    = tiktoken.encoding_for_model("gpt-4o")  # [kontrol edilecek]
tokens = enc.encode(prompt)

if len(tokens) > BUDGET:
    # geçmişi kırp veya belgeleri filtrele
    ...

3 · Token — Hata Kalıpları

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

4 · Structured Output / JSON Schema

Serbest metin çıktısı downstream sistemlerle entegre olmaz

JSON Schema tanımı

API çağrısı (response_format parametresiyle)

Model → garantili schema-uyumlu JSON

Pydantic / zod vb. ile doğrulama  [kontrol edilecek]

Downstream sistem

Prompt’ta “JSON döndür” demek bu garantiyi vermez.
Modern API’lerde response_format parametresiyle schema zorunlu kılınır [kontrol edilecek].

4 · Structured Output — Örnek Schema

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}
    }
)

4 · Structured Output — Hata Kalıpları

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ı

5 · Function / Tool Calling

Model eylem gerçekleştiremez — ama tetikleyebilir

User: "Yarın sabah 10'a toplantı ekle"

Model → tool_call: {add_event, {date: "2026-05-05", time: "10:00"}}

Uygulama: calendar_api.add_event(...)

Sonuç: {"status": "ok", "event_id": "abc"}

Sonuç modele geri gönderilir

Model: "Toplantınız eklendi."

5 · Tool Calling — Tanım ve Akış

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

5 · Tool Calling — Hata Kalıpları

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

6 · Embedding — Indexleme ve Sorgu

# 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]

6 · Embedding — Hata Kalıpları

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

7 · RAG Mimarisi

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

7 · RAG — Pipeline

Kullanıcı sorusu
    ↓ [Opsiyonel: Query rewriting — soruyu iyileştir]
Vector search → top-k chunk
    ↓ [Opsiyonel: Reranking — alakalılık sıralama]
Context packing (token bütçesine sığdır)

Prompt: [system] + [retrieved context] + [user soru]

LLM
    ↓ [Opsiyonel: Citation / kaynak etiketleme]
Yanıt
System:
Sen bir şirket içi destek asistanısın.
Yalnızca aşağıdaki belgelerden yanıt ver.
Bilgi yoksa "belgelerimde bulunamadı" de.

Belgeler: {retrieved_chunks}
Soru:     {user_query}

7 · RAG — Hata Kalıpları

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

8 · LangChain

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

8 · LangChain — LCEL Örneği

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": "..."})
# LCEL ile RAG chain
chain = (
    {"context": retriever, "question": RunnablePassthrough()}
    | prompt_template
    | llm
    | output_parser
)

8 · LangChain — Hata Kalıpları

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]

9 · LangGraph ve Ajan Workflow’ları

Lineer chain → döngüsel ajan

START

Plan node: görevi adımlara böl

Execute node: araç çağır

Observe node: sonucu değerlendir

Koşullu edge:
  ├── Görev tamamlandı → END
  └── Devam gerekiyor → Execute node (döngü)

9 · LangGraph — Mimari ve Örnek

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

9 · LangGraph — Hata Kalıpları

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]

10 · MCP: Araç Standartlaşması

Problem: Her uygulama araçları kendine özel bağlar → entegrasyon maliyeti katlanır

LLM Host (uygulama / IDE / Claude Desktop)
    ↓  ←→  MCP Protokolü  [kontrol edilecek]
MCP Server A    MCP Server B    MCP Server C
(dosya okuma)   (web arama)     (veritabanı)
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]

10 · MCP — Örnek Tool Tanımı ve Hata Kalıpları

{
  "name": "search_documents",
  "description": "Şirket belgelerinde arama yapar",
  "inputSchema": {
    "type": "object",
    "properties": {
      "query":       {"type": "string"},
      "max_results": {"type": "integer", "default": 5}
    },
    "required": ["query"]
  }
}
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

Tam Sistem Mimarisi

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]

Tam Sistem — Katman Sorumlulukları

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

İlişki Haritası: Halkalar

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

Sentez: Prompt Tek Halka

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