Всем привет! Меня зовут Артем Ерохин. Я работаю в X5 Tech в направлении продуктивизации ИИ. В прошлом году у меня был доклад про разметку данных с LLM. И я решил преобразовать этот доклад в статью, попутно обновив некоторые цифры и тезисы (такова уж скорость прогресса в этой области). 

Но для начала позволю себе несколько вводных для тех, кто всё же не слышал про разметку данных и LLM (Large Language Models или большие языковые модели).

Что же такое LLM?

Итак, LLM – это:

  1. Модель. Причём, это модель глубокого обучения (Deep Learning). Получается, мы стараемся получить модель некоторого кусочка нашей реальности.

  2. Языковая модель. Тот кусочек реальности, который хочется моделировать – это естественные (или не очень, но близкие к этому) языки. То есть те языки, на которых мы общаемся (или с которыми работаем, например, языки программирования).

  3. Большая модель. То есть в нашей модели счёт может идти на десятки и сотни миллиардов параметров. Что позволяет таким моделям показывать удивительные результаты. 

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

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

Увы, но очевидные для человека вещи абсолютно не ясны машине. И нам как-то нужно передать наши знания машине, не растеряв их по дороге. Одна из классических задач машинного обучения – это обучение с учителем. В данном случае человек выступает именно таким “учителем”, который явно предоставляет данные модели, добавляя метки к набору данных. Этот процесс называется разметкой данных (Data Labeling).

Неплохо иллюстрирует процесс изображение выше. Наша задача – научить машину отличать геометрические фигуры. В таком случае, для каждой фигуры будет некоторый набор признаков (полученный вручную или извлеченный моделью). Мы можем явно поставить метку к каждому изображению: к изображениям треугольника поставить метку "треугольник", к кругу – "круг" и т. д. Полученный набор данных с метками мы можем использовать для обучения модели. И если мы обучили модель достаточно хорошо, то она сможет отличать треугольники от кругов.

Какие проблемы могут быть в процессе разметки данных?

Как и любой процесс, разметка данных имеет свои особенности и проблемы, которые приходится решать в процессе разметки. Можно выделить несколько крупных проблем:

  1. Большие объемы данных
    Крупные организации, такие, как X5, одновременно решают десятки различных задач, которые могут требовать применения машинного обучения (а, значит, и разметки). И каждая такая задача может требовать немалых объёмов разметки. Что влечёт за собой трату времени и денег.

  2. Данные должны быть актуальны
    Мир не стоит на месте. Потому использование единого набора разметки, полученного на одной из итераций разработки модели, может привести к тому, что мы окажемся в ситуации, когда наши знания о мире устарели. И это будет приводить к ухудшению качества наших моделей, неточностям предсказания или полному отсутствию знаний о некоторых важных для нас областях или классах.

  3. Данные должны быть согласованы
    Каждый человек обладает своим набором знаний и опыта. И своими предрассудками и смещениями восприятия (bias). Соответственно, обычным подходом является получение не одной метки, а сразу нескольких. В таком случае, можно получить более устойчивое консенсусное решение. А в сложных случаях провести разбор и принять решение, что мы считаем более корректной меткой. 

  4. Специализация удорожает разметку
    Знания в специфичных доменах областей обычно удорожают разметку (например, понимание процесса получение диагноза по рентгеновскому снимку, или специфичные знания в области юриспруденции). Всё же, время высококвалифицированных специалистов сильно дороже среднего работника. 

Если рассматривать вопрос стоимости разметки данных, то она обычно варьируется от типа задачи, скорости разметки и требований к качеству результатов. Для ориентира можно смотреть стоимость схожих задач у сервисов разметки, таких, как Яндекс.Crowd или Mechanical Turk, либо запрашивать стоимость у специализированных организаций, занимающихся разметкой.

Для классификации цена варьируется от 0.001$ до 0.13$, для NER (Named Entity Recognition, выделение именованных сущностей) от 0.024$ до 0.7$ за один текст (например, нижняя граница указана в ценах Amazon). Получим стоимость от 1 рубля до нескольких десятков рублей. 

Если мы рассматриваем российский рынок, то стоимость варьируется от 0.3-0.5 рублей до 3-5 рублей, что, в целом сопоставимо с ценами из англоязычных источников.  

Рассмотрим пример. Предположим, что у нас есть набор в пару сотен тысяч наименований товаров. Мы хотим выделить названия брендов в тексте, то есть решить задачу NER. Даже при стоимости в 1-3 рубля за метку (возьмём середину разброса цен), мы получим 0.2M * 1-3 руб. ~ 0.2-0.6M руб

Но не стоит забыть о согласованности данных. Потому нам нужен будет некоторый уровень пересечения ответов, чтобы быть более уверенными в полученных метках. Предположим, мы хотим иметь 3 метки на каждую запись. И стоимость разметки вырастает уже до 0.6-1.8М руб.

Каковы плюсы от применения LLM для разметки?

Давайте рассмотрим преимущества использования LLM в разметке данных:

  1. Стоимость разметки уменьшается
    Стоимость разметки обычно ниже в разы. При этом, качество топовых моделей (например, GPT-4o) может быть сравнимо с результатами разметки человеком.

  2. Скорость разметки повышается
    Некоторые авторы приводят рост скорости в десятки раз. Но даже рост скорости разметки в несколько раз – уже большое преимущество.

  3. Адаптивность
    Учитывая тот факт, что LLM могут решать достаточно обширный класс задач, достаточно сменить промпт – и мы уже решаем совершенно другую задачу.  

Для сравнения качества разметки можно рассмотреть пример из статьи. При этом, конечно же, с момента сравнения качество работы моделей ушло далеко вперёд, так что данное сравнение уже, скорее, ближе к оценке снизу. 

Качество разметки человеком и несколькими разными LLM

Скорость работы тоже можно считать, скорее, оценкой снизу. При этом, стоит отметить, что reasoning модели будут работать дольше. Но про них мы поговорим чуть позже. 

Время разметки человеком и несколькими разными LLM

Давайте попробуем рассчитать, сколько будет стоить разметка одного текста с использованием LLM. Для расчёта возьмём GPT-4o-mini. Стоимость у них 0.15$ / 1M токенов за вход и 0.6$ / 1M токенов за выход. При входном тексте на 1000 токенов (что достаточно немалый текст, но учтём ещё наличие более или менее длинного промпта) и выходном ответе в условные 100 токенов получаем стоимость 0.0021$ на запрос, то есть примерно 18-20 копеек (в зависимости от курса доллара). Что ниже стоимости работы человека в разы, если не десятки раз. При этом, цены постоянно снижаются (если мы не считаем GPT-4.5, но обсуждение цены этой модели выходит за рамки статьи).  

И как мы можем использовать LLM в разметке данных?

Самый простой подход – прямое использование LLM для получения метки. Например, мы можем использовать следующий промпт:

Classify the text into neutral, negative or positive. 

Text: This movie is definitely one of my favorite movies of its kind. The interaction between respectable and morally strong characters is an ode to chivalry and the honor code amongst thieves and policemen.

Label:

Схематичный вид процесса разметки

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

Вариант посложнее – это использование человека для валидации результатов. Это может быть простая перепроверка человеком, либо смешивание результатов LLM разметки и меток, полученных от человека с последующим консенсусным решением. По сути, мы используем известный подход Human-in-the-loop. У нас есть человек, который задействован в цикле работы с разметкой данных. При таком подходе мы удорожаем процесс. Но взамен получаем лучшее качество разметки по сравнению с результатами, за которыми “не приглядывает” человек. Такой подход позволяет сохранить баланс цена/качество. 

С течением времени, по мере улучшения наших моделей, мы можем постепенно сокращать человеческое участие в процессе разметки. Примеры из исследований показывают, что активное обучение может уменьшить необходимость в частом вмешательстве людей, выбирая для разметки только самые информативные данные. Также методы самообучения позволяют моделям автоматически аннотировать большие объёмы данных, что значительно уменьшает нашу зависимость от ручной работы. Это не только снижает затраты, но и сохраняет высокое качество данных.

Схема процесса с проверкой результатов разметки человеком

Примечание: Стоит сказать, что помимо использования валидации человеком можно использовать и подходы к оценке условной “уверенности” LLM в ответе. Это может быть как использование более мощной LLM в качестве “судьи”, так и использование внутренних механизмов и результатов работы моделей. Например, мы можем использовать вероятности токенов, генерируемых моделью или даже можем внутри промпта попросить саму модель оценить уверенность в ответе. 

Обычно использование таких подходов позволяет автоматически избавиться от неуверенных ответов, либо выставлять приоритет валидации человеком результатов на основе уверенности в этих результатах. 

Если развивать общее решение автоматизации разметки дальше, то можно использовать подходы к улучшению промтов для разметки. Это могут быть и автоматизированные подходы к промптингу, и постепенное улучшение промптов специалистами. 

Схема процесса улучшения промптов

При таком подходе у нас должен быть некоторый размеченный набор данных (т. н. “Golden Set”). Тогда каждое улучшение нашего промпта мы сможем протестировать на этом доверенном наборе данных и оценить улучшения. Конечно, тут есть возможность переобучиться на наш набор данных, так что стоит быть осторожными. 

