1. Введение
Я давно хотел поучаствовать в хакатоне. Хотелось приобщиться к особому вайбу скорости, импровизации и стресса. Увидел приглашение на очный хакатон в г. Альметьевск, организатором выступало ПАО "Татнефть". Задача - «бот для поиска информации» - хотя и предельно абстрактная, но скорее всего попадает в стэк моих навыков.
Разделить мой энтузиазм согласились Даниил, Влад и затем к нам присоединился Иван.
Из денежных затрат – только добраться до Казани, но и на них мы нашли спонсора: проект Виктора Домшенко Class Action Lab любезно профинансировал нам билеты.
2. Подготовка
У нас не было деталей задачи, но даже в общих для большинства nlp-задач "развилках" были вопросы и различные альтернативы. Их остроту усиливали ограничения хакатона: нужно было пользоваться только опенсурсными решениями.
Поэтому «домашняя работа» у нас была насыщенной: нам нужно было выбрать LLM, определиться с векторной базой данных, подумать над структурой промпта и т.п.
3. Альметьевск
Мы прибыли в Альметьевск накануне, поэтому успели немного посмотреть город. Он оказался приятным местом. Высшая школа нефти – местная достопримечательность, флагман «нефтяной столицы Татарстана» (свои фотки окружающей среды не делали, поэтому взяли из интернета):
Вечером были в отличном баре. Рекомендуем!
4. Конкретизация задачи
Мы ждали конкретизации задачи, и мы ее получили:
Замечательно, что на площадке были эксперты, которые смогли прояснить множество деталей, иначе, имея только этот слайд, было бы сложнее. Если коротко, от команд на хакатоне ждали аналога Bing со встроенным ChatGPT:)
Мы приступили.
5. Архитектура
В общих чертах продукт работал следующим образом:
Да, дизайнера не было ни в команде, ни как шедоу-тиммейта:)
Расскажем о некоторых деталях.
5.1 Векторная база данных
Нам очень понравилась картинка, которая наглядно демонстрирует принцип ее работы:
Решили использовать Qdrant, поскольку:
это специализированная БД для работы с векторными представлениями;
разворачивается на локальном ПК;
легко масштабируется (это тоже влияло на оценку продукта);
не зависит от конкретного фреймворка;
поддерживает гибридный поиск;
Векторизовать получилось очень удачно:
5.2 Гибридный поиск
Гибридный поиск это сочетание векторного поиска и классического полнотекстового поиска. Тот и другой имеют свои плюсы и минусы, при объединении качество поика повышается. С одной стороны, позволяет хоть немного обуздать LLM и спастись от галлюцинаций, с другой стороны, более точно учесть контекст и запрос пользователя. Выход очевиден – объединить разные методы поиска:
5.3. Структура промпта
Структура нашего промпта:
Инструкция. Мы просим модель отвечать максимально кратко и не отвечать, если она не знает ответа.
Вопрос пользователя;
Контекст. Документы, относимые к запросу пользователя, которые мы получили на этапе поиска и ранжировали.
Конечно, штучки типа "я тебе заплачу", "отвечай только по существу", "если ты ответишь неверно, меня уволят" мы тоже использовали.
6. Сбор данных или зачем на хакатоне юрист
Как писали выше, мы реализовали две модели поиска: в браузере ("открытый") и по конкретным документам ("закрытый").
"Закрытый" поиск требовал коллекцию документов, которые потом попадут в контекст LLM. Но какие документы нужно для этого брать? Где брать эти документы?
Ставя себя на место пользователя (сотрудника нефтяной компании с массой других бизнесов), мы выделили 5 групп источников, которые будет полезно добавить в контекст при ответе модели:
нормы права (законодательство о недрах, о лицензировании и т.п.), как федеральные, так и Республики Татарстан;
технико-правовые нормы (ГОСТы, СНиПы, Своды правил и т.п.) в нефтегазовой отрасли;
открытая информация о заказчике. Публичное акционерное общество раскрывает о себе массу полезной информации;
судебная практика в отношении группы компаний заказчика. Причем по исключительным правам – отдельно. Использование судебной практики стало одной из киллер-фич продукта.
учебники по нефтегазовой отрасли;
Мы были существенно ограничены во времени, поэтому удалось собрать около 700 документов.
7. Подготовка тестовых вопросов для проверки модели
Чтобы оценить качество модели в понятных для всех величинах, мы составили около 70 вопросов о нефтегазовой промышленности (опять же, ставя себя на место сотрудника компании). Часть вопросов была составлена на основании собранных данных. Другая часть – на основании учебных планов профильных вузов (да, те самые экзаменационные билеты, адаптированные нами под задачу). Некоторые вопросы специально подбирались таким образом, что ответ в поисковике («открытый» поиск) не учитывал особенности отрасли и был заведомо неправильный.
После того, как мы собрали ответы модели на наши вопросы, оценили их соответствие – получили точность около 83%.
8. Защита проекта
Мы довольно сильно вымотались за двое суток, поэтому защита проходила уже на морально-волевых качествах команды. Мы выступали последними. Поскольку финал был открытый, оказалось, что решения остальных команд частично совпадали с нашим. Например, почти все команды использовали Телеграмм для юзер-интерфейса.
С одной стороны, это усложняло задачу - повторение очевидно не будет услышано, воспринято и по достоинству оценено. С другой стороны, некоторые обязательные, но при этом всем ясные сюжеты можно было пропустить и сэкономить на этом время. Поэтому нам пришлось подкручивать и докрашивать самолет уже во время полета.
Затраченные время, силы и нервы не прошли даром. Мы взяли почетное второе место, получили полезный опыт командной работы в стрессовых условиях и обросли множеством контактов.
Команда ClassActionLab:
Владислав Попов (tg: @YaZ0p)
Иван Иванов (tg: @kamane_margane)
Ваш покорный слуга, Артем Сабиров (tg: @arsab3)
Даниил Бурмистров (tg: @theDrillDB)