- /rag/commands/expert.py - /core/services/__init__.py - /core/services/embedding_service.py - /core/services/file_service.py - /core/services/giga_client.py - /core/services/kb_service.py - /core/services/postgres_service.py - /core/services/qdrant_service.py - /core/services/reranker_service.py - /core/functions/__init__.py - /core/functions/check_consistency.py - /core/functions/check_spelling.py - /core/functions/critique_answer.py - /core/functions/expand_query.py - /core/functions/extract_metrics.py - /core/functions/file_processor.py - /core/functions/generate_document.py - /core/functions/intent_classify.py - /core/functions/rerank_context.py - /core/functions/summarize_document.py - /core/utils/__init__.py - /core/utils/arg_parser.py - /core/utils/config_loader.py - /core/utils/layout_converter.py - /core/utils/logger.py - /core/utils/text_utils.py - /core/utils/web_utils.py - /bots/commands/__init__.py - /bots/commands/base.py - /bots/commands/create.py - /core/commands/global_remove.py - /core/commands/help.py - /core/commands/info.py - /core/commands/kb.py - /core/commands/learn.py - /core/commands/other.py - /core/commands/registry.py - /core/commands/stats.py - /core/commands/template.py - /core/handlers/__init__.py - /core/handlers/message_handler.py - /core/workers/__init__.py - /core/workers/indexing_worker.py - /core/xmpp/__init__.py - /core/xmpp/client.py - /bots/commands/global_remove.py - /bots/commands/help.py - /bots/commands/info.py - /bots/commands/kb.py - /bots/commands/registry.py - /bots/commands/other.py - /bots/commands/template.py - /bots/commands/learn.py - /bots/commands/stats.py - /bots/handlers/message_handler.py - /bots/handlers/__init__.py - /bots/workers/__init__.py - /bots/workers/indexing_worker.py - /bots/xmpp/__init__.py - /bots/xmpp/client.py - /rag/services/qdrant_service.py - /rag/services/giga_client.py - /rag/services/embedding_service.py - /rag/services/reranker_service.py - /rag/services/__init__.py - /rag/services/file_service.py - /rag/services/postgres_service.py - /rag/services/kb_service.py - /rag/functions/check_spelling.py - /rag/functions/__init__.py - /rag/functions/extract_metrics.py - /rag/functions/generate_document.py - /rag/functions/expand_query.py - /rag/functions/critique_answer.py - /rag/functions/file_processor.py - /rag/functions/check_consistency.py - /rag/functions/summarize_document.py - /rag/functions/rerank_context.py - /rag/functions/intent_classify.py - /rag/utils/__init__.py - /rag/utils/layout_converter.py - /rag/utils/text_utils.py - /rag/utils/arg_parser.py - /rag/utils/config_loader.py - /rag/utils/logger.py - /rag/utils/web_utils.py
80 lines
3.5 KiB
Python
80 lines
3.5 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""
|
|
Модуль переранжирования контекста: отбирает только те фрагменты,
|
|
которые действительно релевантны вопросу.
|
|
Использует локальный кросс-энкодер.
|
|
|
|
АДАПТАЦИЯ: теперь функция принимает bot (для доступа к конфигу) и использует RerankerService.
|
|
"""
|
|
|
|
import logging
|
|
from core.services.reranker_service import RerankerService
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
_reranker = None
|
|
|
|
|
|
def get_reranker(bot_config) -> RerankerService:
|
|
"""Возвращает глобальный экземпляр RerankerService (ленивая инициализация)."""
|
|
global _reranker
|
|
if _reranker is None:
|
|
model_name = getattr(bot_config, 'rerank_model', None)
|
|
device = getattr(bot_config, 'rerank_device', None)
|
|
_reranker = RerankerService(model_name=model_name, device=device)
|
|
logger.info(f"RerankerService инициализирован (модель: {model_name or 'default'})")
|
|
return _reranker
|
|
|
|
|
|
async def rerank_context(
|
|
bot,
|
|
query: str,
|
|
context: str,
|
|
prompt_text: str = None, # сохранён для обратной совместимости, но не используется
|
|
bot_config=None,
|
|
) -> str:
|
|
"""
|
|
Переранжирует контекст, оставляя только релевантные фрагменты.
|
|
Использует кросс-энкодер вместо LLM.
|
|
|
|
Аргументы:
|
|
bot: экземпляр Bot (для доступа к конфигу) — может быть None, если передан bot_config
|
|
query: исходный запрос пользователя
|
|
context: исходный контекст (абзацы, разделённые двойными переносами строки "\n\n")
|
|
prompt_text: не используется
|
|
bot_config: объект конфигурации (если bot не передан)
|
|
|
|
Возвращает:
|
|
str: отфильтрованный контекст
|
|
"""
|
|
if not context:
|
|
return context
|
|
|
|
# Получаем конфиг либо из bot, либо из bot_config
|
|
if bot is not None and hasattr(bot, 'config'):
|
|
config = bot.config
|
|
elif bot_config is not None:
|
|
config = bot_config
|
|
else:
|
|
logger.error("Ни bot, ни bot_config не переданы в rerank_context")
|
|
return context
|
|
|
|
rerank_cfg = getattr(config, 'rerank', {})
|
|
min_length = rerank_cfg.get('min_length', 5000)
|
|
|
|
# Если контекст короткий, переранжирование не требуется
|
|
if len(context) < min_length:
|
|
logger.debug(f"Контекст слишком короткий ({len(context)} < {min_length}), пропускаем переранжирование")
|
|
return context
|
|
|
|
# Получаем сервис переранжирования
|
|
reranker = get_reranker(config)
|
|
|
|
try:
|
|
top_k = rerank_cfg.get('top_k', None)
|
|
ranked_context = reranker.rerank_context(query, context, top_k=top_k)
|
|
logger.debug(f"Переранжирование выполнено: исходный контекст {len(context)} символов")
|
|
return ranked_context
|
|
except Exception as e:
|
|
logger.error(f"Ошибка при переранжировании: {e}. Возвращаем исходный контекст.")
|
|
return context |