Давайте рассмотрим несколько техник улучшения промптов

В прошлом году мы выпускали объёмную статью по Prompt Engineering. Некоторые техники оттуда могут помочь улучшить качество промптов для разметки данных. 

Few-shot prompting

В этой технике мы добавляем примеры решения задачи в наш промпт в виде “задача - ответ”. Например, промпт для анализа настроения пользователей может выглядеть следующим образом:

Classify the text into Neutral, Negative or Positive. 

Отличный магазин, чистенько, уютненько, по утрам пахнет свежей выпечкой. // Positive

Сделала заказ, прождала 3 часа, а заказ так и не приехал ;( // Negative

Самая лучшая «Пятерочка». Всем советую! // 

Мы указали задачу и привели несколько примеров её решения. Обычно это улучшает результаты модели. При этом, стоит помнить, что у few-shot для разметки есть некоторые особенности:

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

  2. Могут быть сложности с domain-specific и сложными задачами.
    Даже при наличии примеров, доменная специфика может серьёзно повлиять на результаты за счёт малого покрытия этой области в обучающих данных самой LLM. Сложные задачи тоже могут приводить к сбоям в работе модели, даже при использовании техники few-shot.

Ещё более интересной может быть стратегия применения элементов RAG-подхода (Retrieve-Augmented Generation) при генерации примеров для few-shot. Например, в работе высказывается идея о выборе примеров для few-shot с использованием поиска в векторной базе данных наиболее близких ко входному примеров. Конечно, в работе подход использован к немного другой задаче. Тем не менее, это кажется интересной идеей для улучшения и повышения гибкости классического few-shot подхода. 

Chain of Thought

Ещё один известный подход – использование “цепочки размышлений” (Chain of Thought, CoT). В самом простом варианте этого подхода мы просим модель “думать шаг за шагом”. Но можно и усложнять, например, приводить объяснения логики решения сходных задач. Исследования подтверждают, что использование CoT улучшает качество результатов модели. 

При этом, дальнейшее развитие reasoning подходов и моделирования “размышлений” привело к появлению reasoning моделей, таких как GPT-o3 и R1. Применение CoT промптов в такого рода моделях будет скорее негативно влиять на итоговый результат. 

Впрочем, стоит отметить, что такие модели имеют более высокую стоимость и иные сценарии применения. Если рассматривать именно задачу разметки данных, то применение reasoning моделей кажется излишней тратой ресурсов и оправдано только для сложных областей и разметки комплексных сущностей, требующих куда большего качества работы модели. Но для таких областей как медицина и юриспруденция, где использование reasoning моделей было бы разумным, выше цена ошибки в разметке, что может свести на нет все плюсы автоматизации разметки.  

Для обычных задач разметки прирост качества вряд ли будет окупать рост стоимости и увеличение времени работы моделей. Поэтому пример промпта мы рассмотрим для моделей без reasoning’а:

Classify the text, based on whether it presents an objective fact or a subjective opinion. 

Describe your reasoning step-by-step.

Input: The banana is big, but its skin is even bigger.

Label:

Но как нам получить корректный ответ в чётком формате, который можно обработать автоматически?

Мы можем форматировать выход нашей модели. Например, мы можем явно указать в промпте формат выхода. И после генерации проверять его корректность. Ниже пример такого промпта: 

You are a data labeler, labeling data to be used in Named Entity Recognition. 

Create a JSON response that categorized words from provided text into specific keys. 

The keys should include {tag_list}. The values should be lists containing relevant words from input text.

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

Какие инструменты есть для работы с разметкой?

На рынке ПО очень много разнообразных средств разметки (от небольших Python библиотек, до полноценного проприетарного ПО). При этом, есть достаточно много Open Source решений. 

Вот несколько таких решений (и это далеко не весь ландшафт, просто интересные примеры):

  1. Label Studio
    Очень известный инструмент, который давно на рынке. Из интересных наблюдений – авторы уже экспериментируют с функционалом частичной автоматизации разметки, который использует LLM.

  2. Docanno
    Достаточно приятный и простой инструмент для разметки текстовых данных. 

  3. Adala
    Полноценный фреймворк для автоматической разметки данных (о чём недвусмысленно говорит расшифровка акронима: Autonomous DAta (Labeling) Agent). 

Единственный совет, который можно дать о ПО для разметки – лучше попробовать несколько вариантов, чтобы выбрать тот, который лучше подойдет именно вашей команде, благо, выбор на рынке очень широк, так что каждый сможет найти себе что-то по душе.

Но у использования LLM в разметке есть и минусы

Как и у использования любого другого инструмента, у применения LLM для разметки есть минусы. Вот некоторые из них:

  1. Возможные смещения (bias) в данных.
    Результаты нашей разметки могут сильно зависеть от того, какие именно данные попадали в обучение. И если для русского языка всё может быть не так уж проблематично, то более редкие языки могут страдать от проблемы смещений в данных. 

  2. Постоянная поддержка LLM.
    Использование внутренних LLM (даже если это Open Source модели) может потребовать достаточно больших затрат ресурсов на запуск, поддержание, мониторинг и управление работой LLM. Особенно эта проблема может быть важна для небольших организаций, у которых попросту нет ресурсов на то, чтобы поднять локальную модель. Конечно, есть всевозможные API. Увы, но не всегда есть возможность передавать вовне данные для разметки. 

  3. Ограниченность текстовыми данными.
    Если мы говорим об LLM (а именно такие модели чаще выходят и выглядят пока более качественными), то у нас есть естественное ограничение на тип данных – использование только текстовых данных.   

Примечание. Хотя применение мультимодальных моделей всё ещё не так часто для разметки данных в области работы с изображениями или звуком, при этом невозможно не отметить продвижение и в этой области. Уже сейчас можно найти примеры простых задач разметки, которые пытаются решать мультмимодальными моделями. Например, здесь можно почитать пример реализации такого решения на основе работы с GPT-4o. 

Соответственно, последний пункт списка выше уже находится, скорее, под вопросом. Сложные типы разметки пока всё ещё недоступны. Но более простые вопросы вида: “Есть ли объект на фото?” и вопросы про свойства объектов на фото, кажутся вполне подходящими для автоматизации.

Для каких задач в X5 мы используем помощь LLM?

У нас очень большое количество команд и продуктов, которые используют данные для обучения разнообразных моделей машинного обучения. Поэтому у нас есть множество примеров. Но сейчас мы сконцентрируемся на тех задачах, в которых мы используем разметку и генерацию синтетических данных с помощью LLM:

  1. Перефразирование.
    Для улучшения качества работы чат-ботов желательно иметь как можно более разнообразный набор вопросов от пользователей. Конечно, можно собрать некоторый набор таких запросов, если у нас уже работает процесс поддержки по этому направлению. Но что делать, если это новый процесс? Размечать руками может быть трудозатратно. Тут нам на выручку и приходят LLM. Мы можем попросить сделать множество различных вариантов обращений так, как бы это делали пользователи с определённым бэкграундом и потребностями. 

  2. Генерация данных в виде “вопрос-ответ” (Question Answering, QA).
    Для обучения вопрос-ответных систем требуются корпусы данных с вопросами и ответами по некоторой базе знаний. Генерация таких наборов может быть весьма трудозатратной. Соответственно, есть пространство для автоматизации процесса. Мы можем попросить сформулировать набор вопросов по нашей базе знаний, а потом отредактировать полученную заготовку. 

  3. Распознавание чувствительной информации.
    Если сформулировать эту задачу иначе, то можно её свести к выделению именованных сущностей (NER). Как упоминалось ранее, не всякие данные могут быть использованы при работе с внешними API для работы с LLM. Здесь-то и возникает задача "маскирования данных". В принципе, задача достаточно известная. Но всегда лучше делать поправку на доменные знания, что требует собственных наборов данных, а значит, и разметки этих данных. 

А если вы хотите подробнее узнать о том, как мы работаем с синтетическими данными – смотрите доклад Дарьи Андреевой.

Какие же получаются итоги?

В статье мы рассмотрели вопрос применения больших языковых моделей (LLM)  в разрезе задачи разметки данных. 

Давайте подведём краткие итоги:

  1. Использование LLM в задаче разметки данных позволяет сэкономить время и деньги.
    Это происходит за счёт меньшей стоимости за один объект, более высокой скорости и возможностей адаптировать LLM к различным задачам разметки.

  2. Использование подхода полезно на масштабе.
    Для больших организаций с достаточным потоком задач экономия может оказаться весьма серьёзной. Небольшим организациям не стоит гнаться за излишней автоматизацией. Возможно, дешевле будет делать ручную разметку, либо использовать API для работы с внешними LLM.

  3. Применение LLM требует аккуратного внедрения.
    Увы, но LLM – не серебряная пуля. Данный класс моделей имеет свои недостатки. И неаккуратное обращение с LLM может принести больше вреда, чем пользы.

  4. Полностью автоматизировать процесс не выйдет.
    По крайней мере, на нынешнем этапе развития инструментов. Более надёжным всё ещё остаётся вариант с частичным использованием человеческого труда в процессе разметки. Если не для самой разметки, то хотя бы для валидации результатов работы LLM.