| |
| """ |
| κ²°ν©(bundle-v3) μλλ¦¬μ€ μΉ΄νλ‘κ·Έ μμ±κΈ°. |
| |
| λ¨μΌ TAXONOMY μ μ(μμ€ μ€λΈ νΈλ£¨μ€)λ‘λΆν° |
| - intents.json : L3 Intent μΉ΄νλ‘κ·Έ (id/name/L1/L2/inference_type/features) |
| - actions.json : Intentλ³ 3μ±λ(push / call_center / agent) νμ© μμ |
| - behavior_intents.json : behaviors.json entity β μ§μ μ νΈ Intent λ§€ν |
| μΈ νμΌμ μΌκ΄λκ² μμ±νλ€. |
| |
| μλ리μ€_κ²°ν©: |
| 1.1 κ²°ν© Domain Intent Taxonomy / 1.2 Metadata / 4.2 νμ© λ°©μ. |
| |
| μ€ν: |
| cd roadshow-server-v3 |
| python scripts/build_bundle_scenario.py |
| """ |
| from __future__ import annotations |
|
|
| import sys |
| from pathlib import Path |
|
|
| sys.path.insert(0, str(Path(__file__).parent.parent)) |
|
|
| from scripts._scenario_common import emit_layers |
|
|
| SCENARIO_ID = "bundle-v3" |
| OUT_DIR = Path(__file__).parent.parent / "scenarios" / SCENARIO_ID |
|
|
| |
| L1 = { |
| "1": ("INT-B1000", "κ°μ
νλ"), |
| "2": ("INT-B2000", "ν μΈ μ΅μ ν"), |
| "3": ("INT-B3000", "νμ /μλΉμ€ νμ₯"), |
| "4": ("INT-B4000", "μ μ§/λ½μΈ"), |
| "5": ("INT-B5000", "μ΄ν κ²ν "), |
| } |
| L2 = { |
| "11": ("INT-B1100", "κ²°ν© κ°λ₯ μ¬λΆ νμ"), |
| "12": ("INT-B1200", "κ²°ν© μν νμ"), |
| "13": ("INT-B1300", "κ°μ
νν νμ"), |
| "14": ("INT-B1400", "κ°μ
μ€ν κ²ν "), |
| "21": ("INT-B2100", "νμ¬ νν μ κ²"), |
| "22": ("INT-B2200", "μΆκ° νν νμ"), |
| "23": ("INT-B2300", "νν νμ© μ΅μ ν"), |
| "31": ("INT-B3100", "κ²°ν© λ²μ νλ"), |
| "32": ("INT-B3200", "λλ°μ΄μ€/IoT νμ₯"), |
| "33": ("INT-B3300", "κ²°ν© κ΅¬μ‘° μ¬κ΅¬μ±"), |
| "41": ("INT-B4100", "μ¬μ½μ κ²ν "), |
| "42": ("INT-B4200", "μ₯κΈ° κ³ κ° νν νμΈ"), |
| "43": ("INT-B4300", "κ²°ν© μ μ§ μν₯ νμΈ"), |
| "51": ("INT-B5100", "κ²½μμ¬ λΉκ΅"), |
| "52": ("INT-B5200", "νν/λΉμ© λΆλ§"), |
| "53": ("INT-B5300", "νμ§ λΆλ§"), |
| "54": ("INT-B5400", "ν΄μ§ κ²ν "), |
| } |
|
|
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| TAX: list[dict] = [ |
| |
| dict(key="111", name="κ°μ‘± κ²°ν© κ°λ₯ μ¬λΆ νμΈ", type="Rule", |
| features=["family_line_count", "Bundle Opportunity Index"], |
| entities=["bundle_eligibility", "family_bundle"], |
| push="κ°μ‘± κ²°ν© μ λ°μ μ μλ ν μΈ ννμ νμΈν΄λ³΄μΈμ", |
| cc=("κ°μ‘± κ²°ν© κ°λ₯ μ¬λΆ νμ", "κ°μ‘± κ²°ν© κ°λ₯ μ¬λΆμ μμ ν μΈ κΈμ‘μ μλ΄"), |
| agent="κ°μ‘± νμ μ κ²°ν©νλ©΄ μΌλ§λ μ μ½λλμ§ κ³μ°ν΄λ³ΌκΉμ?"), |
| dict(key="112", name="μΈν°λ·/IPTV κ²°ν© κ°λ₯ μ¬λΆ νμΈ", type="Rule", |
| features=["service_coverage_ratio", "Bundle Opportunity Index"], |
| entities=["internet_iptv_bundle"], |
| push="μΈν°λ·Β·TV κ²°ν© μ μΆκ° ννμ λ°μ μ μμ΄μ", |
| cc=("μΈν°λ·/IPTV κ²°ν© κ°λ₯ μ¬λΆ νμ", "νμ¬ μ΄μ© μν κΈ°μ€ κ²°ν© κ°λ₯ μνμ μλ΄"), |
| agent="μΈν°λ·κ³Ό TVλ₯Ό ν¨κ» μ΄μ©νλ©΄ μ΄λ€ ννμ΄ μκΈ°λμ§ μμλ³ΌκΉμ?"), |
| dict(key="113", name="νμ¬ μκΈμ κΈ°λ° κ²°ν© κ°λ₯ μ¬λΆ νμΈ", type="Rule", |
| features=["plan_tier", "Bundle Opportunity Index"], |
| entities=[], |
| push="μ§κΈ μκΈμ λ‘ λ°μ μ μλ κ²°ν© ννμ νμΈν΄λ³΄μΈμ", |
| cc=("νμ¬ μκΈμ κΈ°λ° κ²°ν© κ°λ₯ μ¬λΆ νμΈ", "νμ¬ μκΈμ κΈ°μ€ μ μ© κ°λ₯ν κ²°ν©μ μλ΄"), |
| agent="μ§κΈ μ°μλ μκΈμ λ‘ κ²°ν©νλ©΄ μ΄λ€ ννμ΄ μλμ§ λ³ΌκΉμ?"), |
| dict(key="121", name="ν μΈ μ€μ¬ κ²°ν© μν νμ", type="Model", |
| features=["non_mobile_cost_gap", "Benefit Optimization Index"], |
| entities=["discount_calc", "total_bundle"], |
| push="ν μΈ ννμ΄ ν° κ²°ν© μνμ μΆμ²ν΄λ립λλ€", |
| cc=("ν μΈ μ€μ¬ κ²°ν© μν νμ", "κ³ κ°λ 쑰건μ λ§λ κ²°ν© μνμ μλ΄"), |
| agent="κ°μ₯ μ 리ν κ²°ν© μνμ ν¨κ» μ°Ύμλ³ΌκΉμ?"), |
| dict(key="122", name="λ°μ΄ν° νν μ€μ¬ κ²°ν© μν νμ", type="Model", |
| features=["content_view_mode", "Benefit Engagement Index"], |
| entities=[], |
| push="λ°μ΄ν° ννμ΄ ν° κ²°ν© μνμ νμΈν΄λ³΄μΈμ", |
| cc=("λ°μ΄ν° νν μ€μ¬ κ²°ν© μν νμ", "λ°μ΄ν° νμ©μ΄ λ§μ κ³ κ° λμ κ²°ν©μ μλ΄"), |
| agent="λ°μ΄ν°λ₯Ό λ λλν μΈ μ μλ κ²°ν©μ μ°Ύμλ³ΌκΉμ?"), |
| dict(key="123", name="ν리미μ νν μ€μ¬ κ²°ν© μν νμ", type="Model", |
| features=["plan_tier", "Benefit Engagement Index"], |
| entities=[], |
| push="ν리미μ νν μ€μ¬ κ²°ν© μνμ νμΈν΄λ³΄μΈμ", |
| cc=("ν리미μ νν μ€μ¬ κ²°ν© μν νμ", "μμ μκΈμ κΈ°λ° ν리미μ κ²°ν©μ μλ΄"), |
| agent="ν리미μ ννκΉμ§ ν¬ν¨λ κ²°ν©μ μ΄ν΄λ³ΌκΉμ?"), |
| dict(key="131", name="μ κ· κ²°ν© κ°μ
νν νμΈ", type="Model", |
| features=["Bundle Opportunity Index", "Benefit Optimization Index"], |
| entities=["internet_signup_benefit"], |
| push="μ κ· κ°μ
κ³ κ° μ μ© ννμ νμΈν΄λ³΄μΈμ", |
| cc=("μ κ· κ°μ
νν νμ", "νμ¬ κ°μ
κ°λ₯ν ννμ μλ΄"), |
| agent="κ°μ
μ λ°μ μ μλ ννμ μ 리ν΄λ³ΌκΉμ?"), |
| dict(key="141", name="μ¨λΌμΈ κ²°ν© κ°μ
κ²ν ", type="Rule", |
| features=["Bundle Opportunity Index", "Acquisition Score"], |
| entities=["bundle_apply"], |
| push="μ¨λΌμΈμΌλ‘ κ°νΈνκ² κ°μ
ν΄λ³΄μΈμ", |
| cc=("μ¨λΌμΈ κ°μ
κ²ν ", "μ¨λΌμΈ κ°μ
μ μ°¨λ₯Ό μλ΄"), |
| agent="κ°μ
κΉμ§ νμν λ¨κ³λ₯Ό μλ΄ν΄λ릴κΉμ?"), |
| dict(key="142", name="μλ΄ κΈ°λ° κ²°ν© κ°μ
κ²ν ", type="Rule", |
| features=["Bundle Opportunity Index", "Acquisition Score"], |
| entities=["support_consult", "bundle_apply"], |
| push="μλ΄μ¬μ ν¨κ» κ°μ
μ μ§νν΄λ³΄μΈμ", |
| cc=("μλ΄ κΈ°λ° κ°μ
κ²ν (μλ΄ μΈμ
)", "κ³ κ° μ‘°κ±΄ νμΈ ν λ§μΆ€ κ²°ν© κ°μ
μ μλ΄"), |
| agent="μλ΄μ¬ μ°κ²° μ μ νμν μ 보λ₯Ό 미리 μ 리ν΄λ릴κΉμ?"), |
| dict(key="143", name="λ§€μ₯ λ°©λ¬Έ κ²°ν© κ°μ
κ²ν ", type="Model", |
| features=["Bundle Opportunity Index", "Acquisition Score"], |
| entities=[], |
| push="κ°κΉμ΄ λ§€μ₯μμ κ°μ
μλ΄μ λ°μ보μΈμ", |
| cc=("λ§€μ₯ λ°©λ¬Έ κ°μ
κ²ν ", "λ°©λ¬Έ κ°λ₯ λ§€μ₯κ³Ό μ€λΉ μλ₯λ₯Ό μλ΄"), |
| agent="λ°©λ¬Έ κ°μ
μ νμν μ€λΉλ¬Όμ μλ΄ν΄λ릴κΉμ?"), |
|
|
| |
| dict(key="211", name="νμ¬ κ²°ν© νν νμΈ", type="Rule", |
| features=["Benefit Engagement Index", "benefit_utilization"], |
| entities=["current_bundle_benefit"], |
| push="νμ¬ λ°κ³ μλ ν μΈΒ·κ²°ν© ννμ νμΈν΄λ³΄μΈμ", |
| cc=("νμ¬ μ μ© νν νμΈ", "νμ¬ μ μ© μ€μΈ ν μΈ λ΄μμ μλ΄"), |
| agent="μ§κΈ λ°κ³ μλ ννμ ν λ²μ μ 리ν΄λ릴κΉμ?"), |
| dict(key="221", name="μΆκ° κ²°ν© ν μΈ κ°λ₯ μ¬λΆ νμΈ", type="Rule", |
| features=["Benefit Optimization Index", "non_mobile_cost_gap"], |
| entities=["discount_calc"], |
| push="μΆκ°λ‘ λ°μ μ μλ ν μΈ ννμ΄ μλμ§ νμΈν΄λ³΄μΈμ", |
| cc=("μΆκ° νν νμ", "μ μ© κ°λ₯ν ν μΈ νλͺ©μ μλ΄"), |
| agent="νμ¬ μ‘°κ±΄μμ μΆκ° ν μΈμ΄ κ°λ₯νμ§ νμΈν΄λ³ΌκΉμ?"), |
| dict(key="231", name="λ°μ΄ν° νν νμ© κ²ν ", type="Model", |
| features=["Benefit Engagement Index", "content_view_mode"], |
| entities=[], |
| push="μμ§ νμ©νμ§ μμ λ°μ΄ν° ννμ νμΈν΄λ³΄μΈμ", |
| cc=("λ°μ΄ν° νν νμ© κ²ν ", "λ―Ένμ© λ°μ΄ν° ννμ μλ΄"), |
| agent="λμΉκ³ μλ λ°μ΄ν° ννμ΄ μλμ§ ν¨κ» λ³ΌκΉμ?"), |
| dict(key="234", name="λ―Έμ¬μ© κ²°ν© νν νμΈ", type="Rule", |
| features=["Benefit Engagement Index", "benefit_utilization"], |
| entities=["unused_benefit"], |
| push="μμ§ μ¬μ©νμ§ μμ ννμ΄ μμ΅λλ€", |
| cc=("λ―Έμ¬μ© νν νμΈ", "λ―Έμ¬μ© ννμ μ λ¦¬ν΄ μλ΄"), |
| agent="λμΉκ³ μλ ννμ΄ μλμ§ ν¨κ» νμΈν΄λ³ΌκΉμ?"), |
|
|
| |
| dict(key="311", name="κ°μ‘± νμ μΆκ° κ²ν ", type="Rule", |
| features=["family_line_count", "Bundle Opportunity Index"], |
| entities=["family_bundle"], |
| push="κ°μ‘± νμ μ μΆκ°νλ©΄ ν μΈ ννμ΄ λ μ»€μ§ μ μμ΄μ", |
| cc=("κ°μ‘± νμ μΆκ° κ²ν ", "κ°μ‘± νμ μΆκ° μ μμ ννμ μλ΄"), |
| agent="κ°μ‘± νμ μ μΆκ°νλ©΄ μΌλ§λ μ μ½λλμ§ κ³μ°ν΄λ³ΌκΉμ?"), |
| dict(key="312", name="μΈν°λ· κ²°ν© μΆκ° κ²ν ", type="Rule", |
| features=["Home Service Expansion Index", "service_coverage_ratio"], |
| entities=["internet"], |
| push="μΈν°λ· κ²°ν© μ μΆκ° ννμ λ°μ μ μμ΄μ", |
| cc=("μΈν°λ· κ²°ν© μΆκ° κ²ν ", "μΈν°λ· κ²°ν© μνμ μλ΄"), |
| agent="μΈν°λ·μ ν¨κ» μ΄μ©νλ©΄ μΌλ§λ μ μ½λλμ§ μμλ³ΌκΉμ?"), |
| dict(key="313", name="IPTV κ²°ν© μΆκ° κ²ν ", type="Rule", |
| features=["Home Service Expansion Index", "content_view_mode"], |
| entities=["iptv"], |
| push="IPTV κ²°ν© μ μ½ν
μΈ ννμ λ°μ μ μμ΄μ", |
| cc=("IPTV κ²°ν© μΆκ° κ²ν ", "IPTV κ²°ν© μνκ³Ό μ½ν
μΈ ννμ μλ΄"), |
| agent="TVκΉμ§ κ²°ν©νλ©΄ μ΄λ€ μ½ν
μΈ ννμ΄ μκΈ°λμ§ λ³ΌκΉμ?"), |
| dict(key="314", name="μΈν°λ·+IPTV ν΅ν© μ΄μ© κ²ν ", type="Rule", |
| features=["Home Service Expansion Index", "service_coverage_ratio"], |
| entities=["internet_iptv_bundle"], |
| push="μΈν°λ·+TV ν΅ν© κ²°ν© ννμ νμΈν΄λ³΄μΈμ", |
| cc=("μΈν°λ·+IPTV ν΅ν© μ΄μ© κ²ν ", "ν΅ν© κ²°ν© μ ννμ μλ΄"), |
| agent="μΈν°λ·κ³Ό TVλ₯Ό λ¬ΆμΌλ©΄ μΌλ§λ μ 리νμ§ λΉκ΅ν΄λ³ΌκΉμ?"), |
| dict(key="315", name="ν WiFi μΆκ° κ²ν ", type="Rule", |
| features=["Home Service Expansion Index", "household_change"], |
| entities=["wifi"], |
| push="ν WiFi μΆκ° μ λ νΈλ¦¬νκ² μ΄μ©ν μ μμ΄μ", |
| cc=("ν WiFi μΆκ° κ²ν ", "ν WiFi κ²°ν© ννμ μλ΄"), |
| agent="ν WiFiλ₯Ό μΆκ°νλ©΄ μ΄λ€ μ μ΄ μ’μμ§λμ§ μλ €λ릴κΉμ?"), |
| dict(key="321", name="μμΉ νμ μΆκ° κ²ν ", type="Model", |
| features=["plan_tier", "Service Expansion Score"], |
| entities=[], |
| push="μμΉ μ μ© νμ ννμ μλ΄ν΄λ릴κ²μ", |
| cc=("μμΉ νμ μΆκ° κ²ν ", "μμΉ μ μ© νμ ννμ μλ΄"), |
| agent="μ€λ§νΈμμΉ μ°κ²° μ μ΄μ© κ°λ₯ν ννμ νμΈν΄λ³ΌκΉμ?"), |
| dict(key="322", name="νλΈλ¦Ώ κ²°ν© μΆκ° κ²ν ", type="Model", |
| features=["plan_tier", "Service Expansion Score"], |
| entities=[], |
| push="νλΈλ¦Ώ κ²°ν© ννμ νμΈν΄λ³΄μΈμ", |
| cc=("νλΈλ¦Ώ κ²°ν© μΆκ° κ²ν ", "νλΈλ¦Ώ κ²°ν© νμ ννμ μλ΄"), |
| agent="νλΈλ¦Ώμ κ²°ν©νλ©΄ μ΄λ€ ννμ΄ μλμ§ λ³ΌκΉμ?"), |
| dict(key="323", name="μΈμ»¨λ λλ°μ΄μ€ μ°κ²° κ²ν ", type="Model", |
| features=["plan_tier", "Service Expansion Score"], |
| entities=[], |
| push="μΈμ»¨λ λλ°μ΄μ€ μ°κ²° ννμ νμΈν΄λ³΄μΈμ", |
| cc=("μΈμ»¨λ λλ°μ΄μ€ μ°κ²° κ²ν ", "μΆκ° λλ°μ΄μ€ μ°κ²° ννμ μλ΄"), |
| agent="μΆκ° λλ°μ΄μ€λ₯Ό μ°κ²°νλ©΄ μ΄λ€ ννμ΄ μλμ§ μμλ³ΌκΉμ?"), |
| dict(key="331", name="κ°μ‘± νμ ν΅ν© κ²ν ", type="Model", |
| features=["family_line_count", "Bundle Opportunity Index"], |
| entities=[], |
| push="κ°μ‘± νμ μ ν΅ν©νλ©΄ λ μ 리ν κ²°ν©μ λ°μ μ μμ΄μ", |
| cc=("κ°μ‘± νμ ν΅ν© κ²ν ", "κ°μ‘± νμ ν΅ν© μ κ²°ν© κ΅¬μ±μ μλ΄"), |
| agent="κ°μ‘± νμ μ ν΅ν©νλ©΄ μ΄λ€ ννμ΄ μκΈ°λμ§ λΉκ΅ν΄λ³ΌκΉμ?"), |
| dict(key="332", name="κ°μ‘± νμ λΆλ¦¬ κ²ν ", type="Model", |
| features=["family_line_count", "household_change"], |
| entities=[], |
| push="κ°μ‘± νμ λΆλ¦¬ μ λ³λλλ ννμ νμΈν΄λ³΄μΈμ", |
| cc=("κ°μ‘± νμ λΆλ¦¬ κ²ν ", "νμ λΆλ¦¬ μ νν λ³λμ μλ΄"), |
| agent="νμ μ λΆλ¦¬νλ©΄ ννμ΄ μ΄λ»κ² λ¬λΌμ§λμ§ νμΈν΄λ³ΌκΉμ?"), |
| dict(key="333", name="λͺ
μ λ³κ²½ κ²ν ", type="Rule", |
| features=["household_change", "family_line_count"], |
| entities=[], |
| push="κ²°ν© κ΅¬μ‘°λ₯Ό λ³κ²½νλ©΄ λ μ 리ν ννμ λ°μ μ μμ΅λλ€", |
| cc=("λͺ
μ λ³κ²½ κ²ν ", "λͺ
μ λ³κ²½ κ°λ₯ν κ²°ν© κ΅¬μ±μ μλ΄"), |
| agent="νμ¬ μν©μ λ§κ² κ²°ν©μ λ€μ ꡬμ±ν΄λ³ΌκΉμ?"), |
| dict(key="334", name="λν νμ λ³κ²½ κ²ν ", type="Rule", |
| features=["household_change", "family_line_count"], |
| entities=[], |
| push="λν νμ λ³κ²½ μ κ²°ν© ννμ νμΈν΄λ³΄μΈμ", |
| cc=("λν νμ λ³κ²½ κ²ν ", "λν νμ λ³κ²½ μ νν λ³λμ μλ΄"), |
| agent="λν νμ μ λ°κΎΈλ©΄ κ²°ν© ννμ΄ μ΄λ»κ² λ¬λΌμ§λμ§ λ³ΌκΉμ?"), |
| dict(key="335", name="νμ μ΄λ κ²ν ", type="Model", |
| features=["household_change", "family_line_count"], |
| entities=[], |
| push="νμ μ΄λ μ κ²°ν© κ΅¬μ±μ νμΈν΄λ³΄μΈμ", |
| cc=("νμ μ΄λ κ²ν ", "νμ μ΄λ μ κ²°ν© κ΅¬μ±μ μλ΄"), |
| agent="νμ μ μ΄λνλ©΄ κ²°ν©μ΄ μ΄λ»κ² λ°λλμ§ νμΈν΄λ³ΌκΉμ?"), |
|
|
| |
| dict(key="411", name="κ²°ν© μ½μ μνΒ·μ°μ₯ νν νμΈ", type="Rule", |
| features=["contract_status", "Retention Readiness Index"], |
| entities=["contract_status"], |
| push="μ½μ μνμ μ°μ₯ μ λ°μ μ μλ ννμ νμΈν΄λ³΄μΈμ", |
| cc=("μ½μ μν λ° μ°μ₯ νν νμΈ", "νμ¬ μ½μ μνμ μ°μ₯ ννμ μλ΄"), |
| agent="μ½μ μ°μ₯ μ λ°μ μ μλ ννμ μ 리ν΄λ릴κΉμ?"), |
| dict(key="412", name="κ²°ν© μ¬μ½μ νν λΉκ΅", type="Model", |
| features=["Retention Readiness Index", "Benefit Engagement Index"], |
| entities=["renewal_benefit", "renewal_consult"], |
| push="μ¬μ½μ μ λ°μ μ μλ ννμ νμΈν΄λ³΄μΈμ", |
| cc=("μ¬μ½μ κ²ν (μλ΄ μΈμ
)", "νμ¬ μ¬μ½μ κ°λ₯ ννμ λΉκ΅ μλ΄"), |
| agent="μ¬μ½μ κ³Ό νμ¬ μ‘°κ±΄μ λΉκ΅ν΄λ³ΌκΉμ?"), |
| dict(key="421", name="κ²°ν© μ₯κΈ° κ³ κ° νν νμΈ", type="Rule", |
| features=["tenure_group", "Retention Readiness Index"], |
| entities=["long_term_benefit"], |
| push="μ₯κΈ° κ³ κ° μ μ© ννμ νμΈν΄λ³΄μΈμ", |
| cc=("μ₯κΈ° κ³ κ° νν νμΈ", "κ³ κ°μ΄ λ°μ μ μλ μ₯κΈ° ννμ μλ΄"), |
| agent="μ₯κΈ° μ΄μ© κ³ κ° ννμ μ 리ν΄λ릴κΉμ?"), |
| dict(key="431", name="μκΈμ λ³κ²½ μ κ²°ν© μν₯ νμΈ", type="Model", |
| features=["non_mobile_cost_gap", "Retention Readiness Index"], |
| entities=[], |
| push="μκΈμ λ³κ²½ μ κ²°ν© νν λ³λμ νμΈν΄λ³΄μΈμ", |
| cc=("μκΈμ λ³κ²½ μν₯ νμΈ", "μκΈμ λ³κ²½ μ κ²°ν© νν λ³λμ μλ΄"), |
| agent="μκΈμ λ₯Ό λ°κΎΈλ©΄ κ²°ν© ννμ μ΄λ€ μν₯μ΄ μλμ§ λ³ΌκΉμ?"), |
| dict(key="432", name="κ²°ν© ν΄μ§ μν₯ νμΈ", type="Rule", |
| features=["Retention Readiness Index", "Churn Risk Index"], |
| entities=["penalty"], |
| push="κ²°ν© ν΄μ§ μ λ³κ²½λλ ννμ νμΈν΄λ³΄μΈμ", |
| cc=("κ²°ν© μ μ§ μν₯ νμΈ", "κ²°ν© ν΄μ§ μ λ³λλλ ν μΈ ννμ μλ΄"), |
| agent="κ²°ν©μ ν΄μ§νλ©΄ μ΄λ€ μν₯μ΄ μλμ§ λΉκ΅ν΄λ³ΌκΉμ?"), |
|
|
| |
| dict(key="511", name="νμ¬ κ²°ν© νν/κ°κ²© λΉκ΅", type="Model", |
| features=["Churn Risk Index", "non_mobile_cost_gap"], |
| entities=["competitor_compare"], |
| push="νμ¬ ννκ³Ό νμ¬ ννμ λΉκ΅ν΄λ³΄μΈμ", |
| cc=("κ²½μμ¬ λΉκ΅", "κ²½μμ¬ μνκ³Ό λΉκ΅ μλ΄"), |
| agent="νμ¬ ννκ³Ό νμ¬ ννμ λλν λΉκ΅ν΄λ³ΌκΉμ?"), |
| dict(key="512", name="λ²νΈμ΄λ κΈ°λ° νν λΉκ΅", type="Rule", |
| features=["Churn Risk Index", "contract_status"], |
| entities=[], |
| push="λ²νΈμ΄λ μ λ°μ μ μλ ννμ λΉκ΅ν΄λ³΄μΈμ", |
| cc=("λ²νΈμ΄λ κΈ°λ° νν λΉκ΅", "λ²νΈμ΄λ μ ννμ λΉκ΅ μλ΄"), |
| agent="λ²νΈμ΄λ μ ννμ νμ¬μ λΉκ΅ν΄λ³ΌκΉμ?"), |
| dict(key="521", name="κ²°ν© νν λΆμ‘± 체κ°", type="Model", |
| features=["dissatisfaction_factor", "Benefit Optimization Index"], |
| entities=[], |
| push="λ λ°μ μ μλ ννμ΄ μλμ§ νμΈν΄λ³΄μΈμ", |
| cc=("νν λΆμ‘± 체κ°", "μΆκ° μ μ© κ°λ₯ν ννμ μλ΄"), |
| agent="μ§κΈ λ°μ μ μλ ννμ ν λ²μ μ 리ν΄λ릴κΉμ?"), |
| dict(key="522", name="κ²°ν© μ μ§ κ°μΉ νλ½", type="Model", |
| features=["dissatisfaction_factor", "Retention Readiness Index"], |
| entities=[], |
| push="κ²°ν© μ μ§ μ λ°μ μ μλ κ°μΉλ₯Ό νμΈν΄λ³΄μΈμ", |
| cc=("κ²°ν© μ μ§ κ°μΉ νλ½", "κ²°ν© μ μ§ κ°μΉλ₯Ό μ¬μλ΄"), |
| agent="κ²°ν©μ μ μ§νλ©΄ μ΄λ€ μ μ΄ μ 리νμ§ λ€μ μ 리ν΄λ릴κΉμ?"), |
| dict(key="523", name="κ²°ν© ν΅μ λΉ λΆλ΄ μ¦κ°", type="Model", |
| features=["non_mobile_cost_gap", "dissatisfaction_factor"], |
| entities=[], |
| push="ν΅μ λΉλ₯Ό μ€μΌ μ μλ λ°©λ²μ νμΈν΄λ³΄μΈμ", |
| cc=("ν΅μ λΉ λΆλ΄ μ¦κ°", "λΉμ© λΆλ΄μ μ€μΌ μ μλ μνμ μλ΄"), |
| agent="μ§κΈλ³΄λ€ ν΅μ λΉλ₯Ό μ μ½ν μ μλ λ°©λ²μ μ°Ύμλ³ΌκΉμ?"), |
| dict(key="531", name="μΈν°λ· νμ§ λΆλ§", type="Rule", |
| features=["dissatisfaction_factor", "Churn Risk Index"], |
| entities=[], |
| push="μΈν°λ· νμ§ κ°μ λ°©λ²μ νμΈν΄λ³΄μΈμ", |
| cc=("μΈν°λ· νμ§ λΆλ§", "νμ¬ μΈν°λ· νμ§ μνλ₯Ό μ κ² μλ΄"), |
| agent="μΈν°λ· μ΄μ© νκ²½μ ν¨κ» μ κ²ν΄λ³ΌκΉμ?"), |
| dict(key="532", name="IPTV νμ§ λΆλ§", type="Rule", |
| features=["dissatisfaction_factor", "Churn Risk Index"], |
| entities=[], |
| push="IPTV νμ§ κ°μ λ°©λ²μ νμΈν΄λ³΄μΈμ", |
| cc=("IPTV νμ§ λΆλ§", "IPTV νμ§ μνλ₯Ό μ κ² μλ΄"), |
| agent="TV μ΄μ© νκ²½μ ν¨κ» μ κ²ν΄λ³ΌκΉμ?"), |
| dict(key="533", name="λͺ¨λ°μΌ λ°μ΄ν° νμ§ λΆλ§", type="Model", |
| features=["dissatisfaction_factor", "Churn Risk Index"], |
| entities=[], |
| push="λͺ¨λ°μΌ λ°μ΄ν° νμ§ κ°μ λ°©λ²μ νμΈν΄λ³΄μΈμ", |
| cc=("λͺ¨λ°μΌ λ°μ΄ν° νμ§ λΆλ§", "λ°μ΄ν° νμ§ μνλ₯Ό μ κ² μλ΄"), |
| agent="λ°μ΄ν° μ΄μ© νκ²½μ ν¨κ» μ κ²ν΄λ³ΌκΉμ?"), |
| dict(key="541", name="κ²°ν© ν΄μ§ μ μ°¨ νμΈ", type="Rule", |
| features=["Churn Risk Index", "Retention Readiness Index"], |
| entities=["cancel_process", "penalty"], |
| push="ν΄μ§ μ μ μ°¨μ λ³λ ννμ 미리 νμΈν΄λ³΄μΈμ", |
| cc=("ν΄μ§ κ²ν ", "ν΄μ§ μ μ°¨μ ν΄μ§ μ λ³λ μ¬νμ μλ΄"), |
| agent="ν΄μ§ μ λ³κ²½λλ λΆλΆμ 미리 μ 리ν΄λ릴κΉμ?"), |
| dict(key="542", name="κ²°ν© ν΄μ§ μμ½κΈ νμΈ", type="Rule", |
| features=["Churn Risk Index", "contract_status"], |
| entities=["penalty"], |
| push="ν΄μ§ μ μμ½κΈ μ 보λ₯Ό 미리 νμΈν΄λ³΄μΈμ", |
| cc=("μμ½κΈ νμΈ", "ν΄μ§ μ λ°μ κ°λ₯ν μμ½κΈμ μλ΄"), |
| agent="μ§κΈ ν΄μ§νλ©΄ μμ½κΈμ΄ μΌλ§λ λ°μνλμ§ νμΈν΄λ³ΌκΉμ?"), |
| dict(key="543", name="κ²°ν© ν΄μ§ μ μμ¬ νμ μν₯ νμΈ", type="Rule", |
| features=["Churn Risk Index", "Retention Readiness Index"], |
| entities=[], |
| push="ν΄μ§ μ λ³λλλ ννκ³Ό μν₯μ νμΈν΄λ³΄μΈμ", |
| cc=("ν΄μ§ μν₯ νμΈ", "ν΄μ§ μ λ³λλλ κ²°ν© ννμ μλ΄"), |
| agent="ν΄μ§νλ©΄ μ΄λ€ ννμ΄ μ¬λΌμ§λμ§ λΉκ΅ν΄λ³ΌκΉμ?"), |
| ] |
|
|
|
|
| def _l1_of(key: str) -> str: |
| return key[0] |
|
|
|
|
| def _l2_of(key: str) -> str: |
| return key[:2] |
|
|
|
|
| def build_intents() -> dict: |
| intents = [] |
| for t in TAX: |
| key = t["key"] |
| l1_id, l1_name = L1[_l1_of(key)] |
| l2_id, l2_name = L2[_l2_of(key)] |
| intents.append({ |
| "id": f"INT-B{key}0", |
| "name": t["name"], |
| "L1_id": l1_id, |
| "L1_name": l1_name, |
| "L2_id": l2_id, |
| "L2_name": l2_name, |
| "inference_type": t["type"], |
| "features": t["features"], |
| }) |
| return { |
| "scenario_id": SCENARIO_ID, |
| "version": "0.1.0", |
| "description": "κ²°ν© μν νμ±ν μλλ¦¬μ€ Intent Taxonomy", |
| "intents": intents, |
| } |
|
|
|
|
| CHANNELS = [ |
| {"id": "push", "name": "μ± Push", "icon": "π±", |
| "characteristic": "κ³ κ°μκ² μ§μ λ
ΈμΆλλ μλ¦Ό λ©μμ§ β νλ μ λΒ·νν μλ΄"}, |
| {"id": "call_center", "name": "κ³ κ°μΌν° μλ΄μ¬ 컨ν
μ€νΈ", "icon": "π", |
| "characteristic": "μ½Β·μ±ν
μΈμ
μ μλ΄μ¬ νλ©΄ 컨ν
μ€νΈ β μν© + μλ΄ κ°μ΄λ(κ³ κ° λμ λ¬Έμ₯ μλ)"}, |
| {"id": "agent", "name": "AI Agent", "icon": "π€", |
| "characteristic": "AI Agentκ° κ³ κ°μκ² λμ§λ κ°μΈν μ μΒ·λΉκ΅Β·λΆμ λ°ν"}, |
| ] |
|
|
|
|
| def build_actions() -> dict: |
| actions = {} |
| for t in TAX: |
| iid = f"INT-B{t['key']}0" |
| situation, guidance = t["cc"] |
| actions[iid] = { |
| "push": t["push"], |
| "call_center": {"situation": situation, "guidance": guidance}, |
| "agent": t["agent"], |
| } |
| return { |
| "scenario_id": SCENARIO_ID, |
| "version": "0.1.0", |
| "description": "κ²°ν© μλλ¦¬μ€ Intentλ³ 3μ±λ νμ© μμ", |
| "channels": CHANNELS, |
| "actions": actions, |
| } |
|
|
|
|
| |
| |
| STEP1_ENTITY_INTENTS = { |
| "benefit_check": ["INT-B2110", "INT-B2210", "INT-B2340"], |
| "bundle_discount_check": ["INT-B1110", "INT-B1210", "INT-B3110"], |
| "home_service_explore": ["INT-B1120", "INT-B3120", "INT-B3130", "INT-B3140"], |
| "contract_benefit_check": ["INT-B4110", "INT-B4120", "INT-B4210"], |
| "competitor_explore": ["INT-B5110", "INT-B5410", "INT-B5420"], |
| } |
|
|
|
|
| def build_behavior_intents() -> dict: |
| entity_intents: dict[str, list[str]] = {} |
| for t in TAX: |
| iid = f"INT-B{t['key']}0" |
| for ent in t["entities"]: |
| entity_intents.setdefault(ent, []).append(iid) |
| |
| for ent, iids in STEP1_ENTITY_INTENTS.items(): |
| entity_intents.setdefault(ent, []) |
| for iid in iids: |
| if iid not in entity_intents[ent]: |
| entity_intents[ent].append(iid) |
| |
| entity_intents.setdefault("back_to_step1", []) |
| entity_intents.setdefault("session_end", []) |
| return { |
| "scenario_id": SCENARIO_ID, |
| "version": "0.1.0", |
| "description": "κ²°ν© behaviors.json entity β μ§μ μ νΈ Intent λ§€ν", |
| "entity_intents": entity_intents, |
| } |
|
|
|
|
| def main() -> None: |
| emit_layers( |
| OUT_DIR / "engine", |
| taxonomy=build_intents(), |
| context_library=build_actions(), |
| behavior_signals=build_behavior_intents()["entity_intents"], |
| ) |
|
|
| |
| intents = build_intents()["intents"] |
| from collections import Counter |
| print("\nββ L1 λΆν¬ ββ") |
| for (lid, lname), c in sorted(Counter((i["L1_id"], i["L1_name"]) for i in intents).items()): |
| print(f" {lid} {lname}: {c}") |
| print("ββ inference_type ββ") |
| print(" ", Counter(i["inference_type"] for i in intents)) |
| bi = build_behavior_intents()["entity_intents"] |
| print(f"ββ behavior entities mapped: {len([k for k,v in bi.items() if v])} ββ") |
|
|
|
|
| if __name__ == "__main__": |
| main() |
|
|