mata_lee commited on
Commit
94d632e
ยท
unverified ยท
2 Parent(s): 44c9d8ffb280e2

Merge pull request #36 from mata-1223/develop

Browse files
core/feature_trace.py ADDED
@@ -0,0 +1,114 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from __future__ import annotations
2
+ """
3
+ ํŒŒ์ƒ ๋ณ€์ˆ˜(Index/Score) ์‚ฐ์ถœ ๊ทผ๊ฑฐ trace โ€” ์‹œ๋‚˜๋ฆฌ์˜ค ๋ฌด๊ด€.
4
+
5
+ L1 batch_builder ์˜ ์„ ์–ธํ˜• step formula ์™€ ์‹ค์ œ ์ž…๋ ฅ๊ฐ’์„ ํ’€์–ด,
6
+ ๊ฐ ์ตœ์ข… ํŒŒ์ƒ ๋ณ€์ˆ˜๊ฐ€ "์–ด๋–ค ์ž…๋ ฅ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๊ณ„์‚ฐ๋๋Š”์ง€"๋ฅผ ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š”
7
+ ๊ตฌ์กฐ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค. (ํ”„๋ก ํŠธ ๋ถ„์„ ์˜ค๋ฒ„๋ ˆ์ด์˜ ๋ณ€์ˆ˜ ํด๋ฆญ โ†’ ์‚ฐ์‹ ํŒ์˜ค๋ฒ„์šฉ)
8
+
9
+ ๋ฐ˜ํ™˜: { ํŒŒ์ƒ๋ณ€์ˆ˜๋ช…: {
10
+ "value": float, # ์ตœ์ข… ๊ฐ’
11
+ "clamp": [lo,hi] | None, # ๋ฒ”์œ„ ์ œํ•œ(์žˆ์œผ๋ฉด)
12
+ "kind": "passthrough" | "weighted_sum",
13
+ "terms": [ { # ๊ธฐ์—ฌ ํ•ญ
14
+ "ref": str, # ์ž…๋ ฅ ๋ณ€์ˆ˜๋ช…(base ๋˜๋Š” ๋…ธ์ถœ Index๋ช…)
15
+ "ref_value": float, # ๊ทธ ์ž…๋ ฅ์˜ ํ˜„์žฌ ๊ฐ’
16
+ "weight": float | None, # ๊ฐ€์ค‘์น˜(์„ ํ˜• [w,0] ํ•ญ์ผ ๋•Œ)
17
+ "contribution": float, # ์ด ํ•ญ์ด ๊ฒฐ๊ณผ์— ๋”ํ•œ ๊ฐ’
18
+ }, ... ],
19
+ } }
20
+ """
21
+ from typing import Any
22
+
23
+ from core.engines import config
24
+ from core.engines.extract import survey_base
25
+ from core.engines.formula import eval_formula, _load_py
26
+
27
+
28
+ def build_feature_trace(scenario_id: str, answers: dict[str, str]) -> dict[str, dict]:
29
+ survey = config.get_survey(scenario_id)
30
+ spec = config.get_batch_builder(scenario_id)
31
+ steps = spec.get("steps", [])
32
+ if not steps:
33
+ return {}
34
+
35
+ # 0) base feature โ†’ ์„ ํƒํ•œ ์‘๋‹ต ๋ผ๋ฒจ (์ˆซ์ž๊ฐ’ ๋Œ€์‹  "22์‹œ ์ดํ›„" ๊ฐ™์€ ์˜๋ฏธ ํ‘œ์‹œ์šฉ)
36
+ base_answer: dict[str, str] = {}
37
+ for q in survey.get("questions", []):
38
+ code = answers.get(q["id"])
39
+ if code is None:
40
+ continue
41
+ opt = next((o for o in q.get("options", []) if o.get("code") == code), None)
42
+ if not opt:
43
+ continue
44
+ for fname in (opt.get("features") or {}):
45
+ base_answer[fname] = opt.get("label")
46
+
47
+ # 1) ๋ชจ๋“  step์„ ์ค‘๊ฐ„๊ฐ’ ํฌํ•จํ•ด ํ‰๊ฐ€ (run_batch_builder ์™€ ๋™์ผํ•˜๋˜ intermediate ๋ณด์กด)
48
+ feats: dict[str, Any] = dict(survey_base(survey, answers))
49
+ for k, v in spec.get("defaults", {}).items():
50
+ feats.setdefault(k, v)
51
+ if "pre_hook" in spec:
52
+ feats.update(_load_py(spec["pre_hook"])(feats))
53
+
54
+ inter_names: set[str] = set()
55
+ step_formula: dict[str, Any] = {}
56
+ for st in steps:
57
+ val = eval_formula(st["formula"], feats)
58
+ if "round" in st:
59
+ val = round(val, st["round"])
60
+ feats[st["name"]] = val
61
+ step_formula[st["name"]] = st["formula"]
62
+ if st.get("intermediate"):
63
+ inter_names.add(st["name"])
64
+
65
+ # 2) ์ค‘๊ฐ„๊ฐ’(_FAT ๋“ฑ) โ†’ ๊ทธ๊ฒƒ์„ ๊ทธ๋Œ€๋กœ ๋…ธ์ถœํ•˜๋Š” ์ตœ์ข… Index๋ช… ๋งคํ•‘ (passthrough)
66
+ inter_to_final: dict[str, str] = {}
67
+ for st in steps:
68
+ f = st["formula"]
69
+ if (not st.get("intermediate") and f.get("feat") in inter_names
70
+ and f.get("linear") == [1, 0] and "div" not in f and "mul" not in f):
71
+ inter_to_final[f["feat"]] = st["name"]
72
+
73
+ def _terms(formula: dict) -> list[dict]:
74
+ if "terms" in formula:
75
+ return formula["terms"]
76
+ return [formula] # ๋‹จ์ผ feat ๋…ธ๋“œ
77
+
78
+ def _weight(term: dict):
79
+ lin = term.get("linear")
80
+ if lin and lin[1] == 0 and "div" not in term and "mul" not in term:
81
+ return lin[0]
82
+ return None
83
+
84
+ trace: dict[str, dict] = {}
85
+ for st in steps:
86
+ if st.get("intermediate"):
87
+ continue
88
+ name = st["name"]
89
+ f = st["formula"]
90
+ # passthrough Index ๋Š” ์ค‘๊ฐ„๊ฐ’ ์‚ฐ์‹์„ ์ธ๋ผ์ธํ•ด base ์ž…๋ ฅ๊นŒ์ง€ ๋…ธ์ถœ
91
+ eff = f
92
+ kind = "weighted_sum"
93
+ if f.get("feat") in inter_names and f.get("linear") == [1, 0]:
94
+ eff = step_formula[f["feat"]]
95
+ kind = "passthrough"
96
+ clamp = eff["clamp"] if isinstance(eff, dict) and "clamp" in eff else None
97
+
98
+ terms = []
99
+ for t in _terms(eff):
100
+ ref = t.get("feat")
101
+ terms.append({
102
+ "ref": inter_to_final.get(ref, ref),
103
+ "ref_value": round(float(feats.get(ref, 0.0)), 2),
104
+ "ref_answer": base_answer.get(ref), # base ์ž…๋ ฅ์ด๋ฉด ์„ ํƒ ์‘๋‹ต ๋ผ๋ฒจ (์—†์œผ๋ฉด None)
105
+ "weight": _weight(t),
106
+ "contribution": round(eval_formula(t, feats), 2),
107
+ })
108
+ trace[name] = {
109
+ "value": round(float(feats[name]), 2),
110
+ "clamp": clamp,
111
+ "kind": kind,
112
+ "terms": terms,
113
+ }
114
+ return trace
routes/sessions.py CHANGED
@@ -122,10 +122,15 @@ async def submit_survey(session_id: str, submission: SurveySubmission) -> dict[s
122
  _explain.attach_reasoning(_eng, _combined, top_items)
123
  all_probabilities = to_probability_dict(intent_scores, scenario_id=scenario_id)
124
 
 
 
 
 
125
  return {
126
  "session_id": session_id,
127
  "stage": "initial",
128
  "batch_features": batch_features,
 
129
  "top_n": top_items,
130
  "others": others,
131
  "all_probabilities": all_probabilities,
 
122
  _explain.attach_reasoning(_eng, _combined, top_items)
123
  all_probabilities = to_probability_dict(intent_scores, scenario_id=scenario_id)
124
 
125
+ # ํŒŒ์ƒ ๋ณ€์ˆ˜ ์‚ฐ์ถœ ๊ทผ๊ฑฐ(๋ถ„์„ ์˜ค๋ฒ„๋ ˆ์ด์˜ ๋ณ€์ˆ˜ ํด๋ฆญ โ†’ ์‚ฐ์‹ ํ‘œ์‹œ)
126
+ from core.feature_trace import build_feature_trace
127
+ feature_trace = build_feature_trace(scenario_id, submission.answers)
128
+
129
  return {
130
  "session_id": session_id,
131
  "stage": "initial",
132
  "batch_features": batch_features,
133
+ "feature_trace": feature_trace,
134
  "top_n": top_items,
135
  "others": others,
136
  "all_probabilities": all_probabilities,
scenarios/worker-v3/engine/L3_serving.json CHANGED
@@ -2,51 +2,192 @@
2
  "context_library": {
3
  "scenario_id": "worker-v3",
4
  "version": "0.1.0",
5
- "description": "์ง์žฅ์ธ ์‹œ๋‚˜๋ฆฌ์˜ค Intent๋ณ„ MyKT ์•ฑ Push ํ™œ์šฉ ์˜ˆ์‹œ",
6
  "channels": [
7
  {
8
  "id": "push",
9
  "name": "์•ฑ Push",
10
  "icon": "๐Ÿ“ฑ",
 
11
  "characteristic": "๊ณ ๊ฐ ์ƒํƒœ์— ๋งž๋Š” ์ถ”์ฒœ ์„œ๋น„์Šค๋ฅผ MyKT ์•ฑ Push ๋ฉ”์‹œ์ง€๋กœ ์ œ๊ณต โ€” ๋ฒˆ์•„์›ƒ ์™„ํ™”ยท์ผ์ƒ ํšŒ๋ณต ์ง€์›"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12
  }
13
  ],
14
  "actions": {
15
  "INT-W110": {
16
  "push": "์˜ค๋Š˜ ํ•˜๋ฃจ๋„ ์ˆ˜๊ณ ํ•˜์…จ์Šต๋‹ˆ๋‹ค. MyKT ์ง€๋‹ˆ๋ฎค์ง ASMR ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ๋กœ ์กฐ์šฉํ•œ ํœด์‹ ์‹œ๊ฐ„์„ ๊ฐ€์ ธ๋ณด์„ธ์š”.",
17
- "service": "์ง€๋‹ˆ๋ฎค์ง ํž๋งยทASMR ์ฝ˜ํ…์ธ "
 
 
 
 
 
 
 
 
 
 
 
 
 
 
18
  },
19
  "INT-W120": {
20
  "push": "์ง€์นœ ์ €๋…, ์ง์ ‘ ์ค€๋น„ํ•˜์ง€ ์•Š์•„๋„ ๊ดœ์ฐฎ์•„์š”. MyKT ๋ฉค๋ฒ„์‹ญ ๋ฐฐ๋‹ฌ ํ• ์ธ ์ฟ ํฐ์ด ๋„์ฐฉํ–ˆ์Šต๋‹ˆ๋‹ค.",
21
- "service": "๋ฐฐ๋‹ฌ ์ œํœด ํ• ์ธ ํ˜œํƒ"
 
 
 
 
 
 
 
 
 
 
 
 
22
  },
23
  "INT-W130": {
24
  "push": "๋Šฆ์€ ์‹œ๊ฐ„๊นŒ์ง€ ๊นจ์–ด ๊ณ„์‹œ๋„ค์š”. ์ง€๋‹ˆ๋ฎค์ง ์ˆ˜๋ฉด ์œ ๋„ ์ฝ˜ํ…์ธ ๋กœ ํŽธ์•ˆํ•œ ๋ฐค์„ ์ค€๋น„ํ•ด๋ณด์„ธ์š”.",
25
- "service": "์ˆ˜๋ฉดยท๋ช…์ƒ ์ฝ˜ํ…์ธ "
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
26
  },
27
  "INT-W140": {
28
  "push": "์ตœ๊ทผ ์ƒํ™œ ๋ฆฌ๋“ฌ์ด ๋ถˆ๊ทœ์น™ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ์šด๋™ยท๊ฑด๊ฐ• ์ œํœด ํ˜œํƒ์œผ๋กœ ๊ฐ€๋ฒผ์šด ์‚ฐ์ฑ…๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด๋ณด์„ธ์š”.",
29
- "service": "๊ฑด๊ฐ•ยท์šด๋™ ์ œํœด ํ˜œํƒ"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
30
  },
31
  "INT-W210": {
32
  "push": "์˜ค๋Š˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฐ๋‹ฌยท์‡ผํ•‘ ๋ฉค๋ฒ„์‹ญ ํ• ์ธ ํ˜œํƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ž‘์€ ๋ณด์ƒ์œผ๋กœ ํ•˜๋ฃจ๋ฅผ ๋งˆ๋ฌด๋ฆฌํ•ด๋ณด์„ธ์š”.",
33
- "service": "๋ฐฐ๋‹ฌยท์‡ผํ•‘ ๋ฉค๋ฒ„์‹ญ ํ• ์ธ"
 
 
 
 
 
 
 
 
 
34
  },
35
  "INT-W220": {
36
  "push": "์ด๋ฒˆ ์ฃผ๋ง ์ž ์‹œ ๋– ๋‚˜๋ณด๋Š” ๊ฑด ์–ด๋–จ๊นŒ์š”? MyKT ์ „์šฉ ์ˆ™๋ฐ• ํ• ์ธ ํ˜œํƒ์„ ํ™•์ธํ•ด๋ณด์„ธ์š”.",
37
- "service": "์—ฌํ–‰ยท์ˆ™๋ฐ• ํ”„๋กœ๋ชจ์…˜"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
38
  },
39
  "INT-W230": {
40
  "push": "์šด๋™์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ข‹์€ ํƒ€์ด๋ฐ์ž…๋‹ˆ๋‹ค. ํ—ฌ์Šคยท๋Ÿฌ๋‹ ์ œํœด ์ฟ ํฐ์ด ์ค€๋น„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.",
41
- "service": "ํ—ฌ์Šคยท๋Ÿฌ๋‹ ์ œํœด ์ฟ ํฐ"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
42
  },
43
  "INT-W240": {
44
  "push": "๋งˆ์Œ์„ ์‰ฌ๊ฒŒ ํ•ด์ค„ ์‹œ๊ฐ„์ด ํ•„์š”ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ์ง€๋‹ˆ๋ฎค์ง ๋ช…์ƒ ์ฝ˜ํ…์ธ ๋ฅผ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค.",
45
- "service": "์ง€๋‹ˆ๋ฎค์ง ๋ช…์ƒยทํž๋ง ์ฝ˜ํ…์ธ "
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
46
  },
47
  "INT-W250": {
48
  "push": "์˜ค๋žœ๋งŒ์— ์ง€์ธ๊ณผ ์—ฐ๋ฝํ•ด๋ณด๋Š” ๊ฑด ์–ด๋–จ๊นŒ์š”? ์นดํŽ˜ ๋ฉค๋ฒ„์‹ญ ํ• ์ธ ํ˜œํƒ์„ ํ™œ์šฉํ•ด๋ณด์„ธ์š”.",
49
- "service": "์นดํŽ˜ยท๋ฌธํ™” ๋ฉค๋ฒ„์‹ญ ํ˜œํƒ"
 
 
 
 
 
 
 
 
 
 
 
 
50
  }
51
  }
52
  }
 
2
  "context_library": {
3
  "scenario_id": "worker-v3",
4
  "version": "0.1.0",
5
+ "description": "์ง์žฅ์ธ ์‹œ๋‚˜๋ฆฌ์˜ค Intent๋ณ„ ๋ฉ€ํ‹ฐ์ฑ„๋„ ํ™œ์šฉ ์˜ˆ์‹œ (Pushยท์ง€๋‹ˆ๋ฎค์งยท๊ธฐ๊ฐ€์ง€๋‹ˆ) + ๋น„์ฆˆ๋‹ˆ์Šค ์ž„ํŒฉํŠธ",
6
  "channels": [
7
  {
8
  "id": "push",
9
  "name": "์•ฑ Push",
10
  "icon": "๐Ÿ“ฑ",
11
+ "kind": "phone-push",
12
  "characteristic": "๊ณ ๊ฐ ์ƒํƒœ์— ๋งž๋Š” ์ถ”์ฒœ ์„œ๋น„์Šค๋ฅผ MyKT ์•ฑ Push ๋ฉ”์‹œ์ง€๋กœ ์ œ๊ณต โ€” ๋ฒˆ์•„์›ƒ ์™„ํ™”ยท์ผ์ƒ ํšŒ๋ณต ์ง€์›"
13
+ },
14
+ {
15
+ "id": "genie_music",
16
+ "name": "์ง€๋‹ˆ๋ฎค์ง",
17
+ "icon": "๐ŸŽต",
18
+ "kind": "music-card",
19
+ "characteristic": "ํ‰์†Œ ์ฒญ์ทจ ์ด๋ ฅยท์‹œ๊ฐ„๋Œ€ ์ทจํ–ฅ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ง€๊ธˆ ์ƒํƒœ์— ๋งž๋Š” ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ๋ฅผ ํ๋ ˆ์ด์…˜"
20
+ },
21
+ {
22
+ "id": "gigagenie",
23
+ "name": "๊ธฐ๊ฐ€์ง€๋‹ˆ ยท ํ™ˆIoT",
24
+ "icon": "๐Ÿ ",
25
+ "kind": "device-voice",
26
+ "characteristic": "์Œ์„ฑ ํ•œ๋งˆ๋””๋กœ ์ง‘์•ˆ ํ™˜๊ฒฝ(์กฐ๋ช…ยท์ปคํŠผยท๋„์–ด๋ฝยท๊ฐ€์ „)์„ ์ƒํƒœ์— ๋งž๊ฒŒ ์ž๋™ ์„ธํŒ…"
27
  }
28
  ],
29
  "actions": {
30
  "INT-W110": {
31
  "push": "์˜ค๋Š˜ ํ•˜๋ฃจ๋„ ์ˆ˜๊ณ ํ•˜์…จ์Šต๋‹ˆ๋‹ค. MyKT ์ง€๋‹ˆ๋ฎค์ง ASMR ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ๋กœ ์กฐ์šฉํ•œ ํœด์‹ ์‹œ๊ฐ„์„ ๊ฐ€์ ธ๋ณด์„ธ์š”.",
32
+ "service": "์ง€๋‹ˆ๋ฎค์ง ํž๋งยทASMR ์ฝ˜ํ…์ธ ",
33
+ "gigagenie": {
34
+ "command": "๋™๊ตด ๋ชจ๋“œ ์ผœ์ค˜",
35
+ "devices": [
36
+ "๐ŸชŸ ์ปคํŠผ ๋‹ซ๊ธฐ",
37
+ "๐Ÿ’ก ์กฐ๋ช… ์–ด๋‘ก๊ฒŒ",
38
+ "๐Ÿ”’ ๋„์–ด๋ฝ ์ด์ค‘์ž ๊ธˆ"
39
+ ],
40
+ "desc": "์™ธ๋ถ€๋ฅผ ๋‹ซ๊ณ  ์•„๋Š‘ํ•˜๊ฒŒ โ€” ํ˜ผ์ž ์žˆ๊ณ  ์‹ถ์€ ์ƒํƒœ๋ฅผ ์ง‘ ํ™˜๊ฒฝ์œผ๋กœ ๋ฐ›์ณ์ค๋‹ˆ๋‹ค."
41
+ },
42
+ "business_value": {
43
+ "tag": "ํ™ˆIoT ํ™œ์šฉ",
44
+ "kpi": "๊ธฐ๊ฐ€์ง€๋‹ˆ ์‚ฌ์šฉ โ†‘",
45
+ "note": "๋™๊ตด ๋ชจ๋“œ ์ž๋™ ์„ธํŒ…์œผ๋กœ ๊ธฐ๊ฐ€์ง€๋‹ˆ ํ™œ์šฉ"
46
+ }
47
  },
48
  "INT-W120": {
49
  "push": "์ง€์นœ ์ €๋…, ์ง์ ‘ ์ค€๋น„ํ•˜์ง€ ์•Š์•„๋„ ๊ดœ์ฐฎ์•„์š”. MyKT ๋ฉค๋ฒ„์‹ญ ๋ฐฐ๋‹ฌ ํ• ์ธ ์ฟ ํฐ์ด ๋„์ฐฉํ–ˆ์Šต๋‹ˆ๋‹ค.",
50
+ "service": "๋ฐฐ๋‹ฌ ์ œํœด ํ• ์ธ ํ˜œํƒ",
51
+ "gigagenie": {
52
+ "command": "์ฒญ์†Œ ์ข€ ํ•ด์ค˜",
53
+ "devices": [
54
+ "๐Ÿค– ๋กœ๋ด‡์ฒญ์†Œ๊ธฐ ๊ฐ€๋™"
55
+ ],
56
+ "desc": "๊ธฐ๋ ฅ์ด ์—†์„ ๋•Œ ์ง‘์•ˆ์ผ์„ ๋Œ€์‹  โ€” ์ตœ์†Œํ•œ์˜ ๋ถ€๋‹ด์œผ๋กœ ์ •๋ˆ๋œ ํ™˜๊ฒฝ ์œ ์ง€."
57
+ },
58
+ "business_value": {
59
+ "tag": "์ œํœด์ˆ˜์ต",
60
+ "kpi": "๋ฉค๋ฒ„์‹ญ โ†‘",
61
+ "note": "๋ฐฐ๋‹ฌยท์ƒํ™œ ์ œํœด ์ „ํ™˜"
62
+ }
63
  },
64
  "INT-W130": {
65
  "push": "๋Šฆ์€ ์‹œ๊ฐ„๊นŒ์ง€ ๊นจ์–ด ๊ณ„์‹œ๋„ค์š”. ์ง€๋‹ˆ๋ฎค์ง ์ˆ˜๋ฉด ์œ ๋„ ์ฝ˜ํ…์ธ ๋กœ ํŽธ์•ˆํ•œ ๋ฐค์„ ์ค€๋น„ํ•ด๋ณด์„ธ์š”.",
66
+ "service": "์ˆ˜๋ฉดยท๋ช…์ƒ ์ฝ˜ํ…์ธ ",
67
+ "genie_music": {
68
+ "playlist": "์ˆ˜๋ฉด ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ",
69
+ "desc": "์ƒˆ๋ฒฝ ์‹œ๊ฐ„๋Œ€ ์ฒญ์ทจ ์ด๋ ฅ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ž ๋“ค๊ธฐ ์ข‹์€ ์‚ฌ์šด๋“œ๋ฅผ ํ๋ ˆ์ด์…˜."
70
+ },
71
+ "gigagenie": {
72
+ "command": "์ทจ์นจ ํ™˜๊ฒฝ์œผ๋กœ ๋ฐ”๊ฟ”์ค˜",
73
+ "devices": [
74
+ "๐Ÿ“บ ์˜ฌ๋ ˆtv OFF",
75
+ "๐ŸŽต ์ง€๋‹ˆ๋ฎค์ง ์ˆ˜๋ฉด์‚ฌ์šด๋“œ",
76
+ "๐Ÿ›๏ธ ๋ชจ์…˜๋ฒ ๋“œ ์ฝฐ์ด์–ดํŠธ ์Šฌ๋ฆฝ"
77
+ ],
78
+ "desc": "TV์—์„œ ์ˆ˜๋ฉด ์Œ์•…์œผ๋กœ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ•ธ๋“œ์˜คํ”„ โ€” ํ™”๋ฉด์„ ๋„๊ณ  ์ˆ™๋ฉด ๋ชจ๋“œ๋กœ."
79
+ },
80
+ "business_value": {
81
+ "tag": "๊ตฌ๋… ARPU",
82
+ "kpi": "์ง€๋‹ˆ๋ฎค์ง โ†‘",
83
+ "note": "์ˆ˜๋ฉด ์ฝ˜ํ…์ธ  ๊ตฌ๋… ์ „ํ™˜"
84
+ }
85
  },
86
  "INT-W140": {
87
  "push": "์ตœ๊ทผ ์ƒํ™œ ๋ฆฌ๋“ฌ์ด ๋ถˆ๊ทœ์น™ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ์šด๋™ยท๊ฑด๊ฐ• ์ œํœด ํ˜œํƒ์œผ๋กœ ๊ฐ€๋ฒผ์šด ์‚ฐ์ฑ…๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด๋ณด์„ธ์š”.",
88
+ "service": "๊ฑด๊ฐ•ยท์šด๋™ ์ œํœด ํ˜œํƒ",
89
+ "gigagenie": {
90
+ "command": "์•„์นจ ๋ฃจํ‹ด ๊ทœ์น™์ ์œผ๋กœ",
91
+ "devices": [
92
+ "โฐ 7์‹œ ์•Œ๋žŒ",
93
+ "๐ŸชŸ 7์‹œ ๋ธ”๋ผ์ธ๋“œ ์—ด๊ธฐ",
94
+ "๐Ÿ’ก ์กฐ๋ช… ์ ๋“ฑ"
95
+ ],
96
+ "desc": "์•„์นจ์„ ์ผ์ •ํ•˜๊ฒŒ โ€” ๋ถˆ๊ทœ์น™ํ•ด์ง„ ์ƒํ™œ ๋ฆฌ๋“ฌ์„ ํ™˜๊ฒฝ์œผ๋กœ ๋‹ค์žก์Šต๋‹ˆ๋‹ค."
97
+ },
98
+ "business_value": {
99
+ "tag": "ํ™ˆIoT ํ™œ์šฉ",
100
+ "kpi": "๊ธฐ๊ฐ€์ง€๋‹ˆ ์‚ฌ์šฉ โ†‘",
101
+ "note": "์•„์นจ ๋ฃจํ‹ด ์ž๋™ํ™”๋กœ ๊ธฐ๊ฐ€์ง€๋‹ˆ๋ฅผ ๋งค์ผ ํ™œ์šฉ"
102
+ }
103
  },
104
  "INT-W210": {
105
  "push": "์˜ค๋Š˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฐ๋‹ฌยท์‡ผํ•‘ ๋ฉค๋ฒ„์‹ญ ํ• ์ธ ํ˜œํƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ž‘์€ ๋ณด์ƒ์œผ๋กœ ํ•˜๋ฃจ๋ฅผ ๋งˆ๋ฌด๋ฆฌํ•ด๋ณด์„ธ์š”.",
106
+ "service": "๋ฐฐ๋‹ฌยท์‡ผํ•‘ ๋ฉค๋ฒ„์‹ญ ํ• ์ธ",
107
+ "genie_music": {
108
+ "playlist": "์‹ ๋‚˜๋Š” ํ”Œ๋ฆฌ",
109
+ "desc": "๊ธฐ๋ถ„ ์ „ํ™˜์šฉ ์—…๋น„ํŠธ โ€” ๋„ํŒŒ๋ฏผ์„ ๋Œ์–ด์˜ฌ๋ฆฌ๋Š” ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ."
110
+ },
111
+ "business_value": {
112
+ "tag": "๊ตฌ๋… ARPU",
113
+ "kpi": "์ง€๋‹ˆ๋ฎค์ง โ†‘",
114
+ "note": "๊ธฐ๋ถ„ ์ „ํ™˜ ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ๋กœ ์ง€๋‹ˆ๋ฎค์ง ํ™œ์šฉ"
115
+ }
116
  },
117
  "INT-W220": {
118
  "push": "์ด๋ฒˆ ์ฃผ๋ง ์ž ์‹œ ๋– ๋‚˜๋ณด๋Š” ๊ฑด ์–ด๋–จ๊นŒ์š”? MyKT ์ „์šฉ ์ˆ™๋ฐ• ํ• ์ธ ํ˜œํƒ์„ ํ™•์ธํ•ด๋ณด์„ธ์š”.",
119
+ "service": "์—ฌํ–‰ยท์ˆ™๋ฐ• ํ”„๋กœ๋ชจ์…˜",
120
+ "gigagenie": {
121
+ "command": "์™ธ์ถœ๋ชจ๋“œ๋กœ ๋ฐ”๊ฟ”์ค˜",
122
+ "devices": [
123
+ "๐Ÿ’ก ์กฐ๋ช… OFF",
124
+ "๐Ÿ”Œ ํ”Œ๋Ÿฌ๊ทธ OFF",
125
+ "๐Ÿ”’ ๋„์–ด๋ฝ ์ž ๊ธˆ"
126
+ ],
127
+ "desc": "์ฆ‰ํฅ ๋‚˜๋“ค์ด๋ฅผ ๊ฐ€๋ณ๊ฒŒ โ€” ๊ธธ์•ˆ๋‚ดยท๋‚ ์”จ์™€ ํ•จ๊ป˜ ์™ธ์ถœ ํ™˜๊ฒฝ์„ ํ•œ ๋ฒˆ์— ์ •๋ฆฌ."
128
+ },
129
+ "business_value": {
130
+ "tag": "์ œํœด์ˆ˜์ต",
131
+ "kpi": "์—ฌํ–‰ยท์ˆ™๋ฐ• โ†‘",
132
+ "note": "์—ฌํ–‰ยท์ˆ™๋ฐ• ์ œํœด ํ”„๋กœ๋ชจ์…˜ ์ „ํ™˜"
133
+ }
134
  },
135
  "INT-W230": {
136
  "push": "์šด๋™์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ข‹์€ ํƒ€์ด๋ฐ์ž…๋‹ˆ๋‹ค. ํ—ฌ์Šคยท๋Ÿฌ๋‹ ์ œํœด ์ฟ ํฐ์ด ์ค€๋น„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.",
137
+ "service": "ํ—ฌ์Šคยท๋Ÿฌ๋‹ ์ œํœด ์ฟ ํฐ",
138
+ "genie_music": {
139
+ "playlist": "์šด๋™ํ•  ๋•Œ ๋“ฃ๋Š” ์Œ์•…",
140
+ "desc": "๋Ÿฌ๋‹ยทํ™ˆํŠธ ํ…œํฌ์— ๋งž์ถ˜ ์šด๋™ ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ."
141
+ },
142
+ "gigagenie": {
143
+ "command": "์šด๋™ ํƒ€์ด๋จธ ๋งž์ถฐ์ค˜",
144
+ "devices": [
145
+ "โฑ๏ธ ์šด๋™ ํƒ€์ด๋จธ ์„ค์ •"
146
+ ],
147
+ "desc": "๊ฐ€๋ณ๊ฒŒ ๋ชธ์„ ์›€์ง์ด๋Š” ๋ฃจํ‹ด์„ ์ง€์›."
148
+ },
149
+ "business_value": {
150
+ "tag": "์ œํœด์ˆ˜์ต",
151
+ "kpi": "ํ—ฌ์Šค ์ œํœด โ†‘",
152
+ "note": "ํ—ฌ์Šคยท๋Ÿฌ๋‹ ์ œํœด ์ „ํ™˜"
153
+ }
154
  },
155
  "INT-W240": {
156
  "push": "๋งˆ์Œ์„ ์‰ฌ๊ฒŒ ํ•ด์ค„ ์‹œ๊ฐ„์ด ํ•„์š”ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ์ง€๋‹ˆ๋ฎค์ง ๋ช…์ƒ ์ฝ˜ํ…์ธ ๋ฅผ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค.",
157
+ "service": "์ง€๋‹ˆ๋ฎค์ง ๋ช…์ƒยทํž๋ง ์ฝ˜ํ…์ธ ",
158
+ "genie_music": {
159
+ "playlist": "ํž๋ง ์Œ์•…",
160
+ "desc": "๋งˆ์Œ์„ ๊ฐ€๋ผ์•‰ํžˆ๋Š” ๋ช…์ƒยทํž๋ง ์‚ฌ์šด๋“œ."
161
+ },
162
+ "gigagenie": {
163
+ "command": "ํž๋ง ๋ชจ๋“œ๋กœ ๋ฐ”๊ฟ”์ค˜",
164
+ "devices": [
165
+ "๐ŸŒซ๏ธ ๋””ํ“จ์ € ON",
166
+ "๐Ÿ’ก ์กฐ๋ช… ๋”ฐ๋œปํ•˜๊ฒŒยท๋‚ฎ์ถค"
167
+ ],
168
+ "desc": "๊ฐ์ •์„ ์‰ฌ๊ฒŒ ํ•˜๋Š” ๋ถ„์œ„๊ธฐ๋กœ โ€” ํ–ฅ๊ณผ ๋น›์œผ๋กœ ์•ˆ์ •๊ฐ์„ ๋”ํ•ฉ๋‹ˆ๋‹ค."
169
+ },
170
+ "business_value": {
171
+ "tag": "๊ตฌ๋… ARPU",
172
+ "kpi": "์ง€๋‹ˆ๋ฎค์ง โ†‘",
173
+ "note": "ํž๋งยท๋ช…์ƒ ๊ตฌ๋… ์ „ํ™˜"
174
+ }
175
  },
176
  "INT-W250": {
177
  "push": "์˜ค๋žœ๋งŒ์— ์ง€์ธ๊ณผ ์—ฐ๋ฝํ•ด๋ณด๋Š” ๊ฑด ์–ด๋–จ๊นŒ์š”? ์นดํŽ˜ ๋ฉค๋ฒ„์‹ญ ํ• ์ธ ํ˜œํƒ์„ ํ™œ์šฉํ•ด๋ณด์„ธ์š”.",
178
+ "service": "์นดํŽ˜ยท๋ฌธํ™” ๋ฉค๋ฒ„์‹ญ ํ˜œํƒ",
179
+ "gigagenie": {
180
+ "command": "์•ˆ๋ถ€ ์ฑ™๊ธฐ๊ธฐ ์ผ์ • ์ถ”๊ฐ€ํ•ด์ค˜",
181
+ "devices": [
182
+ "๐Ÿ“… ์บ˜๋ฆฐ๋”: ์ด๋ฒˆ ์ฃผ๋ง ์นœ๊ตฌ ๋งŒ๋‚˜๊ธฐ"
183
+ ],
184
+ "desc": "๊ด€๊ณ„ ํšŒ๋ณต์˜ ์ฒซ๊ฑธ์Œ์„ ์ผ์ •์œผ๋กœ โ€” ์ผ์ƒ์œผ๋กœ ๋Œ์•„์˜ค๋Š” ์ž‘์€ ๊ณ„๊ธฐ."
185
+ },
186
+ "business_value": {
187
+ "tag": "ํ™ˆIoT ํ™œ์šฉ",
188
+ "kpi": "๊ธฐ๊ฐ€์ง€๋‹ˆ ์‚ฌ์šฉ โ†‘",
189
+ "note": "์•ˆ๋ถ€ ์ผ์ • ๋“ฑ๋ก์œผ๋กœ ๊ธฐ๊ฐ€์ง€๋‹ˆ ํ™œ์šฉ"
190
+ }
191
  }
192
  }
193
  }
scripts/build_worker_scenario.py CHANGED
@@ -30,50 +30,94 @@ L1 = {
30
  }
31
 
32
  # L3(=L2 ์ˆ˜์ค€) Intent:
33
- # key : ์ฝ”๋“œ (์•ž 1์ž๋ฆฌ๊ฐ€ L1)
34
- # name : Intent ๋ช…
35
- # type : Rule | Model
36
- # features : ์ถ”๋ก  ํ•ต์‹ฌ batch feature (Index/Score)
37
- # apps : ์ด Intent๋กœ ์ง์ ‘ ์‹ ํ˜ธ๋ฅผ ์ฃผ๋Š” ์•ฑ entity
38
- # service : ์ถ”์ฒœ ์„œ๋น„์Šค
39
- # push : MyKT ์•ฑ Push ๋ฌธ๊ตฌ
 
 
 
40
  TAX = [
41
  dict(key="110", name="๋™๊ตด์† ํœด์‹", type="Model",
42
  features=["Burnout Deep Score", "Isolation Tendency Index", "Sleep Disturbance Index"],
43
  apps=[], service="์ง€๋‹ˆ๋ฎค์ง ํž๋งยทASMR ์ฝ˜ํ…์ธ ",
44
- push="์˜ค๋Š˜ ํ•˜๋ฃจ๋„ ์ˆ˜๊ณ ํ•˜์…จ์Šต๋‹ˆ๋‹ค. MyKT ์ง€๋‹ˆ๋ฎค์ง ASMR ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ๋กœ ์กฐ์šฉํ•œ ํœด์‹ ์‹œ๊ฐ„์„ ๊ฐ€์ ธ๋ณด์„ธ์š”."),
 
 
 
 
45
  dict(key="120", name="์—๋„ˆ์ง€ ์ ˆ์•ฝ ๋ชจ๋“œ", type="Model",
46
  features=["Fatigue Load Index", "Burnout Deep Score"],
47
  apps=["delivery"], service="๋ฐฐ๋‹ฌ ์ œํœด ํ• ์ธ ํ˜œํƒ",
48
- push="์ง€์นœ ์ €๋…, ์ง์ ‘ ์ค€๋น„ํ•˜์ง€ ์•Š์•„๋„ ๊ดœ์ฐฎ์•„์š”. MyKT ๋ฉค๋ฒ„์‹ญ ๋ฐฐ๋‹ฌ ํ• ์ธ ์ฟ ํฐ์ด ๋„์ฐฉํ–ˆ์Šต๋‹ˆ๋‹ค."),
 
 
 
 
49
  dict(key="130", name="๋Šฆ์€ ๋ฐค ๋””์ง€ํ„ธ ํ™œ๋™", type="Rule",
50
  features=["Sleep Disturbance Index", "Digital Escape Score"],
51
  apps=["sns", "ott"], service="์ˆ˜๋ฉดยท๋ช…์ƒ ์ฝ˜ํ…์ธ ",
52
- push="๋Šฆ์€ ์‹œ๊ฐ„๊นŒ์ง€ ๊นจ์–ด ๊ณ„์‹œ๋„ค์š”. ์ง€๋‹ˆ๋ฎค์ง ์ˆ˜๋ฉด ์œ ๋„ ์ฝ˜ํ…์ธ ๋กœ ํŽธ์•ˆํ•œ ๋ฐค์„ ์ค€๋น„ํ•ด๋ณด์„ธ์š”."),
 
 
 
 
 
 
53
  dict(key="140", name="์ƒํ™œ ๋ฆฌ๋“ฌ ๋ถˆ๊ทœ์น™", type="Model",
54
  features=["Fatigue Load Index", "Isolation Tendency Index", "weekend_out"],
55
  apps=["sns", "ott"], service="๊ฑด๊ฐ•ยท์šด๋™ ์ œํœด ํ˜œํƒ",
56
- push="์ตœ๊ทผ ์ƒํ™œ ๋ฆฌ๋“ฌ์ด ๋ถˆ๊ทœ์น™ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ์šด๋™ยท๊ฑด๊ฐ• ์ œํœด ํ˜œํƒ์œผ๋กœ ๊ฐ€๋ฒผ์šด ์‚ฐ์ฑ…๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด๋ณด์„ธ์š”."),
 
 
 
 
57
  dict(key="210", name="์ฆ‰๊ฐ ์ŠคํŠธ๋ ˆ์Šค ํ•ด์†Œ", type="Rule",
58
  features=["Burnout Deep Score", "Fatigue Load Index"],
59
  apps=["delivery", "shopping"], service="๋ฐฐ๋‹ฌยท์‡ผํ•‘ ๋ฉค๋ฒ„์‹ญ ํ• ์ธ",
60
- push="์˜ค๋Š˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฐ๋‹ฌยท์‡ผํ•‘ ๋ฉค๋ฒ„์‹ญ ํ• ์ธ ํ˜œํƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ž‘์€ ๋ณด์ƒ์œผ๋กœ ํ•˜๋ฃจ๋ฅผ ๋งˆ๋ฌด๋ฆฌํ•ด๋ณด์„ธ์š”."),
 
 
 
61
  dict(key="220", name="ํ™˜๊ฒฝ ์ „ํ™˜ ์š•๊ตฌ", type="Rule",
62
  features=["Recovery Motivation Score", "Isolation Tendency Index"],
63
  apps=["travel"], service="์—ฌํ–‰ยท์ˆ™๋ฐ• ํ”„๋กœ๋ชจ์…˜",
64
- push="์ด๋ฒˆ ์ฃผ๋ง ์ž ์‹œ ๋– ๋‚˜๋ณด๋Š” ๊ฑด ์–ด๋–จ๊นŒ์š”? MyKT ์ „์šฉ ์ˆ™๋ฐ• ํ• ์ธ ํ˜œํƒ์„ ํ™•์ธํ•ด๋ณด์„ธ์š”."),
 
 
 
 
65
  dict(key="230", name="์‹ ์ฒด ํšŒ๋ณต ์‹œ๋„", type="Rule",
66
  features=["Recovery Motivation Score", "Fatigue Load Index"],
67
  apps=["exercise"], service="ํ—ฌ์Šคยท๋Ÿฌ๋‹ ์ œํœด ์ฟ ํฐ",
68
- push="์šด๋™์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ข‹์€ ํƒ€์ด๋ฐ์ž…๋‹ˆ๋‹ค. ํ—ฌ์Šคยท๋Ÿฌ๋‹ ์ œํœด ์ฟ ํฐ์ด ์ค€๋น„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค."),
 
 
 
 
 
 
69
  dict(key="240", name="์‹ฌ๋ฆฌยท๊ฐ์ • ํšŒ๋ณต", type="Rule",
70
  features=["Recovery Motivation Score", "Isolation Tendency Index"],
71
  apps=["mental_recovery", "music"], service="์ง€๋‹ˆ๋ฎค์ง ๋ช…์ƒยทํž๋ง ์ฝ˜ํ…์ธ ",
72
- push="๋งˆ์Œ์„ ์‰ฌ๊ฒŒ ํ•ด์ค„ ์‹œ๊ฐ„์ด ํ•„์š”ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ์ง€๋‹ˆ๋ฎค์ง ๋ช…์ƒ ์ฝ˜ํ…์ธ ๋ฅผ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค."),
 
 
 
 
 
 
73
  dict(key="250", name="์ผ์ƒ ํšŒ๋ณต", type="Rule",
74
  features=["Recovery Motivation Score", "Isolation Tendency Index"],
75
  apps=["messenger", "reading", "exercise"], service="์นดํŽ˜ยท๋ฌธํ™” ๋ฉค๋ฒ„์‹ญ ํ˜œํƒ",
76
- push="์˜ค๋žœ๋งŒ์— ์ง€์ธ๊ณผ ์—ฐ๋ฝํ•ด๋ณด๋Š” ๊ฑด ์–ด๋–จ๊นŒ์š”? ์นดํŽ˜ ๋ฉค๋ฒ„์‹ญ ํ• ์ธ ํ˜œํƒ์„ ํ™œ์šฉํ•ด๋ณด์„ธ์š”."),
 
 
 
 
77
  ]
78
 
79
 
@@ -93,9 +137,17 @@ def build_intents():
93
  "intents": intents}
94
 
95
 
 
 
 
 
96
  CHANNELS = [
97
- {"id": "push", "name": "์•ฑ Push", "icon": "๐Ÿ“ฑ",
98
  "characteristic": "๊ณ ๊ฐ ์ƒํƒœ์— ๋งž๋Š” ์ถ”์ฒœ ์„œ๋น„์Šค๋ฅผ MyKT ์•ฑ Push ๋ฉ”์‹œ์ง€๋กœ ์ œ๊ณต โ€” ๋ฒˆ์•„์›ƒ ์™„ํ™”ยท์ผ์ƒ ํšŒ๋ณต ์ง€์›"},
 
 
 
 
99
  ]
100
 
101
 
@@ -103,9 +155,16 @@ def build_actions():
103
  actions = {}
104
  for t in TAX:
105
  iid = f"INT-W{t['key']}"
106
- actions[iid] = {"push": t["push"], "service": t["service"]}
 
 
 
 
 
 
 
107
  return {"scenario_id": SCENARIO_ID, "version": "0.1.0",
108
- "description": "์ง์žฅ์ธ ์‹œ๋‚˜๋ฆฌ์˜ค Intent๋ณ„ MyKT ์•ฑ Push ํ™œ์šฉ ์˜ˆ์‹œ",
109
  "channels": CHANNELS, "actions": actions}
110
 
111
 
 
30
  }
31
 
32
  # L3(=L2 ์ˆ˜์ค€) Intent:
33
+ # key : ์ฝ”๋“œ (์•ž 1์ž๋ฆฌ๊ฐ€ L1)
34
+ # name : Intent ๋ช…
35
+ # type : Rule | Model
36
+ # features : ์ถ”๋ก  ํ•ต์‹ฌ batch feature (Index/Score)
37
+ # apps : ์ด Intent๋กœ ์ง์ ‘ ์‹ ํ˜ธ๋ฅผ ์ฃผ๋Š” ์•ฑ entity
38
+ # service : ์ถ”์ฒœ ์„œ๋น„์Šค
39
+ # push : MyKT ์•ฑ Push ๋ฌธ๊ตฌ
40
+ # gmusic : ๐ŸŽต ์ง€๋‹ˆ๋ฎค์ง ์ฑ„๋„ โ€” {playlist, desc} (์—†์œผ๋ฉด ์ƒ๋žต)
41
+ # genie : ๐Ÿ  ๊ธฐ๊ฐ€์ง€๋‹ˆยทํ™ˆIoT ์ฑ„๋„ โ€” {command, devices[], desc} (์—†์œผ๋ฉด ์ƒ๋žต)
42
+ # biz : ๐Ÿ’ผ ๋น„์ฆˆ๋‹ˆ์Šค ์ž„ํŒฉํŠธ โ€” {tag, kpi, note}
43
  TAX = [
44
  dict(key="110", name="๋™๊ตด์† ํœด์‹", type="Model",
45
  features=["Burnout Deep Score", "Isolation Tendency Index", "Sleep Disturbance Index"],
46
  apps=[], service="์ง€๋‹ˆ๋ฎค์ง ํž๋งยทASMR ์ฝ˜ํ…์ธ ",
47
+ push="์˜ค๋Š˜ ํ•˜๋ฃจ๋„ ์ˆ˜๊ณ ํ•˜์…จ์Šต๋‹ˆ๋‹ค. MyKT ์ง€๋‹ˆ๋ฎค์ง ASMR ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ๋กœ ์กฐ์šฉํ•œ ํœด์‹ ์‹œ๊ฐ„์„ ๊ฐ€์ ธ๋ณด์„ธ์š”.",
48
+ genie=dict(command="๋™๊ตด ๋ชจ๋“œ ์ผœ์ค˜",
49
+ devices=["๐ŸชŸ ์ปคํŠผ ๋‹ซ๊ธฐ", "๐Ÿ’ก ์กฐ๋ช… ์–ด๋‘ก๊ฒŒ", "๐Ÿ”’ ๋„์–ด๋ฝ ์ด์ค‘์ž ๊ธˆ"],
50
+ desc="์™ธ๋ถ€๋ฅผ ๋‹ซ๊ณ  ์•„๋Š‘ํ•˜๊ฒŒ โ€” ํ˜ผ์ž ์žˆ๊ณ  ์‹ถ์€ ์ƒํƒœ๋ฅผ ์ง‘ ํ™˜๊ฒฝ์œผ๋กœ ๋ฐ›์ณ์ค๋‹ˆ๋‹ค."),
51
+ biz=dict(tag="ํ™ˆIoT ํ™œ์šฉ", kpi="๊ธฐ๊ฐ€์ง€๋‹ˆ ์‚ฌ์šฉ โ†‘", note="๋™๊ตด ๋ชจ๋“œ ์ž๋™ ์„ธํŒ…์œผ๋กœ ๊ธฐ๊ฐ€์ง€๋‹ˆ ํ™œ์šฉ")),
52
  dict(key="120", name="์—๋„ˆ์ง€ ์ ˆ์•ฝ ๋ชจ๋“œ", type="Model",
53
  features=["Fatigue Load Index", "Burnout Deep Score"],
54
  apps=["delivery"], service="๋ฐฐ๋‹ฌ ์ œํœด ํ• ์ธ ํ˜œํƒ",
55
+ push="์ง€์นœ ์ €๋…, ์ง์ ‘ ์ค€๋น„ํ•˜์ง€ ์•Š์•„๋„ ๊ดœ์ฐฎ์•„์š”. MyKT ๋ฉค๋ฒ„์‹ญ ๋ฐฐ๋‹ฌ ํ• ์ธ ์ฟ ํฐ์ด ๋„์ฐฉํ–ˆ์Šต๋‹ˆ๋‹ค.",
56
+ genie=dict(command="์ฒญ์†Œ ์ข€ ํ•ด์ค˜",
57
+ devices=["๐Ÿค– ๋กœ๋ด‡์ฒญ์†Œ๊ธฐ ๊ฐ€๋™"],
58
+ desc="๊ธฐ๋ ฅ์ด ์—†์„ ๋•Œ ์ง‘์•ˆ์ผ์„ ๋Œ€์‹  โ€” ์ตœ์†Œํ•œ์˜ ๋ถ€๋‹ด์œผ๋กœ ์ •๋ˆ๋œ ํ™˜๊ฒฝ ์œ ์ง€."),
59
+ biz=dict(tag="์ œํœด์ˆ˜์ต", kpi="๋ฉค๋ฒ„์‹ญ โ†‘", note="๋ฐฐ๋‹ฌยท์ƒํ™œ ์ œํœด ์ „ํ™˜")),
60
  dict(key="130", name="๋Šฆ์€ ๋ฐค ๋””์ง€ํ„ธ ํ™œ๋™", type="Rule",
61
  features=["Sleep Disturbance Index", "Digital Escape Score"],
62
  apps=["sns", "ott"], service="์ˆ˜๋ฉดยท๋ช…์ƒ ์ฝ˜ํ…์ธ ",
63
+ push="๋Šฆ์€ ์‹œ๊ฐ„๊นŒ์ง€ ๊นจ์–ด ๊ณ„์‹œ๋„ค์š”. ์ง€๋‹ˆ๋ฎค์ง ์ˆ˜๋ฉด ์œ ๋„ ์ฝ˜ํ…์ธ ๋กœ ํŽธ์•ˆํ•œ ๋ฐค์„ ์ค€๋น„ํ•ด๋ณด์„ธ์š”.",
64
+ gmusic=dict(playlist="์ˆ˜๋ฉด ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ",
65
+ desc="์ƒˆ๋ฒฝ ์‹œ๊ฐ„๋Œ€ ์ฒญ์ทจ ์ด๋ ฅ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ž ๋“ค๊ธฐ ์ข‹์€ ์‚ฌ์šด๋“œ๋ฅผ ํ๋ ˆ์ด์…˜."),
66
+ genie=dict(command="์ทจ์นจ ํ™˜๊ฒฝ์œผ๋กœ ๋ฐ”๊ฟ”์ค˜",
67
+ devices=["๐Ÿ“บ ์˜ฌ๋ ˆtv OFF", "๐ŸŽต ์ง€๋‹ˆ๋ฎค์ง ์ˆ˜๋ฉด์‚ฌ์šด๋“œ", "๐Ÿ›๏ธ ๋ชจ์…˜๋ฒ ๋“œ ์ฝฐ์ด์–ดํŠธ ์Šฌ๋ฆฝ"],
68
+ desc="TV์—์„œ ์ˆ˜๋ฉด ์Œ์•…์œผ๋กœ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ•ธ๋“œ์˜คํ”„ โ€” ํ™”๋ฉด์„ ๋„๊ณ  ์ˆ™๋ฉด ๋ชจ๋“œ๋กœ."),
69
+ biz=dict(tag="๊ตฌ๋… ARPU", kpi="์ง€๋‹ˆ๋ฎค์ง โ†‘", note="์ˆ˜๋ฉด ์ฝ˜ํ…์ธ  ๊ตฌ๋… ์ „ํ™˜")),
70
  dict(key="140", name="์ƒํ™œ ๋ฆฌ๋“ฌ ๋ถˆ๊ทœ์น™", type="Model",
71
  features=["Fatigue Load Index", "Isolation Tendency Index", "weekend_out"],
72
  apps=["sns", "ott"], service="๊ฑด๊ฐ•ยท์šด๋™ ์ œํœด ํ˜œํƒ",
73
+ push="์ตœ๊ทผ ์ƒํ™œ ๋ฆฌ๋“ฌ์ด ๋ถˆ๊ทœ์น™ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ์šด๋™ยท๊ฑด๊ฐ• ์ œํœด ํ˜œํƒ์œผ๋กœ ๊ฐ€๋ฒผ์šด ์‚ฐ์ฑ…๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด๋ณด์„ธ์š”.",
74
+ genie=dict(command="์•„์นจ ๋ฃจํ‹ด ๊ทœ์น™์ ์œผ๋กœ",
75
+ devices=["โฐ 7์‹œ ์•Œ๋žŒ", "๐ŸชŸ 7์‹œ ๋ธ”๋ผ์ธ๋“œ ์—ด๊ธฐ", "๐Ÿ’ก ์กฐ๋ช… ์ ๋“ฑ"],
76
+ desc="์•„์นจ์„ ์ผ์ •ํ•˜๊ฒŒ โ€” ๋ถˆ๊ทœ์น™ํ•ด์ง„ ์ƒํ™œ ๋ฆฌ๋“ฌ์„ ํ™˜๊ฒฝ์œผ๋กœ ๋‹ค์žก์Šต๋‹ˆ๋‹ค."),
77
+ biz=dict(tag="ํ™ˆIoT ํ™œ์šฉ", kpi="๊ธฐ๊ฐ€์ง€๋‹ˆ ์‚ฌ์šฉ โ†‘", note="์•„์นจ ๋ฃจํ‹ด ์ž๋™ํ™”๋กœ ๊ธฐ๊ฐ€์ง€๋‹ˆ๋ฅผ ๋งค์ผ ํ™œ์šฉ")),
78
  dict(key="210", name="์ฆ‰๊ฐ ์ŠคํŠธ๋ ˆ์Šค ํ•ด์†Œ", type="Rule",
79
  features=["Burnout Deep Score", "Fatigue Load Index"],
80
  apps=["delivery", "shopping"], service="๋ฐฐ๋‹ฌยท์‡ผํ•‘ ๋ฉค๋ฒ„์‹ญ ํ• ์ธ",
81
+ push="์˜ค๋Š˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฐ๋‹ฌยท์‡ผํ•‘ ๋ฉค๋ฒ„์‹ญ ํ• ์ธ ํ˜œํƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ž‘์€ ๋ณด์ƒ์œผ๋กœ ํ•˜๋ฃจ๋ฅผ ๋งˆ๋ฌด๋ฆฌํ•ด๋ณด์„ธ์š”.",
82
+ gmusic=dict(playlist="์‹ ๋‚˜๋Š” ํ”Œ๋ฆฌ",
83
+ desc="๊ธฐ๋ถ„ ์ „ํ™˜์šฉ ์—…๋น„ํŠธ โ€” ๋„ํŒŒ๋ฏผ์„ ๋Œ์–ด์˜ฌ๋ฆฌ๋Š” ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ."),
84
+ biz=dict(tag="๊ตฌ๋… ARPU", kpi="์ง€๋‹ˆ๋ฎค์ง โ†‘", note="๊ธฐ๋ถ„ ์ „ํ™˜ ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ๋กœ ์ง€๋‹ˆ๋ฎค์ง ํ™œ์šฉ")),
85
  dict(key="220", name="ํ™˜๊ฒฝ ์ „ํ™˜ ์š•๊ตฌ", type="Rule",
86
  features=["Recovery Motivation Score", "Isolation Tendency Index"],
87
  apps=["travel"], service="์—ฌํ–‰ยท์ˆ™๋ฐ• ํ”„๋กœ๋ชจ์…˜",
88
+ push="์ด๋ฒˆ ์ฃผ๋ง ์ž ์‹œ ๋– ๋‚˜๋ณด๋Š” ๊ฑด ์–ด๋–จ๊นŒ์š”? MyKT ์ „์šฉ ์ˆ™๋ฐ• ํ• ์ธ ํ˜œํƒ์„ ํ™•์ธํ•ด๋ณด์„ธ์š”.",
89
+ genie=dict(command="์™ธ์ถœ๋ชจ๋“œ๋กœ ๋ฐ”๊ฟ”์ค˜",
90
+ devices=["๐Ÿ’ก ์กฐ๋ช… OFF", "๐Ÿ”Œ ํ”Œ๋Ÿฌ๊ทธ OFF", "๐Ÿ”’ ๋„์–ด๋ฝ ์ž ๊ธˆ"],
91
+ desc="์ฆ‰ํฅ ๋‚˜๋“ค์ด๋ฅผ ๊ฐ€๋ณ๊ฒŒ โ€” ๊ธธ์•ˆ๋‚ดยท๋‚ ์”จ์™€ ํ•จ๊ป˜ ์™ธ์ถœ ํ™˜๊ฒฝ์„ ํ•œ ๋ฒˆ์— ์ •๋ฆฌ."),
92
+ biz=dict(tag="์ œํœด์ˆ˜์ต", kpi="์—ฌํ–‰ยท์ˆ™๋ฐ• โ†‘", note="์—ฌํ–‰ยท์ˆ™๋ฐ• ์ œํœด ํ”„๋กœ๋ชจ์…˜ ์ „ํ™˜")),
93
  dict(key="230", name="์‹ ์ฒด ํšŒ๋ณต ์‹œ๋„", type="Rule",
94
  features=["Recovery Motivation Score", "Fatigue Load Index"],
95
  apps=["exercise"], service="ํ—ฌ์Šคยท๋Ÿฌ๋‹ ์ œํœด ์ฟ ํฐ",
96
+ push="์šด๋™์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ข‹์€ ํƒ€์ด๋ฐ์ž…๋‹ˆ๋‹ค. ํ—ฌ์Šคยท๋Ÿฌ๋‹ ์ œํœด ์ฟ ํฐ์ด ์ค€๋น„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.",
97
+ gmusic=dict(playlist="์šด๋™ํ•  ๋•Œ ๋“ฃ๋Š” ์Œ์•…",
98
+ desc="๋Ÿฌ๋‹ยทํ™ˆํŠธ ํ…œํฌ์— ๋งž์ถ˜ ์šด๋™ ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ."),
99
+ genie=dict(command="์šด๋™ ํƒ€์ด๋จธ ๋งž์ถฐ์ค˜",
100
+ devices=["โฑ๏ธ ์šด๋™ ํƒ€์ด๋จธ ์„ค์ •"],
101
+ desc="๊ฐ€๋ณ๊ฒŒ ๋ชธ์„ ์›€์ง์ด๋Š” ๋ฃจํ‹ด์„ ์ง€์›."),
102
+ biz=dict(tag="์ œํœด์ˆ˜์ต", kpi="ํ—ฌ์Šค ์ œํœด โ†‘", note="ํ—ฌ์Šคยท๋Ÿฌ๋‹ ์ œํœด ์ „ํ™˜")),
103
  dict(key="240", name="์‹ฌ๋ฆฌยท๊ฐ์ • ํšŒ๋ณต", type="Rule",
104
  features=["Recovery Motivation Score", "Isolation Tendency Index"],
105
  apps=["mental_recovery", "music"], service="์ง€๋‹ˆ๋ฎค์ง ๋ช…์ƒยทํž๋ง ์ฝ˜ํ…์ธ ",
106
+ push="๋งˆ์Œ์„ ์‰ฌ๊ฒŒ ํ•ด์ค„ ์‹œ๊ฐ„์ด ํ•„์š”ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ์ง€๋‹ˆ๋ฎค์ง ๋ช…์ƒ ์ฝ˜ํ…์ธ ๋ฅผ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค.",
107
+ gmusic=dict(playlist="ํž๋ง ์Œ์•…",
108
+ desc="๋งˆ์Œ์„ ๊ฐ€๋ผ์•‰ํžˆ๋Š” ๋ช…์ƒยทํž๋ง ์‚ฌ์šด๋“œ."),
109
+ genie=dict(command="ํž๋ง ๋ชจ๋“œ๋กœ ๋ฐ”๊ฟ”์ค˜",
110
+ devices=["๐ŸŒซ๏ธ ๋””ํ“จ์ € ON", "๐Ÿ’ก ์กฐ๋ช… ๋”ฐ๋œปํ•˜๊ฒŒยท๋‚ฎ์ถค"],
111
+ desc="๊ฐ์ •์„ ์‰ฌ๊ฒŒ ํ•˜๋Š” ๋ถ„์œ„๊ธฐ๋กœ โ€” ํ–ฅ๊ณผ ๋น›์œผ๋กœ ์•ˆ์ •๊ฐ์„ ๋”ํ•ฉ๋‹ˆ๋‹ค."),
112
+ biz=dict(tag="๊ตฌ๋… ARPU", kpi="์ง€๋‹ˆ๋ฎค์ง โ†‘", note="ํž๋งยท๋ช…์ƒ ๊ตฌ๋… ์ „ํ™˜")),
113
  dict(key="250", name="์ผ์ƒ ํšŒ๋ณต", type="Rule",
114
  features=["Recovery Motivation Score", "Isolation Tendency Index"],
115
  apps=["messenger", "reading", "exercise"], service="์นดํŽ˜ยท๋ฌธํ™” ๋ฉค๋ฒ„์‹ญ ํ˜œํƒ",
116
+ push="์˜ค๋žœ๋งŒ์— ์ง€์ธ๊ณผ ์—ฐ๋ฝํ•ด๋ณด๋Š” ๊ฑด ์–ด๋–จ๊นŒ์š”? ์นดํŽ˜ ๋ฉค๋ฒ„์‹ญ ํ• ์ธ ํ˜œํƒ์„ ํ™œ์šฉํ•ด๋ณด์„ธ์š”.",
117
+ genie=dict(command="์•ˆ๋ถ€ ์ฑ™๊ธฐ๊ธฐ ์ผ์ • ์ถ”๊ฐ€ํ•ด์ค˜",
118
+ devices=["๐Ÿ“… ์บ˜๋ฆฐ๋”: ์ด๋ฒˆ ์ฃผ๋ง ์นœ๊ตฌ ๋งŒ๋‚˜๊ธฐ"],
119
+ desc="๊ด€๊ณ„ ํšŒ๋ณต์˜ ์ฒซ๊ฑธ์Œ์„ ์ผ์ •์œผ๋กœ โ€” ์ผ์ƒ์œผ๋กœ ๋Œ์•„์˜ค๋Š” ์ž‘์€ ๊ณ„๊ธฐ."),
120
+ biz=dict(tag="ํ™ˆIoT ํ™œ์šฉ", kpi="๊ธฐ๊ฐ€์ง€๋‹ˆ ์‚ฌ์šฉ โ†‘", note="์•ˆ๋ถ€ ์ผ์ • ๋“ฑ๋ก์œผ๋กœ ๊ธฐ๊ฐ€์ง€๋‹ˆ ํ™œ์šฉ")),
121
  ]
122
 
123
 
 
137
  "intents": intents}
