Kamu evrak ve yazışma süreçleri için uçtan uca yapay zekâ ajan sistemi
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.
Üç 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.
- Sistem Mimarisi ve Akış
- Depo Yapısı
- Modüller, Eğitim ve Sonuçlar
- Veri Şeması
- Kurulum ve Çalıştırma
- Kullanılan Modeller ve Lisanslar
- Yenilikçilik ve Uygulanabilirlik
- Etik, Veri Kullanımı ve Kaynaklar
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.
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.
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
| 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) |
Üç 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ı.
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.
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ü.
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ş):
regenerate_drafts.py— ChatML kaydındaki sistem prompt'unucanonical_system_prompt.txtile hizalar;responsible_unitalanınıtarget_unityapar.selected_legislationdolu kayıtlarda (~%85) yalnızcadraftalanı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.template_fill_remaining.py— API bakiyesi veya hata yüzündenfailedkalan kayıtlara ücret gerektirmeyen kural tabanlı taslak basar (arz/rica kapanışı gönderen türüne göre). Başarılı kayıtlara dokunulmaz.augment_missing_types.py— seyrek kalanONAY_YAZISIveTESPIT_TUTANAGIörneklerini DeepSeek ile üretir; %80 / %10 / %10 oranında train / val / test*_updated.jsonldosyaları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ığı.
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:
- Anlamsal arama — BGE-M3 vektör temsilleriyle, sorguyla aynı anlama gelen maddeler bulunur.
- Sözcük tabanlı arama — BM25 ile kanun adı, madde numarası gibi birebir eşleşmeler yakalanır.
- 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ı.
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.
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": "..."
}
]
}{
"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."
}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_YAZISIprocess_status(5):INCELEMEDE,TAMAMLANDI,EKSIK_BILGI_BEKLENIYOR,REDDEDILDI,YONLENDIRILDI- Bağlayıcı kural:
process_statusdeğeriEKSIK_BILGI_BEKLENIYORiseresponse_typemutlakaEKSIK_BILGI_BELGE_TAMAMLAMA_YAZISIolur.
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txtHazı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/.envcd 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.jsonlcd QWEN_VL_ocr
python download_dataset.py
python generate_dataset_1000.py --dataset_path ./turkish_law_dataset --output_dir ./dataset_1000Yazı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.py01 / 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.
Notebook'lar sırayla çalıştırılır:
QWEN_VL_ocr/qwen_ocr_baseline_test.ipynb→QWEN_VL_ocr/qwen_ocr_finetune_lora.ipynbanaliz_qwen1/Qwen1_FineTune_Colab.ipynbyazi_qwen2/01_finetune_qwen25_7b.ipynb→02_evaluate_qwen25_7b.ipynb(ham model karşılaştırması için03_evaluate_base_model.ipynb)
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_downloadile 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.
- Runtime → A100 80 GB.
- LoRA + RAG hazır olsun (HF indirmesi veya Drive:
lora_adapter_qwen1/,lora_adapter_qwen2/,qwen_vl_7b_lora_finetuned/,finetune_data_qwen1/içindetrain.jsonl,belediye_konu.json,rag/). VL tabanı Hugging FaceQwen/Qwen2.5-VL-7B-Instructveya Driveqwen_vl_7b_model/. - Run all → ilk turda paket çakışması için kırmızı
RuntimeError(bilinçli) → Restart session → tekrar Run all. - Gradio
share=Truebağlantısı açılır.
KADİM Evrak Masası arayüzü — solda belge, ortada memur kararı ve mevzuat maddeleri, sağda üretilen taslak:
Statik önizleme: docs/demo_onizleme_mock.html.
Ş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.
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.
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.
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.
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.
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.
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
- Qwen2.5 ve Qwen2.5-VL — Alibaba Cloud
- vLLM — çalışma zamanı çıkarım motoru
- BGE-M3 ve BGE-reranker-v2-m3 — BAAI
- KADİM LoRA ve RAG —
kadim-analiz-lora,kadim-yazi-lora,kadim-ocr-lora,kadim-rag - OCR kaynak metinleri —
erdem-erdem/Turkish-Law-Documents-700k-clustered; birincil kurumlar Yargıtay Karar Arama ve Danıştay Karar Arama - Mevzuat metinleri — T.C. Cumhurbaşkanlığı Mevzuat Bilgi Sistemi
- Sentetik evrak üretimi — DeepSeek API
