File size: 11,288 Bytes
ea96655
 
a72d1cf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ea96655
a72d1cf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
---
license: cc-by-4.0
language:
- tr
- en
pretty_name: "TR-TabloSQL: Türkçe belge tablolarında Text-to-SQL"
task_categories:
- table-question-answering
- question-answering
tags:
- text-to-sql
- turkish
- table-extraction
- pdf
- benchmark
- llm-evaluation
size_categories:
- 1K<n<10K
configs:
- config_name: tr_tablosql
  data_files: veri/tr_tablosql.jsonl
- config_name: pilot
  data_files: veri/pilot.jsonl
- config_name: stres
  data_files: veri/stres.jsonl
- config_name: agir
  data_files: veri/agir.jsonl
- config_name: gercek
  data_files: veri/gercek.jsonl
- config_name: sonuclar
  data_files: veri/sonuclar.jsonl
---

# Tablo2SQL-TR ve TR-TabloSQL

**Türkçe belgelerdeki tabloları sorgulanabilir bir bilgi tabanına dönüştüren uçtan uca sistem, test kümeleri ve LLM deney sonuçları.**

Tablo2SQL-TR, PDF, HTML, CSV ve XLSX belgelerdeki tabloları çıkarır. Birleşik hücreleri ve çok satırlı başlıkları çözer. Türkçe sayı, tarih ve birim yazımlarını normalleştirir (`1.234,56` → 1234.56, `(1.200)` → −1200, `Ocak 2024` → `2024-01`). Tabloları meta veriyle birlikte SQLite'a aktarır. Türkçe soruları kendini düzelten bir ajanla SQL'e çevirir. Cevap tablolarda yoksa uydurmak yerine bunu açıkça söyler.

Bu depoda üç şey bir arada:

1. **Uygulama:** kaynak kod, web arayüzü ve tek tıkla başlatıcılar.
2. **Test kümeleri:** 5 küme, 1.406 soru.
3. **Deney sonuçları:** kural tabanlı üretici ve 6 LLM için soru düzeyinde 5.012 kayıt.

*English summary at the end.*

![Soru sor sekmesi](docs/ekran/03_soru_sor.png)

## Öne çıkan sonuçlar

Doğruluk, cevap düzeyinde ölçüldü. Her sistem aynı sorulara, aynı veritabanlarında cevap verdi.

| Küme | Kural tabanlı | Claude Opus 5.5 | GPT-6.1-sol | Qwen2.5-Coder-32B (yerel) |
|---|---|---|---|---|
| Stres (33 belge, 307 soru) | %42,7 | **%89,9** | %76,9¹ | %62,5 |
| Ağır, hızlı alt küme (200 soru) | %14,5 | **%90,0** | %83,0 | %63,5 |
| Gerçek belge pilotu (18 belge, 189 soru) | %19,6 | %59,8 | **%62,4** | %28,6 |
| Sessiz yanlış, gerçek belgeler | %40,7 | **%2,6** | %5,3 | %9,5 |

¹ Bu çalıştırmada 34 soruda API hata döndürdü. Bu sorular dışarıda tutulursa sonuç %85,0.

- **Yerel sayı biçimi bir ön koşul.** TR-TabloSQL'de Türkçe normalizasyonla kural tabanlı üretici %92,9'a ulaşıyor. İngilizce yerel ayar varsayıldığında, kusursuz altın SQL sorgularının bile yalnızca %28,4'ü doğru sonuç veriyor ve hiçbir hata mesajı çıkmıyor.
- **Güçlü LLM'lerle darboğaz tablo çıkarımına kayıyor.** Gerçek belgelerde değeri veritabanına doğru okunamamış 32 sorudan her model yalnızca ikisini çözebildi. Bu sorular dışarıda tutulunca bulut modelleri %70,7–73,9'a çıkıyor.
- **Denetim zinciri sessiz hataları yakalıyor.** 159 bozuk sorguyla yapılan hata enjeksiyonunda hataların %92,5'i yakalandı ve hiç yanlış alarm üretilmedi.

## Ekran görüntüleri

