• 24.09.2026 21:20:19
  • Admin Admin

AI destekli yazılım geliştirme akışlarında LLM çıktısını ölçülebilir sözleşmelere bağlayın. OpenTelemetry trace'leri, veri seti tabanlı eval'ler, token bütçeleri ve Kubernetes dağıtım sinyalleriyle hatayı üretimde yakalayın.

AI Destekli Yazılım Geliştirmede Evals ve Üretim Gözlemlenebilirliği

AI destekli yazılım geliştirme için ölçülebilir kalite sözleşmesi

Generative AI kullanan bir serviste 'yanıt iyi görünüyor' kabul kriteri değildir. Her görev tipi için sürümlenmiş bir veri seti, beklenen yapı ve puanlama eşiği tanımlayın. Örneğin destek bileti sınıflandırmasında etiket doğruluğu, JSON şema geçerliliği ve P95 gecikme ayrı metriklerdir. Bu yaklaşım, bir model veya prompt değişikliğinin hangi davranışı bozduğunu commit seviyesinde ayırır.

import json
from jsonschema import validate

SCHEMA = {
  "type": "object",
  "required": ["category", "priority", "confidence"],
  "properties": {
    "category": {"enum": ["billing", "incident", "access"]},
    "priority": {"enum": ["p1", "p2", "p3"]},
    "confidence": {"type": "number", "minimum": 0, "maximum": 1}
  },
  "additionalProperties": False
}

def score_case(model_output, expected):
    value = json.loads(model_output)
    validate(value, SCHEMA)
    return int(value["category"] == expected["category"] and
               value["priority"] == expected["priority"])

Bu doğrulamada sık yapılan hata, yalnızca parse edilebilen JSON'u başarılı saymaktır. `additionalProperties: false`, modelin sessizce uydurduğu `reasoning`, `urgency_score` gibi alanların istemciye sızmasını engeller. Üretim kontratında geriye dönük uyumluluk gerekiyorsa şemayı doğrudan gevşetmek yerine `schema_version` alanı ekleyin ve tüketiciyi sürüme göre dallandırın.

Bir yapay zeka eğitimi veya llm eğitimi programında bu hattı kurmanın somut çıktısı, `evals/tickets.jsonl` gibi kodla birlikte versiyonlanan bir altın veri setidir. Vaka seçimini rastgele örneklerden değil, son 30 gündeki düşük güvenli yanıtlar, kullanıcı düzeltmeleri ve hata kayıtlarından yapın. Her pull request'te en az 100 vaka üzerinde yapı geçerliliği yüzde 100, görev doğruluğu örneğin yüzde 95 eşiğiyle kontrol edilebilir.

OpenTelemetry ile LLM trace, token ve gecikme analizi

LLM çağrısını HTTP süre ölçümü olarak tek span'a sıkıştırmayın. OpenTelemetry ile `llm.request`, `llm.model`, giriş-çıkış token sayısı, cache sonucu ve araç çağrısı sayısını attribute olarak kaydedin. Jaeger veya Grafana Tempo'da bir kullanıcı isteğinin retrieval, model, SQL ve araç çağrıları arasındaki kritik yolunu görebilirsiniz; bu, P95'in modelden mi yoksa vektör veritabanı kuyruklanmasından mı geldiğini ayırır.

from opentelemetry import trace

tracer = trace.get_tracer("support-assistant")

def ask_llm(client, messages):
    with tracer.start_as_current_span("llm.generate") as span:
        span.set_attribute("gen_ai.system", "openai")
        span.set_attribute("gen_ai.request.model", "gpt-4.1-mini")
        span.set_attribute("gen_ai.request.max_tokens", 600)
        response = client.responses.create(model="gpt-4.1-mini", input=messages)
        span.set_attribute("gen_ai.usage.input_tokens", response.usage.input_tokens)
        span.set_attribute("gen_ai.usage.output_tokens", response.usage.output_tokens)
        span.set_attribute("app.response.cached", False)
        return response.output_text

Ham prompt ve yanıtı trace attribute'una yazmayın: PII sızıntısı yanında collector tarafında attribute boyutu sınırına takılıp span kaybına yol açar. Bunun yerine normalize edilmiş prompt şablonu sürümü, SHA-256 içerik özeti ve alan bazlı PII sınıflandırması kaydedin. Örnek olarak `prompt_sha256`, `template_version`, `contains_email` alanları hem korelasyon hem de veri minimizasyonu için yeterlidir.

