From c61c61d87ed1f06d068671fa4c53d238ecb9f790 Mon Sep 17 00:00:00 2001 From: Markov Andrey Date: Tue, 30 Jun 2026 09:12:33 +0000 Subject: [PATCH] Add new file --- core/functions/intent_classify.py | 89 +++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 core/functions/intent_classify.py diff --git a/core/functions/intent_classify.py b/core/functions/intent_classify.py new file mode 100644 index 0000000..2214582 --- /dev/null +++ b/core/functions/intent_classify.py @@ -0,0 +1,89 @@ +# -*- coding: utf-8 -*- +""" +Модуль классификации намерений пользователя. +Определяет тип запроса: METRICS, SUMMARY, CONTRADICTION, SURGICAL, GREETING и др. + +АДАПТАЦИЯ: теперь функция принимает промпт как аргумент, а не использует глобальный. +""" + +import logging +import time +from core.services.giga_client import GigaClient + +logger = logging.getLogger(__name__) + +# Список всех допустимых кодов намерений +VALID_INTENTS = { + "METRICS", "SUMMARY", "CONTRADICTION", "FACT", "PROCEDURE", + "COMPARISON", "CALCULATION", "SURGICAL", "GREETING", "TEMPLATE_FILL", + "SPELLCHECK" +} + +# Кэш для классификации (in-memory) +_intent_cache = {} +_CACHE_TTL = 300 # 5 минут + + +async def classify_intent( + giga: GigaClient, + query: str, + prompt_text: str, + bot_config, +) -> str: + """ + Классифицирует намерение пользователя на основе текста запроса. + + Аргументы: + giga (GigaClient): клиент GigaChat + query (str): исходный запрос пользователя + prompt_text (str): содержимое промпта классификации (передаётся из оркестратора) + bot_config (BotConfig): объект конфигурации бота + + Возвращает: + str: один из кодов VALID_INTENTS или "GENERAL" + """ + if not prompt_text: + logger.warning("Промпт классификации пуст, возвращаем GENERAL") + return "GENERAL" + + # Проверка кэша + cache_key = query.strip().lower() + now = time.time() + if cache_key in _intent_cache: + cached_time, cached_result = _intent_cache[cache_key] + if now - cached_time < _CACHE_TTL: + logger.debug(f"Кэш классификации: '{cache_key}' -> {cached_result}") + return cached_result + else: + del _intent_cache[cache_key] + + # Получаем температуру из конфига + intent_cfg = getattr(bot_config, 'intent', {}) + temperature = intent_cfg.get('temperature', 0.1) + if isinstance(temperature, dict): + temperature = 0.1 + + # Формируем полный промпт + full_prompt = f"{prompt_text}\n\nВопрос: {query}" + + try: + response = await giga.chat( + history=[], + query=full_prompt, + system_prompt=None, + file_id=None, + temperature=temperature + ) + answer = response.strip().upper() + + if answer in VALID_INTENTS: + logger.debug(f"Классификация успешна: {answer}") + _intent_cache[cache_key] = (now, answer) + return answer + else: + logger.debug(f"Неизвестный ответ классификатора: {answer}, возвращаем GENERAL") + return "GENERAL" + + except Exception as e: + logger.error(f"Ошибка классификации намерения: {e}", exc_info=True) + return "GENERAL" \ No newline at end of file