### Описание файлов и папок 1. Папка db - база данных chromadb 2. Папка docs - папка с документами для обработки 3. Папка examples - папка с примерами работы решения 4. app.py и app.ipynb - python и notebook версии инференса решения 5. preprocess_doc.ipynb - обработка документов и сохранение в базу данных 6. question_generation.ipynb - генерация синтетического датасета для дообучения Retriever и Cross-Encoder ### Описание реализации задания 1. Документы разбиваются по частям статей, лишние "технические" части документа не учитываются 2. После разбивки сохраняем каждый получившийся фрагмент вместе с его эмбеддингом, полученным с помощью LaBSE, в базу данных 3. Когда пользователь вводит запрос, получаем на него предварительный ответ при помощи LLM (ChatGPT или GigaChat на выбор), объединяем запрос и ответ LLM, при помощи LaBSE получаем эмбеддинг, выполняем запрос в БД и получаем топ-10 наиболее релевантных фрагментов закона, переранжируем их при помощи предобученной для русского MiniLMv2-L12 и выбираем топ-3 наиболее релевантных варианта. Затем просим LLM выбрать один вариант ответа, где есть ответ на запрос или сказать, что ответа нет. Если ответ есть, то LLM подсказывает номер фрагмента с ответом, что позволяет определить конкретную норму, на основе которой будет дан ответ. Потом просим LLM дать ответ на запрос, используя только один фрагмент, или сказать, что ответа все-таки нет. Если LLM в первый раз назовет норму, где есть ответ, а потом ответ не найдет, то пользователю не выведется ответ, но порекомендуется обратиться к найденной норме. 4. У меня в целом предусмотрены выводы LLM в виде просто цифры штрафа или в виде развернутого ответа, однако это скорее работает только для ChatGPT, GigaChat склонен отвечать всегда развернуто. ### Что не успел сделать 1. Генерация качественного датасета для дообучения моделей поиска. Я попробовал сгенерировать датасет при помощи GigaChat (поскольку когда я это делал, у меня не было возможности использовать api ChatGPT), результат получился на взгляд посредственным и я решил пока не использовать полученные данные для дообучения. 2. В целом почти всегда найденная конкретная норма будет содержать в себе полноценный ответ, однако иногда описание санкций для повторных нарушений вынесено в отдельные части статей, поэтому можно пробовать для топ-1 фрагмента брать фрагменты выше и ниже для более точного ответа. 3. В целом все модели, использованные для решения, мультиязычные, поэтому если задать вопрос, например, на английском, то ответ будет найден, но LLM выведет его на русском. Можно попробовать модифицировать промпты для вывода ответа на языке запроса, если такая необходимость есть. 4. Если в запрос внести много лишних слов, то вероятность успеха понизится. Можно попробовать подобрать промпт или сделать локальную модель, которая будет упрощать запрос для более точного ответа. ### Важно! 1. В app.py находятся ключи к api ChatGPT и GigaChat. Там должно быть достаточно средств для проведения тестирования, но если вдруг средства закончатся, то нужно будет или мне написать, или вставить свои ключи. 2. Если слишком часто делать запросы, то можно получить сообщение Error. Это может быть из-за timeout'ов api Open AI, нужно подождать секунд 15-30 и повторить запрос.