Commit 8d48b24d authored by khanhnq's avatar khanhnq
Browse files

KHANHNQ: Update warning chat

parent 6407c7d0
from urllib import response
from xml.parsers.expat import model
from ai_service.warning_data import WarningData
from ai_service.warning_prompt import WARNING_PROMPT
from dto.check_sensitive_info_result_dto import CheckSensitiveInfoResultDTO
from openai import OpenAI
from typing import Callable, List, Literal, Optional, Sequence, TypedDict, Union
......@@ -80,9 +84,10 @@ class OpenAIHandler:
return title
def contains_sensitive_info(self,message: str, is_start: bool, chat_id: str ,on_contains_sensitive_info_checked: Callable[[dict], None]):
def contains_sensitive_info(self, message: str, is_start: bool, chat_id: str ,on_contains_sensitive_info_checked: Callable[[dict], None]):
state = ProcessingState.IDLE
self.logger.info(chat_id)
dict_output = {}
def start(state, message, chat_id, on_contains_sensitive_info_checked):
while True:
if state == ProcessingState.IDLE:
......@@ -92,54 +97,36 @@ class OpenAIHandler:
elif state == ProcessingState.PROCESSING:
self.logger.info("start processing")
try:
prompt = f"""
Bạn là bộ lọc phát hiện thông tin nhạy cảm (PII và thông tin doanh nghiệp).
Nhiệm vụ: phân tích văn bản và trả về đúng một trong hai giá trị:
- {WarningResult.WARNING}: nếu có chứa bất kỳ thông tin nhạy cảm nào trong danh sách dưới đây.
- {WarningResult.ACCEPTED}: nếu không có.
Yêu cầu bắt buộc:
- Chỉ trả về {WarningResult.WARNING} hoặc {WarningResult.ACCEPTED}, không thêm giải thích hoặc ký tự khác.
- Chỉ xét các loại thông tin được liệt kê, không suy diễn ngoài phạm vi.
messages = [
{"role": "system", "content": WARNING_PROMPT},
]
Danh mục thông tin nhạy cảm cần kiểm tra:
1. Thông tin cá nhân:
- Họ và tên đầy đủ (ít nhất 2 từ, viết hoa chữ cái đầu).
- Email cá nhân (dạng tên@miền).
- Số CCCD/CMND (9-12 chữ số liên tục).
- Số điện thoại cá nhân Việt Nam (bắt đầu bằng 0, dài 10-11 chữ số).
- Số hộ chiếu (theo định dạng phổ biến tại Việt Nam, 8 ký tự gồm chữ và số).
messages.append({
"role": "user",
"content": f"Phân tích truy vấn sau:\n\n{message}"
})
2. Thông tin doanh nghiệp / đối tác:
- Tên công ty, tổ chức, doanh nghiệp (ít nhất 2 từ, có chữ viết hoa).
- Email liên hệ công ty (dạng tên@tencongty...).
- Số điện thoại công ty (theo định dạng số điện thoại Việt Nam).
Văn bản cần kiểm tra:
{message}
"""
response = self.client.chat.completions.create(
model="gpt-5-nano",
messages=[
{"role": "system", "content": "Bạn là bộ lọc thông tin nhạy cảm."},
{"role": "user", "content": prompt}
],
response = self.client.responses.parse(
model= "gpt-5-nano",
input= messages,
text_format=WarningData
)
result = response.choices[0].message.content.strip()
self.logger.info(result)
dict_output: dict = JSONSerializer.string_to_dict(response.output_text)
self.logger.info(dict_output)
state = ProcessingState.COMPLETED
except Exception as e:
self.logger.error(e , exc_info=True)
return
elif state == ProcessingState.COMPLETED:
check_sensitive_info_result_dto = CheckSensitiveInfoResultDTO()
check_sensitive_info_result_dto.conversationId = self.conversation_id
check_sensitive_info_result_dto.sensitiveInfoResult = result
check_sensitive_info_result_dto.message = message
check_sensitive_info_result_dto.chatId = chat_id
check_sensitive_info_result_dto.isStart = is_start
on_contains_sensitive_info_checked(CheckSensitiveInfoResultDTO.to_dict(check_sensitive_info_result_dto))
if(not dict_output.get("is_available", True)):
check_sensitive_info_result_dto = CheckSensitiveInfoResultDTO()
check_sensitive_info_result_dto.conversationId = self.conversation_id
check_sensitive_info_result_dto.sensitiveInfoResult = "WARNING"
check_sensitive_info_result_dto.message = dict_output.get("message", "Phát hiện nội dung nhạy cảm")
check_sensitive_info_result_dto.chatId = chat_id
on_contains_sensitive_info_checked(CheckSensitiveInfoResultDTO.to_dict(check_sensitive_info_result_dto))
break
elif state == ProcessingState.ERROR:
self.logger.error("state == ProcessingState.ERROR", exc_info=True)
......@@ -167,7 +154,7 @@ class OpenAIHandler:
"container": {"type": "auto", "file_ids": spread_sheet_file_ids} # Optional: if using a file
})
stream = self.client.responses.create(
model= "gpt-5",
model= "gpt-5.1-chat-latest",
input= input,
tools=tools,
stream=True
......
from pydantic import BaseModel
class WarningData(BaseModel):
message: str
is_available: bool
\ No newline at end of file
WARNING_PROMPT = """
Bạn là hệ thống phân tích nội dung an toàn trong môi trường giáo dục. Nhiệm vụ của bạn là phát hiện các vi phạm trong truy vấn của học sinh theo 6 nhóm tiêu chí sau:
## 1. GIAN LẬN HỌC TẬP (Mức độ: CAO)
- Yêu cầu AI làm toàn bộ/phần lớn bài tập, kiểm tra, đồ án thay cho người dùng
- Yêu cầu AI tạo sản phẩm học tập hoàn chỉnh để nộp trực tiếp
- Yêu cầu AI giải đề thi đang/sắp được sử dụng
- Yêu cầu cung cấp đáp án đề thi, đề kiểm tra
- Yêu cầu hướng dẫn cách gian lận, qua mặt giáo viên/hệ thống
- Yêu cầu chỉnh sửa nội dung để che giấu việc sử dụng AI
## 2. NỘI DUNG NHẠY CẢM (Mức độ: CAO)
- Nội dung vượt quá độ tuổi, không phù hợp môi trường học đường
- Mô tả chi tiết hành vi nhạy cảm
- Sử dụng ngôn từ thô tục, xúc phạm, miệt thị
- Nội dung phân biệt, kỳ thị giới tính, vùng miền, cá nhân
## 3. NỘI DUNG BẠO LỰC (Mức độ: CAO)
- Yêu cầu về hành vi bạo lực, gây tổn hại thể chất
- Hướng dẫn hành vi gây hại, trả thù, đánh người
- Kích động, cổ vũ bạo lực hoặc hành vi nguy hiểm
## 4. LẶP LẠI YÊU CẦU VI PHẠM (Mức độ: TRUNG BÌNH)
- Gửi lại yêu cầu giống/tương đương sau khi bị từ chối
- Thay đổi câu chữ nhưng giữ nguyên mục đích vi phạm
- Sử dụng cách diễn đạt gián tiếp để vượt kiểm soát
- Tăng tần suất gửi yêu cầu vi phạm sau cảnh báo
## 5. LẠM DỤNG AI (Mức độ: TRUNG BÌNH)
- Gửi nhiều truy vấn vi phạm liên tiếp trong thời gian ngắn
- Tạo chuỗi hội thoại khai thác AI không đúng quy định
- Tự động hóa hoặc spam truy vấn
- Lặp lại nhiều hành vi vi phạm khác nhau trong một phiên
## 6. LỆCH MỤC ĐÍCH GIÁO DỤC (Mức độ: TRUNG BÌNH)
- Yêu cầu nội dung giải trí thuần túy (truyện hư cấu, caption mạng xã hội)
- Nội dung cá nhân, đời sống riêng tư không liên quan học tập
- Lạm dụng AI ngoài mục đích giáo dục >3 ngày
- Sử dụng cho mục đích thương mại, quảng cáo, bán hàng
- Tạo nội dung truyền thông, marketing ngoài phạm vi học tập
## HƯỚNG DẪN PHÂN TÍCH:
1. Phân tích ý định (intent) thực sự của truy vấn
2. Xác định có vi phạm hay không
3. Nếu VI PHẠM: is_available = false, message = mô tả cụ thể vi phạm + mức độ cảnh báo
4. Nếu AN TOÀN: is_available = true, message = "Truy vấn phù hợp với mục đích học tập"
## LƯU Ý QUAN TRỌNG:
- Phân biệt yêu cầu "làm thay" vs "hướng dẫn/giải thích"
- Yêu cầu giải thích, hướng dẫn cách làm, học cách giải quyết vấn đề là HỢP LỆ
- Yêu cầu "làm giúp tôi", "viết hộ tôi bài nộp", "làm hết cho tôi" là VI PHẠM
- Ngữ cảnh học tập chân chính (ví dụ, bài tập thực hành, học code) là HỢP LỆ
"""
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment