Skip to content

Latest commit

 

History

23 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

KADİM: Kamu Dilekçe ve İnceleme Mekanizması

Kamu evrak ve yazışma süreçleri için uçtan uca yapay zekâ ajan sistemi

Lisans: MIT Python Taban model Servis Hugging Face

TEKNOFEST 2026 — Yapay Zeka Dil Ajanları Yarışması, 1. Senaryo: Kamu Evrak ve Yazışma Süreçleri. Görev 1: evrak sınıflandırma ve içerik analizi · Görev 2: resmî yazı taslaklama ve birim yönlendirme.

Belediyeye ulaşan bir dilekçe ya da kurum yazısı sisteme girer. Sistem belgeyi okur, içeriğini yapılandırılmış veriye çevirir, ilgili mevzuat maddelerini getirir, memurun kararını bekler ve son olarak resmî yazı taslağını üretir. Evrakın hangi müdürlüğe gideceğini model tahmin etmez; konu etiketi üzerinden sabit bir eşleme tablosuyla belirlenir.

Evrak görseli/metni → OCR → Analiz → Mevzuat → [ Memur kararı ] → Resmî yazı taslağı + hedef birim

Eğitilmiş LoRA adaptörleri ve mevzuat arama indeksi GitHub'da yoktur (şartname §7). Herkese açık kopyalar Hugging Face'tedir:

Ne Hugging Face
Analiz LoRA (analiz_lora) furkancmc/kadim-analiz-lora
Yazıcı LoRA (yazi_lora) furkancmc/kadim-yazi-lora
OCR LoRA furkancmc/kadim-ocr-lora
RAG indeksi furkancmc/kadim-rag

Taban modeller ayrıca: Qwen/Qwen2.5-7B-Instruct, Qwen/Qwen2.5-VL-7B-Instruct.


Öne çıkan sonuçlar

Üç dil modeli, projeye özgü verilerle LoRA yöntemiyle ince ayardan geçirildi. Bütün ölçümler eğitimde kullanılmayan sabit test kümeleri üzerinde yapıldı; ham model ile ince ayarlı model aynı test kümesinde, aynı koşullarda karşılaştırıldı.

Modül Ölçüt Ham model İnce ayarlı Kazanç
OCR Karakter hata oranı (CER) ↓ 0,4283 0,1076 hatanın %75'i giderildi
OCR Türkçe karakter doğruluğu ↑ %78,55 %85,90 +7,35 puan
Analiz document_type doğruluğu ↑ %70,1 %85,5 +15,4 puan
Analiz sender_type doğruluğu ↑ %78,0 %95,4 +17,4 puan
Analiz missing_information doğruluğu ↑ %74,3 %97,9 +23,6 puan
Yazıcı response_type doğruluğu ↑ %50,0 %82,18 +32,2 puan
Yazıcı Mevzuat atıf sadakati ↑ %83,91 %92,53 +8,6 puan
Mevzuat araması İlk sırada isabet (H@1) ↑ 59,5 69,0 +9,5 puan

OCR, analiz ve yazıcı satırları LoRA ince ayarıdır (aynı test, ham model vs adaptör). Mevzuat satırı LoRA değildir: aynı BGE-M3 aramasına sıralama düzeltmesi eklenince H@1 59,5 → 69,0.

Her modülün ölçüm ayrıntısı, kendi bölümünün sonundadır.


İçindekiler

  1. Sistem Mimarisi ve Akış
  2. Depo Yapısı
  3. Modüller, Eğitim ve Sonuçlar
  4. Veri Şeması
  5. Kurulum ve Çalıştırma
  6. Kullanılan Modeller ve Lisanslar
  7. Yenilikçilik ve Uygulanabilirlik
  8. Etik, Veri Kullanımı ve Kaynaklar

1. Sistem Mimarisi ve Akış

Sistem, her biri tek bir işi üstlenen dört ajandan oluşur. Ajanların tam ortasında insan-döngüde (HITL) memur kararı vardır: model öneri üretir, memur onaylar.

   Evrak görseli / metni
             │
             ▼
 ┌────────────────────────┐
 │ 1) OKUYUCU  (OCR)      │  Qwen2.5-VL-7B + LoRA
 │    QWEN_VL_ocr/        │  →  ham metin
 └───────────┬────────────┘
             ▼
 ┌────────────────────────┐
 │ 2) ANALİZ  (Görev 1)   │  Qwen2.5-7B-Instruct + LoRA
 │    analiz_qwen1/       │  →  document_type, sender_type, primary_topic,
 └───────────┬────────────┘     requested_action, key_information,
             │                  missing_information, summary
             ▼
 ┌────────────────────────┐
 │ 3) MEVZUAT             │  Hibrit arama + yeniden sıralama
 │    mevzuat_rag/        │  →  ilgili kanun ve yönetmelik maddeleri
 └───────────┬────────────┘
             ▼
        ⏸  MEMUR KARARI      maddeleri işaretler · süreç durumunu seçer · not ekler
             │
             ▼
 ┌────────────────────────┐
 │ 4) YAZICI  (Görev 2)   │  Qwen2.5-7B-Instruct + LoRA
 │    yazi_qwen2/         │  →  performed_actions, response_type, process_status,
 └───────────┬────────────┘     result_information, process_information, draft
             ▼
   Hedef birim  =  primary_topic → müdürlük  (sabit eşleme tablosu)

