Разработчики сервиса для хранения данных о киберугрозах (Threat Intelligence) столкнулись с тем, что обычный векторный поиск не справляется с особенностями этой области. В отличие от общего поиска по документам, ценность записей в TI сильно зависит от времени публикации и надежности источника. Документ, выпущенный вчера, может быть критически важным, а старая ссылка на CVE — по-прежнему актуальна. Кроме того, аналитику нужны не просто похожие абзацы, а точные индикаторы компрометации (IOC): IP-адреса, домены, хэши, номера уязвимостей.

Первым прототипом стала простая система: загрузка PDF, RSS и CVE, извлечение текста, разбиение на части, построение векторов и поиск. Однако быстро выяснилось, что такой подход требует серьезной доработки. Разработчики добавили разделение текста по границам разделов (а не механически по токенам), извлечение сущностей с помощью регулярных выражений и словарей, а также разную оценку свежести для новостей и справочных материалов. Для поиска используется модель BAAI/bge-m3, генерирующая векторы, которые pgvector сравнивает в Postgres.

Хотелось добавить сразуЧто сделали в первой версииПочему
Celery и RedisОчередь в PostgresОдин обработчик, умеренный поток задач
Отдельную графовую БДТаблицы сущностей и связейГрафовые запросы еще не стали узким местом
Универсальный конвейер загрузкиТри явных пути для PDF, RSS и CVEПроще проверять поведение каждого источника
Облачный расчет векторовЛокальная модельTI-тексты и клиентские данные не уходят наружу
Панель администратораAPI и утилита командной строкиДля закрытого пилота интерфейс не был критичен

В качестве технологического стека выбрали Postgres с расширением pgvector для векторного поиска и MinIO для хранения файлов и извлеченного текста. От Celery и Redis отказались в пользу очереди заданий прямо в Postgres с четырьмя статусами: queued, running, complete, failed. Отдельную графовую БД тоже решили не внедрять — на текущем объеме данные хорошо живут в обычных таблицах. Такой минималистичный подход упростил отладку и позволил быстро запустить закрытое пилотирование через API и CLI без веб-интерфейса.

Особое внимание уделили обработке документов: система сохраняет извлеченный текст в MinIO, делит на фрагменты, вычисляет векторы небольшими группами и записывает результат одной транзакцией. Это защищает от дублирования при сбоях. Также реализована поддержка формата STIX/TAXII для обмена данными об угрозах. В будущем разработчики планируют добавить веб-интерфейс, Celery для фоновых задач и графовую базу данных для сложных запросов, но пока эти компоненты не являются критичными.