update message
Browse files- app/constants.py +29 -1
- app/message_processor.py +6 -6
- app/reranker.py +7 -7
- app/utils.py +23 -2
app/constants.py
CHANGED
|
@@ -118,7 +118,7 @@ VIETNAMESE_STOP_WORDS = {
|
|
| 118 |
"mà", "mỗi", "một", "nên", "nếu", "ngay", "như", "nhưng", "những",
|
| 119 |
"nơi", "nữa", "phải", "qua", "ra", "rằng", "rất", "rồi", "sau", "sẽ",
|
| 120 |
"thì", "trên", "trước", "từ", "từng", "và", "vẫn", "vào", "vậy", "về",
|
| 121 |
-
"vì", "việc", "với", "xong", "phạt", "xử", "xe"
|
| 122 |
# ... thêm các từ khác bạn muốn loại bỏ
|
| 123 |
}
|
| 124 |
|
|
@@ -156,4 +156,32 @@ SUMMARY_STATUS_MESSAGES = [
|
|
| 156 |
"Mình đang chốt lại các điểm chính để trả lời một cách trọn vẹn"
|
| 157 |
]
|
| 158 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 159 |
SHEET_RANGE = 'chat!A2:L'
|
|
|
|
| 118 |
"mà", "mỗi", "một", "nên", "nếu", "ngay", "như", "nhưng", "những",
|
| 119 |
"nơi", "nữa", "phải", "qua", "ra", "rằng", "rất", "rồi", "sau", "sẽ",
|
| 120 |
"thì", "trên", "trước", "từ", "từng", "và", "vẫn", "vào", "vậy", "về",
|
| 121 |
+
"vì", "việc", "với", "xong", "phạt", "xử", "xe"
|
| 122 |
# ... thêm các từ khác bạn muốn loại bỏ
|
| 123 |
}
|
| 124 |
|
|
|
|
| 156 |
"Mình đang chốt lại các điểm chính để trả lời một cách trọn vẹn"
|
| 157 |
]
|
| 158 |
|
| 159 |
+
# Processing status messages for Facebook notifications when processing/searching
|
| 160 |
+
PROCESSING_STATUS_MESSAGES = [
|
| 161 |
+
"Okie, mình kiểm tra lại thông tin liền nha!",
|
| 162 |
+
"Để mình rà lại chút, xong mình phản hồi ngay.",
|
| 163 |
+
"Mình đang xem lại phần này, xử lý xong báo bạn liền.",
|
| 164 |
+
"Mình check lại một chút cho chắc nhé!",
|
| 165 |
+
"Ok, mình đang xem lại để đảm bảo chính xác.",
|
| 166 |
+
"Mình xem lại thông tin rồi cập nhật bạn ngay.",
|
| 167 |
+
"Để mình xử lý phần này trước đã nhé!",
|
| 168 |
+
"Mình đang kiểm tra lại, sẽ báo liền khi xong.",
|
| 169 |
+
"Ok bạn, để mình coi lại rồi chốt luôn.",
|
| 170 |
+
"Mình đang coi lại nội dung này, có gì mình nói liền."
|
| 171 |
+
]
|
| 172 |
+
|
| 173 |
+
# Found regulations status messages for Facebook notifications when regulations are found
|
| 174 |
+
FOUND_REGULATIONS_MESSAGES = [
|
| 175 |
+
"Mình có thấy một vài quy định liên quan, đang xác minh lại và sẽ phản hồi sớm.",
|
| 176 |
+
"Tạm thời đã tra được một số quy định, mình đang kiểm tra thêm rồi cập nhật liền nhé.",
|
| 177 |
+
"Mình đang đối chiếu lại thông tin vừa tìm được, sẽ báo bạn ngay khi rõ.",
|
| 178 |
+
"Có một vài chỗ trong quy định mình đang xem lại cho chắc, sẽ phản hồi sớm thôi.",
|
| 179 |
+
"Mình đã tìm thấy một số điểm có liên quan, đang xác thực thêm để phản hồi cụ thể.",
|
| 180 |
+
"Thông tin bước đầu đã có, mình đang kiểm tra thêm rồi gửi lại ngay khi hoàn tất.",
|
| 181 |
+
"Mình đang kiểm tra kỹ hơn những gì vừa tìm được, sẽ gửi bạn sớm nhất có thể.",
|
| 182 |
+
"Một số quy định đang được mình rà lại lần nữa, sẽ phản hồi lại ngay khi rõ ràng.",
|
| 183 |
+
"Mình có dữ liệu sơ bộ rồi, đang xác minh thêm để đảm bảo chính xác trước khi trả lời.",
|
| 184 |
+
"Thông tin đang được mình kiểm tra lại lần cuối, mình sẽ cập nhật sớm nhất nhé."
|
| 185 |
+
]
|
| 186 |
+
|
| 187 |
SHEET_RANGE = 'chat!A2:L'
|
app/message_processor.py
CHANGED
|
@@ -2,8 +2,8 @@ from typing import Dict, Any, List
|
|
| 2 |
import asyncio
|
| 3 |
import traceback
|
| 4 |
from loguru import logger
|
| 5 |
-
import
|
| 6 |
-
from .
|
| 7 |
|
| 8 |
class MessageProcessor:
|
| 9 |
def __init__(self, channel):
|
|
@@ -120,14 +120,14 @@ class MessageProcessor:
|
|
| 120 |
return
|
| 121 |
# Gửi message Facebook, nếu lỗi token expired thì invalidate và thử lại một lần
|
| 122 |
try:
|
| 123 |
-
await self.channel.facebook.send_message(message=
|
| 124 |
except Exception as e:
|
| 125 |
if "expired" in str(e).lower():
|
| 126 |
logger.warning("[FACEBOOK] Token expired, invalidate and refresh")
|
| 127 |
self.channel.invalidate_page_token()
|
| 128 |
page_token = self.channel.get_page_token(force_refresh=True)
|
| 129 |
self.channel.facebook.update_context(page_id=page_id, page_token=page_token, sender_id=sender_id)
|
| 130 |
-
await self.channel.facebook.send_message(message="Ok, để mình check. Bạn chờ mình chút xíu nhé!")
|
| 131 |
else:
|
| 132 |
raise
|
| 133 |
|
|
@@ -256,7 +256,7 @@ class MessageProcessor:
|
|
| 256 |
async def format_search_results(self, question: str, matches: List[Dict[str, Any]], page_token: str, sender_id: str) -> str:
|
| 257 |
if not matches:
|
| 258 |
return "Không tìm thấy kết quả phù hợp."
|
| 259 |
-
await self.channel.facebook.send_message(message=
|
| 260 |
try:
|
| 261 |
reranked = await self.channel.reranker.rerank(question, matches, top_k=5)
|
| 262 |
if reranked:
|
|
@@ -328,7 +328,7 @@ class MessageProcessor:
|
|
| 328 |
"\n\nHãy trả lời ngắn gọn, dễ hiểu, trích dẫn rõ ràng thông tin từ các đoạn luật nếu cần."
|
| 329 |
f"\n\nCâu hỏi của người dùng: {question}\n"
|
| 330 |
)
|
| 331 |
-
await self.channel.facebook.send_message(message=f"... {
|
| 332 |
try:
|
| 333 |
answer = await self.channel.llm.generate_text(prompt)
|
| 334 |
if answer and answer.strip():
|
|
|
|
| 2 |
import asyncio
|
| 3 |
import traceback
|
| 4 |
from loguru import logger
|
| 5 |
+
from .constants import SUMMARY_STATUS_MESSAGES, PROCESSING_STATUS_MESSAGES, FOUND_REGULATIONS_MESSAGES
|
| 6 |
+
from .utils import get_random_message
|
| 7 |
|
| 8 |
class MessageProcessor:
|
| 9 |
def __init__(self, channel):
|
|
|
|
| 120 |
return
|
| 121 |
# Gửi message Facebook, nếu lỗi token expired thì invalidate và thử lại một lần
|
| 122 |
try:
|
| 123 |
+
await self.channel.facebook.send_message(message=get_random_message(PROCESSING_STATUS_MESSAGES))
|
| 124 |
except Exception as e:
|
| 125 |
if "expired" in str(e).lower():
|
| 126 |
logger.warning("[FACEBOOK] Token expired, invalidate and refresh")
|
| 127 |
self.channel.invalidate_page_token()
|
| 128 |
page_token = self.channel.get_page_token(force_refresh=True)
|
| 129 |
self.channel.facebook.update_context(page_id=page_id, page_token=page_token, sender_id=sender_id)
|
| 130 |
+
# await self.channel.facebook.send_message(message="Ok, để mình check. Bạn chờ mình chút xíu nhé!")
|
| 131 |
else:
|
| 132 |
raise
|
| 133 |
|
|
|
|
| 256 |
async def format_search_results(self, question: str, matches: List[Dict[str, Any]], page_token: str, sender_id: str) -> str:
|
| 257 |
if not matches:
|
| 258 |
return "Không tìm thấy kết quả phù hợp."
|
| 259 |
+
await self.channel.facebook.send_message(message=get_random_message(FOUND_REGULATIONS_MESSAGES))
|
| 260 |
try:
|
| 261 |
reranked = await self.channel.reranker.rerank(question, matches, top_k=5)
|
| 262 |
if reranked:
|
|
|
|
| 328 |
"\n\nHãy trả lời ngắn gọn, dễ hiểu, trích dẫn rõ ràng thông tin từ các đoạn luật nếu cần."
|
| 329 |
f"\n\nCâu hỏi của người dùng: {question}\n"
|
| 330 |
)
|
| 331 |
+
await self.channel.facebook.send_message(message=f"... {get_random_message(SUMMARY_STATUS_MESSAGES)} ...")
|
| 332 |
try:
|
| 333 |
answer = await self.channel.llm.generate_text(prompt)
|
| 334 |
if answer and answer.strip():
|
app/reranker.py
CHANGED
|
@@ -3,10 +3,10 @@ from .config import get_settings
|
|
| 3 |
from .gemini_client import GeminiClient
|
| 4 |
from loguru import logger
|
| 5 |
import asyncio
|
| 6 |
-
import random
|
| 7 |
import hashlib
|
| 8 |
import time
|
| 9 |
from .constants import BATCH_STATUS_MESSAGES
|
|
|
|
| 10 |
|
| 11 |
class Reranker:
|
| 12 |
def __init__(self, facebook_client=None):
|
|
@@ -245,12 +245,12 @@ class Reranker:
|
|
| 245 |
scored.append(doc)
|
| 246 |
|
| 247 |
# Gửi Facebook message sau khi hoàn thành
|
| 248 |
-
|
| 249 |
-
|
| 250 |
-
|
| 251 |
-
|
| 252 |
-
|
| 253 |
-
|
| 254 |
|
| 255 |
# Sort theo score và trả về top_k
|
| 256 |
scored = sorted(scored, key=lambda x: x['rerank_score'], reverse=True)
|
|
|
|
| 3 |
from .gemini_client import GeminiClient
|
| 4 |
from loguru import logger
|
| 5 |
import asyncio
|
|
|
|
| 6 |
import hashlib
|
| 7 |
import time
|
| 8 |
from .constants import BATCH_STATUS_MESSAGES
|
| 9 |
+
from .utils import get_random_message
|
| 10 |
|
| 11 |
class Reranker:
|
| 12 |
def __init__(self, facebook_client=None):
|
|
|
|
| 245 |
scored.append(doc)
|
| 246 |
|
| 247 |
# Gửi Facebook message sau khi hoàn thành
|
| 248 |
+
if self.facebook_client:
|
| 249 |
+
try:
|
| 250 |
+
message = get_random_message(BATCH_STATUS_MESSAGES)
|
| 251 |
+
await self.facebook_client.send_message(message=f"... {message} ...")
|
| 252 |
+
except Exception as e:
|
| 253 |
+
logger.error(f"[RERANK][FACEBOOK] Error sending batch message: {e}")
|
| 254 |
|
| 255 |
# Sort theo score và trả về top_k
|
| 256 |
scored = sorted(scored, key=lambda x: x['rerank_score'], reverse=True)
|
app/utils.py
CHANGED
|
@@ -1,7 +1,8 @@
|
|
| 1 |
import time
|
|
|
|
| 2 |
from functools import wraps
|
| 3 |
from loguru import logger
|
| 4 |
-
from typing import Any, Callable
|
| 5 |
import os
|
| 6 |
import asyncio
|
| 7 |
import httpx
|
|
@@ -136,4 +137,24 @@ async def call_endpoint_with_retry(client, url, payload, max_retries=3, base_tim
|
|
| 136 |
raise
|
| 137 |
except Exception as e:
|
| 138 |
logger.error(f"Other error: {e}")
|
| 139 |
-
raise
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
import time
|
| 2 |
+
import random
|
| 3 |
from functools import wraps
|
| 4 |
from loguru import logger
|
| 5 |
+
from typing import Any, Callable, List
|
| 6 |
import os
|
| 7 |
import asyncio
|
| 8 |
import httpx
|
|
|
|
| 137 |
raise
|
| 138 |
except Exception as e:
|
| 139 |
logger.error(f"Other error: {e}")
|
| 140 |
+
raise
|
| 141 |
+
|
| 142 |
+
def get_random_message(message_list: List[str]) -> str:
|
| 143 |
+
"""
|
| 144 |
+
Lấy ngẫu nhiên một message từ danh sách messages.
|
| 145 |
+
|
| 146 |
+
Args:
|
| 147 |
+
message_list (List[str]): Danh sách các messages có sẵn
|
| 148 |
+
|
| 149 |
+
Returns:
|
| 150 |
+
str: Message được chọn ngẫu nhiên, hoặc message mặc định nếu danh sách rỗng
|
| 151 |
+
|
| 152 |
+
Example:
|
| 153 |
+
>>> messages = ["Message 1", "Message 2", "Message 3"]
|
| 154 |
+
>>> get_random_message(messages)
|
| 155 |
+
"Message 2" # hoặc message khác ngẫu nhiên
|
| 156 |
+
"""
|
| 157 |
+
if not message_list:
|
| 158 |
+
return "Đang xử lý..."
|
| 159 |
+
|
| 160 |
+
return random.choice(message_list)
|