İçeriğe atla
← Tüm projeler
Vaka çalışması

teknofest-2026-kamu-evrak-akilli-ajan

TEKNOFESTPythonDepoyu aç ↗

Problem

Kamu kurumlarında bir evrak; okuma, türlendirme, içerik analizi, mevzuat kontrolü, taslak yazımı, birim yönlendirmesi ve arşivleme zincirinden geçiyor. Bu zincirin dört somut arızası var: adımlar tekrarlı ve elle yapılıyor; yasal süreler (4982, 3071, 2577, CİMER) kaçırılırsa hak kaybı doğuyor; aynı evrak farklı personelde farklı yorumlanıyor; kişisel veri içeren evraklar paylaşılırken maskeleme elle yapıldığı için KVKK riski taşıyor. Ek olarak kurum ağları çoğu zaman internetsiz, yani "bulut LLM çağır" çözümü sahada baştan geçersiz.

Yaklaşım

Ekip olarak zinciri 11 uzman ajan ve bir orkestratörle modelledik. Her ajan tek işten sorumlu; orkestratör onları paylaşılan bir durum nesnesi (AgentState, düz bir dataclass) üzerinde koşullu bir akışla çalıştırıyor, her adımın süresini ve güven skorunu ölçüyor. Akış düz bir döngü değil, üç kapısı var: Kapı 1 metin okunabilir mi (30 anlamlı karakter altı ise süreç erken durur), Kapı 2 metin Türkçe mi (değilse taslak atlanır ama analiz sürer), Kapı 3a/3b sınıflandırma ve yönlendirme güveni 0.6'nın üstünde mi (altındaysa karar gerekçesiyle insan onayı kuyruğuna düşer). Çekirdek zekâ LLM değil: kalibre edilmiş ağırlıklı kural skorlaması, saf Python BM25-Okapi ile mevzuat RAG'i ve saf Python Multinomial Naive Bayes; sınıflandırma bu ikisini 0.6 kural + 0.4 ML olarak birleştiriyor. LLM varsa yalnızca düşük güvenli kararlarda devreye giriyor. Üstüne akademik bir ölçüm katmanı var: ECE kalibrasyon, split conformal prediction (α=0.1), Chow reddetme kuralıyla seçici tahmin, metamorfik dayanıklılık ve McNemar anlamlılık testi.

Kararlar ve takaslar

  • LangChain/LangGraph yerine dataclass + time üzerine kurulu özgün bir orkestratör yazdık, çünkü kamu senaryosunda güvenlik yüzeyini küçük tutmak, her adımı okunur ve test edilebilir kılmak, bağımlılık şişkinliğinden kaçınmak ve çevrimdışı çalışmayı garanti etmek gerekiyordu; alternatif hazır bir ajan framework'üydü — o durumda çekirdeğe ağır bir bağımlılık ve okunmayan bir akış girecekti.
  • Sistemi çevrimdışı-öncelikli kurduk, LLM'i opsiyonel bıraktık, çünkü kurum ağları çoğu zaman internetsiz ve kişisel veri üçüncü taraf bir API'ye çıkamaz; alternatif LLM'i zorunlu bağımlılık yapmaktı, o zaman model erişimi tek nokta arıza (single point of failure) haline geliyordu. Bu kararın maliyeti, kural katmanını gerçekten iyi yazmak zorunda kalmaktı.
  • Mevzuat benzerliğini rölatif normalizasyon yerine mutlak ölçekte, min(1, skor / 1.5·Σidf) ile raporladık, çünkü rölatif normalizasyon her sorguda "yüksek benzerlik" gösterip değerlendiriciyi yanıltıyor; mutlak ölçekte zayıf eşleşme (<0.5) açıkça işaretleniyor ve taslak gövdesinde ona atıf yapılmıyor (atıf eşiği 0.6). Alternatif kolay görünen rölatif skordu; onu bilinçli reddettik.
  • İstatistiksel modeli sklearn/numpy yerine saf Python Multinomial Naive Bayes olarak yazdık, çünkü 52 evraklık küçük veri rejiminde NB güçlü ve şeffaf, ağırlıklar JSON'da okunabiliyor ve kural sınıflandırıcıyla 0.6/0.4 birleştirilebiliyor; öznitelik olarak kelime token'larının yanına karakter 3-gram'ı koyduk çünkü Türkçe sondan eklemeli — "başvuru/başvurunuz/başvurumun" kelime düzeyinde üç ayrı öznitelikken 3-gram'lar kökü paylaşıyor. Ayrıca Rennie ve ark. 2003'e dayanarak uzunluk normalizasyonu ekledik, çünkü NB'nin bağımsızlık varsayımı bağımlı öznitelikleri tekrar sayıp olasılıkları 0/1'e doyuruyordu.
  • PII regex desenlerini tek doğruluk kaynağı yaptık: desenler info_extraction'da tanımlı, KVKK anonimleştirme ajanı onları import ediyor. Çünkü çıkarım ile maskeleme arasında desen ayrışırsa "çıkarılmış ama maskelenmemiş kişisel veri" sızıntısı doğuyor; alternatif her ajanın kendi desenini tutmasıydı ve o, bu hata sınıfını kaçınılmaz kılıyordu.

