/
Chaizee
/
ZenithCode_Incident-LLM-analytics
Обзор
Документация
Войти
/
Chaizee
/
ZenithCode_Incident-LLM-analytics
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
ui
config.py
115 строк
4 KB
Chaizee
feat: add llm-analyzer realisation
08 июн 2026, 18:44
08 июн 2026, 18:44
0796e1d
Код
Авторство
О чём код?
"""Конфигурация, промпты и Pydantic-модели ответа LLM.""" from __future__ import annotations from pathlib import Path from pydantic import BaseModel, Field, field_validator ROOT = Path(__file__).resolve().parent DATA_DIR = ROOT / "data" CACHE_DB = DATA_DIR / "llm_cache.sqlite" CHECKPOINT_DIR = DATA_DIR / "checkpoints" OUTPUT_DIR = DATA_DIR / "output" TRAINING_DIR = DATA_DIR / "training" # Датасеты: обучение / тест BASE_XLSX = ROOT / "base.xlsx" TEST_XLSX = ROOT / "test.xlsx" LABELED_BASE = TRAINING_DIR / "base_labeled.parquet" FEW_SHOT_FILE = TRAINING_DIR / "few_shot.json" TRAIN_METRICS = TRAINING_DIR / "train_metrics.json" TEST_METRICS = TRAINING_DIR / "test_metrics.json" EXCEL_HEADERS = ( "Номер инцидента", "Группа тем", "Тема", "Регион", "Муниципалитет", "Населенный пункт", "Улица", "Дом", "2ой ответ ПИ", "Текст инцидента", "1ый ответ ПИ", "Общий текст первого ответа", ) EXCEL_COLUMN_MAP = { "Номер инцидента": "incident_id", "Группа тем": "group", "Тема": "theme", "Регион": "region", "Муниципалитет": "municipality", "Населенный пункт": "settlement", "Улица": "street", "Дом": "house", "2ой ответ ПИ": "text_ak", "Текст инцидента": "text_ai", "1ый ответ ПИ": "text_aj", "Общий текст первого ответа": "text_g", } TEXT_SOURCE_COLS = ("text_ak", "text_ai", "text_aj", "text_g") CATEGORY_COLS = ("group", "theme", "region", "municipality", "settlement") CHUNK_SIZE = 5_000 LLM_BATCH_SIZE = 64 TOP_N_CHART = 10 TOP_N_SUMMARY = 3 EXAMPLES_PER_DISTRICT = 3 DEFAULT_MODEL = "Qwen/Qwen2.5-7B-Instruct" LLM_TEMPERATURE = 0.0 LLM_MAX_TOKENS = 150 APP_TITLE = "Аналитика обращений граждан" APP_ICON = "📊" MAX_PREVIEW = 500 PAGES = ( "1. Загрузка данных", "2. Запуск анализа", "3. Результаты", "4. Выгрузка", ) TRAIN_SAMPLE_DEFAULT = 5_000 FEW_SHOT_COUNT = 6 INCIDENT_SYSTEM = "Ты аналитик обращений граждан. Отвечай только валидным JSON." INCIDENT_PROMPT = """\ Изучи текст инцидента и верни строго действительный JSON-объект без лишнего текста и markdown. Ключи: - "is_problem" (boolean: true — реальная проблема/жалоба; false — благодарность, вопрос, спам) - "severity" (integer 1–5: 1 консультация, 5 критическая авария/ЧС) - "core_issue" (string: суть проблемы, 3–5 слов) Текст инцидента: {text}""" SUMMARY_SYSTEM = "Ты помощник руководителя региона. Пиши кратко на русском, без markdown." SUMMARY_PROMPT = """\ По данным трёх самых проблемных муниципалитетов подготовь справку для руководства (5–8 предложений). Данные: {payload}""" class IncidentLLMResponse(BaseModel): is_problem: bool = False severity: int = Field(default=1, ge=1, le=5) core_issue: str = Field(default="не определено", max_length=120) @field_validator("severity", mode="before") @classmethod def clamp_severity(cls, v: object) -> int: try: n = int(v) # type: ignore[arg-type] except (TypeError, ValueError): return 1 return max(1, min(5, n)) @field_validator("core_issue", mode="before") @classmethod def strip_issue(cls, v: object) -> str: return str(v or "не определено").strip()[:120]