Dört ajanı tek arayüzde birleştiren orkestratör ve Gradio demosu app/ klasöründedir.

Çalışma zamanı: vLLM ve çoklu LoRA

Eğitim Unsloth/TRL ile yapılır, canlı servis vLLM üzerinde çalışır. LoRA adaptörleri taban modele birleştirilmez; vLLM'in çoklu adaptör desteğiyle çalışma anında takılır:

Motor Model Adaptör Görev
1 Qwen2.5-VL-7B-Instruct OCR LoRA Görsel → metin
2 Qwen2.5-7B-Instruct analiz_lora + yazi_lora Metin → analiz JSON'u, JSON → resmî yazı

Analiz ve yazı ajanları aynı taban modeli paylaşır; ikinci bir 7B model belleğe yüklenmez.


2. Depo Yapısı

kadim/
├── README.md                     # Bu dosya
├── LICENSE                       # MIT
├── requirements.txt              # Üst düzey bağımlılıklar
├── docs/
│   ├── demo_ekran.png            # Arayüz ekran görüntüsü
│   └── demo_onizleme_mock.html   # Statik arayüz önizlemesi
│
├── app/                          # ORKESTRATÖR + GRADIO DEMOSU
│   ├── notebooks/
│   │   └── Agent_Demo.ipynb             # Uçtan uca canlı demo (vLLM multi-LoRA)
│   ├── src/                             # Notebook hücrelerinin okunabilir kaynak karşılıkları
│   │   ├── gradio_app.py                # Gradio arayüzü
│   │   ├── draft_prompt.py              # Yazıcı ajanın sistem prompt'u
│   │   ├── topic_map.py                 # Konu eşleme tablolarının yükleyicisi
│   │   └── vllm_worker.py               # vLLM çıkarım süreci
│   └── maps/
│       └── belediye_konu.json           # 58 konu → 11 müdürlük ve mevzuat anahtarları
│
├── QWEN_VL_ocr/                  # 1) OKUYUCU — OCR modeli
│   ├── download_dataset.py              # Kaynak metin kümesini indirir
│   ├── generate_dataset_1000.py         # 1000 sentetik belge görseli üretir
│   ├── qwen_ocr_baseline_test.ipynb     # Ham model ölçümü
│   ├── qwen_ocr_finetune_lora.ipynb     # LoRA eğitimi ve aynı testte ölçüm
│   └── data/                            # Her bozulma seviyesinden bir örnek (A/B/C/D)
│
├── analiz_qwen1/                 # 2) ANALİZ — Görev 1
│   ├── generate_dataset_*.py            # 11 müdürlük için sentetik evrak üretimi
│   ├── build_finetune_splits.py         # Eğitim/doğrulama/test ayrımı
│   ├── Qwen1_FineTune_Colab.ipynb       # LoRA eğitimi ve değerlendirme
│   └── veri/                            # Eğitim kümesinin tamamı
│       ├── train.jsonl · val.jsonl · test.jsonl
│       └── split_stats.txt              # Konu bazında dağılım
│
├── yazi_qwen2/                   # 4) YAZICI — Görev 2
│   ├── 01_finetune_qwen25_7b.ipynb      # LoRA eğitimi (`*_updated.jsonl`)
│   ├── 02_evaluate_qwen25_7b.ipynb      # İnce ayarlı model — 522 kayıt
│   ├── 03_evaluate_base_model.ipynb     # Ham Instruct — aynı 522 kayıt
│   ├── regenerate_drafts.py             # Mevzuatı olan kayıtlarda draft'ı yeniden yazar
│   ├── template_fill_remaining.py       # API'nin kaçırdığı kayıtlara şablon taslak
│   ├── augment_missing_types.py         # ONAY_YAZISI / TESPIT_TUTANAGI dengeleme
│   ├── canonical_system_prompt.txt      # Resmî yazışma kuralları (sistem prompt)
│   ├── .env.example                     # DeepSeek anahtarı şablonu (üretim betikleri)
│   └── veri/
│       ├── qwen2_*_updated.jsonl        # Eğitimde kullanılan tam küme (4.240 / 863 / 522)
│       └── qwen2_*_ornek.jsonl          # Aynı şemadan küçük bakış örnekleri
│
└── mevzuat_rag/                  # 3) MEVZUAT — Arama motoru
    ├── requirements.txt
    └── rag/
        ├── search.py                    # Hibrit arama ve yeniden sıralama
        ├── config.py · scope.py · rerankers.py
        ├── embed/models.py              # Vektör temsilleri
        └── index/bm25.py                # Sözcük tabanlı arama

