cogni-vault

2

Описание

Cogni-Vault — AI-архивариус знаний AI-powered knowledge archivist для групповых чатов Telegram. Слушает, фильтрует, извлекает факты и отвечает через RAG.

https://lid.gitverse.site/cogni-vault/

Языки

  • Python89,2%
  • HTML10,5%
  • Dockerfile0,2%
  • Mako0,1%
месяц назад
месяц назад
месяц назад
месяц назад
месяц назад
месяц назад
README.md

🧠 Cogni-Vault

AI-архивариус знаний для групповых чатов Telegram
Тихо слушает · Фильтрует шум · Извлекает факты · Отвечает на вопросы через RAG

Python 3.11+
·
aiogram 3
·
PostgreSQL 16 + pgvector
·
SQLAlchemy 2.0
·
Docker

v0.1.5
·
394+ тестов
·
73% покрытие
·
BSD лицензия


💡 Что такое Cogni-Vault?

Cogni-Vault — Telegram-бот, работающий как тихий архивариус знаний для групповых чатов. Он читает сообщения от всех участников, использует многоуровневый AI-пайплайн для фильтрации шума и извлечения полезных фактов, сохраняет их как векторы в PostgreSQL+pgvector и отвечает на вопросы авторизованных пользователей через RAG (Retrieval-Augmented Generation).

Ключевой принцип: Бот слушает всех, но отвечает только пользователям из вайтлиста.


✨ Возможности

📥 Пайплайн записи (Write)

  • Тихий слушатель — фиксирует полезные факты от всех участников чата
  • Настраиваемая модерация — 4 уровня фильтрации:
    strict
    /
    moderate
    /
    relaxed
    /
    off
  • Разбор списков — определяет списки и сохраняет каждый пункт отдельно
  • Извлечение дат — определяет даты событий из сообщений
  • Голосовые — транскрипция через Whisper STT
  • Распознавание изображений — OCR для извлечения текста из фото
  • Парсинг файлов — поддержка PDF, DOCX, TXT
  • Сбор ссылок — извлечение контента из URL
  • Дедупликация — предотвращение сохранения дубликатов

📤 RAG-пайплайн (Read)

  • Гибридный поиск — векторное сходство + ключевые слова
  • Умные ответы — LLM генерирует ответы с контекстом
  • Указание источников — показывает, откуда взята информация
  • Даты событий — отображает 📅 даты начала/окончания
  • Поддержка @mention — отвечает при упоминании в группах
  • Личные сообщения — вайтлист-пользователи могут писать в ЛС
  • Словарь терминов — подключение доменных глоссариев

🔐 Управление доступом

  • Super Admin — полный контроль, задаётся через ENV
  • Admin — может добавлять пользователей в вайтлист
  • Whitelisted User — может запрашивать базу знаний
  • Contributor — сообщения записываются, доступа к запросам нет

⚙️ Эксплуатация

  • Health-эндпоинты
    /health
    ,
    /ready
    ,
    /metrics
  • Метрики Prometheus — 14 предзарегистрированных метрик
  • Graceful shutdown — упорядоченное завершение с таймаутами
  • CI/CD — линт, тайпчек, тесты с покрытием
  • Docker — multi-stage сборка, non-root пользователь

� Чем Cogni-Vault отличается от типичных RAG-ботов

Большинство open-source Telegram-ботов с RAG работают по простой схеме: входящее сообщение → нарезка на чанки → сохранение в вектор-БД. Cogni-Vault — это архитектура когнитивной обработки, а не скрипт автоматизации.

ХарактеристикаТипичный RAG-ботCogni-Vault
AI-пайплайн1 модель на все задачи6 специализированных моделей по тирам (L1–L4, OCR, STT)
Фильтрация шумаНет или примитивная (по длине)L1 Dumb Model — бинарный AI-фильтр SAVE/SKIP
Обработка данныхСырое сохранение текстаL3 DumbSmart — извлечение фактов, тегов, дат, разбор списков
ПоискТолько векторныйГибридный: вектор + ключевые слова
Форматы вводаТолько текстТекст, голос (STT), изображения (OCR), PDF, DOCX, ссылки
ДедупликацияНетContent-hash дедупликация
Группировка сообщенийНетDebouncer: буферизация быстрых сообщений
Управление доступомТокен бота4-уровневая ролевая модель (Super Admin → Contributor)
МониторингНетHealth/Ready/Metrics, 14 метрик Prometheus
Завершение
kill -9
Graceful shutdown с LIFO-порядком и таймаутами
Провайдеры1 API-ключ, 1 модельМульти-провайдер: разные модели от разных API
ЗапускНужна интеграцияPlug & play:
docker compose up
— и бот в чате

