minhan6559's picture
Upload 73 files
60d1d13 verified
"""
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}")