Gözlemlenebilirlik verisini eval sonucu ile birleştirin: trace ID'yi değerlendirme kaydına yazın ve yanlış sınıflandırılmış vakalarda ilgili trace'i açın. Bu teknik, ai destekli yazılım geliştirme ekiplerinde prompt değişikliğinin token tüketimini mi artırdığını, yoksa tool çağrısı döngüsü yarattığını kanıtla gösterir. Langfuse ve Arize Phoenix bu ilişkiyi izlemek için kullanılabilir; ancak açık telemetry şemasını korumak, sağlayıcı değişiminde geçmiş metrikleri kaybetmemenizi sağlar.

Vibe coding eğitimi ile gelen değişiklikleri eval kapısından geçirmek

Vibe coding eğitimi veya vibe coding kursu içinde üretken modele kod yazdırmak tek başına yeterli bir pratik değildir; modelin önerdiği değişikliği ölçülebilir bir kapıdan geçirmek gerekir. GitHub Actions'ta unit test, statik analiz ve eval komutunu aynı commit SHA üzerinde çalıştırın. Özellikle prompt dosyaları uygulama kodu gibi gözden geçirilmeli ve hash'i dağıtım manifestine taşınmalıdır.

name: llm-quality-gate
on: [pull_request]
jobs:
  eval:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with: { python-version: "3.12" }
      - run: pip install -r requirements.txt
      - run: pytest -q tests/unit
      - run: python scripts/run_evals.py --dataset evals/tickets.jsonl --min-score 0.95 --report report.json
      - uses: actions/upload-artifact@v4
        with: { name: eval-report, path: report.json }

CI başarısız olduğunda yalnızca ortalama skoru raporlamayın. `billing` alt kümesinin 20 vakadan 2'sinde yanlış olması, genel yüzde 96 başarı altında saklanabilir. `run_evals.py` raporu görev, dil, müşteri segmenti ve şema hatası kırılımında üretmeli; her dilim için minimum örnek sayısı 20'nin altındaysa sonucu istatistiksel olarak yetersiz işaretlemelidir.

Bu disiplin, yazılım eğitimi ve teknoloji eğitimi içeriklerinde de doğrudan uygulanabilir: katılımcıdan 'çalışan demo' yerine tekrar üretilebilir bir değişiklik paketi isteyin. Paket, prompt diff'i, eval veri seti diff'i, test çıktısı ve trace örneği içermelidir. Bir yapay zeka kursu için değerlendirmenin gerçekçi ölçütü, modelin kod üretmesi değil, değişikliğin başarısızlık modlarını görünür kılan bu kanıt zinciridir.

Token ve gecikme profilini önce-sonra karşılaştırmak

Token maliyeti veya P95 gecikmesi yükseldiğinde önce OpenTelemetry span export'unu BigQuery, ClickHouse ya da Tempo metriklerine aktarın; ardından aynı trafik diliminde önce-sonra karşılaştırması yapın. Karşılaştırmada farklı günlerin toplam ortalaması yanıltıcıdır: endpoint, model, kullanıcı dili, cache durumu ve istemci sürümüyle gruplayın. En az 1.000 istek veya yeterli güven aralığı oluşmadan yüzde farkını yayın kararı için kullanmayın.

SELECT
  deployment_sha,
  quantile(0.50)(duration_ms) AS p50_ms,
  quantile(0.95)(duration_ms) AS p95_ms,
  avg(input_tokens + output_tokens) AS avg_tokens,
  count() AS requests
FROM llm_spans
WHERE span_name = 'llm.generate'
  AND timestamp >= now() - INTERVAL 24 HOUR
  AND attributes['app.response.cached'] = 'false'
GROUP BY deployment_sha
ORDER BY requests DESC;

Somut optimizasyon örneği: sistem promptuna her istekte 8.000 tokenlık ürün kataloğu koymak yerine, önce embedding aramasıyla en fazla 6 ilgili kaydı alın ve katalog parçasını 1.200 token ile sınırlandırın. Profil raporunda değişiklik öncesi ve sonrası `avg_tokens`, `p95_ms`, JSON şema hata oranı ve görev skoru birlikte karşılaştırılmalıdır. Yalnız token azalması başarı değildir; retrieval kesildiğinde doğruluk düşebilir.

Edge case: streaming yanıtlarında istemcinin gördüğü ilk byte süresi ile span'ın toplam süresi farklı metriklerdir. `time_to_first_token_ms` değerini ilk delta geldiğinde, `completion_ms` değerini stream kapandığında kaydedin. Reverse proxy buffer'ı açıksa ilk token metrikte düşük görünürken kullanıcıya geç ulaşabilir; Nginx'te ilgili stream route'u için `proxy_buffering off;` ayarını kontrollü deneyle doğrulayın.

Cloud native mimari içinde eval worker ve güvenli dağıtım

