Views
No views yet
Important Notice: Runeward is a technical privacy-filtering tool. It is not a legal compliance product and does not guarantee KVKK/GDPR compliance by itself.
| Model | Açıklama | Yaklaşık Boyut | Amaç |
|---|---|---|---|
runeward-kvkk-filter | Full teacher model, openai/privacy-filter üzerine fine-tune edilmiştir | 2.61 GB | Yüksek kapasiteli KVKK/PII span detection |
runeward-small-onnx-int8 | BERTurk student modelinden ONNX INT8 quantization ile üretilmiştir | 106.68 MB | CPU-friendly hızlı inference |
1Input:
2Müşteri Ahmet Yılmaz için TCKN 91234567890 sisteme kaydedildi.
3
4Output:
5Müşteri <PRIVATE_PERSON> için TCKN <TCKN> sisteme kaydedildi.1private_person
2private_email
3private_phone
4private_address
5private_date
6private_url
7account_number
8secret
9tckn
10iban
11tax_number
12passport_number
13license_plate
14credit_card
15health_data
16biometric_data
17genetic_data
18religion_or_belief
19political_opinion
20union_membership
21criminal_record
22child_data11. Legal and policy review
22. Data inventory and classification
33. Lawful processing basis and consent management
44. Role-based access control
55. Retention and deletion policies
66. Audit logging
77. Human review for sensitive categories
88. Deterministic validators for structured identifiers
99. Regular evaluation and monitoring1Regex validators
2+ Runeward span detection
3+ KVKK policy engine
4+ output redaction
5+ audit logging
6+ human review for special categories11. Full teacher model fine-tuning
22. Student model distillation
33. ONNX INT8 CPU optimizationopenai/privacy-filter modeli üzerine Türkçe KVKK/PII label space’i ile fine-tune edilmiştir.openai/privacy-filterprivacy_filter1{
2 "model_type": "privacy_filter",
3 "param_dtype": "bfloat16",
4 "hidden_size": 640,
5 "num_hidden_layers": 8,
6 "num_attention_heads": 14,
7 "num_key_value_heads": 2,
8 "num_experts": 128,
9 "experts_per_token": 4,
10 "vocab_size": 200064,
11 "max_position_embeddings": 131072,
12 "default_n_ctx": 128000,
13 "num_labels": 89
14}1model.safetensors: 2669.39 MB
2total checkpoint size: 2669.40 MB
3approximate total size: 2.61 GB1train_examples=4330
2validation_examples=541
3epochs=1
4train_loss=0.657055
5validation_loss=0.487073
6train_token_accuracy=0.8828
7validation_token_accuracy=0.9097
8best_epoch=11{
2 "text": "Müşteri Ahmet Yılmaz için TCKN 91234567890 sisteme kaydedildi.",
3 "spans": {
4 "private_person": [[8, 20]],
5 "tckn": [[31, 42]]
6 }
7}start/end karakter index’i istenmemiştir. Bunun yerine modelden şu formatta çıktı alınmıştır:1{
2 "text": "Ahmet Yılmaz'ın TC kimlik numarası 91234567890 olarak girilmiş.",
3 "entities": [
4 {
5 "value": "Ahmet Yılmaz",
6 "label": "private_person"
7 },
8 {
9 "value": "91234567890",
10 "label": "tckn"
11 }
12 ]
13}1entity value → text içinde bulunur
2start/end karakter index’i hesaplanır
3span çakışmaları kontrol edilir
4geçersiz örnekler elenir
5JSONL dataset üretilirtext alanı string mi?spans alanı geçerli mi?start/end karakter sınırları doğru mu?start < end mi?None span var mı?None, hatalı label veya metinde bulunmayan entity gibi durumlar filtrelenmiştir.dbmdz/bert-base-turkish-cased1Runeward/KVKK span dataset
2→ BIO token labels
3→ BERTurk token-classification student1O
2B-private_person
3I-private_person
4B-private_email
5I-private_email
6...45 labels11. Text tokenize edilir.
22. Token offset_mapping alınır.
33. Her karakter için label atanır.
44. Her token için token’ın kapsadığı karakterlerdeki çoğunluk label seçilir.
55. Entity başlangıcında B-label, devamında I-label kullanılır.
66. Special token’lar -100 ile ignore edilir.1BERTurk student
2→ ONNX export
3→ ONNX Runtime dynamic INT8 quantization
4→ CPU inference| Model | Size |
|---|---|
| Full Runeward teacher | 2.61 GB |
| BERTurk student | ~421 MB |
| ONNX INT8 student | 106.68 MB |
12.61 GB → 106.68 MB
2~25x size reduction1opf --checkpoint ./runeward-kvkk-filter \
2 --device cpu \
3 "Müşteri Ahmet Yılmaz için TCKN 91234567890 sisteme kaydedildi."Müşteri <PRIVATE_PERSON> için TCKN <TCKN> sisteme kaydedildi.1from optimum.onnxruntime import ORTModelForTokenClassification
2from transformers import AutoTokenizer, pipeline
3
4model = ORTModelForTokenClassification.from_pretrained(
5 "curiositytech/runeward-small-onnx-int8"
6)
7
8tokenizer = AutoTokenizer.from_pretrained(
9 "curiositytech/runeward-small-onnx-int8"
10)
11
12pipe = pipeline(
13 "token-classification",
14 model=model,
15 tokenizer=tokenizer,
16 aggregation_strategy="simple",
17)
18
19text = "Müşteri Ahmet Yılmaz için TCKN 91234567890 sisteme kaydedildi."
20entities = pipe(text)
21
22print(entities)1def mask_with_pipeline(text, entities):
2 masked = text
3
4 for ent in sorted(entities, key=lambda x: x["start"], reverse=True):
5 label = ent["entity_group"]
6 masked = masked[:ent["start"]] + f"<{label.upper()}>" + masked[ent["end"]:]
7
8 return masked1Input text
2 ↓
3Deterministic validators
4 - TCKN regex/checksum
5 - IBAN regex/checksum
6 - E-mail regex
7 - Phone regex
8 - Credit card validation
9 ↓
10Runeward model inference
11 ↓
12Span merge and conflict resolution
13 ↓
14Policy decision
15 - ALLOW
16 - MASK
17 - BLOCK
18 - HUMAN_REVIEW
19 ↓
20Redacted output
21 ↓
22Audit log1SPECIAL_CATEGORY_LABELS = {
2 "health_data",
3 "biometric_data",
4 "genetic_data",
5 "religion_or_belief",
6 "political_opinion",
7 "union_membership",
8 "criminal_record",
9 "child_data",
10}
11
12HIGH_RISK_MASK_LABELS = {
13 "tckn",
14 "iban",
15 "credit_card",
16 "passport_number",
17 "tax_number",
18 "secret",
19}
20
21def decide_kvkk_policy(spans):
22 labels = {span["label"] for span in spans}
23
24 if labels & SPECIAL_CATEGORY_LABELS:
25 return "HUMAN_REVIEW"
26
27 if labels & HIGH_RISK_MASK_LABELS:
28 return "MASK"
29
30 if len(spans) >= 5:
31 return "BLOCK"
32
33 if spans:
34 return "MASK"
35
36 return "ALLOW"11. Label-level precision, recall, and F1
22. False negative rate for TCKN, IBAN, phone, email, and secrets
33. False positive rate on normal business text
44. Special-category recall
55. Redaction correctness after span merging
66. Regression tests for hard negatives
77. Runtime latency on target CPU/GPU environment1Full teacher model
2Base: openai/privacy-filter
3Size: 2.61 GB
4Training: synthetic + KVKK label space1Student base: dbmdz/bert-base-turkish-cased
2Distillation: hard-label BIO token-classification
3Optimization: ONNX Runtime dynamic INT8
4Size: 106.68 MB
5Target: CPU inference1@misc{runeward2026,
2 title={Runeward: Turkish KVKK-aware Privacy Filter},
3 author={Curiosity Technology},
4 year={2026},
5 howpublished={Hugging Face model checkpoint},
6 note={Fine-tuned from openai/privacy-filter and distilled into a CPU-friendly ONNX INT8 student model}
7}