| | |
|---|---|
| ![Belgeler](docs/ekran/01_belgeler.png) **Belgeler:** tablo çıkarma; birleşik hücreler mavi, Türkçe sayılar çözümlenmiş | ![Bilgi tabanı](docs/ekran/02_bilgi_tabani.png) **Bilgi tabanı:** aktarılan tablolar, meta veri, SQL konsolu ve dışa aktarma |
| ![Soru sor](docs/ekran/10_soru_red.png) **Soru sor:** cevap ve SQL; tablolarda olmayan bir varlık için gerekçeli red | ![Hata kataloğu](docs/ekran/04_hata_katalogu.png) **Hata kataloğu:** Türkçeye özgü hata tipleri, örnekler ve önlemler |
| ![Değerlendirme](docs/ekran/05_degerlendirme.png) **Değerlendirme:** modelleri test kümelerinde karşılaştırma, seviyelere göre doğruluk | ![Otomasyon](docs/ekran/06_otomasyon.png) **Otomasyon:** testleri ve modelleri seçip arka planda çalıştırma |
| ![Raporlar](docs/ekran/07_raporlar.png) **Raporlar:** geçmiş çalıştırmalar; raporları tek tek ya da ZIP olarak indirme | ![Genel rapor](docs/ekran/08_genel_rapor.png) **Genel rapor (HTML/PDF, TR/EN):** aydınlık/karanlık tema |
| ![Test raporu](docs/ekran/09_test_raporu.png) **Test raporu:** soru tipi, zorluk ve soru ailesine göre kırılım | |

## Hızlı başlangıç

```bash
# Windows: baslat.bat (çift tık) · macOS: baslat.command · Linux:
bash baslat.sh
```

Başlatıcı şunları kendisi yapar:

- Gerekirse Python'u kurar.
- Bir sanal ortam oluşturur ve paketleri yükler.
- Tarayıcıda `http://localhost:8501` adresini açar.

Uygulama LLM olmadan, kural tabanlı üreticiyle çalışır. Claude, OpenAI ya da yerel Ollama modelleri **Bağlantılar** düğmesinden eklenir.

Docker ile çalıştırmak için:

```bash
docker compose up -d        # durdurmak için: docker compose stop
```

Elle kurulum, tüm seçenekler ve deneyleri yeniden üretme adımları için [KURULUM.md](KURULUM.md) dosyasına bakın. Ekran görüntülü kullanım kılavuzları için: [Türkçe](docs/KULLANIM_KILAVUZU.md) · [English](docs/USER_GUIDE.md).

> **Güvenlik:** API anahtarları `ayarlar/tablo2sql-ayarlar.json` dosyasına düz metin olarak yazılır. Bu dosya pakette yoktur. Kendi kopyanızı paylaşmayın ve depoya yüklemeyin.

## Test kümeleri