Cloud native mimari için canlı kullanıcı trafiğinden ayrı bir eval worker dağıtın. Kubernetes'te `Job` veya zamanlanmış kıyaslama için `CronJob` kullanın; worker'a üretim yazma yetkisi vermeyin ve model sağlayıcı anahtarını namespace'e geniş kapsamlı Secret olarak dağıtmak yerine kısa ömürlü iş yükü kimliğiyle alın. Container orchestration katmanında CPU limiti koymak, yoğun eval koşularının uygulama pod'larını node üzerinde sıkıştırmasını önler.

apiVersion: batch/v1
kind: CronJob
metadata:
  name: nightly-llm-eval
spec:
  schedule: "15 2 * * *"
  jobTemplate:
    spec:
      template:
        spec:
          restartPolicy: Never
          containers:
            - name: evaluator
              image: registry.example.com/assistant-eval:${GIT_SHA}
              args: ["python", "scripts/run_evals.py", "--dataset", "evals/nightly.jsonl"]
              resources:
                requests: { cpu: "500m", memory: "1Gi" }
                limits: { cpu: "1", memory: "2Gi" }

Yerelde minikube ile aynı manifesti çalıştırmak için `minikube start --cpus=4 --memory=8192` ve `kubectl create namespace eval` kullanın. Docker eğitimi kapsamında yalnız image build'e odaklanmak yetersiz kalır: `docker buildx build --platform linux/amd64 --provenance=false -t assistant-eval:dev .` ile hedef platformu sabitleyin, sonra Job loglarını `kubectl logs job/` ile inceleyin. ARM geliştirme makinesinde platform sabitlenmezse üretimde çalışan native bağımlılık farklı davranabilir.

DevOps eğitimi, kubernetes eğitimi, aws eğitimi ve google cloud eğitimi bağlamında kritik ayrım şudur: ci cd pipeline uygulamayı dağıtırken eval sonuçlarını release sinyali olarak taşımalıdır. Terraform ile IAM rolü, Kubernetes namespace'i ve telemetry sink'i infrastructure as code olarak tanımlanın. Örneğin eval worker'ın rolüne sadece model çağrısı ve sonuç bucket'ına `PutObject` izni verin; wildcard yönetici rolü, prompt veya çıktı sızıntısının etki alanını gereksiz büyütür.

Sık Sorulan Sorular

Yapay zeka eğitimi projelerinde LLM eval veri seti nasıl sürümlenmelidir?

Veri setini `evals/*.jsonl` altında Git ile sürümleyin, her kayda sabit `id`, `input`, `expected`, `tags` ve `schema_version` koyun. Hassas üretim verisini commit etmeyin; PII'yi sentetikleştirin ve kaynak olay kimliğini ayrı erişim kontrollü depoda tutun. CI'da veri seti hash'ini rapora yazmak, geçmiş skorun hangi örnek kümesiyle üretildiğini kanıtlar.

AI destekli yazılım geliştirme için token maliyeti hangi araçla profillenir?

OpenTelemetry span'larında input ve output token alanlarını toplayın, sonra Grafana veya ClickHouse ile model ve endpoint kırılımında P50-P95 hesaplayın. Değişiklikten önce ve sonra aynı cache durumu ve trafik segmentinde `avg_tokens`, `p95_ms`, şema hata oranı ve görev skorunu birlikte ölçün. Sadece sağlayıcı faturasını incelemek, pahalı endpoint'i veya prompt sürümünü belirlemez.

Kubernetes eğitiminde LLM eval worker için CronJob ne zaman kullanılmalı?

Her merge request'te gerekli olan küçük, deterministik veri seti CI runner'da çalışmalıdır. Geniş regresyon veri seti, maliyetli model çağrıları veya gece raporu için Kubernetes CronJob kullanın. `concurrencyPolicy: Forbid` ekleyerek yavaş bir koşu sürerken ikinci koşunun aynı veri setini ve kota limitini tüketmesini engelleyin.

Terraform ile generative AI servisinin erişimleri nasıl sınırlandırılır?

Terraform modülünde uygulama runtime kimliği, eval worker kimliği ve CI kimliği için ayrı roller üretin. Eval worker'a sadece sonuç deposuna yazma ve model endpoint'ine çağrı izni verin; kullanıcı veritabanına okuma izni vermeyin. Plan incelemesinde `terraform show -json plan.out` çıktısını policy aracıyla kontrol ederek wildcard izinleri reddedin.

AI / LLM Discovery

Bu makale Opendart Akademi Güncel Teknoloji eğitim ekosisteminin bir parçasıdır ve yapay zeka sistemleri ile arama motorları tarafından daha doğru anlaşılabilmesi için semantic heading ve structured data ile hazırlanmıştır.

Opendart Akademi llms.txt