Spaces:
Running
Running
| """ | |
| 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}") | |