Notebook'lar

Dosya İçerik
QWEN_VL_ocr/qwen_ocr_baseline_test.ipynb Ham görsel-dil modelinin 100 belgelik test kümesindeki hata oranı
QWEN_VL_ocr/qwen_ocr_finetune_lora.ipynb OCR LoRA eğitimi ve aynı test kümesinde ölçüm
analiz_qwen1/Qwen1_FineTune_Colab.ipynb Analiz LoRA eğitimi ve 241 kayıtlık test
yazi_qwen2/01_finetune_qwen25_7b.ipynb Yazıcı LoRA eğitimi — girdi: veri/qwen2_train_updated.jsonl ve qwen2_val_updated.jsonl
yazi_qwen2/02_evaluate_qwen25_7b.ipynb Yazıcı ince ayarlı model — veri/qwen2_test_updated.jsonl (522 kayıt)
yazi_qwen2/03_evaluate_base_model.ipynb Yazıcı ham Instruct — aynı test dosyası
app/notebooks/Agent_Demo.ipynb Uçtan uca canlı demo — OCR → analiz → RAG → memur → yazı (vLLM multi-LoRA, Gradio)

3. Modüller, Eğitim ve Sonuçlar

Üç dil modeli eğitildi; üçü de tam parametre eğitimi yerine LoRA ile Qwen/Qwen2.5-7B-Instruct (OCR için Qwen2.5-VL-7B-Instruct) üzerine uyarlandı. OCR ve yazıcı bf16; analiz QLoRA (4-bit).

Her modülün ölçümü eğitimde kullanılmayan sabit bir test kümesi üzerinde, ham model ile ince ayarlı model aynı kümede karşılaştırılarak yapıldı.

3.1. Okuyucu — OCR · QWEN_VL_ocr/

Amaç: Türkçe belge görsellerinden metin çıkarmak.

Veri: Açık kaynaklı erdem-erdem/Turkish-Law-Documents-700k-clustered derlemesindeki düz metinler kullanıldı. Bu metinler Yargıtay ve Danıştay'ın kamuya açık karar arama sistemlerinden derlenmiştir. generate_dataset_1000.py her metni antetli bir belge sayfası olarak yeniden basar ve PNG'ye çevirir: 800 eğitim, 100 doğrulama, 100 test.

Gerçek tarama koşullarını temsil etmek için görseller dört bozulma seviyesine ayrılır ve her gruptan 250 belge üretilir:

Grup Tarama kalitesi Örnek
A Temiz baskı, bozulma yok QWEN_VL_ocr/data/A_0003.png
B Hafif bulanıklık, küçük kontrast kayması QWEN_VL_ocr/data/B_0077.png
C Belirgin bulanıklık, kontrast düşüşü, gürültü QWEN_VL_ocr/data/C_0065.png
D Düşük çözünürlük, ağır gürültü, eğrilik QWEN_VL_ocr/data/D_0064.png

Yöntem: Görsel kodlayıcı dondurulur; LoRA adaptörleri yalnızca dil modeli katmanlarına eklenir.

Sonuç — test kümesi: 100 belge görseli, 21.571 Türkçe karakter.

Model Karakter hata oranı (CER) ↓ Türkçe karakter doğruluğu ↑
Ham model 0,4283 %78,55
İnce ayarlı (LoRA) 0,1076 %85,90

İnce ayar, karakter hata oranını yaklaşık dört kat düşürdü. Kazanç en çok Türkçe'ye özgü harflerde (ı, ş, ğ, ö, ü, ç) görüldü: ham model bu harfleri sıklıkla ASCII karşılıklarına indirgerken, ince ayarlı model doğru üretiyor.

3.2. Analiz — Görev 1 · analiz_qwen1/

Amaç: Vatandaş ya da kurum başvurusunun ham metnini okuyup yapılandırılmış JSON'a çevirmek.

Çıktı alanları: document_type, sender_type, primary_topic, requested_action, key_information, missing_information, summary.

Kabul edilen belge türleri (document_type, 5): TALEP_DILEKCE_BASVURUSU, BILGI_TALEBI, SIKAYET_IHBAR_BASVURUSU, ITIRAZ_IDARI_BASVURU, KURUMLAR_ARASI_RESMI_YAZI.

Gönderen türleri (sender_type, 4): VATANDAS, KAMU_KURUMU, OZEL_KURULUS, YARGI_MERCII.

Çıkarılan bilgi unsurları (key_information, 16 tip): PERSON, ORGANIZATION, LOCATION, CONTACT, DATE, REFERENCE_DATE, DEADLINE, DOCUMENT_NO, REFERENCE_NO, APPLICATION_NO, CASE_NO, AMOUNT, INCOME_INFORMATION, HOUSEHOLD_INFORMATION, EVENT_DETAIL, OTHER.

