Files
AdNova/solution/services/backend/integrations/yandexai/moderation.py
T

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=200, 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)