Введение в проблему
При создании leaderboard'а для проекта DumbQuestion.ai возникла задача отслеживания наиболее часто задаваемых вопросов. Казалось бы, что это простая задача, но люди редко задают один и тот же вопрос одинаково. Было интересно узнать, как творчески пользователи формулируют свои вопросы, и было решено создать leaderboard наиболее часто задаваемых "глупых" вопросов.
Техническая проблема
Люди задают один и тот же вопрос по-разному. Например, "Что такое 2+2?" и "Можешь ли ты сложить два плюс два для меня?" по сути одинаковы. Простой счетчик строк даст шум, а не сигнал. Нужно было найти способ определить семантическую схожесть, а не просто сравнивать строки. Это известная проблема в мире машинного обучения, но типичные решения имеют компромиссы: тяжелые модели, дорогие API или значительную задержку в критическом пути.
Решение: Векторная схожесть на ограниченном бюджете
Каждый вопрос проходит через модель вложения и сравнивается с базой данных Qdrant. Бесплатный тарифный план Qdrant очень щедрый для проекта с ограниченным бюджетом, но самохостинг тривиально прост, если это необходимо. Логика сравнения проста:
- Генерировать вложение для входящего вопроса
- Сравнивать с существующими вложениями, используя косинусную схожесть
- Если схожесть превышает порог, увеличивать счетчик вопроса
- Если вопрос новый, добавлять его в базу данных
- Первый экземпляр вопроса становится официальной версией для отображения
Ключевое архитектурное решение
Ни одна из этих операций не выполняется в основном приложении. Это позволяет сохранить основное приложение эффективным и не нагружать его дополнительными вычислениями. Векторная схожесть обеспечивает понимание контекста вопросов, а не просто сравнение строк. Это решение позволяет создать leaderboard, который действительно понимает, о чем спрашивают пользователи.