Skip to content

TJirden/baza

Repository files navigation

Baza

Baza — современный, интеллектуальный Telegram-бот для каталогизации, гибридного семантического поиска, автоматической модерации и игрового сравнения мемов. Проект построен на базе Spring Boot и Spring AI с интеграцией мультимодальных моделей Google Gemini.


Ключевые возможности

1. Мультимодальный ИИ-анализ и модерация (Google Gemini 3.5)

При загрузке изображения бот обрабатывает его в асинхронном пайплайне (AsyncMemeService):

  • OCR-распознавание: Точное извлечение любого текста с картинки.
  • Описание контекста: ИИ описывает визуальную составляющую и смысл мема на русском языке.
  • ИИ-Цензура: Автоматический сканер проверяет изображение на NSFW, пропаганду запрещенных веществ, насилие и язык вражды. При нарушении мем помещается в карантин.
  • Векторная дедупликация: Бот проверяет степень схожести нового мема с уже существующими (порог 0.95). Дубликаты автоматически изолируются.

2. Интеллектуальный гибридный поиск (RRF)

Бот реализует современный подход к поиску мемов:

  • Семантический поиск: pgvector + gemini-embedding-001 ищут мемы по смыслу (даже если ключевых слов нет на картинке).
  • Текстовый поиск: Полнотекстовый поиск по OCR-тексту и описанию через ILIKE с нормализацией букв «е/ё» и регистронезависимостью.
  • Reciprocal Rank Fusion (RRF): Комбинация и взвешенное ранжирование результатов из векторного и текстового поисковых движков.
  • Контроль видимости: Учитывает приватность мемов (PUBLIC, PRIVATE, GROUP) в соответствии с правами пользователя.

3. Мем-Баттлы на основе векторного сходства

  • Интеллектуальный подбор оппонента: Бот выбирает первый случайный мем, а второго оппонента подбирает через векторную базу данных по семантическому сходству. Это гарантирует, что в баттле будут участвовать мемы на схожую тематику (например, коты против котов).
  • ELO-рейтинг: Победители и проигравшие пересчитывают свой рейтинг по официальной формуле Elo (K-factor = 32).

4. PvP-Дуэли на очки ставок (/duel)

  • Пользователи могут бросить вызов друг другу на очки баланса: /duel @username <ставка>.
  • Выбор оружия происходит в ЛС с ботом, где каждый участник выбирает один из своих одобренных мемов.
  • Битва транслируется в общий чат. Победитель забирает двойную ставку и очки славы, проигравший теряет ставку, а в случае ничьей или истечения времени ставки возвращаются.

5. Swipe-механика ("Tinder для мемов")

  • Интерактивная оценка мемов в ЛС с ботом через кнопки BASE и CRINGE.
  • Алгоритм выдает пользователю только те новые мемы, которые он еще не оценивал.
  • Лайки начисляют очки автору мема и увеличивают ELO-рейтинг изображения.

6. Юмористические ИИ-Дайджесты

  • Автоматическая генерация подборок лучших мемов за неделю (на основе ELO-рейтинга).
  • ИИ-редактор Gemini принимает описания и OCR-текст топ-3 мемов и генерирует саркастический, ироничный дайджест с разметкой Markdown для отправки участникам группы.

Команды бота

Команда Описание Пример использования
/start Запуск бота, инициализация сессии /start
/save Сохранить мем (ответом на фото или интерактивно в ЛС) /save public, /save group 101
/find Поиск мем-картинки по смыслу или тексту /find грустный программист
/battle Запустить случайный мем-баттл в чате /battle
/duel Вызвать пользователя на PvP-дуэль на очки /duel @username 50
/swipe Войти в режим оценки мемов (Tinder-лайки) /swipe
/leaderboard Показать топ-5 мемов и авторов /leaderboard
/digest Сгенерировать дайджест лучших мемов вручную /digest

Конфигурация параметров (application.properties)

В проекте используются следующие важные параметры:

  • app.battle.duration-minutes — длительность голосования в баттлах и дуэлях (по умолчанию 10).
  • app.battle.default-elo — стартовый ELO-рейтинг для новых мемов (по умолчанию 1000).
  • app.digest.days — за сколько последних дней собирать лучшие мемы для дайджеста (по умолчанию 7).
  • app.bot.complaints-threshold — количество жалоб пользователей для автоматической отправки мема в карантин (по умолчанию 3).
  • app.bot.search-limit — лимит возвращаемых мемов в результатах поиска (по умолчанию 50).

Инструкция по запуску

1. Поднятие инфраструктуры (PostgreSQL + pgvector)

docker-compose up -d

2. Настройка переменных окружения

Создайте файл .env в корневой папке или передайте переменные окружения при запуске:

  • TELEGRAM_TOKEN — Токен вашего Telegram-бота.
  • GEMINI_API_KEY — Ваш Google Gemini API-ключ.
  • GOOGLE_CLOUD_PROJECT — Идентификатор проекта Google Cloud (необязательно).

3. Сборка и запуск приложения

Сборка JAR-файла:

./gradlew clean build

Запуск Spring Boot приложения:

./gradlew bootRun

Тестирование

Запуск юнит и интеграционных тестов:

./gradlew test

Запуск нагрузочных тестов (k6): Для проверки производительности API поиска выполните команду:

k6 run load-test.js

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors