- Обновлен Dockerfile для использования Alpine вместо Slim, улучшая размер образа. - Удален устаревший RAGService и добавлен RagApiClient для работы с внешним RAG API. - Обновлены переменные окружения в env.example для настройки нового RAG API. - Обновлен ScoringManager для интеграции с RagApiClient. - Упрощена структура проекта, удалены ненужные файлы и зависимости, связанные с векторным хранилищем. - Обновлены обработчики и функции для работы с новым API, включая получение статистики и обработку ошибок.
84 lines
3.0 KiB
Python
84 lines
3.0 KiB
Python
#!/usr/bin/env python3
|
||
"""
|
||
Миграция: Добавление колонки для ML-скоринга постов.
|
||
|
||
Добавляет:
|
||
- ml_scores (TEXT/JSON) - JSON с результатами оценки от разных моделей
|
||
|
||
Структура ml_scores:
|
||
{
|
||
"deepseek": {"score": 0.75, "model": "deepseek-chat", "ts": 1706198400},
|
||
"rag": {"score": 0.90, "model": "rubert-base-cased", "ts": 1706198400}
|
||
}
|
||
"""
|
||
import argparse
|
||
import asyncio
|
||
import os
|
||
import sys
|
||
from pathlib import Path
|
||
|
||
# Добавляем корень проекта в путь
|
||
project_root = Path(__file__).resolve().parent.parent
|
||
sys.path.insert(0, str(project_root))
|
||
|
||
import aiosqlite
|
||
|
||
# Пытаемся импортировать logger, если не получается - используем стандартный
|
||
try:
|
||
from logs.custom_logger import logger
|
||
except ImportError:
|
||
import logging
|
||
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
||
logger = logging.getLogger(__name__)
|
||
|
||
DEFAULT_DB_PATH = "database/tg-bot-database.db"
|
||
|
||
|
||
async def column_exists(conn: aiosqlite.Connection, table: str, column: str) -> bool:
|
||
"""Проверяет существование колонки в таблице."""
|
||
cursor = await conn.execute(f"PRAGMA table_info({table})")
|
||
columns = await cursor.fetchall()
|
||
return any(col[1] == column for col in columns)
|
||
|
||
|
||
async def main(db_path: str) -> None:
|
||
"""
|
||
Основная функция миграции.
|
||
|
||
Добавляет колонку ml_scores в таблицу post_from_telegram_suggest.
|
||
Миграция идемпотентна - можно запускать повторно без ошибок.
|
||
"""
|
||
db_path = os.path.abspath(db_path)
|
||
|
||
if not os.path.exists(db_path):
|
||
logger.error(f"База данных не найдена: {db_path}")
|
||
return
|
||
|
||
async with aiosqlite.connect(db_path) as conn:
|
||
await conn.execute("PRAGMA foreign_keys = ON")
|
||
|
||
# Проверяем и добавляем колонку ml_scores
|
||
if not await column_exists(conn, "post_from_telegram_suggest", "ml_scores"):
|
||
await conn.execute(
|
||
"ALTER TABLE post_from_telegram_suggest ADD COLUMN ml_scores TEXT"
|
||
)
|
||
logger.info("Колонка ml_scores добавлена в post_from_telegram_suggest")
|
||
else:
|
||
logger.info("Колонка ml_scores уже существует")
|
||
|
||
await conn.commit()
|
||
logger.info("Миграция add_ml_scores_columns завершена успешно")
|
||
|
||
|
||
if __name__ == "__main__":
|
||
parser = argparse.ArgumentParser(
|
||
description="Добавление колонки ml_scores для ML-скоринга"
|
||
)
|
||
parser.add_argument(
|
||
"--db",
|
||
default=os.environ.get("DATABASE_PATH", DEFAULT_DB_PATH),
|
||
help="Путь к БД",
|
||
)
|
||
args = parser.parse_args()
|
||
asyncio.run(main(args.db))
|