Spaces:
Sleeping
Sleeping
| """λ°νμ μ€μ β `settings.json` μμ. | |
| UI μ "μ€μ " νμ΄μ§μμ SHAP νμ±, ensemble Ξ±, λ‘κ·Έ λ 벨 λ±μ μ‘°μ . | |
| λ³κ²½μ μ¦μ λ°μ (κ° λͺ¨λμ΄ settings.get() μΌλ‘ μ‘°ν). | |
| """ | |
| from __future__ import annotations | |
| import json | |
| from pathlib import Path | |
| from threading import Lock | |
| SETTINGS_FILE = Path(__file__).resolve().parent / "settings.json" | |
| _lock = Lock() | |
| # κΈ°λ³Έκ° β ν€λ μ¬κΈ° λ±λ‘λ κ²λ§ νμ© (UI μ λ ₯ κ²μ¦μ©) | |
| DEFAULTS: dict = { | |
| "shap_enabled": False, # λΆλ₯ μΉ΄λμ SHAP λ²νΌ λ ΈμΆ | |
| "shap_max_evals": 60, # PartitionExplainer νκ° νμ (μλ/μ νλ) | |
| "ensemble_alpha": 0.5, # rule vs neural blend (0=neural only, 1=rule only) | |
| "log_level": "INFO", # DEBUG/INFO/WARNING/ERROR | |
| "perf_collect": True, # μμ² timing μμ§ μ¬λΆ | |
| "dashboard_refresh_ms": 5000, # λμ보λ μλ μλ‘κ³ μΉ¨ (0=μλλ§) | |
| "logs_refresh_ms": 3000, | |
| "neural_auto_load": False, # λΆν μ μ κ²½λ§ λͺ¨λΈ μλ λ‘λ (λλ¦Ό) | |
| "neural_disable": False, # λΆλ₯ μ neural νΈμΆ μΌκ΄ λΉνμ±ν | |
| # νκ΅μ΄ NER μ νλ κ°μ (Bμ + Aμ) | |
| "ko_ner_enabled": True, # KoELECTRA-NER λ‘λλλ©΄ μ¬μ© | |
| "ko_ner_auto_load": False, # λΆν μ μλ λ‘λ (λλ¦Ό) | |
| "drop_spacy_korean_ner": True, # ko_ner κ°μ© μ spaCy νκ΅μ΄ PERSON/LOC/ORG νκΈ° | |
| "heuristic_filter": True, # κΈΈμ΄/μ‘°μ¬/μ΄λ―Έ ν΄λ¦¬μ€ν± νμ²λ¦¬ | |
| } | |
| ALLOWED_TYPES = { | |
| "shap_enabled": bool, | |
| "shap_max_evals": int, | |
| "ensemble_alpha": float, | |
| "log_level": str, | |
| "perf_collect": bool, | |
| "dashboard_refresh_ms": int, | |
| "logs_refresh_ms": int, | |
| "neural_auto_load": bool, | |
| "neural_disable": bool, | |
| "ko_ner_enabled": bool, | |
| "ko_ner_auto_load": bool, | |
| "drop_spacy_korean_ner": bool, | |
| "heuristic_filter": bool, | |
| } | |
| def load() -> dict: | |
| if not SETTINGS_FILE.exists(): | |
| return dict(DEFAULTS) | |
| try: | |
| cur = json.loads(SETTINGS_FILE.read_text(encoding="utf-8")) | |
| return {**DEFAULTS, **(cur if isinstance(cur, dict) else {})} | |
| except Exception: | |
| return dict(DEFAULTS) | |
| def save(updates: dict) -> dict: | |
| """allowed key λ§ μ μ© ν νμΌ μ μ₯. λ°ν = μ μ₯ μ§ν μ 체 μν.""" | |
| with _lock: | |
| cur = load() | |
| for k, v in (updates or {}).items(): | |
| if k not in DEFAULTS: | |
| continue | |
| try: | |
| cur[k] = ALLOWED_TYPES[k](v) | |
| except (TypeError, ValueError): | |
| continue | |
| SETTINGS_FILE.write_text( | |
| json.dumps(cur, ensure_ascii=False, indent=2), | |
| encoding="utf-8", | |
| ) | |
| return cur | |
| def get(key: str): | |
| return load().get(key, DEFAULTS.get(key)) | |