Veri: 11 müdürlük için ayrı ayrı yazılmış generate_dataset_*.py betikleri, her birimin kendi şemasına uygun sentetik evrak üretir. Toplam 2.444 evrak, 58 konu, 11 müdürlük:

Küme Kayıt
train.jsonl 1.957
val.jsonl 246
test.jsonl 241
Toplam 2.444

Konu bazında dağılım analiz_qwen1/veri/split_stats.txt dosyasındadır. Veri üretiminde DeepSeek API'si kullanılır; anahtar .env dosyasından okunur ve depoya girmez.

Sonuç — test kümesi: 241 kayıt.

Ölçüt Ham model İnce ayarlı (LoRA) Kazanç
document_type doğruluğu %70,1 %85,5 +15,4 puan
sender_type doğruluğu %78,0 %95,4 +17,4 puan
missing_information doğruluğu %74,3 %97,9 +23,6 puan

İnce ayarlı model ayrıca primary_topic alanında, 58 başlıktan oluşan konu taksonomisi üzerinde %72,2 doğruluğa ulaşıyor.

missing_information doğruluğu, modelin evrakta eksik bilgi bulunup bulunmadığını doğru tespit etme oranıdır. Örneğin bir imar dilekçesinde ada veya parsel numarası yoksa modelin bunu eksik olarak işaretlemesi beklenir. En büyük kazanç bu alanda görüldü.

3.3. Yazıcı — Görev 2 · yazi_qwen2/

Amaç: Analiz JSON'unu, memurun seçtiği süreç durumunu ve onaylanan mevzuat maddelerini alarak idari aksiyonları, yanıt türünü, süreç bilgisini ve resmî yazı taslağını üretmek.

Veri (depoda, yazi_qwen2/veri/): ChatML JSONL, toplam 5.625 kayıt. Eğitim ve ölçüm *_updated.jsonl dosyalarını kullanır; *_ornek.jsonl aynı şemadan küçük bakış kopyalarıdır.

Dosya Kayıt Rol
qwen2_train_updated.jsonl 4.240 LoRA eğitimi (01_finetune_qwen25_7b.ipynb)
qwen2_val_updated.jsonl 863 Eğitim sırası doğrulama
qwen2_test_updated.jsonl 522 Holdout — 02 ve 03 notebook'ları
qwen2_*_ornek.jsonl 250 / 60 / 60 Şemayı incelemek için temsilî kesit

Bir evraktan çok senaryo (1→N): Gerçek idari hayatta aynı başvuru farklı süreç durumlarına düşebilir ve her durum farklı bir resmî yazı gerektirir. "İncelemede", "eksik bilgi bekleniyor", "yönlendirildi", "reddedildi" ve "tamamlandı" durumlarının her biri için ayrı bir yazı yazılır. Bu nedenle her analiz kaydı farklı süreç durumlarıyla eşlenerek birden çok eğitim örneğine açıldı. Yazıcı kümesinin (5.625) analiz kümesinden (2.444) büyük olmasının sebebi budur; model böylece aynı evrakın duruma göre nasıl farklı yazıldığını öğrenir.

Eğitim seti nasıl üretildi (canlı demoda çalışmaz; set zaten üretilmiş):

  1. regenerate_drafts.py — ChatML kaydındaki sistem prompt'unu canonical_system_prompt.txt ile hizalar; responsible_unit alanını target_unit yapar. selected_legislation dolu kayıtlarda (~%85) yalnızca draft alanını DeepSeek ile yeniden yazar: verilen kanun/madde gövdeye doğal atıf olarak girer, diğer altı assistant alanı değişmez. Liste boş kayıtlarda taslağa dokunulmaz (fallback). Çıktı *_updated.jsonl.
  2. template_fill_remaining.py — API bakiyesi veya hata yüzünden failed kalan kayıtlara ücret gerektirmeyen kural tabanlı taslak basar (arz/rica kapanışı gönderen türüne göre). Başarılı kayıtlara dokunulmaz.
  3. augment_missing_types.py — seyrek kalan ONAY_YAZISI ve TESPIT_TUTANAGI örneklerini DeepSeek ile üretir; %80 / %10 / %10 oranında train / val / test *_updated.jsonl dosyalarına ekler.

DeepSeek anahtarı yazi_qwen2/.env.example üzerinden; .env depoya girmez. Canlı yazı üretimi bu betiklere bağlı değildir: vLLM + yazi_lora.

Mevzuata dayanma ve halüsinasyon direnci: Kayıtların yaklaşık %85'inde model, kendisine verilen mevzuat maddelerine doğrudan atıf yapar. Kalan %15'inde madde listesi bilinçli olarak boş bırakılır. Böylece model, ilgili mevzuat bulunamadığında madde uydurmak yerine genel idari usule uygun bir yazı üretmeyi öğrenir.

Eğitim kümesindeki dağılım:

