# -*- coding: utf-8 -*- """ Модуль самокритики: оценивает качество сгенерированного ответа. Проверяет соответствие источнику, отсутствие галлюцинаций, соблюдение стиля и логику. АДАПТАЦИЯ: теперь функция принимает промпт как аргумент. """ import logging import re from core.services.giga_client import GigaClient logger = logging.getLogger(__name__) async def critique_answer( giga: GigaClient, query: str, context: str, answer: str, prompt_text: str, bot_config, ) -> bool: """ Оценивает ответ, возвращает True, если ответ приемлем, иначе False. Аргументы: giga (GigaClient): клиент GigaChat query (str): исходный вопрос пользователя context (str): контекст из базы знаний answer (str): сгенерированный ответ prompt_text (str): содержимое промпта самокритики bot_config (BotConfig): объект конфигурации Возвращает: bool: True если ответ хороший, False если есть замечания """ if not prompt_text: logger.debug("Промпт самокритики не загружен, пропускаем проверку") return True crit_cfg = getattr(bot_config, 'critique', {}) temperature = crit_cfg.get('temperature', 0.1) if isinstance(temperature, dict): temperature = 0.1 full_prompt = f"{prompt_text}\n\nВопрос: {query}\nКонтекст:\n{context}\nОтвет:\n{answer}" try: response = await giga.chat( history=[], query=full_prompt, system_prompt=None, file_id=None, temperature=temperature ) verdict = response.strip() if re.search(r'\[OK\]|ПРИЕМЛЕМ', verdict, re.IGNORECASE): return True elif re.search(r'\[ISSUES\]', verdict, re.IGNORECASE): return False else: logger.warning(f"Самокритика вернула неопределённый ответ: {verdict[:200]}") return True except Exception as e: logger.error(f"Ошибка самокритики: {e}", exc_info=True) return True # При ошибке пропускаем проверку