Как связать базу вопросов и ответов с внешним сайтом для решения задачи
Что проверяют
Умеете ли вы превратить расплывчатую постановку в систему: откуда данные, как они синхронизируются, как вопрос с сайта находит ответ в базе и как мерить качество. Следом обычно спрашивают, что делать, когда подходящего ответа в базе нет.
Как отвечать
Начните с уточнения, куда идут данные: сайт служит источником вопросов и ответов или потребителем, которому база отвечает. Дальше каркас по слоям:
- получение данных: официальный API или выгрузка лучше парсинга. Парсинг только с учётом условий сайта и
robots.txt, с ограничением частоты и повторами с экспоненциальной задержкой; - синхронизация: инкрементально по
updated_atили курсору, upsert по внешнему идентификатору, хеш содержимого, чтобы пропускать неизменившиеся записи. Повторный запуск должен быть идемпотентным; - сопоставление: одинаковые вопросы формулируют по-разному, точное совпадение строк не работает. Эмбеддинги мультиязычной моделью из sentence-transformers, векторный индекс (pgvector с HNSW, FAISS) плюс BM25 для терминов, кодов ошибок и названий. Верх выдачи переранжирует кросс-энкодер;
- порог и запасной путь: если близость лучшего кандидата ниже порога, не выдавать чужой ответ, а отправить вопрос человеку или в очередь разметки;
- выдача: сервис с REST API, который вызывает сайт, и кеш частых запросов. Если ответ генерирует LLM, это RAG: найденные ответы идут в контекст, а пользователь видит ссылку на источник.
Качество мерьте офлайн на размеченных парах «вопрос, правильный ответ»: recall@k и MRR для поиска. Онлайн собирайте сигнал с сайта: клики, отметки «помогло», долю вопросов, ушедших в запасной путь.
Где спотыкаются
Сразу пишут requests и INSERT, не выяснив, что за задача и в какую сторону течёт информация. Интервьюер ждёт вопросов, а не кода.
Перезаливают всё при каждом запуске или вставляют без проверки на дубли. Через месяц в базе по три копии каждого вопроса.
Не думают о пороге и оценке: система всегда отвечает хоть чем-то и уверенно выдаёт неверный ответ. Сюда же относится смена модели эмбеддингов без переиндексации: векторы запроса и индекса оказываются из разных пространств.