Поиск руководств по поисковому запросу

Постановка задачи

Фирма Моё дело предоставляет услуги бухгалтерского обслужвания и размещает на своём сайте "базу знаний" для предпренимателей, содержащую большое количество руководств по бухгалтерскому и налоговому учёту. Базе знаний не хватает поисковой системы. Задача - разработать систему поиска документов наиболее релевантных запросу пользователя.

Задача ставится как задача ранжирования: нужно возвращать N наиболее релевантных запросу документов.

Возможные решения

  1. Использовать простые методы на основе сходства Жаккара, алгоритма шилингов, расстояния Левенштейна. Плюс - простота реализации. Минус - слабые результаты. Подробнее в статье.
  2. Использовать готовый поисковый движок, например Tantivy или Apache Lucene. Плюс: поиск выполняется быстро даже на очень большом объёме текстов. Минус: может не учитываться семантика слов, поэтому поисковый движок может не учитывать контекст. Подробнее в статье.
  3. Использовать модели машинного обучения, создающую эмбединги из текстов, например Sentence-BERT или Doc2vec из Gensim. В этом случае задачу можно формулировать либо как задачу семантического поиска, либо как задачу семантического текстового сходства. Плюс: решение учтёт семантику и контекст запроса. Минус: может работать очень медленно на большом корпусе текстов.

Предлагаемое решение

Предлагается использовать вариант с созданием эмбедингов из текстов. Ниже приведены предполагаемые шаги по разработке первого прототипа модели.

  1. Использовать предобученную BERT или DistilBERT, так как есть опыт её использования, но можно рассмотреть и другие.
  2. Дообучить модель на имеющихся текстах.
  3. Разбить тексты на части пригодные для обработки BERT. Для начала можно попробовать разбивку без пересечения.
  4. Сделать эмбединги из каждой части с помощью библиотеки Sentence-BERT. В итоге, каждый фрагмент текста можно будет представить точкой в многомерном пространстве (вектором размерности эмбединга), а каждое полное руководство будет образовывать облако таких точек. Каждое облако будет образовывать свой кластер или класс с меткой равной ID-текста.
  5. С помощью дообученного BERT cделать эмбединг из запроса пользователя.
  6. Решать задачу ранжирования: считать, что наиболее релевантный текст - тот, "чьё облако ближе всего" к вектору, полученному из запроса пользователя. Можно рассмотреть альтернативное решение: искать фрагмент текста (только один эмбединг) наиболее похожий на запрос пользователя и считать самым релевантным руководство, частью которого я вляется этот фрагмент.
  7. Под вопросом остаётся оценка качества поисковой выдачи (результатов ранжирования). Статья про метрики ранжирования.

Возможные проблемы:

  1. Опечатки пользователей, ошибки в исходных текстах (пока не обдумывал).
  2. Низкая скорость работы модели.

Вопросы

  1. Каков реальный объём текстов? Есть ли требования к скорости работы модели?
  2. Есть ли какое-либо базовое решение, с котороым можно будет сравнить прототип модели?
  3. Есть ли гипотеза о том какую модель лучше использовать для создания эмбедингов: BERT, GPT или другие?
  4. Как оценивать качество поисковой выдачи? Ранжирование - задача обучения с учителем, что предполагает наличие разметки. Будет ли разметка?