From 9c5914caa995d96aca3ebfef0837cc5a146d95a6 Mon Sep 17 00:00:00 2001 From: Markov Andrey Date: Tue, 30 Jun 2026 09:10:39 +0000 Subject: [PATCH] Add new file --- core/functions/critique_answer.py | 68 +++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 core/functions/critique_answer.py diff --git a/core/functions/critique_answer.py b/core/functions/critique_answer.py new file mode 100644 index 0000000..82012da --- /dev/null +++ b/core/functions/critique_answer.py @@ -0,0 +1,68 @@ +# -*- 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 # При ошибке пропускаем проверку \ No newline at end of file