response_type Adet process_status Adet
EKSIK_BILGI_BELGE_TAMAMLAMA_YAZISI 1.127 EKSIK_BILGI_BEKLENIYOR 1.127
BILDIRIM_YAZISI 727 TAMAMLANDI 944
BILGI_YAZISI 709 INCELEMEDE 849
YONLENDIRME_YAZISI 631 YONLENDIRILDI 688
RET_YAZISI 478 REDDEDILDI 632
ONAY_YAZISI 315
TESPIT_TUTANAGI 253

Modelin uyduğu resmî yazışma kurallarının tamamı yazi_qwen2/canonical_system_prompt.txt dosyasındadır.

Sonuç — test kümesi: 522 kayıt.

Ölçüt Ham model İnce ayarlı (LoRA) Kazanç
response_type doğruluğu %50,0 %82,18 +32,2 puan
Mevzuat atıf sadakati %83,91 %92,53 +8,6 puan

Ölçüm notebook'ları: ham model 03_evaluate_base_model.ipynb, ince ayarlı model 02_evaluate_qwen25_7b.ipynb. İkisi de aynı 522 kaydı, aynı kontrollerle değerlendirir.

İnce ayar, doğru yazı türünü seçme başarısını +32,2 puan artırdı. Ham model vakaların ancak yarısında doğru türü seçebilirken, ince ayarlı model kurum pratiğine uygun türü büyük çoğunlukla isabet ettiriyor.

Mevzuat atıf sadakati, üretilen taslakta geçen kanun ve madde numaralarının gerçekten memura sunulan mevzuat listesinden gelip gelmediğini ölçer; yani modelin madde uydurmadan yazma oranıdır. Kontrol 02_evaluate_qwen25_7b.ipynb içindeki check_legislation_citation fonksiyonuyla yapılır. İnce ayar bu oranı %92,53'e çıkardı — eğitim setindeki %15'lik boş mevzuat tasarımının doğrudan karşılığı.

3.4. Mevzuat Arama Motoru · mevzuat_rag/

Amaç: Başvuruyla ilgili kanun ve yönetmelik maddelerini bulup memura sunmak.

Motor, kamuya açık mevzuat metinlerini madde düzeyinde indeksler ve üç aşamada çalışır:

  1. Anlamsal arama — BGE-M3 vektör temsilleriyle, sorguyla aynı anlama gelen maddeler bulunur.
  2. Sözcük tabanlı arama — BM25 ile kanun adı, madde numarası gibi birebir eşleşmeler yakalanır.
  3. Birleştirme ve yeniden sıralama — İki listenin sonuçları RRF ile birleştirilir ve BGE-reranker-v2-m3 ile yeniden sıralanır.

Arama sorgusu iki parçadan oluşur: analiz ajanının belirlediği konunun mevzuat dilindeki karşılığı ve başvurunun talep cümlesi (requested_action).

Korpus: Mevzuat metinleri T.C. Cumhurbaşkanlığı Mevzuat Bilgi Sistemi üzerinden, kamuya açık güncel metinler olarak alınmıştır. Korpus, 3.5 bölümündeki 11 müdürlüğün görev alanına giren kanun ve yönetmeliklerden oluşur. Metinler madde düzeyinde parçalanıp indekslenir. Üretilen indeks dosyaları (chunks.jsonl, embedding vektörleri) boyutları nedeniyle depoda yer almaz; kaynak metinler kamuya açık olduğundan aynı korpus Mevzuat Bilgi Sistemi'nden yeniden derlenebilir.

Sonuç — test kümesi: 126 kavramsal sorgudan oluşan sabit bir referans kümesi. Tüm koşular aynı sorgular üzerinde, tek seferde tek değişken değiştirilerek yapıldı.

Koşu Vektör modeli H@1 ↑ H@3 ↑ H@5 ↑ MRR ↑ Kaçırma ↓
Taban BGE-M3 59,5 84,1 92,9 0,729 6
Üretim BGE-M3 + sıralama düzeltmesi 69,0 86,5 92,9 0,789 4
Alternatif multilingual-e5-large + sıralama düzeltmesi 70,6 84,9 91,3 0,792 6

Konuyla yalnızca yüzeysel örtüşen maddeleri geriye iten sıralama düzeltmesi, ilk sıradaki isabeti 59,5'ten 69,0'a çıkardı ve hiç sonuç bulunamayan sorgu sayısını 6'dan 4'e indirdi.

Aynı koşullarda denenen multilingual-e5-large yalnızca H@1'de 1,6 puan öndeydi; H@3, H@5 ve kaçırma sayısında geride kaldı. Bundan dolayı BGE-M3 modeli kullanıma alındı.

3.5. Birim Yönlendirmesi