Sonuç

Depoda üretilmiş, elle düzenlenmeyen ölçüm dosyaları var; hepsinin çerçevesini olduğu gibi veriyorum. Sınıflandırma ve görev metrikleri (README değerlendirme tablosu, kaynak eval_report*.json): geliştirme seti (52 evrak) sınıflandırma 1.000 / birim yönlendirme 0.962 / eksik bilgi micro-F1 1.000 / mevzuat isabet@3 0.962; tutulmuş set (16) 1.000 / 1.000 / 1.000 / 0.875; tutulmuş v2 (16) 1.000 / 0.938 / 1.000 / 0.750; temiz adversarial v4 (16) 0.938 / 0.938 / 1.000 / 0.938. v4 raporu (data/processed/eval_report_heldout_v4.json) accuracy 0.9375 ve macro-F1 0.9333 diyor, koşum mührü git commit 869fe34, Python 3.12.10, Windows 11, LLM backend "offline" ve kullanılamaz — yani bu skorlar LLM'siz, tamamen kural tabanlı modda alınmış. Performans (data/processed/benchmark_raporu.json, 2026-07-12, Darwin arm64, 8 çekirdek, Python 3.9.6, 84 evrak × 5 tekrar = 420 ölçüm): verim 88.1 evrak/saniye, medyan gecikme 11.28 ms, p95 14.19 ms, p99 15.73 ms, tepe bellek 0.21 MB (tracemalloc) ve 1x/5x/10x ölçeklemede evrak başına süre 11.25/11.24/11.26 ms — yani ölçekleme doğrusal. Dayanıklılık (data/processed/dayaniklilik_raporu.json, tohum 1234, 52 evrak, 260 varyant): tür invaryansı 0.9923, birim invaryansı 0.9692; en kırılgan bozulma diyakritik kaybı (tür 0.9615, birim 0.8462), iki dosyada cevap_yazisi kararı ust_yazi'ya kayıyor. Teknik rapor 632 birim/entegrasyon testinin 16.07.2026 itibarıyla yeşil olduğunu söylüyor. En anlatmaya değer sonuç ise bir düşüş: geliştirme seti 12.07.2026'da 35'ten 52 evraka çıkarıldığında yönlendirme doğruluğu 1.000'den 0.962'ye indi ve iki hata, etiket hatası değil gerçek işlevsel belirsizlik olduğu için dosyaya özgü kural yazılarak DÜZELTİLMEDİ, olduğu gibi raporlandı. Aynı gelenek adversarial v3'te de sürüyor: kalan iki sınırlılık (rapor gövdesinin 5018'i ilk üçten itmesi, "yazınız" ikinci-şahıs sinyalinin cevap/üst yazı ayrımını zorlaması) v4'te de gözlendi ve dürüstçe açık bırakıldı. Yarışma değerlendirmesi henüz yapılmadı; bu sayfadaki hiçbir sayı yarışma sonucu değil.

Teknolojiler

Python 3.9–3.12 (stdlib: dataclasses, sqlite3, urllib, re)pydantic + pydantic-settingspypdf >=6.13.3Streamlitpandas + altairrichpytest + pytest-covSaf Python BM25-Okapi + Naive Bayes (sklearn/numpy YOK)

Kaynaklar