138
 
139
 
140
+ # ์ฑ„๋„ โ€” kind: ํ”„๋ก ํŠธ์˜ ๋ฒ”์šฉ ๋ Œ๋”๋Ÿฌ๊ฐ€ ์ฑ„๋„ ์ข…๋ฅ˜๋ณ„ ๋ชฉ์—…์„ ๊ฒฐ์ • (์‹œ๋‚˜๋ฆฌ์˜ค ํŠนํ™” ์ฝ”๋“œ ์ง€์–‘)
141
+ # phone-push : ํœด๋Œ€ํฐ ๋ฝ์Šคํฌ๋ฆฐ ํ‘ธ์‹œ ๋ชฉ์—…
142
+ # music-card : ์ง€๋‹ˆ๋ฎค์ง ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ ์นด๋“œ
143
+ # device-voice: ๊ธฐ๊ฐ€์ง€๋‹ˆ ์Œ์„ฑ ๋ช…๋ น + ํ™ˆIoT ๊ธฐ๊ธฐ ๋™์ž‘ ์นฉ
144
  CHANNELS = [
145
+ {"id": "push", "name": "์•ฑ Push", "icon": "๐Ÿ“ฑ", "kind": "phone-push",
146
  "characteristic": "๊ณ ๊ฐ ์ƒํƒœ์— ๋งž๋Š” ์ถ”์ฒœ ์„œ๋น„์Šค๋ฅผ MyKT ์•ฑ Push ๋ฉ”์‹œ์ง€๋กœ ์ œ๊ณต โ€” ๋ฒˆ์•„์›ƒ ์™„ํ™”ยท์ผ์ƒ ํšŒ๋ณต ์ง€์›"},
147
+ {"id": "genie_music", "name": "์ง€๋‹ˆ๋ฎค์ง", "icon": "๐ŸŽต", "kind": "music-card",
148
+ "characteristic": "ํ‰์†Œ ์ฒญ์ทจ ์ด๋ ฅยท์‹œ๊ฐ„๋Œ€ ์ทจํ–ฅ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ง€๊ธˆ ์ƒํƒœ์— ๋งž๋Š” ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ๋ฅผ ํ๋ ˆ์ด์…˜"},
149
+ {"id": "gigagenie", "name": "๊ธฐ๊ฐ€์ง€๋‹ˆ ยท ํ™ˆIoT", "icon": "๐Ÿ ", "kind": "device-voice",
150
+ "characteristic": "์Œ์„ฑ ํ•œ๋งˆ๋””๋กœ ์ง‘์•ˆ ํ™˜๊ฒฝ(์กฐ๋ช…ยท์ปคํŠผยท๋„์–ด๋ฝยท๊ฐ€์ „)์„ ์ƒํƒœ์— ๋งž๊ฒŒ ์ž๋™ ์„ธํŒ…"},
151
  ]
152
 
153
 
 
155
  actions = {}
156
  for t in TAX:
157
  iid = f"INT-W{t['key']}"
158
+ act = {"push": t["push"], "service": t["service"]}
159
+ if t.get("gmusic"):
160
+ act["genie_music"] = t["gmusic"]
161
+ if t.get("genie"):
162
+ act["gigagenie"] = t["genie"]
163
+ if t.get("biz"):
164
+ act["business_value"] = t["biz"]
165
+ actions[iid] = act
166
  return {"scenario_id": SCENARIO_ID, "version": "0.1.0",
167
+ "description": "์ง์žฅ์ธ ์‹œ๋‚˜๋ฆฌ์˜ค Intent๋ณ„ ๋ฉ€ํ‹ฐ์ฑ„๋„ ํ™œ์šฉ ์˜ˆ์‹œ (Pushยท์ง€๋‹ˆ๋ฎค์งยท๊ธฐ๊ฐ€์ง€๋‹ˆ) + ๋น„์ฆˆ๋‹ˆ์Šค ์ž„ํŒฉํŠธ",
168
  "channels": CHANNELS, "actions": actions}
169
 
170