Cogni-Vault не просто сохраняет сообщения — он их осмысляет. Входящий текст проходит через фильтрацию, извлечение фактов, тегирование и векторизацию перед сохранением в базу знаний.


�🏗️ Архитектура

┌──────────────────────────────────────────────────────────────────┐ │ ГРУППОВОЙ ЧАТ TELEGRAM │ │ │ │ Юзер А: «Конференция 15 мая в Хилтоне» │ │ Юзер Б: «лол класс» │ │ Юзер В: «Дедлайн по заявкам — 30 апреля» │ └─────────┬────────────────────────────────────────────────────────┘ │ ▼ ┌──────────────────────────────────────────────────────────────────┐ │ COGNI-VAULT БОТ │ │ │ │ ┌────────────┐ ┌────────────┐ ┌────────────┐ │ │ │ Debounce │─▶│ Загрузка │─▶│ Вайтлист │ │ │ │ Middleware │ │ User из БД │ │ Middleware │ │ │ └────────────┘ └────────────┘ └─────┬──────┘ │ │ │ │ │ ┌─────────────────────────────────────▼────────────────────┐ │ │ │ МНОГОУРОВНЕВЫЙ AI-ПАЙПЛАЙН │ │ │ │ │ │ │ │ ┌──────────┐ ┌────────┐ ┌─────────┐ ┌────────────┐ │ │ │ │ │ Сплиттер │▶│ Фильтр │▶│ Тезис, │▶│ Векториз. │ │ │ │ │ │ сообщений│ │ SAVE / │ │ теги, │ │ (Embedding │ │ │ │ │ │(DumbSm.) │ │ SKIP │ │ даты │ │ Model) │ │ │ │ │ └──────────┘ │ (Dumb) │ │(DumbSm.)│ └─────┬──────┘ │ │ │ │ └────────┘ └─────────┘ │ │ │ │ └────────────────────────────────────────────┴─────────────┘ │ │ │ │ │ ┌────────────────────────────────────────────▼─────────────┐ │ │ │ POSTGRESQL + PGVECTOR │ │ │ │ ┌────────┐ ┌───────────┐ ┌────────┐ ┌──────────┐ │ │ │ │ │ users │ │ knowledge │ │ chats │ │ vectors │ │ │ │ │ │ │ │ entries │ │ │ │(pgvector)│ │ │ │ │ └────────┘ └───────────┘ └────────┘ └──────────┘ │ │ │ └──────────────────────────────────────────────────────────┘ │ │ │ │ ┌──────────────────────────────────────────────────────────┐ │ │ │ RAG-ПАЙПЛАЙН ЗАПРОСОВ │ │ │ │ │ │ │ │ @mention ──▶ Embed ──▶ Гибридный ──▶ Smart LLM │ │ │ │ (L2) поиск (L4 Smart) │ │ │ │ │ │ │ │ │ ▼ │ │ │ │ Форматированный ответ │ │ │ └──────────────────────────────────────────────────────────┘ │ └──────────────────────────────────────────────────────────────────┘

Уровни AI-моделей

УровеньНазначениеСтоимостьПримеры моделей
🟢 L1 — DumbБинарный фильтр: SAVE или SKIPМинимальнаяT-lite, Llama 3.2 1B
🔵 L2 — EmbeddingВекторизация текста для хранения и поискаНизкаяQwen3-Embedding-0.6B
🟡 L3 — DumbSmartИзвлечение фактов, тезисов, тегов, дат; разбор списковСредняяGigaChat3-10B
🔴 L4 — SmartRAG-ответы с поддержкой tool callingВысокаяGLM-4.7-Flash, GPT-4o
🟣 OCRИзвлечение текста из изображенийСредняяDeepSeek-OCR-2
WhisperТранскрипция речи в текстСредняяwhisper-large-v3

🚀 Быстрый старт

Предварительные требования

  • Python 3.11+
  • PostgreSQL 16 с pgvector (или Docker)
  • Токен Telegram-бота от @BotFather
  • OpenAI-совместимый API-эндпоинт и ключ

Вариант 1: Docker Compose (рекомендуется)

Вариант 2: Локальная разработка


⚙️ Конфигурация

Cogni-Vault использует каскадную конфигурацию из трёх уровней (в порядке приоритета):

  1. Переменные окружения /
    .env
    высший приоритет, перекрывают всё
  2. config.yaml
    — базовая структура и значения
  3. Значения по умолчанию — встроены в Pydantic-схему

Для вложенных ключей используйте разделитель

__
:

Совет: Скопируйте

.env.example
в
.env
— там перечислены все доступные параметры с описаниями и значениями по умолчанию.

📋 Полный справочник конфигурации (развернуть)

database

