Большой тест GPT4, GPT3.5, YandexGPT, GigaChat, Saiga в RAG-задаче. Часть 2/2

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Краткое содержание первой части

В первой части статьи я рассказывал о создании цифрового юриста, способного отвечать на вопросы на основе 200-страничного регламента. Цель — работа такого юриста в закрытом контуре организации, без использования облачных технологий.

Для этого задания мы разработали фреймворк, позволяющий изменять LLM-модель и тип токенизации в реальном времени. В качестве эталона мы использовали GPT4 Turbo и ADA-02 для токенизации. Хотя такое решение не подходит для продакшн, оно отлично служит точкой отсчёта.

Особенностью нашего подхода стало собрание 31 вопроса, от простых до сложных, с последующей оценкой ответов юристами. Оценка была руками, людьми, что делает его особенно ценными. Мы тестировали различные комбинации моделей и промптов, включая GPT4, GPT3.5, GigaChat и YandexGPT. Гипотеза об эталонной модели и токенайзере подтвердилась результатами от OpenAI (около 70% точных ответов). Однако токенайзеры от RuBert оказались не настолько эффективными, как ожидалось.

Более подробно об этом можно прочитать в первой части.

Сравнительная таблица из первой части

В этой части мы рассмотрим дообученный токенайзер и модели Saiga на базе Llama и Mistral.

Какой выбрать токензайзер (тот что создаёт векторное представление текста)?

Правильный выбор токенайзера в RAG аналогичен выбору ингредиентов для супа. Чтобы избежать перебора всех возможных вариантов и не нагружать проверкой наших юристов, я решил провести предварительную квалификацию.

Напомню, что в RAG промпт задачи формируется динамически. Вопрос (A) конвертируется в вектор, и выбираются наиболее близкие ему математические векторы фрагментов регламента, сортируемые по убыванию "близости". Затем из них формируется запрос. Например, для вопроса A наиболее близкими являются фрагменты текста P, D, F, G, при этом дистанция между векторами A-P больше, чем A-D. С этой задачей лучше всего справляется ADA-02 от OpenAI.

Таким образом, можно создать собственный токенайзер и сравнить, какие фрагменты текста он выдаст для такого же запроса. Если их последовательность совпадает с ADA-02, это отлично. В противном случае, эту ошибку можно измерить и анализировать.

Если скормить этот текст в СhatGPT и попросить зарисовать, он выделит суп как основный элемент.

В некотором смысле наш токензайзер должен выделять правильные элементы.

Методология поиска лучшего токенайзера

В качестве референса было я взял около 5000 текстовых фрагментов различного содержания: примеры вопросов, выдержки из регламента. Из этих данных случайным образом формировались 250 пар текстов для расчета косинусной близости для выбранного токенизайзера. Далее рассчитывал отклонение между значением эталонного ADA-02 и выбранного. Колебание этого отклонения и есть наш параметр. Если токензайзеры идентичны, то и среднееквадратичное отклонение между ними = 0.

Среднее квадратичное отклонение между каждой точкой позволило определить точность выбранного токенизатора. RuBert – Large демонстрировал погрешность около 10-11% в отношении ADA-02, sbert-nlu-ru-mt – 9-11%, что является улучшением, хоть и незначительным.

Близко, но все равно колбасит (9-13%)
Близко, но все равно колбасит (9-13%)

9Ембеддинг – это матрица чисел, поэтому задача адаптации локального токенизатора, такого как RuBERT или sbert‑nlu‑ru‑mt, заключается в преобразовании одной матрицы в другую. Классическая ML задача.

После исследований промпта в ChatGPT я остановился на трехслойной сети TensorFlow, без специальной настройки и подбора гиперпараметров (всё по умолчанию, что наверное упущение).

30 эпох обучения и был создан адаптер. Он переводит вектор RuBert (1024 параметра) в вектор OpenAI (1526 параметров). Этот адаптер будет эффективно работать только с текстами, близкими к определенной тематике.

Желтая линия - это токенайзер RuBert после FineTuning. Он по форме и пикам больше подходит под эталонный.  Улучшение точности с 11 до 6% - радикально улучшило общие показатели.
Желтая линия - это токенайзер RuBert после FineTuning. Он по форме и пикам больше подходит под эталонный. Улучшение точности с 11 до 6% - радикально улучшило общие показатели.

Синтетические тесты показали, что ошибка снизилась с 9-11% до 6%. При этом использование sbert-nlu-ru-mt не дало прироста, поэтому был выбран RuBert-large в качестве основы.

Таким образом, был получен локально работающий токенизатор, близкий по эффективности к облачному ADA-02, что теоретически должно улучшить качество ответов.

Проверка гипотезы, что улучшенный токенайзер даст заметно лучший результат

