diff --git a/core/functions/expand_query.py b/core/functions/expand_query.py new file mode 100644 index 0000000..1d695ef --- /dev/null +++ b/core/functions/expand_query.py @@ -0,0 +1,76 @@ +# -*- coding: utf-8 -*- +""" +Модуль расширения запроса ключевыми словами. +Добавляет синонимы, аббревиатуры и связанные термины для увеличения релевантности. + +АДАПТАЦИЯ: теперь функция принимает промпт как аргумент. +""" + +import logging +import time +from core.services.giga_client import GigaClient + +logger = logging.getLogger(__name__) + +_expand_cache = {} +_CACHE_TTL = 300 + + +async def expand_query( + giga: GigaClient, + query: str, + prompt_text: str, + bot_config, +) -> str: + """ + Расширяет исходный запрос пользователя набором ключевых слов. + + Аргументы: + giga (GigaClient): клиент GigaChat + query (str): исходный запрос + prompt_text (str): содержимое промпта расширения + bot_config (BotConfig): объект конфигурации + + Возвращает: + str: расширенный запрос или исходный, если расширение не удалось + """ + if not prompt_text: + logger.debug("Промпт расширения пуст, возвращаем исходный запрос") + return query + + cache_key = query.strip().lower() + now = time.time() + if cache_key in _expand_cache: + cached_time, cached_result = _expand_cache[cache_key] + if now - cached_time < _CACHE_TTL: + logger.debug(f"Кэш расширения: '{cache_key}' -> '{cached_result}'") + return cached_result + else: + del _expand_cache[cache_key] + + expand_cfg = getattr(bot_config, 'expand', {}) + temperature = expand_cfg.get('temperature', 0.1) + if isinstance(temperature, dict): + temperature = 0.1 + + prompt = prompt_text.format(query=query) + + try: + response = await giga.chat( + history=[], + query=prompt, + system_prompt=None, + file_id=None, + temperature=temperature + ) + expanded = response.strip() + if expanded and expanded != query: + logger.debug(f"Расширенный запрос: {expanded}") + _expand_cache[cache_key] = (now, expanded) + return expanded + else: + _expand_cache[cache_key] = (now, query) + return query + except Exception as e: + logger.error(f"Ошибка расширения запроса: {e}", exc_info=True) + return query \ No newline at end of file