Files
fckbot/rag/functions/extract_metrics.py
Markov Andrey 63900feece Update 86 files
- /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
2026-06-30 10:33:28 +00:00

84 lines
2.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*- coding: utf-8 -*-
"""
Модуль извлечения метрик (KPI) из текста.
Использует промпт metrics_extract.txt.
АДАПТАЦИЯ: теперь функция принимает промпт как аргумент.
"""
import json
import logging
from typing import List, Dict
from core.services.giga_client import GigaClient
logger = logging.getLogger(__name__)
async def extract_metrics(
giga: GigaClient,
context: str,
prompt_text: str,
bot_config,
) -> List[Dict]:
"""
Извлекает числовые показатели, KPI, статистические величины из контекста.
Аргументы:
giga (GigaClient): клиент GigaChat
context (str): текст для анализа
prompt_text (str): содержимое промпта для извлечения метрик
bot_config (BotConfig): объект конфигурации
Возвращает:
List[Dict]: список метрик с полями metric_name, value, unit, period, source_fragment
"""
if not prompt_text:
logger.warning("Промпт извлечения метрик пуст")
return []
if not context or len(context) < 20:
logger.debug("Контекст слишком короткий для извлечения метрик")
return []
metrics_cfg = getattr(bot_config, 'metrics', {})
temperature = metrics_cfg.get('temperature', 0.1)
if isinstance(temperature, dict):
temperature = 0.1
full_prompt = f"{prompt_text}\n\nТекст для анализа:\n{context}"
try:
response = await giga.chat(
history=[],
query=full_prompt,
system_prompt=None,
file_id=None,
temperature=temperature
)
raw_answer = response.strip()
# Пытаемся распарсить JSON
try:
metrics = json.loads(raw_answer)
if isinstance(metrics, list):
return metrics[:15]
except json.JSONDecodeError:
# Fallback: построчный разбор
logger.debug("Не удалось распарсить JSON, пробуем построчный разбор")
lines = raw_answer.split('\n')
result = []
for line in lines:
if ':' in line:
parts = line.split(':', 1)
result.append({
"metric_name": parts[0].strip(),
"value": parts[1].strip(),
"unit": "",
"period": "",
"source_fragment": ""
})
return result
return []
except Exception as e:
logger.error(f"Ошибка извлечения метрик: {e}", exc_info=True)
return []