Hedef müdürlük model tahminine bırakılmaz. Analiz ajanının belirlediği primary_topic etiketi, app/maps/belediye_konu.json dosyasındaki sabit eşleme tablosu üzerinden bir müdürlüğe karşılık gelir. 58 konu, 11 müdürlüğe eşlenmiştir: İmar ve Şehircilik, Fen İşleri, Zabıta, Çevre Koruma ve Kontrol, Temizlik İşleri, Veteriner İşleri, Sosyal Yardım İşleri, Park ve Bahçeler, Mali Hizmetler, Hukuk İşleri, Yazı İşleri.

Böylece yönlendirme kararı deterministik, tekrarlanabilir ve denetlenebilir olur; modelin var olmayan bir birim üretmesi mümkün değildir.


4. Veri Şeması

4.1. Analiz ajanının çıktısı

Bu JSON aynı zamanda yazıcı ajanın girdisidir; memurun seçtiği süreç durumu ve işaretlediği mevzuat maddeleri eklenerek iletilir.

{
  "document_type": "ITIRAZ_IDARI_BASVURU",
  "sender_type": "VATANDAS",
  "primary_topic": "TEBLIGAT_ISLEMLERI",
  "requested_action": "2024/128 sayılı encümen kararının tebligatının yeniden yapılması",
  "key_information": [
    {"type": "PERSON", "value": "Ali Veli"},
    {"type": "DOCUMENT_NO", "value": "2024/128"},
    {"type": "REFERENCE_NO", "value": "E-2025-1142"}
  ],
  "missing_information": [],
  "summary": "Ali Veli, encümen kararı tebligatının usulsüz olduğunu belirterek yeniden tebliğ talep etmektedir.",
  "process_status": "INCELEMEDE",
  "selected_legislation": [
    {
      "law_name": "3071 sayılı Dilekçe Hakkının Kullanılmasına Dair Kanun",
      "article": "Madde 7",
      "reference_text": "..."
    }
  ]
}

4.2. Yazıcı ajanının çıktısı

{
  "performed_actions": [
    {"action": "BASVURU_KAYDI", "detail": "Başvuru E-2025-1142 numarasıyla kaydedilmiştir."},
    {"action": "EVRAK_INCELEMESI", "detail": "İlgili karar ve tebligat mazbatası incelenmeye başlanmıştır."}
  ],
  "target_unit": "Yazı İşleri Müdürlüğü",
  "response_type": "BILGI_YAZISI",
  "process_status": "INCELEMEDE",
  "result_information": "Başvurunuz incelemeye alınmıştır; süreç değerlendirmesi devam etmektedir.",
  "process_information": "Başvuru kayıtlı olup tebligat usulü incelemesi sürmektedir.",
  "draft": "T.C.\nBELEDİYE BAŞKANLIĞI\nYazı İşleri Müdürlüğü\n\nSayı: E-2025-1142\nKonu: Tebligat İşlemleri Hk.\n\nSayın Ali Veli,\n...\nBilgilerinize rica ederim."
}

4.3. İzin verilen değerler

Model bu listelerin dışında değer üretemez.

  • response_type (7): BILGI_YAZISI, BILDIRIM_YAZISI, EKSIK_BILGI_BELGE_TAMAMLAMA_YAZISI, RET_YAZISI, YONLENDIRME_YAZISI, TESPIT_TUTANAGI, ONAY_YAZISI
  • process_status (5): INCELEMEDE, TAMAMLANDI, EKSIK_BILGI_BEKLENIYOR, REDDEDILDI, YONLENDIRILDI
  • Bağlayıcı kural: process_status değeri EKSIK_BILGI_BEKLENIYOR ise response_type mutlaka EKSIK_BILGI_BELGE_TAMAMLAMA_YAZISI olur.

5. Kurulum ve Çalıştırma

5.1. Bağımlılıklar

python -m venv .venv
source .venv/bin/activate    # Windows: .venv\Scripts\activate
pip install -r requirements.txt

Hazır eğitim kümeleri depoda bulunduğundan veri üretimi zorunlu değildir. Yeni sentetik veri üretmek isterseniz DeepSeek API anahtarı gerekir:

cp analiz_qwen1/.env.example analiz_qwen1/.env

5.2. Veri üretimi (isteğe bağlı)

cd analiz_qwen1
python generate_dataset_imar.py       # ve diğer 10 müdürlük betiği
python build_finetune_splits.py       # → veri/train|val|test.jsonl
cd QWEN_VL_ocr
python download_dataset.py
python generate_dataset_1000.py --dataset_path ./turkish_law_dataset --output_dir ./dataset_1000

Yazıcı kümesi depoda hazırdır (yazi_qwen2/veri/qwen2_*_updated.jsonl). Aynı hattı yeniden koşmak isterseniz (DeepSeek anahtarı gerekir; canlı serviste kullanılmaz):

cd yazi_qwen2
copy .env.example .env          # DEEPSEEK_API_KEY
python regenerate_drafts.py     # mevzuatı olan kayıtlarda draft
python template_fill_remaining.py
python augment_missing_types.py

