dammmmmmmmm commited on
Commit
b0dd369
·
verified ·
1 Parent(s): 2e9eead

Upload strategy_low_data.py

Browse files
backend/ai/strategy/strategy_low_data.py CHANGED
@@ -1,76 +1,89 @@
1
- import time
2
-
3
- class LowDataStrategy:
4
- def __init__(self, llm_client, data_engine):
5
- self.llm_client = llm_client
6
- self.data_engine = data_engine
7
-
8
- # --- KỊCH BẢN "VĂN NÓI" (HUMANIZED SCRIPT) ---
9
- # Nội dung gốc của bạn đã được chuyển sang giọng văn chia sẻ, thêm từ nối.
10
- CORE_MESSAGE = (
11
- "Dạ, em rất xin lỗi trải nghiệm mạng vừa qua chưa đáp ứng được nhu cầu công việc của mình."
12
- "Sau khi kiểm tra, em thấy gói cước hiện tại của mình tập trung nhiều ưu đãi miễn phí cho các mạng xã hội (Facebook, TikTok...), "
13
- "tuy nhiên dung lượng Data tốc độ cao chung để dùng cho việc họp online, check mail hay truy cập hệ thống thì lại hơi hạn chế.\n\n"
14
- "Với nhu cầu làm việc cần kết nối ổn định, bên em hiện có các gói chuyên biệt với dung lượng tốc độ cao lớn hơn hẳn, "
15
- "giúp đường truyền mượt mà ngay cả trong giờ cao điểm mà không bị giới hạn ứng dụng.\n\n"
16
- "Em xin phép giới thiệu qua về quyền lợi gói này để mình xem thử phù hợp hơn không ạ?"
17
- )
18
-
19
- def execute(self, customer_id, complaint_text):
20
- # 1. TRÍCH XUẤT DỮ LIỆU
21
- ctx = self.data_engine.get_full_context(customer_id)
22
- if not ctx: return "Lỗi: Không tìm thấy khách hàng."
23
-
24
- # Log kiểm tra
25
- print(f" ⚡ [Strategy LowData] ID {customer_id}: Input: '{complaint_text}'")
26
-
27
- # 2. XÂY DỰNG PROMPT
28
- prompt = f"""
29
- VAI TRÒ: Bạn là nhân viên Kỹ thuật & CSKH tận tâm, giọng điệu nhẹ nhàng.
30
-
31
- DỮ LIỆU ĐẦU VÀO:
32
- - Phàn nàn của khách: "{complaint_text}"
33
- - Nội dung cốt lõi (CORE MESSAGE):
34
- '''
35
- {self.CORE_MESSAGE}
36
- '''
37
-
38
- NHIỆM VỤ:
39
- Phản hồi khách hàng dựa trên CORE MESSAGE.
40
-
41
- YÊU CẦU VỀ GIỌNG ĐIỆU (TONE & VOICE):
42
- 1. **Mở đầu:** Đồng cảm ngay lập tức với sự bất tiện của khách.
43
- 2. **Thân bài:** Sử dụng nội dung CORE MESSAGE.
44
- - Giữ nguyên các từ nối tạo nhịp điệu: "Thực sự", "Tuy nhiên", "Do đó", "Cứ để em".
45
- - Tránh giải thích kỹ thuật khô khan, hãy nói như đang chia sẻ mẹo vặt.
46
-
47
- QUY TẮC AN TOÀN (ANTI-HALLUCINATION):
48
- - Tuyệt đối KHÔNG tự bịa ra nguyên nhân khác (virus, hack...) ngoài những gì đã nêu.
49
- - Tuyệt đối KHÔNG hứa tặng cụ thể bao nhiêu GB (chỉ nói "hỗ trợ tặng data bổ sung" như kịch bản).
50
- - Xưng hô: BẮT BUỘC dùng "Mình" "Em".
51
-
52
- OUTPUT:
53
- Trả về đoạn hội thoại hoàn chỉnh.
54
- """
55
-
56
- # 3. GỌI LLM
57
- if self.llm_client:
58
- try:
59
- response = self.llm_client.generate_content(prompt)
60
-
61
- # Hậu xử : Lớp bảo vệ cuối cùng cho xưng hô
62
- final_text = response.text
63
- replacements = {
64
- "Anh": "Mình", "Chị": "Mình", "Quý khách": "Mình",
65
- "anh": "mình", "chị": "mình",
66
- "chi phí phát sinh": "chi phí ngoài ý muốn" # Chuẩn hóa từ ngữ
67
- }
68
- for old, new in replacements.items():
69
- final_text = final_text.replace(old, new)
70
-
71
- return final_text
72
- except Exception as e:
73
- # Fallback: Trả về kịch bản cứng nếu API lỗi
74
- return "Dạ, em rất tiếc về trải nghiệm này ạ. " + self.CORE_MESSAGE
75
- else:
76
- return "Lỗi: Chưa kết nối LLM Client."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import time
2
+ import re
3
+ import asyncio
4
+
5
+ class LowDataStrategy:
6
+ def __init__(self, llm_client, data_engine):
7
+ self.llm_client = llm_client
8
+ self.data_engine = data_engine
9
+
10
+ self.cleaner_regex = re.compile(
11
+ r"^(.*?>>>|dưới đây là.*?|sau đây là.*?|câu trả lời.*?|đoạn văn.*?|viết lại.*?|output:)",
12
+ re.IGNORECASE | re.MULTILINE | re.DOTALL
13
+ )
14
+
15
+ CORE_MESSAGE = (
16
+ "Dạ, em rất xin lỗi trải nghiệm mạng vừa qua chưa đáp ứng được nhu cầu công việc của mình. "
17
+ "Sau khi kiểm tra, em thấy gói cước hiện tại của mình tập trung nhiều ưu đãi miễn phí cho các mạng xã hội như Facebook hay TikTok, "
18
+ "tuy nhiên dung lượng Data tốc độ cao chung để dùng cho việc họp online, check mail hay truy cập hệ thống thì lại hơi hạn chế. "
19
+ "Với nhu cầu làm việc cần kết nối ổn định, bên em hiện có các gói chuyên biệt v���i dung lượng tốc độ cao lớn hơn hẳn, "
20
+ "giúp đường truyền mượt ngay cả trong giờ cao điểm mà không bị giới hạn ứng dụng. "
21
+ "Em xin phép giới thiệu sơ qua về quyền lợi gói này để mình xem thử có phù hợp hơn không ạ?"
22
+ )
23
+
24
+ def execute(self, customer_id, complaint_text):
25
+ ctx = self.data_engine.get_full_context(customer_id)
26
+ if not ctx: return "Lỗi: Không tìm thấy khách hàng."
27
+
28
+ print(f" ⚡ [Strategy LowData] ID {customer_id}: Input: '{complaint_text}'")
29
+
30
+ prompt = f"""
31
+ Nhiệm vụ: Đóng vai nhân viên CSKH, nói lại nội dung sau với khách (Xưng Em - Mình).
32
+ NỘI DUNG GỐC: "{self.CORE_MESSAGE}"
33
+ YÊU CẦU:
34
+ - Bỏ qua mọi lời chào hỏi, giải thích.
35
+ - Bắt đầu ngay lập tức bằng nội dung hội thoại.
36
+ - KHÔNG xuống dòng.
37
+ BẮT ĐẦU TRẢ LỜI NGAY SAU DẤU MŨI TÊN:
38
+ >>> """
39
+
40
+ if self.llm_client:
41
+ try:
42
+ response = self.llm_client.generate_content(prompt)
43
+ raw_text = response.text.strip()
44
+
45
+ if ">>>" in raw_text:
46
+ final_text = raw_text.split(">>>")[-1].strip()
47
+ else:
48
+ final_text = self.cleaner_regex.sub("", raw_text).strip()
49
+
50
+ if "\n" in final_text:
51
+ final_text = " ".join([l.strip() for l in final_text.split('\n') if l.strip()])
52
+
53
+ replacements = { "Anh/Chị": "Mình", "Quý khách": "Mình", "Anh": "Mình", "Chị": "Mình", "anh": "mình", "chị": "mình", "chi phí phát sinh": "chi phí ngoài ý muốn" }
54
+ for old, new in replacements.items():
55
+ if old in final_text or old.lower() in final_text.lower():
56
+ final_text = final_text.replace(old, new)
57
+
58
+ if not final_text: return self.CORE_MESSAGE.replace("\n", " ")
59
+ return final_text
60
+ except Exception as e:
61
+ print(f" [ERROR] LowData Strategy: {e}")
62
+ return self.CORE_MESSAGE.replace("\n", " ")
63
+ else:
64
+ return "Lỗi: Chưa kết nối LLM Client."
65
+
66
+ # --- [NEW] HÀM STREAMING ---
67
+ async def execute_stream_gen(self, customer_id, complaint_text):
68
+ print(f" 🌊 [Stream LowData] ID {customer_id}")
69
+
70
+ prompt = f"""
71
+ Nhiệm vụ: Đóng vai nhân viên CSKH, nói lại nội dung sau với khách (Xưng Em - Mình).
72
+ NỘI DUNG GỐC: "{self.CORE_MESSAGE}"
73
+ YÊU CẦU:
74
+ - Bắt đầu ngay lập tức bằng nội dung hội thoại.
75
+ - KHÔNG có lời dẫn.
76
+ BẮT ĐẦU TRẢ LỜI NGAY SAU DẤU MŨI TÊN:
77
+ >>> """
78
+
79
+ if self.llm_client and hasattr(self.llm_client, 'ai_service'):
80
+ try:
81
+ async for chunk in self.llm_client.ai_service.chat_gemini_stream(prompt):
82
+ if ">>>" in chunk:
83
+ chunk = chunk.replace(">>>", "")
84
+ yield chunk
85
+ except Exception as e:
86
+ print(f"Stream Error: {e}")
87
+ yield self.CORE_MESSAGE
88
+ else:
89
+ yield self.CORE_MESSAGE