КлючТипУмолчаниеОписание
url
string
postgresql+asyncpg://...@localhost:5432/cogni_vault
URL базы данных (async)
echo
bool
false
Логирование SQL-запросов
pool_size
int
10
(1–100)
Размер пула соединений
max_overflow
int
20
(0–100)
Допустимое превышение пула

bot

КлючТипУмолчаниеОписание
token
string
""
Токен Telegram-бота
super_admin_telegram_id
int/null
null
Telegram ID суперадмина
whitelist_chat_ids
list[int]
[]
ID чатов для записи сообщений
admins
list[int]
[]
Telegram ID администраторов

providers

Определение одного или нескольких OpenAI-совместимых API-провайдеров:

КлючТипУмолчаниеОписание
base_url
string
https://api.openai.com/v1
Базовый URL API
api_key
string
""
API-ключ
timeout
int
30
(1–300)
Таймаут запроса (секунды)
max_retries
int
3
(0–10)
Макс. количество повторов
retry_base_delay
float
1.0
(0.1–10.0)
Базовая задержка между повторами
retry_max_delay
float
10.0
(1.0–60.0)
Макс. задержка между повторами
whisper_url
string
https://api.openai.com/v1/audio/transcriptions
Эндпоинт Whisper STT

ai_models

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

КлючТипУмолчаниеОписание
provider
string
"default"
Имя провайдера из
providers
model
string
"gpt-4"
Идентификатор модели
temperature
float
0.7
(0–2)
Температура сэмплирования
max_tokens
int
2000
(1–8000)
Макс. токенов в ответе
tier
ModelTier
"dumb"
Уровень модели (см. Архитектура)
supports_tools
bool
false
Поддержка tool calling
system_prompt
string/null
null
Кастомный системный промпт

processing

КлючТипУмолчаниеОписание
process_text
bool
true
Обработка текстовых сообщений
process_voice
bool
false
Обработка голосовых (Whisper)
process_images
bool
false
Обработка изображений (OCR)
process_documents
bool
false
Обработка загруженных документов
process_links
bool
false
Обработка URL/ссылок
debounce_seconds
int
7
(1–30)
Окно дебаунса сообщений
max_message_length
int
4000
(100+)
Макс. длина обрабат. сообщения
embedding_batch_size
int
100
(1–1000)
Размер батча для эмбеддингов
filter_model
string
"dumb"
Модель для фильтрации
processor_model
string
"dumb_smart"
Модель для извлечения фактов
filter_sensitivity
string
"strict"
Уровень фильтрации:
strict
/
moderate
/
relaxed
/
off

knowledge_base

КлючТипУмолчаниеОписание
vector_dimension
int
1536
(1–32768)
Размерность вектора эмбеддинга
similarity_threshold
float
0.7
(0–1)
Мин. сходство для результатов
max_results
int
5
(1–100)
Макс. результатов поиска
chunk_size
int
500
(100–5000)
Размер чанка при нарезке текста
chunk_overlap
int
50
(0–1000)
Перекрытие между чанками
enable_deduplication
bool
true
Включить обнаружение дубликатов
dedup_lookback_days
int
30
(1–365)
Период поиска дубликатов (дни)
dedup_similarity_threshold
float
0.85
(0–1)
Порог сходства для дедупликации
vector_weight
float
0.6
(0–1)
Вес векторного поиска
keyword_weight
float
0.4
(0–1)
Вес поиска по ключевым словам

logging

КлючТипУмолчаниеОписание
level
string
"INFO"
DEBUG, INFO, WARNING, ERROR, CRITICAL
format
string
"json"
Формат вывода логов
include_timestamp
bool
true
Добавлять временную метку
include_correlation_id
bool
true
Добавлять correlation ID

term_definitions

Подключение доменных терминов в промпты AI для улучшения контекста:

🔀 Настройка нескольких провайдеров (развернуть)

Назначение разных моделей разным провайдерам для оптимизации затрат:

Все провайдеры должны предоставлять OpenAI-совместимый эндпоинт

/v1/chat/completions
.


📁 Структура проекта