01 / 02 / 03 notebook'ları Colab'da DATA_DIR içindeki *_updated.jsonl dosyalarını okur; depodaki veri/ klasörü bu dosyaların kopyasıdır.

5.3. Eğitim

Notebook'lar sırayla çalıştırılır:

  1. QWEN_VL_ocr/qwen_ocr_baseline_test.ipynbQWEN_VL_ocr/qwen_ocr_finetune_lora.ipynb
  2. analiz_qwen1/Qwen1_FineTune_Colab.ipynb
  3. yazi_qwen2/01_finetune_qwen25_7b.ipynb02_evaluate_qwen25_7b.ipynb (ham model karşılaştırması için 03_evaluate_base_model.ipynb)

5.4. Uçtan uca demo

Canlı sistem app/notebooks/Agent_Demo.ipynb ile çalışır (Colab A100). Dört ajan aynı notebook'tadır: VL vLLM (OCR LoRA) + tek Instruct vLLM üzerinde analiz_lora ve yazi_lora. app/src/gradio_app.py aynı masanın okunabilir kaynak karşılığıdır.

Ağırlıklar iki yerde durabilir:

  • Hugging Face (herkese açık): yukarıdaki dört repo. Colab'da huggingface_hub.snapshot_download ile indirilip Drive'daki klasör adlarına karşılık gelir (lora_adapter_qwen1 ← analiz, lora_adapter_qwen2 ← yazı, qwen_vl_7b_lora_finetuned ← OCR, rag/kadim-rag).
  • Google Drive (geliştirme): notebook şu an bu yolları arar.
  1. Runtime → A100 80 GB.
  2. LoRA + RAG hazır olsun (HF indirmesi veya Drive: lora_adapter_qwen1/, lora_adapter_qwen2/, qwen_vl_7b_lora_finetuned/, finetune_data_qwen1/ içinde train.jsonl, belediye_konu.json, rag/). VL tabanı Hugging Face Qwen/Qwen2.5-VL-7B-Instruct veya Drive qwen_vl_7b_model/.
  3. Run all → ilk turda paket çakışması için kırmızı RuntimeError (bilinçli) → Restart session → tekrar Run all.
  4. Gradio share=True bağlantısı açılır.

KADİM Evrak Masası arayüzü — solda belge, ortada memur kararı ve mevzuat maddeleri, sağda üretilen taslak:

KADİM Evrak Masası arayüzü

Statik önizleme: docs/demo_onizleme_mock.html.


6. Kullanılan Modeller ve Lisanslar

Şartnamenin 7. bölümü uyarınca üçüncü taraf model ağırlıkları depoya yüklenmez; erişim bağlantısı, sürüm ve lisans bilgisi burada belirtilir.

Bileşen Erişim Lisans
Qwen/Qwen2.5-7B-Instruct — analiz ve yazı taban modeli Hugging Face Apache-2.0
Qwen/Qwen2.5-VL-7B-Instruct — OCR taban modeli Hugging Face Apache-2.0
BAAI/bge-m3 — vektör temsili Hugging Face MIT
BAAI/bge-reranker-v2-m3 — yeniden sıralama Hugging Face Apache-2.0
Analiz LoRA furkancmc/kadim-analiz-lora MIT
Yazıcı LoRA furkancmc/kadim-yazi-lora MIT
OCR LoRA furkancmc/kadim-ocr-lora MIT
RAG indeksi furkancmc/kadim-rag MIT

Depoda bulunanlar: tüm kaynak kod, eğitim ve değerlendirme notebook'ları, sentetik veri üretim betikleri (analiz_qwen1/generate_dataset_*.py, yazi_qwen2/regenerate_drafts.py, template_fill_remaining.py, augment_missing_types.py), analiz eğitim kümesinin tamamı, yazıcı eğitim kümesinin tamamı (yazi_qwen2/veri/qwen2_{train,val,test}_updated.jsonl) ve küçük *_ornek.jsonl kesitleri, OCR'dan dört örnek görsel, sistem prompt'ları, eşleme tabloları ve Gradio arayüzü.

