refactor: обновление системы ML-скоринга и переход на RAG API
- Обновлен Dockerfile для использования Alpine вместо Slim, улучшая размер образа. - Удален устаревший RAGService и добавлен RagApiClient для работы с внешним RAG API. - Обновлены переменные окружения в env.example для настройки нового RAG API. - Обновлен ScoringManager для интеграции с RagApiClient. - Упрощена структура проекта, удалены ненужные файлы и зависимости, связанные с векторным хранилищем. - Обновлены обработчики и функции для работы с новым API, включая получение статистики и обработку ошибок.
This commit is contained in:
@@ -1,10 +1,9 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Миграция: Добавление колонок для ML-скоринга постов.
|
||||
Миграция: Добавление колонки для ML-скоринга постов.
|
||||
|
||||
Добавляет:
|
||||
- ml_scores (TEXT/JSON) - JSON с результатами оценки от разных моделей
|
||||
- vector_hash (TEXT) - хеш текста для кеширования векторов
|
||||
|
||||
Структура ml_scores:
|
||||
{
|
||||
@@ -46,7 +45,7 @@ async def main(db_path: str) -> None:
|
||||
"""
|
||||
Основная функция миграции.
|
||||
|
||||
Добавляет колонки ml_scores и vector_hash в таблицу post_from_telegram_suggest.
|
||||
Добавляет колонку ml_scores в таблицу post_from_telegram_suggest.
|
||||
Миграция идемпотентна - можно запускать повторно без ошибок.
|
||||
"""
|
||||
db_path = os.path.abspath(db_path)
|
||||
@@ -67,22 +66,13 @@ async def main(db_path: str) -> None:
|
||||
else:
|
||||
logger.info("Колонка ml_scores уже существует")
|
||||
|
||||
# Проверяем и добавляем колонку vector_hash
|
||||
if not await column_exists(conn, "post_from_telegram_suggest", "vector_hash"):
|
||||
await conn.execute(
|
||||
"ALTER TABLE post_from_telegram_suggest ADD COLUMN vector_hash TEXT"
|
||||
)
|
||||
logger.info("Колонка vector_hash добавлена в post_from_telegram_suggest")
|
||||
else:
|
||||
logger.info("Колонка vector_hash уже существует")
|
||||
|
||||
await conn.commit()
|
||||
logger.info("Миграция add_ml_scores_columns завершена успешно")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser(
|
||||
description="Добавление колонок ml_scores и vector_hash для ML-скоринга"
|
||||
description="Добавление колонки ml_scores для ML-скоринга"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--db",
|
||||
|
||||
123
scripts/drop_vector_hash_column.py
Normal file
123
scripts/drop_vector_hash_column.py
Normal file
@@ -0,0 +1,123 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Миграция: Удаление колонки vector_hash из таблицы post_from_telegram_suggest.
|
||||
|
||||
Колонка больше не нужна, т.к. RAG сервис вынесен в отдельный микросервис
|
||||
и хранит векторы самостоятельно.
|
||||
|
||||
SQLite не поддерживает DROP COLUMN напрямую (до версии 3.35.0),
|
||||
поэтому используем пересоздание таблицы.
|
||||
"""
|
||||
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 get_sqlite_version(conn: aiosqlite.Connection) -> tuple:
|
||||
"""Возвращает версию SQLite."""
|
||||
cursor = await conn.execute("SELECT sqlite_version()")
|
||||
version_str = (await cursor.fetchone())[0]
|
||||
return tuple(map(int, version_str.split('.')))
|
||||
|
||||
|
||||
async def main(db_path: str) -> None:
|
||||
"""
|
||||
Удаляет колонку vector_hash из таблицы 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:
|
||||
# Проверяем существует ли колонка
|
||||
if not await column_exists(conn, "post_from_telegram_suggest", "vector_hash"):
|
||||
logger.info("Колонка vector_hash не существует, миграция не требуется")
|
||||
return
|
||||
|
||||
# Проверяем версию SQLite
|
||||
version = await get_sqlite_version(conn)
|
||||
logger.info(f"Версия SQLite: {'.'.join(map(str, version))}")
|
||||
|
||||
# SQLite 3.35.0+ поддерживает DROP COLUMN
|
||||
if version >= (3, 35, 0):
|
||||
logger.info("Используем ALTER TABLE DROP COLUMN")
|
||||
await conn.execute(
|
||||
"ALTER TABLE post_from_telegram_suggest DROP COLUMN vector_hash"
|
||||
)
|
||||
else:
|
||||
# Для старых версий пересоздаём таблицу
|
||||
logger.info("Используем пересоздание таблицы (SQLite < 3.35.0)")
|
||||
|
||||
# Получаем список колонок без vector_hash
|
||||
cursor = await conn.execute("PRAGMA table_info(post_from_telegram_suggest)")
|
||||
columns = await cursor.fetchall()
|
||||
column_names = [col[1] for col in columns if col[1] != "vector_hash"]
|
||||
columns_str = ", ".join(column_names)
|
||||
|
||||
logger.info(f"Колонки для сохранения: {columns_str}")
|
||||
|
||||
# Пересоздаём таблицу
|
||||
await conn.execute("BEGIN TRANSACTION")
|
||||
try:
|
||||
# Создаём временную таблицу
|
||||
await conn.execute(
|
||||
f"CREATE TABLE post_from_telegram_suggest_backup AS "
|
||||
f"SELECT {columns_str} FROM post_from_telegram_suggest"
|
||||
)
|
||||
|
||||
# Удаляем старую таблицу
|
||||
await conn.execute("DROP TABLE post_from_telegram_suggest")
|
||||
|
||||
# Переименовываем временную
|
||||
await conn.execute(
|
||||
"ALTER TABLE post_from_telegram_suggest_backup "
|
||||
"RENAME TO post_from_telegram_suggest"
|
||||
)
|
||||
|
||||
await conn.execute("COMMIT")
|
||||
except Exception as e:
|
||||
await conn.execute("ROLLBACK")
|
||||
raise e
|
||||
|
||||
await conn.commit()
|
||||
logger.info("Колонка vector_hash успешно удалена")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser(
|
||||
description="Удаление колонки vector_hash из post_from_telegram_suggest"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--db",
|
||||
default=os.environ.get("DATABASE_PATH", DEFAULT_DB_PATH),
|
||||
help="Путь к БД",
|
||||
)
|
||||
args = parser.parse_args()
|
||||
asyncio.run(main(args.db))
|
||||
Reference in New Issue
Block a user