TIDE NATO Hackathon — змагання, під час яких команди шукають інноваційні рішення для покращення взаємосумісності країн НАТО та союзників. 2024 року українські команди здобули перемогу у двох челенджах, а також гран-прі змагань. Тарас Кльоба, лідер команди Valkyrie, розповів, як їм за пʼять днів вдалося розробити рішення для пошуку медикаментів з допомогою ШІ, яке визнали найкращим на хакатоні. Під час виступу на конференції Highload fwdays'24 він описав, як команда шукала юзкейси в українських парамедиків, а також розказав про технічні деталі реалізації через функції PostgreSQL і Azure AI.
Тарас Кльоба — Senior Partner Solutions Architect, Data&Artificial Intelligence в Microsoft. Має понад 14 років досвіду в IT індустрії, банківській справі та кібербезпеці. 2019 року був визнаний найкращим Software Architect України. Тарас є сертифікованим тренером Microsoft, а також має низку професійних сертифікатів від Google, Amazon тощо. Також він засновник спільноти PostgreSQL Ukraine.
Хакатон НАТО: завдання та пошук рішення
Моделюємо ситуацію, що ворог нападає на одну з країн НАТО, і союзники мають застосувати свої сили: кожна країна з Альянсу відправляє військовий контингент у зону бойових дій. Коли в одній локації збирається велика кількість людей, які спілкуються різними мовами й погано розуміють один одного, може виникнути новий «Вавилон».
Змагання Pharmaceutical Thesaurus в межах TIDE NATO Hackathon покликане вирішити цю проблему у медичному треці. Аптечка кожного з таких військових складається з локальних ліків зі специфічними назвами. У критичній ситуації медикам потрібно буде швидко зорієнтуватися і надати першу допомогу. Тому завданням хакатону було придумати технічне рішення для цієї проблеми: мобільний застосунок для пошуку еквівалентів в аптечках союзників. На його розробку у команд було п’ять днів.
«Оскільки ми залучені до допомоги українській армії, ми мали змогу проконсультувалися з парамедиками. Від них дізналися чимало юзкейсів та реалізували додаткові корисні фічі у застосунку, який отримав назву Panacea», — ділиться Тарас Кльоба. Так звали богиню-цілительку у давньогрецькій міфології, яка є символом фармацевтів.
Функціонал застосунку Panacea
1. Пошук ліків-еквівалентів за діючою речовиною
У різних країнах є безліч брендів ліків. Водночас речовини, що лежать в основі — однакові та завжди зазначаються в інструкції латиною. Цей інсайт ліг в основу алгоритму пошуку, який розробила українська команда. «Ми взяли одну з найбільших у світі баз даних ліків, яка містить 700 000 назв брендів та 34 000 активних компонентів, і створили матрицю для пошуку еквівалентів, — пояснює Тарас. — Наприклад, у США є знеболювальне «Тайленол», в основі якого лежить ацетамінофен. Так само ця речовина входить до складу таких препаратів як «Панадол», «Парацетамол» або «Дофалген», які є аналогами «Тайленолу» в інших країнах».
2. Категорії та спеціальні теги
Коли в Україну надсилають допомогу у вигляді контейнерів з ліками з різних країн, їх потрібно розвантажити та розсортувати за категоріями. Частину з цих ліків треба помістити в спеціальний холодильник, а частину, яка містить наркотичні речовини, — у сейфи. У медиків немає вільного ресурсу, щоби займатися цією роботою. Проте з цим може допомогти застосунок Panacea. Для цього команда додала категоризацію, яку розробила Всесвітня організація охорони здоровʼя. Так будь-який волонтер без медичної освіти може правильно визначити категорію ліків (через сканування штрих-коду, фотографію упаковки або ручний пошук у застосунку). Це дає можливість побудувати певний конвеєр та полегшити подальший процес пакування аптечок для військових та парамедиків. Також розробники додали спеціальні теги, які сповіщають про особливі умови сортування.
3. Профайл пацієнта
У такому профайлі можна зберігати інформацію про групу крові, алергії, хронічні захворювання, а також інформацію про надану першу допомогу на кожному етапі евакуації. Чому це важливо: до таких операцій евакуації зазвичай залучено декілька груп. Спочатку пораненому надають домедичну допомогу, потім відвозять в стабілізаційний центр, потім в шпиталь. Якщо на якомусь етапі пораненому вкололи сильне знеболювальне або кровоспинне, інші медики мають обовʼязково про це знати. Застосунок показуватиме не тільки інформацію про всю надану допомогу під час евакуації, але й допоможе її інтерпретувати медикам з інших країн НАТО.
Технічна реалізація: інструменти та архітектура
Ядром системи став PostgreSQL, у якому команда мала хорошу експертизу. Через обмежений час розробники використовували екстеншени. Робота з базою даних на Azure дала застосувати функціонал Azure AI, який дозволяє перетворювати будь-які колонки в ембединги та працювати із векторним типом даних. Своєю чергою PostgreSQL має відповідні індекси, які дозволяють інтегрувати векторні дані у мобільний застосунок.
Підписуйтеся на розсилку від High Bar Journal, аби щомісяця одержувати найцікавіші тексти та актуальні вакансії.
Також команда використовувала додатковий компонент, який називається PostgREST. Він дає перетворити функції, процедури, таблиці та інші об'єкти, які є в базі даних, на REST API функції. Таким чином фактично весь бекенд застосунку змогли реалізувати за допомогою звичайного SQL.
Для додаткових речей, наприклад, Optical Character Recognition (OCR), частина коду була написана на Python. Як інтерфейс розробники використовували Fast API, щоби віддавати ендпойнти для комунікації з мобільним застосунком. Фронтенд був написаний на Flutter.
Ефективний пошук на PostgreSQL
Для якісної роботи застосунку команда прагнула реалізувати ефективний пошуковик для роботи з ліками. За словами Тараса, через брак часу вирішили не додавати нових компонентів, а побудувати його силами PostgreSQL, який має всі відповідні пререквізити.
Для цього реалізували три типи пошуку:
через оператор LIKE/ILIKE;
триграми;
семантичний пошук за допомогою векторів.
LIKE/ILIKE
Припустимо, потрібно знайти в базі ліки з назвою «тайленол». У SQL є оператор LIKE, до якого можна додати знак %, і це означатиме, що ми шукаємо всі слова в цій колонці, які починаються з певного словосполучення, наприклад «тайлен%». Так можна швидко знайти назву ліків в базі, перш ніж користувач введе повну назву. У кейсі Panacea доречно використовувати оператор ILIKE, який ігнорує чутливість до регістру. Так буде неважливо, з великої чи маленької літери почнуть набирати назву ліків, а також, як назва записана у базі даних — система знайде всі відповідники.
Наступний крок — пошук назви ліків всередині колонок. Для цього потрібно поставити два знаки %: на початку та в кінці. Це допомагає нам ранжувати пошукову видачу: спочатку повний збіг, потім збіг всередині тексту.
Триграми
У PostgreSQL є розширення pg_trgm, яке дозволяє виконуватим пошук за допомогою триграм — послідовностей з трьох символів, на які розбивається слово. Наприклад, триграми для слова «tylenol» будуть такими: «tyl», «yle», «len», «eno», «nol». У такий спосіб велике слово перетворюється на масив маленьких «стрічок» з трьох знаків, і якщо людина вводить слово із помилкою, наприклад, «tylelon», застосунок все одно видасть потрібний результат.
Векторний пошук
Для його реалізації команда застосувала екстеншен azure_ai: взяли відповідні колонки, по яких хотіли реалізувати пошук, та створили додаткову таблицю із даними, перетвореними у вектор. Далі створили нову колонку, налаштували, що вона буде автоматично заповнюватися щоразу, коли в ній щось відбувається з даними. Для калькуляції цього вектора застосовується певна функція, а результати зберігатимуться завжди в цій колонці. Провівши ці маніпуляції, можна використовувати вектори для пошуку інформації, якої немає безпосередньо в назві ліків. Наприклад, можна ввести запит «ліки від болю голови», і вектор розмістить його у багатовимірному просторі у певній близькості до ліків, які можуть розв'язати цю проблему.
AI RAG Assistant
Також розробники вирішили додати RAG-систему до застосунку Panacea — додаткову вкладку, яка дозволяє працювати з пошуком у форматі чат-бота. Для цього усі дані про ліки та діючі речовини перенесли у Knowledge Graph та векторизували їх.
Щоби відповісти користувачеві на повідомлення, система дістає інформацію з векторизованої БД та віддає в LLM. Таким чином у реалізованої RAG-системи буде менше галюцинацій, ніж у великої лінгвістичної моделі.
«Застосувавши ці підходи, ми змогли реалізувати багаторівневий пошук, який вирішував завдання хакатону. Він дозволяє користувачам знаходити відповіді за точними та частковими збігами, за запитами, введеними із помилками, або словами, які не згадуються безпосередньо у назві завдяки багатовимірному пошуку. Цей підхід можна застосувати також для інших потреб, фактично в будь-якій системі», — ділиться Тарас Кльоба.
OCR-пошук
Ще один можливий вид пошуку у застосунку Panacea, — через OCR. Команда створила мініалгоритм, який зчитує всю інформацію з коробки та розбиває її на певний набір слів. За кожним з них здійснюється пошук у базі даних, щоби ідентифікувати, яких ліків стосується ця інформація. Таким чином користувач може просто сфотографувати коробку і знайти всю інформацію про ліки в застосунку.
Наразі Panacea використовують українські громадські організації, зокрема для потреб сортування. Також після участі в хакатоні розробку представили на двох конференціях NATO, зокрема у Дрездені, де зібралося близько 600 учасників. Загалом команда відкрита до співпраці та імплементації продукту в різних країнах альянсу і сподівається, що Panacea допоможе врятувати життя.