Depoda bulunmayanlar: taban model ağırlıkları, üç LoRA (Hugging Face'te), RAG vektör indeksi (Hugging Face kadim-rag), OCR'ın 1000'lik görsel arşivi. Taban modeller Hugging Face Qwen/BGE kartlarından; LoRA ve RAG yukarıdaki KADİM repolarından indirilir.


7. Yenilikçilik ve Uygulanabilirlik

Kurumda nasıl kullanılır

Sistem, evrak masasındaki memurun yerine geçmez; önündeki işi hazırlar. Dilekçe ya da kurum yazısı geldiğinde belgeyi okur, konusunu ve talebini çıkarır, ilgili mevzuat maddelerini önüne getirir. Memur maddeleri işaretler, süreç durumunu seçer, gerekirse not düşer; sistem taslağı ondan sonra üretir. Taslağı düzenleyen ve imzalayan memurdur.

Bu ayrım bilinçlidir. İdari işlemin sorumluluğu bir modele devredilemez; kararın memurda kalması kurumda benimsenmenin ön koşuludur. Aynı tasarım, modelin hata yaptığı durumların işleme yansımadan yakalanmasını da sağlar.

Veri kurumdan çıkmaz

Yığının tamamı açık ağırlıklı modellerden (Qwen2.5, BGE) ve açık kaynak kütüphanelerden oluşur; hiçbir aşamada dış servise istek gönderilmez. Sistem kurumun kendi donanımında (on-premise) çalışabilir.

Vatandaş dilekçesi kişisel veri içerir ve kurum dışına çıkarılması hem mevzuat hem kurumsal politika açısından sorunludur. Kapalı devre çalışabilmesi, bu sistemi bulut tabanlı ticari API'lere dayanan çözümlerden ayıran en belirleyici özelliktir.

Ölçeklenebilirlik

Analiz ve yazı ajanları tek bir taban modeli paylaşır; ikisi de aynı modele çalışma anında takılan LoRA adaptörleriyle çalışır. İkinci bir 7B model belleğe alınmadığından donanım ihtiyacı yaklaşık yarıya iner.

Adaptörler taban modele göre çok küçüktür. Yeni bir konu, değişen bir yönetmelik veya farklı bir yazışma türü için modelin baştan eğitilmesi gerekmez; ilgili adaptör güncellenir. Birim yönlendirmesi model tahminine değil eşleme tablosuna dayandığı için yeni bir müdürlük eklemek tabloya satır eklemekten ibarettir.

Ayırt edici tasarım kararları

Memur kararı akışın ortasında. Belge otomasyonlarının çoğu uçtan uca çalışıp çıktıyı doğrudan üretir. Burada sistem analiz bittiğinde durur; memurun mevzuat seçimini ve süreç kararını bekler. Yazıcı model, memurun kararını girdi olarak alacak biçimde eğitilmiştir — insan onayı sonradan eklenmiş bir katman değil, mimarinin parçasıdır.

Bir evraktan çok senaryo (1→N). Aynı başvuru "incelemede", "eksik bilgi bekleniyor" veya "reddedildi" durumlarında tamamen farklı bir resmî yazı gerektirir. Eğitim seti bu gerçeğe göre kurulmuş, her analiz kaydı farklı süreç durumlarıyla eşlenerek çoğaltılmıştır. Model, aynı evrakı duruma göre farklı yazmayı öğrenir.

Madde uydurmama davranışı veriyle öğretildi. Eğitim kayıtlarının yaklaşık %15'inde mevzuat listesi bilinçli olarak boş bırakıldı; model, ilgili madde bulunamadığında atıf uydurmak yerine genel idari usule uygun yazı üretmeyi öğrendi. Halüsinasyon problemine prompt talimatıyla değil eğitim verisiyle yaklaşmak demektir bu ve ölçülebilir bir karşılığı vardır: mevzuat atıf sadakati %83,91'den %92,53'e çıkmıştır.

Genişleme

Mimari alana bağımlı değildir. Mevzuat korpusu ile konu–birim tablosu değiştirildiğinde aynı yapı il müdürlükleri, üniversiteler veya diğer kamu kurumlarının yazışma süreçlerine taşınabilir; modellerin yeniden eğitilmesi yalnızca alan diline uyum için gerekir.


8. Etik, Veri Kullanımı ve Kaynaklar

Lisans: MIT — bkz. LICENSE.

Veri kullanımı. Şartname gereği gerçek kamu evrakı kullanılmamıştır:

  • Görev 1 ve 2: DeepSeek API'si ile üretilmiş kurgu dilekçeler ve resmî yazışma taslakları.
  • OCR: Hugging Face üzerindeki açık derlemeden alınan, kamuya açık yargı kararı metinleri. Bu metinler antetli sayfa olarak yeniden basılmıştır; depodaki görseller taranmış resmî evrak değil, eğitim için üretilmiş sentetik belge görüntüleridir.
  • Mevzuat: T.C. Cumhurbaşkanlığı Mevzuat Bilgi Sistemi (mevzuat.gov.tr) üzerinden erişilen, kamuya açık kanun ve yönetmelik metinleri.

Hiçbir veri kümesinde gerçek kişisel veri (TCKN, ad, adres, telefon) yer almaz; tüm örnekler sentetiktir.

Üçüncü taraf lisansları. Kullanılan tüm modeller ve kütüphaneler kendi lisans koşullarına uygun biçimde kullanılmaktadır; ayrıntı için bkz. 6. bölüm.

Kaynaklar

About

KADİM — Kamu evrak ve yazışma süreçleri için uçtan uca yapay zekâ ajan sistemi. OCR, evrak analizi, mevzuat eşleştirme ve resmî yazı taslaklama; insan-döngüde memur onayı ile. TEKNOFEST 2026 Yapay Zeka Dil Ajanları Yarışması, 1. Senaryo.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages