В качестве датасета выступили данные доступные на сайте Центрального банка . Сбор данных начинался с изучения работы сайта и устройства существующего поиска. После анализа трафика и результатов поиска выявили следующие моменты:
- API поиска
https://www.cbr.ru/search/
с параметрами- Text: "Запрос поиска"
- PageNum: пагинация по результатам поиска
- Category: тип материала (нововсти / пресс релизы)
- Time: фильтр по времени
- API новостей:
https://www.cbr.ru/news/eventandpress/
с query параметрами:- page: int - пагинация по результатам поиска
- IsEng: bool - вывод результатов на английском языке
- type: int тип новость / пресс релиз
- dateFrom: начало временного отрезка по которому происходит поиск
- dateTo: конец временого отрезка по которому происходит поиск
- Tid: ?
- vol: ?
- phrase: поиск по фразе в новостях Так же по результатам тестовых запросов выявили две ссылки по которым можно получить отцифрованные документы в формате pdf:
- Документы центрального банка: https://www.cbr.ru/Queries/UniDbQuery/File/90134/
- Документы содержащие правовую информацию https://www.cbr.ru/
Из интересных данных так же отметили раздел часто задаваемых вопросов. Для его парсинга написали простую утилитку на го, с помощью которой пробежались по сложной вложенной структуре категорий и вопров и сохранили их во временное хранилище
Все оригинальные документы хранятся на гугл диске
В качестве временного хранилища для текстовых данных используется MongoDB. Так как документо орентированые бд позьволяют хранить данные без определенной структуры.
После обработки pdf документов, которые были созданы в текстовых редакторах. Для пополнения набора данных использовалась модель easyocr для обработки текста с изображений для дальнейшей обработки. В процессе экстракции текстов с отсканированных документов обнаружились проблемы, с горизонтальными таблицами расположенными в вертикальном документе вот несколько примеров:
170-173 страница - https://www.cbr.ru/Queries/UniDbQuery/File/90134/2726
Перед кодированием мы создаем исскуственное пересечение контекстом, чтобы во время поиска мы могли выдавать два материала с релевантными данными. Благодаря использованию Tochka-AI/ruRoPEBert-e5-base-2k с увеличеным контекстом до 2 тысяч токенов, что позволило сделать overlap в 490 токенов. Эта модель является русифицированной версией intfloat/multilingual-e5-base, полученной путем удаления лишних токенов из других языков. Что позволяет пересчитывать embeddings для всех материалов в районе 8-9 минут на gpu.
Для векторного поиска по документам мы используем распределенное векторное хранилище Clickhouse. Для этого был написан собственный класс VectorStore, который выполняет следующие функции:
- создание таблицы
- создание эмбеддингов
- поиск ближайших документов к запросу
После получения ранжированного списка семантически близких документов к запросу, мы передаем их вместе с специальным промптом в две модели - LLama2 и T5-FRED. LLama2 запускается из библиотеки Ollama и была дополнительно донастроена с использованием библиотеки UnSloth. запуск моделей можно осуществить в прототипе *для запуска в блокноте потребуется соединение с clickhouse промт для Llama2:
template = """Отвечай только на русском. Если пишешь на другом языке, переводи его на русской.
Если не знаешь ответа, скажи что не знаешь ответа, не пробуй отвечать.
Я дам тебе три текста, из которых надо дать ответ на поставленный вопрос.
Также тебе надо оставить ссылку из источник.
Context:
источник {url1}:
{context1}
источник {url2}:
{context2}
источник {url3}:
{context3}
Вопрос: {question} на русском языке. Ответь на вопрос основываясь на данных документах
Развернутый ответ:
"""
промт для T5-FRED:
promt = f"""
<SC6>Текст:
источник {docs[0].metadata}:
{docs[0].text}
источник {docs[1].metadata}:
{docs[1].text}
источника {docs[2].metadata}:
{docs[2].text}
Вопрос: {query} Укажи источник. Ответь на вопрос основываясь на данных документах
Развернутый ответ: <extra_id_0>
"""
Так же реализован интуитивно понятный веб-сервис, позволяющий протестировать работу модели, а также проще и быстрее внедрить наше решение для пользования сотрудниками банка или же любыми другими пользователями.
- Сервис позволяет отправлять запорсы в чат на естественном языке и ответы на эти запросы передаются в чат посимвольно, используя стриминг через протокол RPC, что обеспечивает мгновенную и плавную доставку информации в реальном времени без задержек.
- В верхней панели чата доступна возможность выбрать модель LLama2 и T5-FRED
- По кнопке загрузки есть возмоность поделиться историей чата, получив по кнопке необходимую ссылку
- Пользователь может авторизоваться - тогда история чата будет сохраняться
Кроме того, наличие в сервисе сохранения истории позволит в будущем анализировать запросы пользователей и ответы, на основе который можно проводить аналитику и улучшать работу сервиса