Deney Kartı 05 — Qwen2.5-14B Fine-Tuning ile TR Dizin Metadata Extraction

Tek cümle: TR Dizin akademik makalelerinin markdown'larından yapılandırılmış JSON metadata üretmek için Qwen2.5-14B-Instruct LoRA ile fine-tune edildi; JSON validity %98, referans F1 0.84, 6.5 sn/örnek hız ile production'a aday model elde edildi.

1. Amaç

Akademik makalelerin (PDF → Marker → Markdown) içeriğinden başlık, özet, yazarlar, ORCID, DOI, sayfa, dergi, yayın türü ve referans listesi alanlarını eksiksiz JSON olarak üretebilen bir LLM elde etmek. Asıl zor alan: 200'e kadar çıkabilen referans listesinin tam ve sıralı çıkarılması (citation graph beslemesi için).

2. Parametre / Kurulum

Bileşen Değer
Base model unsloth/Qwen2.5-14B-Instruct-bnb-4bit
Yöntem LoRA (r=32, α=32, tüm attention + MLP target)
Donanım TRUBA, 1 × H100
Eğitim süresi ~6 saat (1 epoch, ~90K örnek)
max_seq_length 16384 (training)
Veri 95.340 örnek (train 90.573 / val 2.383 / test 2.384)
Veri kaynağı TR Dizin → 703.183 publication ID → 96.695 markdown
Truncation dynamic_smart_truncate_md (%25 baş + %70 son + %5 buffer)
Inference vLLM (max_model_len=32768, max_new_tokens=14336, greedy T=0)
Single-pass İki-aşamalı ref-only prompt kaldırıldı (eğitimde yoktu)
JSON sanitizer Geçersiz \[, \], \_, \(, \) escape'lerini temizleyen post-processor

3. Sonuç ve Bulgu

3.1 Final Test (n = 2.384)

Kategori Metrik Değer Yorum
JSON json_validity_rate 0.9807 46/2384 parse hatası
Başlık fuzzy_title.tr / .en 1.0000 / 1.0000 Parse düzeltmesi sonrası
Yazarlar author_count_match 0.9705 İyi
Yazarlar author_names_avg 0.9107 İyi
Meta exact_docType 0.9769 Çok iyi
Meta exact_publicationType 0.8654 İyi
Meta exact_language 0.8691 İyi
Özet abstract_lang_match 0.9850 Çok iyi
Özet abstract_count_match 0.7789 Orta
Referans ref_f1 0.8371 Üretim seviyesi
Referans ref_precision / ref_recall 0.8665 / 0.8307 İyi
Referans ref_count_tol2 0.7807 %78 ±2 içinde
Referans avg_ref_count_diff 7.39 Ortalama eksik/fazla
DOI exact_doi 0.6683 Düşük
Dergi fuzzy_journal.name 0.6493 Düşük
Sayfa exact_startPage / endPage 0.6382 / 0.6262 Düşük
ORCID orcid_recall 0.6081 Orta
Skor overall_score 5.2456
Perf. avg_time_per_sample_sec 6.46 ~4.3 saat / 2.384 örnek

3.2 Yolculukta Kritik Dönüm Noktaları

  1. Veri hazırlama tarafında metadata fetch bug'ı: İlk koşuda prepare_data.py içindeki yanlış alan eşlemesi nedeniyle TR Dizin kayıtlarındaki title.tr / title.en alanları null olarak hedef JSON'a yazıldı. Bu nedenle hem eğitim seti title sinyaline boş öğretildi, hem de değerlendirmede fuzzy_title.tr = 0.03, fuzzy_title.en = 0.07 çıktı. İlk teşhis "model başlık üretemiyor" oldu; doğru teşhis ise "GT zaten null" idi. Metadata fetcher düzeltilip dataset yeniden üretildikten sonra her iki başlık skoru 1.00'a çıktı (n=2384). Ders: metrik düşük gelince modeli suçlamadan önce GT'yi doğrula.
  2. Inference 30× hızlandı: Transformers-native ~10 dk/örnek → vLLM + greedy + inference_mode~6 sn/örnek. CUDA/PyTorch uyumsuzluğu yüzünden Flash Attention 2 elle kurulamadı; vLLM bu sorunu kendi içinde çözüyor.
  3. 2-pass ref-only prompt başarısızlığı: Sorun "uzun bağlam" değil, eğitimde görülmeyen prompt ile model zero-shot moduna düşüyordu. Tek pass + büyük output bütçesi → ref_recall 0.18 → 0.94.
  4. JSON escape kaynaklı parse hataları: Modelin markdown'dan içeri kaçırdığı \[, \], \_ JSON spec'inde geçersiz. _sanitize_json_escapes() ile 11 hatadan 10'u kurtarıldı (json_validity 0.89 → 0.99).
  5. DOI / Page format normalizasyonu: _normalize_doi, _normalize_page ile prefix / leading-zero / case farkları temizlendi; küçük ama anlamlı iyileşme sağladı.

3.3 Güçlü ve Zayıf Yönler (Özet)

Güçlü Zayıf
Yapısal alanlarda %90+ doğruluk DOI/Page/Journal ~0.63–0.67
Referans F1 = 0.84 (en zor alan) 46 parse hatası (özel karakter kalıntıları)
6.5 sn/örnek production hızı ref_count_diff = 7.39 ortalama sapma
Ölçeklenebilir (2.384 örnekte stabil) ORCID recall = 0.61 (veri sorunu olası)

4. Karara Etkisi

5. Detay Bağlantılar