File size: 2,884 Bytes
52c1c67 850344d 52c1c67 850344d 3e9e69f 52c1c67 850344d 52c1c67 850344d 58debbc 3e9e69f 58debbc 3e9e69f 52c1c67 3e9e69f 58debbc 52c1c67 850344d 52c1c67 850344d 58debbc 850344d 52c1c67 850344d 58debbc 850344d 52c1c67 850344d 52c1c67 850344d | 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 | from __future__ import annotations
"""
Predictive Model ๋ ์ง์คํธ๋ฆฌ (ML/DL ๊ตฌํ ๊ต์ฒด ์ง์ ).
predictive_model = ์๋ ์ธํฐํ์ด์ค๋ฅผ ๋ง์กฑํ๋ ๊ฐ์ฒด/๋ชจ๋ (์๋๋ฆฌ์ค ๋ฌด๊ด):
predict(intent_id, features, *, training_data, dataset_path, model_prefix, train_params=None) -> float
- "predictive_model"์ ML(sklearn)ยทDL(torch ๋ฑ)์ ์์ฐ๋ฅด๋ [2b] ์์ธก ๋ชจ๋ธ ๊ตฌํ์ ๊ฐ๋ฆฌํจ๋ค.
- config L2.model.predictive_model ๋ก ์ ํ (์์ผ๋ฉด "sklearn").
- ์ ๊ตฌํ์ register_predictive_model("torch", <obj>)๋ก ๋ฑ๋ก.
- common.model_predict / GenericEngine.model_predict ๋ ํน์ ๊ตฌํ์ ์ง์ importํ์ง ์๊ณ
์ด ๋ ์ง์คํธ๋ฆฌ๋ก predictive_model์ ๋ฐ์ ํธ์ถํ๋ค.
"""
from typing import Any, Protocol
class PredictiveModel(Protocol):
"""์์ธก ๋ชจ๋ธ ๊ตฌํ ์ธํฐํ์ด์ค (sklearn/torchโฆ ๊ณตํต).
intent๋ณ 0~1 ์ ์๋ฅผ ๋ฐํํ๋ predict ๋ฉ์๋๋ฅผ ์ ์ํ๋ค.
"""
def predict(self, intent_id: str, features: dict[str, Any], *,
training_data: dict, dataset_path, model_prefix: str,
train_params: dict | None = None) -> float:
"""Intent์ ๋ํ 0~1 ์์ธก ์ ์๋ฅผ ๋ฐํํ๋ค.
Args:
intent_id: ์์ธกํ Intent ID.
features: ์ถ๋ก ์ ์ฌ์ฉํ feature dict.
training_data: ํ์ต ๋ฐ์ดํฐ(์๋๋ฆฌ์ค ์์ง ์ ๊ณต).
dataset_path: ์๋ ๋ฐ์ดํฐ์
๊ฒฝ๋ก.
model_prefix: ์๋๋ฆฌ์ค๋ณ ๋ชจ๋ธ๋ช
๋ค์์คํ์ด์ค.
train_params: ํ์ต ํ์ดํผํ๋ผ๋ฏธํฐ(config L2.model.train).
๋ฏธ์ฌ์ฉ ๊ตฌํ์ ๋ฌด์ ๊ฐ๋ฅ.
Returns:
0~1 ๋ฒ์์ ์์ธก ์ ์.
"""
...
_PREDICTIVE_MODELS: dict[str, Any] = {}
def register_predictive_model(name: str, predictive_model: Any) -> None:
"""์์ธก ๋ชจ๋ธ ๊ตฌํ์ name์ผ๋ก ๋ฑ๋กํ๋ค.
Args:
name: ๋ฑ๋ก ํค (์: "torch").
predictive_model: PredictiveModel ์ธํฐํ์ด์ค๋ฅผ ๋ง์กฑํ๋ ๊ฐ์ฒด/๋ชจ๋.
"""
_PREDICTIVE_MODELS[name] = predictive_model
def get_predictive_model(name: str = "sklearn") -> Any:
"""name์ ๋ฑ๋ก๋ ์์ธก ๋ชจ๋ธ ๊ตฌํ์ ๋ฐํํ๋ค.
"sklearn"์ ์ต์ด ํธ์ถ ์ ๊ธฐ๋ณธ ๊ตฌํ์ lazy ๋ฑ๋กํ๋ค.
Args:
name: ์กฐํํ ์์ธก ๋ชจ๋ธ ๋ฑ๋ก ํค.
Returns:
๋ฑ๋ก๋ ์์ธก ๋ชจ๋ธ ๊ตฌํ ๊ฐ์ฒด/๋ชจ๋.
Raises:
ValueError: ๋ฑ๋ก๋์ง ์์ name์ด๋ฉด ๋ฐ์.
"""
if name == "sklearn" and "sklearn" not in _PREDICTIVE_MODELS:
from models import sklearn_model # ๊ธฐ๋ณธ ๊ตฌํ lazy ๋ฑ๋ก
_PREDICTIVE_MODELS["sklearn"] = sklearn_model
try:
return _PREDICTIVE_MODELS[name]
except KeyError:
raise ValueError(f"unknown predictive_model: {name!r} (๋ฑ๋ก๋จ: {sorted(_PREDICTIVE_MODELS)})")
|