Фирма Моё дело предоставляет услуги бухгалтерского обслужвания и размещает на своём сайте "базу знаний" для предпренимателей, содержащую большое количество руководств по бухгалтерскому и налоговому учёту. Базе знаний не хватает поисковой системы. Задача - разработать систему поиска документов наиболее релевантных запросу пользователя.
Задача ставится как задача ранжирования: нужно возвращать N наиболее релевантных запросу документов.
- Использовать простые методы на основе сходства Жаккара, алгоритма шилингов, расстояния Левенштейна. Плюс - простота реализации. Минус - слабые результаты. Подробнее в статье.
- Использовать готовый поисковый движок, например Tantivy или Apache Lucene. Плюс: поиск выполняется быстро даже на очень большом объёме текстов. Минус: может не учитываться семантика слов, поэтому поисковый движок может не учитывать контекст. Подробнее в статье.
- Использовать модели машинного обучения, создающую эмбединги из текстов, например Sentence-BERT или Doc2vec из Gensim. В этом случае задачу можно формулировать либо как задачу семантического поиска, либо как задачу семантического текстового сходства. Плюс: решение учтёт семантику и контекст запроса. Минус: может работать очень медленно на большом корпусе текстов.
Предлагается использовать вариант с созданием эмбедингов из текстов. Ниже приведены предполагаемые шаги по разработке первого прототипа модели.
- Использовать предобученную BERT или DistilBERT, так как есть опыт её использования, но можно рассмотреть и другие.
- Дообучить модель на имеющихся текстах.
- Разбить тексты на части пригодные для обработки BERT. Для начала можно попробовать разбивку без пересечения.
- Сделать эмбединги из каждой части с помощью библиотеки Sentence-BERT. В итоге, каждый фрагмент текста можно будет представить точкой в многомерном пространстве (вектором размерности эмбединга), а каждое полное руководство будет образовывать облако таких точек. Каждое облако будет образовывать свой кластер или класс с меткой равной ID-текста.
- С помощью дообученного BERT cделать эмбединг из запроса пользователя.
- Решать задачу ранжирования: считать, что наиболее релевантный текст - тот, "чьё облако ближе всего" к вектору, полученному из запроса пользователя. Можно рассмотреть альтернативное решение: искать фрагмент текста (только один эмбединг) наиболее похожий на запрос пользователя и считать самым релевантным руководство, частью которого я вляется этот фрагмент.
- Под вопросом остаётся оценка качества поисковой выдачи (результатов ранжирования). Статья про метрики ранжирования.
Возможные проблемы:
- Опечатки пользователей, ошибки в исходных текстах (пока не обдумывал).
- Низкая скорость работы модели.
- Каков реальный объём текстов? Есть ли требования к скорости работы модели?
- Есть ли какое-либо базовое решение, с котороым можно будет сравнить прототип модели?
- Есть ли гипотеза о том какую модель лучше использовать для создания эмбедингов: BERT, GPT или другие?
- Как оценивать качество поисковой выдачи? Ранжирование - задача обучения с учителем, что предполагает наличие разметки. Будет ли разметка?