cogni-vault/ ├── src/cogni_vault/ │ ├── main.py # Бутстрап и запуск приложения │ ├── health.py # HTTP-эндпоинты health/ready/metrics │ ├── metrics.py # Реестр метрик Prometheus │ ├── shutdown.py # Координатор graceful shutdown │ ├── logger.py # Конфигурация structlog (JSON) │ │ │ ├── config/ # Pydantic Settings (YAML + ENV каскад) │ │ │ ├── bot/ # Слой Telegram │ │ ├── handlers.py # Обработчики сообщений и команд │ │ ├── middleware.py # Загрузка User, проверка вайтлиста │ │ ├── message_debouncer.py # Буферизация быстрых сообщений │ │ └── debounce_middleware.py │ │ │ ├── database/ # Слой данных │ │ ├── models/ # User, Chat, KnowledgeEntry │ │ ├── models_def.py # SQLAlchemy ORM определения │ │ └── session.py # Async engine и session factory │ │ │ ├── services/ # Бизнес-логика │ │ ├── ai/ # LLM-сервисы │ │ │ ├── dumb_model.py # L1 — бинарный фильтр │ │ │ ├── dumb_smart_model.py # L3 — извлечение фактов, сплит │ │ │ ├── embedding_model.py # L2 — векторизация │ │ │ ├── smart_model.py # L4 — RAG-ответы │ │ │ ├── stt_service.py # Whisper STT │ │ │ ├── ocr_service.py # OCR изображений │ │ │ ├── file_parser_service.py # Парсинг документов │ │ │ ├── link_scraper_service.py # Извлечение контента из URL │ │ │ └── factory.py # LLM-роутер и фабрика │ │ ├── knowledge_service.py # CRUD для записей знаний │ │ ├── query_service.py # Оркестрация RAG-запросов │ │ ├── formatted_query_service.py # Форматирование для Telegram │ │ └── hybrid_search_service.py # Векторный + ключевой поиск │ │ │ └── rag/ # Компоненты RAG-пайплайна │ ├── tests/ # 394+ тестов (pytest + pytest-asyncio) ├── alembic/ # Миграции базы данных ├── docs/ # Дополнительная документация ├── docker-compose.yml # App + PostgreSQL (pgvector) ├── Dockerfile # Multi-stage production сборка └── config.yaml # Конфигурация по умолчанию

🧪 Разработка

Запуск тестов

Линтинг и форматирование

Миграции базы данных


📊 Наблюдаемость

Health-эндпоинты (порт 8080)

ЭндпоинтМетодОписание
/health
GETLiveness probe — 200, если процесс жив
/ready
GETReadiness probe — 200, только когда БД доступна
/metrics
GETМетрики в формате Prometheus

Метрики Prometheus

Все 14 метрик
МетрикаТипОписание
messages_received_total
counterВсего получено сообщений
messages_processed_total
counterСообщений обработано через пайплайн
messages_filtered_total
counterОтфильтрованных сообщений (SKIP)
llm_requests_total
counterВсего запросов к LLM API
llm_request_duration_seconds
histogramЛатентность запросов к LLM
llm_errors_total
counterОшибок LLM API
knowledge_entries_total
counterЗаписей знаний сохранено
knowledge_duplicates_total
counterОбнаружено дубликатов
rag_queries_total
counterВсего RAG-запросов
rag_query_duration_seconds
histogramЛатентность RAG-запросов
active_debounce_buffers
gaugeАктивных дебаунс-буферов
db_session_duration_seconds
histogramДлительность сессий БД
health_check_total
counterЗапросов health check

Graceful Shutdown

При получении

SIGTERM
/
SIGINT
компоненты завершаются в обратном порядке регистрации:

  1. Сброс дебаунс-буферов
  2. Остановка поллинга бота и закрытие сессии Telegram
  3. Закрытие всех подключений LLM-клиентов
  4. Уничтожение движка базы данных
  5. Остановка HTTP-сервера health

Каждый колбэк имеет таймаут 10 секунд. Работает на Unix и Windows.


🐳 Docker

Сборка и запуск

Сервисы:

СервисКонтейнерОписание
app
cogni-vault-app
Бот (ждёт готовности БД)
db
cogni-vault-db
PostgreSQL 16 с pgvector

Dockerfile использует multi-stage сборку:

  • Builder — установка зависимостей и пакета
  • Production — копирование только установленных пакетов, запуск от non-root пользователя
    appuser
    , порт 8080

🔄 CI/CD

CI работает на GitVerse (

.gitverse/workflows/
):

WorkflowТриггерШаги
python.yaml
push / PRBlack, isort, flake8, mypy, pytest (покрытие >70%)
docker.yaml
ручнойMulti-stage Docker-сборка, сохранение образа

📝 Технологический стек

КомпонентТехнология
RuntimePython 3.11+ (полностью async)
Bot Frameworkaiogram 3.x
База данныхPostgreSQL 16 + pgvector
ORMSQLAlchemy 2.0 (async) + Alembic
КонфигурацияPydantic Settings v2 (YAML + ENV)
ВалидацияPydantic v2
Логированиеstructlog (JSON)
HTTP Healthaiohttp
КонтейнеризацияDocker + Docker Compose
CI/CDGitVerse Workflows

📜 Лицензия

BSD — свободное использование, модификация и распространение в любых целях, включая коммерческие. Подробности в LICENSE.