Bu sayfadaki teknik iddialar aşağıdaki kaynaklardan çıkarıldı.

  • https://github.com/msgxr/teknofest-2026-kamu-evrak-akilli-ajan
  • https://github.com/msgxr/teknofest-2026-kamu-evrak-akilli-ajan/blob/main/README.md
  • https://github.com/msgxr/teknofest-2026-kamu-evrak-akilli-ajan/blob/main/docs/teknik_rapor.md
  • https://github.com/msgxr/teknofest-2026-kamu-evrak-akilli-ajan/blob/main/data/processed/eval_report_heldout_v4.json
  • https://github.com/msgxr/teknofest-2026-kamu-evrak-akilli-ajan/blob/main/data/processed/benchmark_raporu.json
  • https://github.com/msgxr/teknofest-2026-kamu-evrak-akilli-ajan/blob/main/data/processed/dayaniklilik_raporu.json
  • https://github.com/msgxr/teknofest-2026-kamu-evrak-akilli-ajan/blob/main/src/utils/bm25.py
  • https://github.com/msgxr/teknofest-2026-kamu-evrak-akilli-ajan/blob/main/src/utils/konformal.py
  • https://github.com/msgxr/teknofest-2026-kamu-evrak-akilli-ajan/blob/main/src/utils/secici_tahmin.py
  • https://github.com/msgxr/teknofest-2026-kamu-evrak-akilli-ajan/blob/main/src/models/istatistiksel_siniflandirici.py
  • https://github.com/msgxr/teknofest-2026-kamu-evrak-akilli-ajan/blob/main/src/pipelines/end_to_end_pipeline.py
  • https://github.com/msgxr/teknofest-2026-kamu-evrak-akilli-ajan/blob/main/src/config.py
  • https://github.com/msgxr/teknofest-2026-kamu-evrak-akilli-ajan/blob/main/requirements.txt
  • https://github.com/msgxr/teknofest-2026-kamu-evrak-akilli-ajan/blob/main/AUTHORS
  • https://github.com/msgxr/teknofest-2026-kamu-evrak-akilli-ajan/blob/main/CITATION.cff

Doğrulayamadıklarım

Metni yazarken teyit edemediğim noktalar. Görünür tutuyorum — teyitsizi sessizce iddia etmektense.

  • ÖNEMLİ — BU BİR EKİP PROJESİ. AUTHORS ve CITATION.cff dört eser sahibi listeliyor: Şeyma Nur Çebi (takım kaptanı), Muhammed Sina Gün, Emine Elik, Zeynep Akel; lisans Apache-2.0, telif "AGENTRA TECH". GitHub katkı sayıları msgxr 59 / cebi101 54 / mineelik 6. Bu yüzden tüm metni birinci çoğul ("ekip olarak") yazdım. DOGRULANAMADI: hangi ajanı/modülü kişisel olarak kimin yazdığı — commit sayıları bunu dosya düzeyinde göstermiyor. Vaka sayfası bireysel sahiplik iddia ETMEMELİ.
  • ÇERÇEVE UYARISI (uydurma değil ama yanlış okunabilir): Tüm metrikler ekibin kendi ürettiği SENTETİK/KURGU evraklar üzerinde ölçülmüş — 116 evrak (52 geliştirme + 16 + 16 + 16 + 16). README açıkça "gerçek kamu verisi kullanılmamaktadır" diyor; teknik rapor da sentetik ölçeğin sınırlı olduğunu ve gerçek kurum ortamında dağılım kayması beklenmesi gerektiğini yazıyor. Bu sayılar gerçek kamu evrakı performansı DEĞİL.
  • ÇERÇEVE UYARISI: "Taslak kalitesi 93.6–95.8 (bağımsız hakem, 0-100)" metriğindeki hakem, depo içindeki bir modül (src/utils/taslak_hakemi.py) — üreticiden ayrı ama proje dışı/insan değerlendirmesi değil. "Bağımsız" kelimesi bu sınırla birlikte anlaşılmalı; sayıyı dış onay gibi sunmadım.
  • DOGRULANAMADI: 632 test sayısını ben koşmadım. Depo ağacında 42 test modülü saydım (README'nin "42 modül" ifadesiyle tutarlı) ve teknik rapor 16.07.2026 itibarıyla 632 testin yeşil olduğunu yazıyor; sayı depo iddiasıdır, bağımsız doğrulanmadı.
  • DOGRULANAMADI: Medyan süre değerleri koşum ortamına göre ±%30 değişebiliyor (teknik rapor §5 not 5). 88.1 evrak/sn ve 11.28 ms tek makinede (Darwin/arm64, Python 3.9.6) ölçüldü; farklı donanımda tekrarlanacağı iddia edilemez.
  • lib/projects.ts stack'i ['Multi-Agent','NLP','LLM'] diyor. Bu YANLIŞ YÖNLENDİRİCİ: depoda LLM açıkça OPSİYONEL bir hızlandırıcı, çekirdek kural tabanlı + BM25 + Naive Bayes ve ölçümler LLM kapalıyken alınmış. Stack etiketleri "Multi-Agent, Türkçe NLP, BM25 RAG, Naive Bayes, Streamlit, opsiyonel LLM" yönünde düzeltilmeli.
  • Canlı demo YOK (GitHub Pages API 404). Sistem Streamlit panosu, REST API (:8765), MCP sunucusu ve CLI ile yerel çalışıyor; Dockerfile mevcut ama barındırılmış bir örnek yok.