Skip to content

yogenyslav/Purple-hack

 
 

Repository files navigation

Протестировать работу сервиса можно на прототипе (ссылка указана в форме отправки решения)

Поиск по документам методом RAG

Схема проекта

В качестве датасета выступили данные доступные на сайте Центрального банка . Сбор данных начинался с изучения работы сайта и устройства существующего поиска. После анализа трафика и результатов поиска выявили следующие моменты:

  • 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
  • По кнопке загрузки есть возмоность поделиться историей чата, получив по кнопке необходимую ссылку
  • Пользователь может авторизоваться - тогда история чата будет сохраняться

Кроме того, наличие в сервисе сохранения истории позволит в будущем анализировать запросы пользователей и ответы, на основе который можно проводить аналитику и улучшать работу сервиса

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Jupyter Notebook 37.9%
  • TypeScript 25.0%
  • Go 20.3%
  • Python 14.4%
  • JavaScript 1.1%
  • CSS 0.6%
  • Other 0.7%