| Küme | Belge | Soru | İçerik | Konum |
|---|---|---|---|---|
| **TR-TabloSQL** | 6 sentetik (4 PDF, 2 HTML), 7 tablo | 99 (64 geliştirme / 35 test) | Altın SQL; Spider/BIRD tiplerinden uyarlama; 11 cevapsız soru | `benchmark/`, `data/` |
| **Pilot** | 3 | 44 | Ana kümeden bilerek farklı düzenler | `pilot/` |
| **Stres** | 33 (11 tür × 3) | 307 (39 cevapsız) | Izgara, yalnız yatay çizgi, çizgisiz PDF ve HTML | `stres_kumesi/` |
| **Ağır** | 52, tek veritabanında | 767 (200'lük hızlı alt küme) | L1–L5 seviyeleri; %20'si İngilizce, Türkçe karaktersiz ya da yazım hatalı | `agir_kume/` |
| **Gerçek belge pilotu** | 7 kurumdan 18 gerçek PDF | 189 (19 cevapsız) | Bağımsız yazılmış ve denetlenmiş sorular | `gercek_pilot/` |

Sentetik belgeler tohumlanmış rastgele sayılarla üretilir. Gerçek kurum verisi içermezler, ama Türk kamu belgelerinin düzenini ve yazım kurallarını taklit ederler. Belgeleri yeniden üreten betikler her klasördedir.

**Gerçek belgeler bu pakette yoktur,** çünkü belgelerin hakları ilgili kurumlara aittir. Belgeler kurumların internet sitelerinden indirilmeli:

- Kaynakların listesi [`gercek_pilot/README.md`](gercek_pilot/README.md) dosyasında.
- İndirilen dosyaların doğru sürüm olduğu SHA-256 özetleriyle denetlenebilir. Komut `gercek_pilot` klasöründen çalıştırılır: `sha256sum -c belgeler.sha256`.

Kod deneylerden önce donduruldu. Dosyaların SHA-256 özetleri `kod_parmak_izi.txt` dosyalarında; çalıştırma betikleri bu özetleri kontrol eder.

### Hugging Face veri görüntüleyicisi (`veri/`)

Soru kümeleri ve sonuçlar, veri görüntüleyicide açılabilsin diye düz JSONL olarak da verildi:

```python
from datasets import load_dataset
gercek = load_dataset("<kullanıcı>/tr-tablosql", "gercek", split="train")
sonuc  = load_dataset("<kullanıcı>/tr-tablosql", "sonuclar", split="train")
```

| Yapılandırma | Satır | Alanlar |
|---|---|---|
| `tr_tablosql` | 99 | `id, bolum, soru, altin_sql, cevaplanabilir, zorluk, kategoriler, kanit, tablolar` |
| `pilot`, `stres`, `agir`, `gercek` | 44 / 307 / 767 / 189 | `id, belge, soru, tip, cevap_json, aile, zorluk` ve kümeye özgü alanlar (`seviye`, `dil`, `cizim`, `sayfa`, `tablo` …) |
| `sonuclar` | 5.012 | `kume, model, calistirma, id, dogru, durum, bulunan, beklenen_json, sql` |

Cevaplar farklı tiplerde olabilir (sayı, metin ya da liste). Bu yüzden JSON metni olarak saklandılar: `json.loads(r["cevap_json"])`.

## Deney sonuçları (`sonuclar_llm/`)

| Klasör | İçerik |
|---|---|
| `20261026-021813/` | 26.10.2026 çalıştırması: her test için rastgele seçilen üst kademe model. TR-TabloSQL'de GPT-5.2, pilotta Claude Opus 5.5, stresde GPT-6.1-sol, ağır hızlı alt kümede Claude Opus 4.5, ağır tam kümede GPT-5. |
| `20261027-043315/` | 27.10.2026 çalıştırması: stres, ağır hızlı alt küme ve gerçek belge kümelerinin her biri üç modelle. 4 sa 51 dk sürdü. |
| `kural_tabanli/` | Kural tabanlı üreticinin aynı kümelerdeki sonuçları. |
| `analiz.py`, `llm_analiz.json`, `gercek_kirilim.json` | Güven aralıkları, McNemar testleri ve gerçek belgelerde belge türüne göre kırılım. |

Her test klasöründe soru başına SQL, cevap ve hakem kararı (`sonuclar.json`, `ozet_normal.json`) ile Türkçe ve İngilizce HTML/PDF raporlar bulunur.

Bulut modelleri sağlayıcı API'leriyle çalıştırıldı. API'ler sıcaklık parametresini kabul etmediği için sağlayıcının varsayılan ayarı kullanıldı; bu nedenle sonuçlar soru düzeyinde küçük farklarla değişebilir. Yerel model Ollama ile, sıcaklık 0'da çalıştırıldı.

## Klasör yapısı

```
app.py, arayuz_tema.py   web arayüzü (Streamlit)
t2s/                     çıkarma, normalizasyon, ajan, denetim zinciri, LLM istemcileri
otomasyon/               arka planda çoklu test/model çalıştırma ve rapor üretimi
benchmark/, data/        TR-TabloSQL soruları, sentetik belgeler, doğru içerik dosyaları
pilot/, stres_kumesi/, agir_kume/, gercek_pilot/   diğer test kümeleri ve raporları
veri/                    Hugging Face görüntüleyicisi için JSONL dosyaları
sonuclar_llm/            LLM ve kural tabanlı deneylerin ham sonuçları
outputs/                 TR-TabloSQL, ablasyon ve hata enjeksiyonu çıktıları
scripts/, tests/         yardımcı betikler ve testler (pytest)
docs/                    kullanım kılavuzları ve ekran görüntüleri
```

## Lisans

- **Kod:** MIT.
- **Test kümeleri ve sonuçlar:** CC BY 4.0.

Ayrıntılar [LICENSE](LICENSE) dosyasında. Gerçek belgelerin hakları ilgili kurumlara aittir.

## Atıf

Makale değerlendirme sürecindedir. Atıf bilgisi yayımlandıktan sonra eklenecektir.

---

## English summary

**Tablo2SQL-TR** is an end-to-end system for question answering over tables in Turkish documents. It:

- extracts tables from PDF, HTML, CSV and XLSX files and resolves merged cells and multi-row headers;
- normalises Turkish number, date and unit notations;
- loads the tables with metadata into SQLite;
- answers Turkish or English questions with a self-correcting Text-to-SQL agent that abstains when the answer is not in the tables.

This repository contains:

- the code and web app;
- five benchmarks with 1,406 questions in total: TR-TabloSQL, pilot, stress, heavy, and an 18-document real-world pilot. Real PDFs are not redistributed; sources and SHA-256 hashes are given.
- question-level results of a rule-based generator and six LLMs (5,012 records).

The main findings:

- Locale-aware normalisation is a prerequisite. Under an English-locale assumption, even gold SQL returns correct results for only 28.4% of questions, with no error raised.
- With strong LLMs (Claude Opus 5.5 reaches 89.9–90.0% on synthetic sets and 59.8% on real documents; GPT-6.1-sol 62.4% on real documents), the bottleneck shifts from SQL generation to table extraction.

Quick start: `bash baslat.sh` (or `baslat.bat` / `baslat.command`), or `docker compose up -d`. The interface is available in English via the TR/EN switch. See [docs/USER_GUIDE.md](docs/USER_GUIDE.md).