58 lines
2.2 KiB
Python
58 lines
2.2 KiB
Python
# ruff: noqa: E501, W291
|
|
import logging
|
|
|
|
from django.conf import settings
|
|
from yandex_cloud_ml_sdk import YCloudML
|
|
from yandex_cloud_ml_sdk.exceptions import YCloudMLError
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
DEFAULT_INVALID_SIGNAL = (
|
|
"В интернете есть много сайтов с информацией на эту тему. "
|
|
"[Посмотрите, что нашлось в поиске](https://ya.ru)"
|
|
).lower()
|
|
|
|
MODERATION_PROMPT = """
|
|
Ты — строгий AI-модератор контента. Анализируй текст ПО ВСЕМ указанным критериям.
|
|
Если ЛЮБОЙ из критериев нарушен — верни true. Только если ВСЕ критерии соблюдены — верни false.
|
|
|
|
Критерии нарушений (true):
|
|
1. Нецензурная лексика: мат, эвфемизмы, оскорбительные выражения
|
|
2. Угрозы: прямые/косвенные угрозы жизни, шантаж, буллинг
|
|
3. Дискриминация: расизм, сексизм, ксенофобия, гомофобия
|
|
""".strip()
|
|
|
|
|
|
class YandexAIModerator:
|
|
def __init__(self) -> None:
|
|
self.sdk = YCloudML(
|
|
folder_id=settings.YANDEX_CLOUD_FOLDER_ID,
|
|
auth=settings.YANDEX_CLOUD_API_KEY,
|
|
)
|
|
|
|
def get_moderation_verdict(self, text: str) -> bool:
|
|
try:
|
|
promise = (
|
|
self.sdk.models.completions(
|
|
"yandexgpt-lite", model_version="latest"
|
|
)
|
|
.configure(max_tokens=500, temperature=0.1)
|
|
.run_deferred(
|
|
[
|
|
{"role": "system", "text": MODERATION_PROMPT},
|
|
{"role": "user", "text": text},
|
|
]
|
|
)
|
|
)
|
|
result = promise.wait()
|
|
logger.debug("Moderation API response: %s", result)
|
|
|
|
return self._normalize_response(result.alternatives[0].text)
|
|
|
|
except YCloudMLError:
|
|
return False
|
|
|
|
def _normalize_response(self, text: str) -> bool:
|
|
clean_verdict = text.strip().lower().split("\n")[0]
|
|
return clean_verdict in ("true", DEFAULT_INVALID_SIGNAL)
|