Возьмем наш эталон GPT-4, а также YandexGPT и пропустим через нашу машинку вопросов/ответов и отдадим на оценку ответов юристам. И мы получаем следующие результаты:

GPT-4

ADA-02

RuBert - Large

RuBert-Large FineTuned

Верно

71%

32%

55%

Спорно

6%

13%

19%

Ошибочно

23%

55%

26%

Значения правильных ответов на эталонной модели значительно выросли (с 32% до 55%). Ошибочных ответов уменьшилось в двое и равно эталонным (уменьшение с 55% до 26%, при 23% эталонных). Иными словами – наша стратегия сработала:

  1. Правильный токенайзер повышает качество. Улучшение точности ембедингов с 11% до 6% даёт значимый результат.

  2. Fine Tune токенайзера возможен

Аналогичный результат мы видим и для моделей YandexGPT. Количество правильных ответов растет, ошибочных падает:

GPT-4

ADA-02

RuBert - Large

RuBert-Large FineTuned

Верно

29%

32%

45%

Спорно

26%

6%

13%

Ошибочно

45%

61%

42%

Локальные модели

Пришло время к самому интересному. Я развернул локальные на базе Saiga2 (LLama2).

Решение не тестировать на токенизаторе от OpenAI и обычном RuBert было обоснованным, так как использование локальной модели с облачным токенизатором от OpenAI кажется абсурдным, а применение обычного RuBert нецелесообразно из-за его низкого качества.

Для сравнения я взял модели с двумя разными квантованиями. На 5 и 8. Первая может поместиться в видеокарту 3060 (12GB), вторая уже требует карты 3090 или 4090 (24GB).

Обе модели показали почти идентичные: 35% верных ответов, 52% ошибочных и 13% спорных ответов. Это немного лучше, чем у YandexGPT|GigaChat на базе обычного RuBert, но хуже, чем у RuBert-fine tuned.

В целом, YandexGPT немного превосходит Saiga LLama2, что является положительным моментом.

Итоговая сравнительная таблица:

А вот с fine-tune моделями у меня пока не всё получается как надо. Много галлюцинаций. Поэтому я планирую написать отдельную статью по этой теме, когда завершу эксперименты.

Влияние сложности вопросов на оценку

На данный момент задача RAG с использованием локальных моделей (в закрытом контуре) не решается в полной мере в лоб. Одновременно эту задачу можно решать, если есть доступ к OpenAI GPT4 с широким окном контекста, достигая 70-80% правильных ответов без особых усилий. Обратная сторона медали, кроме отсутсвия контура безопасности - это стоимость. Сейчас запрос будет обходится где-то в 5-10 центов.

Основные ограничения локальных моделей, на мой взгляд связаны в первую очередь с (1) правильным формированием чанков первичного текста (2) токенайзерами,и в меньшей степени – с самими моделями. Недостатки моделей, по моему мнению, можно компенсировать более точными промптами и fine-tuning. Альтернативно, можно подождать развития технологий в ближайшие месяцы.

Работа над нарезкой и векторизацией данных – это задача требующая нашего внимания и которая не будет решена сама по себе. Доработка FineTune токенайзера представляется технически выполнимой. Нужно больше экспериментировать с гиперпараметрами модели.

По вопросу нарезки данных (чанков текста) возможны три пути. Первый, немного примитивный, но правильный с точки зрения продуктового подхода – ограничить RAG задачу информацией, которая умещается в 1-2 абзаца, возможно с ручной нарезкой.

Второй – изучить возможности и технологии графового представления данных для более сложной обработки.

Третий - ждать, пока появятся достойный локальные модели с длиной контекста (эффективной длинной) до 128К символов. Но это не наш путь.

Поэтому не прощаюсь ...

Источник: https://habr.com/ru/articles/784952/


Интересные статьи

Интересные статьи

Мы продолжаем рассказывать о внутренней кухне Wiren Board. В наших контроллерах используются модули резервного питания WBMZ4-SUPERCAP на суперконденсаторах (ионисторах).Мы постоянно ищем новые компоне...
Несколько недель назад в блоге «.NET Blog» появилась статья «Что такое .NET, и почему вы должны выбрать его?». В нем был представлен высокоуровневый обзор платформы, кратко описаны различные компонен...
Apache NiFi динамично развивается и на сегодняшний день обладает достаточно большим набором возможностей, позволяющим отслеживать состояние потоков данных, ошибки и предупреждения, возникающие в проце...
В первой части темы мы познакомились с проектом Meshtastic. Узнали, что можно построить собственный радиочат на основе Mesh-сети, обычного смартфона и радиомодема. Во вто...
Toolkit начинающего пентестера: представляем краткий дайджест главных инструментов, которые пригодятся при пентесте внутренней сети. Эти инструменты уже активно используются широким кругом специа...