File size: 7,948 Bytes
60d1d13
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
"""
Conversation Scripts Handler
Manages predefined scripts for standard conversation scenarios
"""

import os
import pandas as pd
from typing import Dict, Optional


class ConversationScripts:
    """Handler for conversation scripts and standard responses"""

    def __init__(self, scripts_file: Optional[str] = None):
        self.scripts = {}
        self.scripts_file = scripts_file

        # Default built-in scripts (fallback)
        self._load_default_scripts()

        # Load from file if provided
        if scripts_file and os.path.exists(scripts_file):
            self._load_scripts_from_file(scripts_file)
            print(f"✅ Loaded conversation scripts from {scripts_file}")
        else:
            print("⚠️ Using default built-in scripts")

    def _load_default_scripts(self):
        """Load default conversation scripts"""
        self.scripts = {
            "greeting": """Xin chào! Em là Trợ lý ảo Viettelpay Pro sẵn sàng hỗ trợ Anh/chị!
Hiện tại, Trợ lý ảo đang trong giai đoạn thử nghiệm hỗ trợ nghiệp vụ cước viễn thông, thẻ cào và thẻ game với các nội dung sau:
 - Hướng dẫn sử dụng
 - Chính sách phí bán hàng
 - Tìm hiểu quy định hủy giao dịch
 - Hướng dẫn xử lý một số lỗi thường gặp.

Anh/Chị vui lòng bấm vào từng chủ đề để xem chi tiết.
Nếu thông tin chưa đáp ứng nhu cầu, Anh/Chị hãy đặt lại câu hỏi để em tiếp tục hỗ trợ ạ!""",
            "out_of_scope": """Cảm ơn Anh/chị đã đặt câu hỏi!
Trợ lý ảo Viettelpay Pro đang thử nghiệm và cập nhật kiến thức nghiệp vụ để hỗ trợ Anh/chị tốt hơn. Vì vậy, rất tiếc nhu cầu hiện tại của Anh/chị nằm ngoài khả năng hỗ trợ của Trợ lý ảo.

Để được hỗ trợ chính xác và đầy đủ hơn, Anh/chị vui lòng gửi yêu cầu hỗ trợ tại đây""",
            "human_request_attempt_1": """Anh/Chị vui lòng chia sẻ thêm nội dung cần hỗ trợ, Em rất mong được giải đáp trực tiếp để tiết kiệm thời gian của Anh/Chị ạ!""",
            "human_request_attempt_2": """Rất tiếc! Hiện tại hệ thống chưa có Tư vấn viên hỗ trợ trực tuyến.
Tuy nhiên, Anh/chị vẫn có thể yêu cầu hỗ trợ được trợ giúp qua các hình thức sau: 
📌 1. Đặt câu hỏi ngay tại đây, Trợ lý ảo ViettelPay Pro luôn sẵn sàng hỗ trợ Anh/chị trong phạm vi nghiệp vụ thử nghiệm (nghiệp vụ cước viễn thông, thẻ cào, thẻ game):
✅ Hướng dẫn sử dụng
✅ Chính sách phí bán hàng
✅ Tìm hiểu về quy định hủy giao dịch
✅ Hướng dẫn xử lý một số lỗi thường gặp.
📌 2. Tìm hiểu thông tin nghiệp vụ tại mục:
📚 Hướng dẫn, hỗ trợ: Các video hướng dẫn nghiệp vụ
💡Thông báo: Các tin tức nghiệp vụ và tin nâng cấp hệ thống/tin sự cố.
📌 3. Gửi yêu cầu hỗ trợ tại đây
 Hoặc gọi Tổng đài 1789 nhánh 5 trong trường hợp khẩn cấp""",
            "confirmation_check": """Anh/Chị có thắc mắc thêm vấn đề nào liên quan đến nội dung em vừa cung cấp không ạ?""",
            "closing": """Hy vọng những thông tin vừa rồi đã đáp ứng nhu cầu của Anh/chị.
Nếu cần hỗ trợ thêm, Anh/Chị hãy đặt câu hỏi để em tiếp tục hỗ trợ ạ!
🌟 Chúc Anh/chị một ngày thật vui và thành công!""",
            "ask_for_clarity": """Em chưa hiểu rõ yêu cầu của Anh/chị. Anh/chị có thể chia sẻ cụ thể hơn được không ạ?""",
            "empathy_error": """Em hiểu Anh/chị đang gặp khó khăn với lỗi này. Để hỗ trợ Anh/chị tốt nhất, em sẽ tìm hiểu và đưa ra hướng giải quyết cụ thể.""",
        }

    def _load_scripts_from_file(self, file_path: str):
        """Load scripts from CSV file (kich_ban.csv format)"""
        try:
            df = pd.read_csv(file_path)

            # Map CSV scenarios to script keys
            scenario_mapping = {
                "Chào hỏi": "greeting",
                "Trao đổi thông tin chính": "out_of_scope",  # First occurrence
                "Trước khi kết thúc phiên": "confirmation_check",
                "Kết thúc": "closing",
            }

            for _, row in df.iterrows():
                scenario_type = row.get("Loại kịch bản", "")
                situation = row.get("Tình huống", "")
                script = row.get("Kịch bản chốt", "")

                # Handle specific mappings
                if scenario_type == "Chào hỏi":
                    self.scripts["greeting"] = script
                elif scenario_type == "Trao đổi thông tin chính":
                    if "ngoài nghiệp vụ" in situation:
                        self.scripts["out_of_scope"] = script
                    elif "gặp tư vấn viên" in situation:
                        if "Lần 1" in script:
                            self.scripts["human_request_attempt_1"] = (
                                script.split("Lần 1:")[1].split("Lần 2:")[0].strip()
                            )
                        if "Lần 2" in script:
                            self.scripts["human_request_attempt_2"] = script.split(
                                "Lần 2:"
                            )[1].strip()
                    elif "không đủ ý" in situation:
                        self.scripts["ask_for_clarity"] = (
                            "Em chưa hiểu rõ yêu cầu của Anh/chị. Anh/chị có thể chia sẻ cụ thể hơn được không ạ?"
                        )
                    elif "lỗi" in situation:
                        self.scripts["empathy_error"] = (
                            "Em hiểu Anh/chị đang gặp khó khăn với lỗi này."
                        )
                elif scenario_type == "Trước khi kết thúc phiên":
                    self.scripts["confirmation_check"] = script
                elif scenario_type == "Kết thúc":
                    self.scripts["closing"] = script

        except Exception as e:
            print(f"⚠️ Error loading scripts from file: {e}")
            print("Using default scripts instead")

    def get_script(self, script_type: str) -> Optional[str]:
        """Get script by type"""
        return self.scripts.get(script_type)

    def has_script(self, script_type: str) -> bool:
        """Check if script exists"""
        return script_type in self.scripts

    def get_all_script_types(self) -> list:
        """Get all available script types"""
        return list(self.scripts.keys())

    def add_script(self, script_type: str, script_content: str):
        """Add or update a script"""
        self.scripts[script_type] = script_content

    def get_stats(self) -> dict:
        """Get statistics about loaded scripts"""
        return {
            "total_scripts": len(self.scripts),
            "script_types": list(self.scripts.keys()),
            "source": "file" if self.scripts_file else "default",
        }


# Usage example
if __name__ == "__main__":
    # Test with default scripts
    scripts = ConversationScripts()
    print("📊 Scripts Stats:", scripts.get_stats())

    # Test specific scripts
    greeting = scripts.get_script("greeting")
    print(f"\n👋 Greeting Script:\n{greeting}")

    # Test loading from file (if available)
    try:
        scripts_with_file = ConversationScripts(
            "./viettelpay_docs/processed/kich_ban.csv"
        )
        print(f"\n📊 File-based Scripts Stats: {scripts_with_file.get_stats()}")
    except Exception as e:
        print(f"File loading test failed: {e}")