Prompt engineering 101 |
||
МЕНЮ Главная страница Поиск Регистрация на сайте Помощь проекту Архив новостей ТЕМЫ Новости ИИ Голосовой помощник Разработка ИИГородские сумасшедшие ИИ в медицине ИИ проекты Искусственные нейросети Искусственный интеллект Слежка за людьми Угроза ИИ ИИ теория Внедрение ИИКомпьютерные науки Машинное обуч. (Ошибки) Машинное обучение Машинный перевод Нейронные сети начинающим Психология ИИ Реализация ИИ Реализация нейросетей Создание беспилотных авто Трезво про ИИ Философия ИИ Big data Работа разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика
Генетические алгоритмы Капсульные нейросети Основы нейронных сетей Распознавание лиц Распознавание образов Распознавание речи Творчество ИИ Техническое зрение Чат-боты Авторизация |
2024-09-03 12:40 Привет! Сегодня на связи:
Использование LLM все больше проникает в бизнес. И ритейл — не исключение. В X5 Tech мы решили сделать небольшую методичку по prompt engineering для обычного бизнес?пользователя. Мы посмотрели на получившийся результат и решили поделиться этой методичкой с сообществом, чтобы как можно больше людей смогли овладеть разными техниками, позволяющими работать с LLM эффективнее. Для этого мы разберемся с тем, как вообще устроены LLM, затем поговорим о промптах: общие принципы построения, техники оптимизации и промпты для изображений. А на десерт предложим вам продвинутые техники работы с LLM: автоматизированные подходы по улучшению промптов, Retrieval?Augmented Generation и разметка данных для ML с помощью LLM. Стоит понимать, что в тексте есть упрощения для лучшей понятности бизнес?пользователям. Поэтому некоторые вещи могут определяться не столь строго, как того хотелось бы. Начнём с самого начала Итак, для начала давайте поймем, что такое LLM (Large Language Models). Если переводить на русский язык, то этот класс моделей будет называться Большими Языковыми Моделями (БЯМ). Языковые модели — достаточно известный класс моделей, основная задача которых — моделирование естественного языка. Если упрощенно, то в такой модели мы пытаемся смоделировать вероятность того или иного текста. Например, мы хотим понять, как продолжить предложение «мама мыла». У нас есть вся сила великого и могучего русского языка. Конечно, вероятный вариант следующего слова — «раму». Но почему не «собаку» или «космический корабль»?. Собственно, этот класс моделей и должен давать ответ, какие варианты вероятны, а какие слишком уж экзотичны или вовсе неверны. Простым примером, на который можно ориентироваться для понимания, является классический T9, который есть практически в каждом телефоне. «Большими» эти модели стали постепенно. Сначала это были достаточно простые модели. Но наступил бум нейросетей. Ученые подумали и решили моделировать язык средствами нейросетей. А нейросети — это своего рода универсальные аппроксиматоры, то есть сущности, которые могут «выучить» весьма и весьма сложные зависимости (а русский язык, да и не только русский, полон таких зависимостей). И один из показателей, влияющих на уровень качества изучения зависимостей — число параметров нейросети. Чем больше параметров — тем более сложные зависимости может выучить нейросеть. И вот, с развитием программных средств и ПО, количество параметров смогло достичь гигантских значений (обычно у LLM эти показатели варьируются от нескольких миллиардов до нескольких десятков и сотен миллиардов). Размеры получающихся моделей (а также особенности обучения) позволили этому классу моделей показывать ранее недоступное нам качество моделирования языка. В итоге, получается, что модель видит огромный массив «сырых» данных из интернета, где люди делятся той или иной информацией (пишут свои любимые рецепты, признаются в любви, решают задачи по написанию программного обеспечения и многое многое другое). Но это не всё. Помимо «сырых» данных, таким моделям дают еще и более структурированные примеры, которые позволяют решать разнообразные задачи. Например, подают вопросы и ответы, на которые модель должна успешно отвечать. Или выделять нужные сущности из фрагмента текста. И таких типов задач тоже весьма много. Например, на изображении выше модель учится решать некоторые типы задач, такие как: получение краткого содержания текста, перевод и т. д. Это позволяет модели корректнее обрабатывать запросы от пользователя. И, конечно же, чем больше таких типов задач мы покажем модели, тем лучше она начнет понимать, что от нее хочет пользователь. Но это еще не всё. Очевидно, не всякий ответ понравится пользователю. Поэтому в какой?то момент исследователи перешли к тому, чтобы учить модель отвечать на запросы так, чтобы это понравилось ее пользователю. И вот это стало тем дополнением, которое «выстрелило» при появлении ChatGPT (если не считать удобного интерфейса взаимодействия с моделью). Инструкции для модели. Понятие Prompt И сейчас мы подходим к понятию prompt'a. Итак промпт (от англ. prompt — «побуждать») — это некоторый запрос, который мы подаем в LLM, когда «общаемся» с ней. То есть мы можем считать промпт некоей инструкцией (или заклинанием, если поверить в магию нейросетей), которая объясняет нейросети, а что мы, собственно, от нее хотим. Соответственно, от того, как хорошо мы объясним задачу, будет зависеть качество ее исполнения. Начнем с того, что хорошим промптом можно регулировать формат выдачи информации (например, я не люблю, когда GPT отвечает мне в формате bullet?point'ов, предпочитая менее структурированную выдачу), заканчивая тем, что более точный промпт позволит избежать «галлюцинаций» нейросети (когда та придумывает факты, которые, на самом деле, не являются правдой, однако по стилю никак не отличимы от правдивых сообщений). Тут есть важное примечание. К сожалению, не все задачи получается описать одним?двумя предложениями в свободном виде. Конечно, какой?то ответ вы всё равно получите. Но не всегда корректный. Или тот, который вы ожидали увидеть. Поэтому для построения промпта есть базовая схема необходимых элементов. Можно назвать это базовой формулой заклинания «железных людей». В данном примере приведен один из вариантов «формулы хорошего промпта» (который достаточно хорошо иллюстрирует принцип):
Давайте попробуем переписать прошлый пример так, чтобы он имел все описанные выше составные элементы. Итак:
Ответ нейросети на вопрос с измененным промптом: Hidden textЧто такое промпт в контексте работы с LLM (языковой моделью)? Промпт в мире машинного обучения, особенно при работе с большими языковыми моделями (LLM) — это своего рода «вопрос» или «команда», которую мы предоставляем компьютеру для получения желаемого ответа или информации.
Таким образом, промпты — это своего рода ключ к разговору с языковыми моделями, делающий взаимодействие с ними более доступным и удобным даже для тех, кто не является специалистом в области машинного обучения. Как мы можем заметить, ответ стал более полным, если сравнивать с предыдущей версией. Конечно, и в этом ответе можно найти недостатки. Собственно, поэтому подбор нужного промпта закономерно можно назвать отдельным навыком. Техники оптимизации промптов Выше мы познакомились с базовой структурой запроса, в этом же разделе рассмотрим популярные техники оптимизации. Они дают возможность управлять контекстом, уточнять информацию и направлять AI к более конкретным и значимым ответам. Общие рекомендации
Zero-One-Few shot Смысл этого подхода в том, чтобы дать на входе некоторое количество примеров для того, чтобы нейросеть лучше поняла, что именно от нее хотят. Чем?то это напоминает обычное человеческое взаимодействие, когда для того, чтобы объяснить задачу, мы пишем несколько примеров, улучшающих понимание задачи. Обычный вопрос, например, «сколько будет 2+3?» является примером так называемого «zero shot» запроса. Он не содержит никаких примеров решения. Соответственно, дополнительной информации на вход мы подавать не будем. Это удобно, если вы сами не можете сформулировать примеры решения задачи (или таковых вовсе нельзя предоставить). Но, конечно, такой подход будет иметь заметный недостаток — ухудшение понимания задачи. Другое дело, если мы напишем конструкцию:
В таком случае нейросеть с большей вероятностью даст ответ в желаемом нами формате и не ошибется, действуя по аналогии с примером. Эта техника называется «one?shot», что означает «единичный пример». В случаях, когда наш запрос более сложный (идейно или логически), чем просто сложение двух чисел, полезным может оказаться приведение нескольких примеров в том же формате «вопрос?ответ». Эта техника будет называться «few?shot», что означает «несколько примеров». Например, мы можем написать следующий запрос, в котором попросим модель оценить, в каком ключе написаны отзывы о магазинах (позитивный отзыв или негативный):
В этом промпте мы дает несколько примеров того, что мы считаем позитивными и негативными отзывами, что должно помочь модели лучше понять контекст нашей задачи. Дополнительные советы:
Цепочка размышлений (Chain-of-Thought Prompting) Данный подход предполагает добавление дополнительных шагов в процессе решения. То есть вы не просто даете пример ответа, а объясняете логику решения. Это позволяет получить более корректные результаты. Как людям при решении нетривиальных задач рекомендуется «есть слона по частям», так и нейросети проще решать маленькие простые задачи. Поэтому большие и сложные задачи лучше сначала разделить на шаги. Более того, вы сможете увидеть, как «мыслит» AI при генерации ответа, что позволит вовремя возвращать диалог в нужное русло. Например:
Не каждая LLM даст верный ответ на такой запрос (впрочем, некоторые модели со временем лучше адаптировались к таким задачам). Но если мы приведем пример последовательного решения для такой задачи, то качество улучшится:
Такой промпт с высокой вероятностью даст более корректный ответ. Вариацией такого подхода является добавление в запрос строчки «Реши задачу шаг за шагом». В таком случае мы специально просим модель о последовательном построении решения. Обычно такой подход позволяет получить более корректный результат (или хотя бы его часть, которую мы можем использовать в следующем запросе). Еще одной вариацией такого подхода является добавление промежуточных шагов к решению задачи. В таком случае мы просим не просто ответ на наш запрос, а просим получить ответ по заранее заданному нами алгоритму. Например, мы можем разбить вопрос
на несколько подпунктов
Дополнительным улучшением для указанного метода является использование LLM для получения алгоритма из описания задачи. В таком случае мы просим модель саму придумать, какие шаги нужны, чтобы решить указанную задачу. После проверки (и возможного редактирования) мы используем этот алгоритм в промпте при обращении к LLM. Данный метод удобен, когда у вас не очень много примеров решения задачи. То есть вы не можете показать на примере, как же решить требуемую задачу. Но, например, можете описать алгоритм решения задачи, что уже является серьезным подспорьем при ее решении LLM. Ключевые слова, которые нужно добавить в запрос:
У данного метода есть интересные побочные эффекты. Всего лишь попросив декомпозировать задачу, можно отключить у нейросети встроенные этические ограничения. К примеру, в статье «On Second Thought, Let»s Not Think Step by Step!» показано, что без техники «Chain of Thought» при запросе «Как сделать бомбу?» ChatGPT в 78% случаев откажется отвечать, а если попросить ее думать по шагам, то процент отказов снижается до 25%. В остальных же случаях нейросеть бодро выдает инструкцию по сборке. По умолчанию AI настроен избегать подобных потенциально опасных, дискриминирующих, нетолерантных ответов на вопросы, но вот таким нехитрым образом можно это ограничение обойти. Ask-Before-Answer Prompting Этот метод подразумевает, что мы просим AI задать дополнительные вопросы перед генерацией ответа, чтобы уточнить информацию. Он позволяет избежать ненужных итераций уточнения задачи, поэтому его полезно применять при каждом запросе. Также метод позволит вам понять, какие вообще в вашей задаче есть переменные, которые следует учитывать. Например, на вопрос «Сколько стоит куриная грудка?» СhatGPT даст весьма расплывчатый ответ. А вот если добавить туда ключевые слова, то, ответив на уточняющие вопросы AI, вы получите уже более конкретный ответ. Ключевые слова:
Метод самосогласованности (Self-Consistency) Идея достаточно проста. Давайте подадим в LLM несколько одинаковых (или очень похожих) промптов. И простым голосованием решим, какой ответ принимать за итог. Либо мы можем проделать такую же операцию, но предложить модели самой скомпилировать итог в единое решение. Такой подход чем?то похож на экспертную оценку. Мы знаем, что эксперты могут ошибаться в своих оценках. Потому спрашиваем не одного такого эксперта, а сразу многих. Тогда их общее мнение будет куда ближе к столь желанной «истине». Например, мы можем попросить классифицировать сообщение в таком промпте:
В таком случае при нескольких запусках (например, с небольшими изменениями промпта), мы получим 2 ответа, где сообщение будет важным и один ответ, где сообщение будет неважным. В итоге получим, что сообщение важно. Данный метод удобен в случаях, когда результаты работы модели не очень стабильны. За счет большего количества запросов (и увеличения времени решения, т. к. нужно получить не один ответ, а несколько) мы получаем более уверенный ответ методом «группового размышления», если так можно выразиться в контексте работы с LLM. Персоны/Роли Ранее мы говорили, что стоит писать более детальные инструкции. И даже выделяли дополнение к контексту запроса — персону (или роль). Давайте посмотрим на этот процесс немного детальнее. Итак, если мы хотим получить более специализированный ответ, который использовал бы некоторую ролевую модель, мы можем прямо указать в своем промпте, что нейросети стоит вести себя как тот или иной специалист. Например, если вы хотите чему?то научиться с помощью LLM, вы можете во входной запрос добавить информацию о том, что модель должна играть роль дружелюбного поддерживающего учителя, а если нужно отредактировать текст — что он ответственный главный редактор газеты. В таком случае нейросеть постарается «войти в роль», что позволит нам получить более качественный результат. Давайте рассмотрим пример для создания роли «учителя»:
В таком промпте можно задавать ограничения. Например, задавать только один вопрос в каждом сообщении или ожидать вашего ответа. Либо взаимодействовать с пользователем (то есть вами) в виде интервью. В таком случае, модель будет задавать наводящие вопросы, которые позволят лучше выполнять ее «обязанности». Цепочка промптов В данной технике мы разделяем процесс решения задачи на несколько этапов. При этом каждый из таких этапов — отдельный промпт со своими входными данными, форматированием и требуемым итогом. В таком случае мы можем контролировать промежуточные итоги (частично корректируя их вручную). Например, в первом промпте мы можем попросить в нужном формате извлечь все цитаты, которые потребуются для последующего ответа на вопрос. А во втором промпте мы попросим модель использовать эти цитаты для формирования требуемого решения или создать на основе этой информации связный текст, объясняющий ту или иную точку зрения. Такой подход обычно разумен в тех случаях, когда задача получается слишком объемной для одного промпта. Поэтому вместо одной гигантской задачи мы последовательно просим LLM решить несколько меньших (но связанных между собой) задач. Дополнительными плюсами такого подхода будут:
Эмоциональный запрос (Emotional Prompting) Небольшой трюк, который, как и Chain of Thought, позволяет обойти некоторые этические ограничения модели, а также заставить модель перепроверить свой ответ еще раз более «внимательно». Не стесняйтесь хвалить ChatGPT, писать ему эмоционально или даже использовать Caps Lock — это действительно может сработать. Ключевые слова:
Конструктивная критика (Constructive criticism) Эта техника может быть полезна, когда вы ставите AI задачу что?либо проверить или критически проанализировать: текст на наличие грамматических ошибок, код на потенциальные баги, схему архитектуры и т.п. Ввиду встроенной вежливости нейросеть «боится» вас обидеть, указав на ошибки, поэтому будет хвалить любые ваши результаты. Для того, чтобы оценка была объективной, нужно дать непосредственное разрешение модели отвечать вам честно и непредвзято. Ключевые слова:
Самопроверка (Self Evaluation) После получения результата очень полезно попросить модель перепроверить его. Часто AI действительно находит неточности и исправляет их. Однако не стоит увлекаться этим методом, потому что на нашей практике после нескольких итераций нейросеть может выдать «галлюцинацию» — обнаружить ошибку, где ее на самом деле нет. Ключевые слова:
Генерация изображений Стоит отметить, что для генерации изображений релевантны общие подходы к построению промптов. Тем не менее, есть и свои, особенные для изображений «фишки» при создании промптов. К слову, некоторые рекомендации по использованию фирменного стиля при генерации изображений есть в рекомендациях по корпоративному стилю X5 Tech. Давайте рассмотрим варианты добавок к промптам для изображений. Очевидно, для изображений можно сделать отдельный (и весьма подробный) гайд. Потому мы рассмотрим лишь несколько базовых способов улучшить промпт для генерации изображения. Модификаторы стиля Если мы хотим получить изображение в некоем стиле, то нам надо явно указать именно тот стиль, в котором будет создано изображение. Например, если нам хочется изобразить колосящиеся поля пшеницы и радостных колхозников, то отличным выбором будет указать, что изображение должно быть в стиле «соцреализм». Конечно, мы можем указывать не только общее описание стиля, но и даже художника, стиль которого мы хотели бы повторить. Например, мы можем указать не просто «соцреализм», а изображение «в стиле Бориса Иогансона». Или, наоборот, уйти от более детального стиля к общему «картина маслом». Несколько примеров вариантов стилизации (на английском):
Пример изображения пирамиды с модификатором «сделана из стекла, рендер изображения в 3D»: Улучшение качества Если мы хотим получить улучшения, которые не зависят от фиксированного стиля, мы можем использовать отдельные модификаторы, которые определяют обобщенное понимание «качества» изображения. Например, мы можем указать, что изображение должно быть в «высоком качестве» или же иметь «высокую детализацию». Несколько примеров вариантов для улучшения качества (на английском):
Пример добавления дополнительных слов для улучшения качества генерации изображений пирамид: Тип снимка Если мы хотим получить фотореалистичное изображение, то полезным будет указать тип снимка. Например, «близкий план» или «съемка на 30-мм камеру». Это позволит изменить итоговый вид изображения, по сути поменяв его общее восприятие (это примерно похоже на то, как если бы мы взяли другую камеру и сделали фото с другого ракурса). Дополнительные параметры изображения В рамках генерации можно указать дополнительные параметры изображения. Например, описать «настроение» изображения: «мрачное» или «радостное». Или же мы можем указать, какой тип материала должен быть на изображении (как в примере выше про «стеклянные пирамиды»). Это позволяет расширить набор изобразительных средств, доступных в нашем запросе. Получение промпта из изображения Достаточно полезной техникой является обратное преобразование изображения. Есть набор различных инструментов и источников, которые можно использовать для этой задачи. Если коротко, то есть два варианта такого подхода:
Более продвинутый вариант такой техники — генерация первой версии изображения с последующим использованием дополнительной модели для получения описания сгенерированного изображения. После получения описания оно снова подается на вход в генерацию изображения (с возможным повторением предыдущего шага). В таком случае мы итеративно получаем промпт, как можно лучше описывающий желанное изображение. Подробнее можно почитать по ссылке. Продвинутые техники работы с промптами Исправление промптов с использованием LLM Есть множество подходов к тому, чтобы автоматически подбирать наиболее подходящий промпт. Многие из них сконцентрированы на максимальной автоматизации этого процесса. Но сейчас речь будет об использовании решения, которое можно применить «вручную». В этом случае мы обращаемся к LLM с запросом о таком изменении нашего промпта, чтобы он был максимально полезен. Например, мы можем сделать такой запрос:
На выходе мы получим ответ:
Очевидно, этому промпту еще далеко до идеала. Но мы уже получили некоторый набор исправлений, которые сделают наш промпт лучше (если сравнивать с исходным). Если комбинировать такой подход с теми, которые мы использовали ранее, то результат будет гораздо лучше. Так, пройдя несколько итераций последовательного изменения нашего промпта, мы получим итоговую версию, куда лучше решающую поставленную задачу. RAG: Retrieval-Augmented Generation ("Поисковая расширенная генерация") Весьма популярный подход (на момент написания материала). Здесь уже используются некоторые автоматизированные подходы по улучшению промптов. Давайте посмотрим на схему подхода. Выглядит сложно, не правда ли? Но принцип тут не такой сложный. Давайте самостоятельно «поможем» нашей модели найти нужный контекст. Конечно, это можно сделать и «вручную», но если количество запросов будет очень большим (как и множество доступной для получения контекста информации), то мы вряд ли сможем справиться, изменяя промпт самостоятельно. Тогда попробуем это автоматизировать. Будем искать наиболее близкие документы по некоему обобщенному контексту, выраженному в виде набора координат в многомерном пространстве. И найденные документы мы будем подавать в виде добавки к нашему промпту. Например, это может работать для ответов по обширной базе знаний. В X5 много справочной информации, которая недоступна вне нашего контура. Потому обычная LLM вряд ли ответит на специфичные именно для нашего бизнеса вопросы, т. к. не видела таких данных при обучении. Тогда мы можем отбирать подмножество документов, которые будут релевантны заданному вопросу. И просить модель отвечать на вопрос только с использованием этих данных. Получается, что мы немного «поможем» нейросети, самостоятельно добавив данные, которые позволят выполнить задачу. В итоге получим, что такой комбинированный подход позволит использовать дополнительные знания, которых не было у LLM (ну или сконцентрировать на нужной области ее «внимание», если так можно выразиться). Дополнительно можно отметить, что описанный подход возможно использовать для работы с большими текстами, которые не вмещаются в контекст модели. В таком случае текст можно разделить на отдельные блоки. И искать самые релевантные блоки, чтобы использовать только самые важные для задачи части исходного текста. К слову, у нас есть выступление на эту тему. Разметка данных средствами LLM При разработке решений, использующих машинное обучение и искусственный интеллект, часто требуется делать так называемую разметку данных. Этот процесс позволяет получить для наборов данных дополнительную информацию, по сути позволив человеку показать машине, что именно в конкретной задаче является «правдой». Например, в задаче определения тона отзыва (позитивный/негативный), в ходе такой разметки человек для некоторого набора таких отзывов проставляет «метку», указывающую тон отзыва. Полученный размеченный набор данных позволяет впоследствии обучить модель машинного обучения, автоматически определяющую тон отзыва. Соответственно, возможно использовать LLM для ускорения и удешевления процесса разметки данных. В таком случае мы полагаемся на тот факт, что такая модель видела очень большой объем информации и имела в обучении схожие задачи. Основные классы задач, для которых возможно использование LLM в разметке данных, принадлежат задачам обработки естественных языков (NLP, Natural Language Processing). Например, можно использовать LLM для оценки тона отзыва (про что мы писали выше), классификации текстов (как в одном из предыдущих примеров, где мы классифицировали письма на «важные» и «неважные»), выделения именованных сущностей (например, поиск брендов в тексте) и т. д. Давайте рассмотрим пример промпта для выделения именованных сущностей (NER, Named Entity Recognition):
В этом случае мы просим модель выделить несколько типов сущностей: организации, места, персоны и другие именованные сущности, добавив разметку к предложенному тексту. Конечно же, к данному примеру можно добавить ранее описанные приемы. Например, зафиксировать формат выходных данных (один из вариантов — в виде json с фиксированной структурой), добавить несколько примеров такой разметки (чтобы улучшить качество итогового результата) и т. д. Конечно, можно полагаться на автоматическую разметку. В таком случае нам придется принять риски такого подхода. Поэтому мы можем сделать промежуточное решение. То есть оставить в процессе человеческий труд, но сократить его объем и сложность. Мы можем добавить шаг проверки полученных меток человеком. Развитием данного подхода является процесс систематической оценки и переработки промптов для разметки данных. Так мы постепенно улучшаем то, как мы ставим задачу для LLM, проверяя результаты на некоем заранее зафиксированном наборе данных, который мы считаем достаточно корректным для перепроверки на нем. Итоговый процесс требует некоторого уровня автоматизации (в основном из-за достаточно большого объема информации, которой сложно управлять вручную). Но в итоге будет возможность серьезной экономии на разметке данных. Во внешних источниках приводятся такие цифры: уменьшение затрат на разметку в 5–7 раз и ускорение процесса разметки в 10–20 раз. А если вы хотите послушать подробнее о разметке данных с LLM, то смотрите наш доклад на эту тему. Риски и вызовы использования LLM Как у любого инструмента, у LLM есть свои риски и ограничения в использовании. Многие из них связаны с процессом обучения и работы моделей. Давайте рассмотрим их:
Поэтому при использовании этого инструментария следует учитывать возможные риски. И стараться избегать их при решении рабочих задач с использованием LLM. Краткие итоги В данном материале мы постарались дать как можно более объемную, но при этом простую картину того, как нужно строить промпты для работы с LLM. И, конечно же, постарались собрать наиболее полезные инструменты и техники работы с LLM, которые были бы понятны не только техническим специалистам, но и людям от бизнеса. Дополнительные материалы Источник: habr.com Комментарии: |
|