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ı
- 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.
- 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.
- 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.
- 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).
- 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
- Mevcut model canlıya alınabilir: Yapısal doğruluk + referans F1 + hız üçlüsü production'da kullanılabilir seviyede.
- Mimari kararlar pekişti:
- Inference için vLLM standart oldu.
- Eğitim ve değerlendirme prompt'u birebir aynı olmalı (2-pass denemesi bu kuralı somutlaştırdı).
- Çıktı bütçesi (
max_new_tokens) referans uzunluğuna göre cömert olmalı (10K–14K).
- JSON sanitize katmanı pipeline'ın kalıcı parçası olarak işaretlendi.
- Sıradaki adımlar (öncelik sırasıyla):
- Parse error'ları sıfıra indir (yeni sanitizer kuralları →
json_validity 0.98 → 0.995+).
- DOI/Page çıktılarını teşhis et (
predicted_* alanlarını kaydet, sistematik pattern var mı?).
- Veri hazırlama sanity-check'i (metadata fetch bug'ının tekrarını önle):
prepare_data.py sonunda alan-bazlı null-rate raporu, eşik aşılırsa pipeline uyarı versin.
- Chunked ref extraction: 200+ refli makaleler için referans bölümünü ayrı pass'le çıkarma.
- Hard-negative retraining:
ref_count_diff > 15 ya da json_valid=False örneklerle micro-training.
- Atıf Zekası ve Bilgi Ağları için besleme: Model çıktısı, Atıf Zekası ve Bilgi Ağları MVP'lerinin birinci sınıf veri kaynağı olarak işaretlendi.
5. Detay Bağlantılar