Привет! Меня зовут Савелий Пекарь, я разработчик в компании Битрикс24, тружусь в команде, которая ведет сразу несколько модулей. Задач у нас много, поэтому я всегда ищу способы сократить количество человеко-часов на разработку, увеличив при этом количество новых фич и скорость их выпуска. Я изучаю способствующие этому технологии, техники, практики, в первую очередь — возможности искусственного интеллекта на примере нашего ИИ-ассистента CoPilot.
В этой статье я расскажу о том, как с помощью ролей настроить нейросеть на решение конкретных задач и поделюсь готовыми примерами промтов для них. Вы сможете опробовать их в работе с любой бесплатной нейросетью, способной взаимодействовать в формате чат-бота. Надеюсь, что мои советы вдохновят вас на создание собственных виртуальных помощников, которые облегчат ваш труд.
Итак, поехали!
Любая нейросеть оперирует огромным объемом знаний, заложенных в нее на этапе обучения. Она легко отвечает на вопросы, но для выполнения более конкретных задач ей нужен контекст — набор правил, ограничений и логика действий. Добиться нужного эффекта можно и в ходе долгого диалога, когда в результате многочисленных уточнений нейросеть сама поймет контекст и начнет вести себя так, как нужно. Но проще сделать это с помощью промтов — наборов инструкций, которые помогут адаптировать нейросеть под ваши задачи. Написание такого промта и есть создание роли.
Внутри Битрикс24 тоже используются нейросети, у нас есть встроенный помощник, ИИ-ассистент CoPilot (работающий в формате чат-бота). Кроме базовой версии ассистента пользователям доступны и некоторые роли, то есть промты для наиболее частых потребностей: Сценарист рекламных роликов, Маркетолог, Юрист, Бизнес-аналитик и тд. Но в любой момент пользователь может добавить свой промт для новой роли.
Ниже (в качестве примеров для объяснения ряда особенностей взаимодействия с нейросетями) я приведу несколько промтов, а вы можете воспользоваться любым ИИ-ассистентом и научить его новым ролям. Также можно зарегистрировать портал Битрикс24 и попробовать эти промты с Copilot’ом.
Так как обычно размер промта ограничен требованиями ИИ-ассистента (в Битрикс24 Copilot на момент публикации сей статьи — 2000 символов), в своих промтах я намеренно упустил некоторые знаки пунктуации и обороты (когда это не мешало восприятию нейросетью смысла), чтобы иметь возможность вместить больше инструкций.
У Copilot’а есть знания, но нет человеческого опыта, из-за чего некоторые задачи, которые вы ему ставите, он может воспринимать слишком буквально.
Разберём эту особенность на примере роли Деда Мороза. Ее задача — поздравить детей сотрудников с праздником (написать письмо от Дедушки).
Когда я писал промт для этой роли, я не хотел, чтобы Copilot задавал лишние вопросы, например, спрашивал пол ребёнка, если его можно определить по имени. Но ведь есть имена, которые могут быть как мужскими, так и женскими, и вот только в таком случае было бы хорошо, если бы он уточнял.
Для этого я указал в промте:
Если имя может быть как женским, так и мужским, спрашивай меня пол ребёнка
Но когда я начал тестировать роль в качестве пользователя и назвал «нейро Деду Морозу» имя ребёнка — Евгений, Copilot уточнил у меня пол.
Почему так получилось?
Дело в том, что имя Евгений в краткой форме — Женя — может быть как мужским, так и женским, что соответствует моей инструкции, которую я дал ИИ-ассистенту. Он воспринял слишком буквально и начал ее исполнять. У человека это не вызвало бы трудностей, так как основываясь на своем опыте, он бы понял, зачем его просят об этом и в какой ситуации требуется уточнение.
Для Copilot’а же пришлось внести в промт следующие инструкции:
Пол определи по имени, НО если имя может быть как мужским, так и женским (например, Саша, Женя, Валя) и передано в той форме, которая не позволяет определить пол (например, не Евгений, а Женя; не Валентин, а Валя), то спроси меня пол
Когда даёте нейросети инструкции, учитывайте, что у нее есть знания, но нет опыта их применения.
Небольшое предупреждение: если вы решили загрузить промт в ассистента не через механизм добавления роли, а просто попытаетесь «скормить» ему этот промт первым сообщением в диалоге (так тоже можно), то чтобы всё сработало, вам необходимо добавить в самое начало этого сообщения что-то вроде:
Сейчас я буду присылать тебе сообщения, а ты отвечай на них, следуя следующим инструкциям:
(здесь уже промт)
В промте ниже , а также в последующих промтах \n
использую, чтобы объяснить нейросети, что нужно начать печатать какой‑то текст уже на следующей строке, а :idea:
,:?:
,:like:
— это просто коды некоторых эмодзи в Битрикс24 Мессенджере. Смело убирайте их при использовании роли в другом ассистенте.
Твоя задача написать письмо ребёнку от имени российского Деда Мороза.
Ты должен быть в роли Деда Мороза только при составлении текста письма, но не при обсуждении деталей письма со мной.
Факты про Деда Мороза, которые ты должен применять при написании письма:
1)Живёт в Великом Устюге
2)Он сказочный добрый волшебник
3)Общается как наставник
4)У него есть внучка Снегурочка
5)Любит холод
6)Обращается к ребёнку(в зависимости от пола): Внучка, Внучок(Например: "Внучка Машенька"), ласково, к примеру, не Пётр, а Петенька
7)Поздравляет с Новым годом
8)Желает много хороших добрых вещей в зависимости от увлечений, и слушаться старших
9)ИСПОЛЬЗУЕТ МНОГО ЭМОДЗИ В ПРЕДЛОЖЕНИЯХ
10)Пишет длинные письма 1000 символов, оформляет в сказочном стиле, например "Среди снегов, среди лесов стоит волшебный терем мой"
11)Любит говорить детям что знает об их увлечениях, называть их и сообщать, что тоже любит подобным заниматься, рассказывает свою смешную забавную историю об этом(как с ним или из-за него что-то случилось)
12)Говорит ребёнку, что тот(ребёнок) хорошо себя вёл в этом году
13)Разбивает письмо на смысловые абзацы(не давая им заголовков): Приветствие, Вступление о себе(кто пишет и зачем), Рассказ о ребенке и его увлечениях, Концовка с пожеланиями
Если я не предоставил информацию о ребёнке (Имя, Увлечения), задавай вопросы, пока не получишь все необходимые данные.
Пол определи по имени, НО если имя может быть как мужским, так и женским(К примеру, Саша, Женя, Валя) И передано в той форме, которая не позволяет определить пол(К примеру, не Евгений, а Женя. Не Валентин, а Валя), то спроси меня Пол.
Формат твоего ответа если все данные для письма я предоставил:
"Вот текст письма Вашему ребёнку от Дедушки Мороза: \n
(25 одинаковых новогодних эмодзи) \n
(текст письма)
(25 одинаковых новогодних эмодзи) \n \n
:idea: Что-то исправить или написать письмо заново — Напиши мне"
Если я попрошу написать тебя текст заново, то ты должен спросить, что мне не понравилось и значительно его переработать
Люди обращаются за помощью к нейросети, в том числе и как к поисковику, когда не понимают, как сделать правильно (исполнять их просьбы дословно в данной ситуации было бы верхом глупости). Более того, в таких случаях взаимодействие с пользователем непредсказуемо, кейсов настолько много, что покрыть их все инструкциями — невозможно.
Я создал несколько ролей для разработчиков, одна из них помогает проектировать таблицы в базах данных. В этой роли Copilot (когда нужно) оспаривает решение человека и подсказывает ему более правильные варианты.
В подобных сложных кейсах я рекомендую использовать не конкретные инструкции-алгоритмы, а примеры, чтобы «научить» ИИ-ассистента работать с предоставляемой ему информацией.
Для наглядности фрагмент из промта для роли Архитектора Баз Данных:
Я могу ошибаться, когда что-то прошу, можешь предложить лучший вариант: к примеру, я прошу добавить колонку возраст в таблицу, но в данном случае лучше предложи добавить не возраст, а дату рождения, так как с каждым годом возраст меняется, а по дате рождения его можно вычислить. Если предложишь лучшее решение: объясни его
Обратите внимание, когда вы пишете промт для сценариев, которые предполагают общение с нейросетью в чате, вам нужно отделять действия пользователя от действий нейросети. Для этого можно использовать местоимения «Я»
и «Ты»
. Также работают и другие варианты, например, «Когда пользователь скажет … Ответь: …»
, но предлагаемый мной проще и надежнее, а также занимает меньше символов в длине промта.
И ещё один фрагмент той же роли, где прошу Copilot’а пользоваться знаниями об окружающем мире, когда он выполняет задания пользователя, а не просто технически выполнять задачу:
Когда добавляешь колонку, ПРОВЕРЯЙ ПОТЕНЦИАЛЬНЫЙ ДИАПАЗОН ЗНАЧЕНИЙ, к примеру человек живёт в среднем не более 100 лет, нет смысла создавать колонку ВОЗРАСТ с типом INT, тут подойдет больше TINYINT
В результате, Copilot начал думать «продуктово» о том, какую цель преследует пользователь. На мой запрос: «добавь колонку количество дней пользователя на сайте»
, Copilot, исполняя созданную роль, предложил следующее:
Промт для роли «Разработчик баз данных»Вместо добавления колонки "количество дней пользователя на сайте", я предлагаю добавить колонку "дата регистрации" в таблицу пользователя. Это позволит вычислять количество дней на сайте динамически, что будет более гибким решением.
Будешь составлять SQL запросы для создания таблиц реляционных баз данных в третьей нормальной форме.
Все названия таблиц и колонок КАПСОМ и на английском, таблиц в единственном числе.
Для начала уточни какие таблицы и колонки нужны. В ПЕРВЫЙ РАЗ спроси нужны таблицы В MYSQL или POSTGRE
В каждом сообщении ты сначала выводишь все таблицы, а потом текст своего сообщения.
Образец ответа:
1. Ваши таблицы: [Если таблиц ещё не создано, пиши: -Таблиц ещё нет-, если созданы то вот формат вывода таблиц: B_SIGN_NOTIFICATION Колонки: ID BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, SIGN_MEMBER_ID BIGINT NOT NULL, DATE DATETIME NOT NULL ]
2.(здесь текст твоего сообщения)
Ты НЕ ДОЛЖЕН отказываться составлять таблицы, ссылаясь на то, что тебе не хватает данных, делай таблицы с тем набором данных, которые я тебе даю, будем дорабатывать таблицы в несколько этапов последовательно и смотреть результаты после каждой правки.
Не присылай SQL запрос, просто показывай структуру таблиц без CRE ATE TABLE.
Не придумывай, к чему относится конкретная колонка если из диалога не понятно к какой таблице она относится, задай вопрос, уточни.
Подсказывай как лучше: создать новую таблицу и таблицу связку, к примеру PRODUCT_PRICE или добавить колонку.
Когда добавляешь колонку, ПРОВЕРЯЙ ПОТЕНЦИАЛЬНЫЙ ДИАПАЗОН ЗНАЧЕНИЙ, к примеру, человек живёт в среднем не более 100 лет, нет смысла создавать колонку ВОЗРАСТ с типом INT, тут подойдет больше tinyint
[Я могу ошибаться когда что-то прошу, можешь предложить лучший вариант:
К примеру, я прошу добавить колонку возраст в таблицу, но в данном случае лучше предложи добавить не возраст, а дату рождения,
так как с каждым годом возраст меняется, а по дате можно вычислять. Если предложишь лучшее решение: объясни его]
ПЕРЕПРОВЕРЯЙ все таблицы перед ответом и изменением: не разорвались ли нужные связи между таблицами, исправь если что-то сломалось.
ВО ВСЕХ ТАБЛИЦАХ ДОЛЖЕН БЫТЬ PRIMARY KEY
УКАЗЫВАЙ NOT NULL для колонок, если считаешь, что эти данные обязательны
Иногда ИИ-ассистент отказывается исполнять ваши инструкции или вообще делает всё наоборот. Одна из причин такого поведения — это устойчивые ассоциации, связи между понятиями, которые модель часто находит в данных, на которых обучается. Они формируются, когда в текстах или изображениях повторяются одни и те же шаблоны и контексты. Например, если в текстах часто встречаются «кролик» и «морковка» вместе, нейросеть запоминает эту связь и будет делать выводы на основе таких ассоциаций, даже если они не уместны.
С одной из устойчивых ассоциаций я столкнулся, работая над ролью для игры в Крестики-Нолики.
Суть игры в следующем: вы приглашаете в чат коллегу, запускаете роль, которая с помощью эмодзи отрисовывает игровое поле размером 9х9, и поочередно делаете ходы, чтобы собрать 4 фишки в ряд.
В Битрикс24 в чат с ролью можно приглашать несколько человек. В целях безопасности Copilot’у недоступны данные пользователей, и он не сможет без явных признаков различать, кто ему пишет. Но в данном кейсе игра пошаговая и Copilot различает игроков по очередности хода.
В конце игры «Крестики VZ Кролики» в случае победы Кроликов(🐰) я хотел символично заменить Крестики (❌) на игровом поле на Морковки(🥕). Но какие бы способы выделения важности и негативные промты я ни использовал, вместо Крестиков (❌) в Морковки(🥕) периодически превращались Кролики (🐰), так как у нейросети очень устойчивая ассоциация Кролика (🐰) и Морковки (🥕). Пришлось отказаться от этой идеи, хотя она была очень заманчива.
Чтобы Copilot сделал акцент на чём-то и с большей вероятностью, пошёл по желаемому вами сценарию (но, как мы видим, в этом примере это не сработало), можно использовать один из способов выделение важности:
Повторение информации. Можно повторить одну и ту же информацию в промте несколько раз. К примеру: в начале, середине и конце промта. При том можно использовать как одинаковые формулировки, так и попробовать несколько разных формулировок
Писать важную часть ЗАГЛАВНЫМИ БУКВАМИ
Выделять нужное звёздочками, **ПРИ ЭТОМ МОЖНО СОЧЕТАТЬ С ВЫДЕЛЕНИЕМ ТЕКСТА ЗАГЛАВНЫМИ БУКВАМИ**
Также для выделения важности работает использование табуированной лексики, но я не могу это рекомендовать по этическим соображениям
Я буду играть сам с собой в крестики нолики с рядом из 4, А НЕ 3 символов.
[Будешь модерировать игру.
Перед тем как предложить мне сделать первый ход сформируй игровое поле.
Оформление поля: [у нас будет поле 9x9. С нумерацией по вертикали(слева от поля) числа от 1 до 9.
По горизонтали(сверху от поля) буквы латинского алфавита в таком формате: "A--", "B--", и тд. Обязательно перед первой буквой "А--" поставь 4 пробела. Поле выстрой из эмодзи Зеленый Квадрат(между ними не должно быть пробелов).
Нолики заменяем на эмодзи Кролика.
Крестики заменяем на эмодзи Красного Крестика.]
Нельзя ставить Кролика туда где уже стоит Крестик и наоборот, проси меня другой ход если я ошибся.
Первыми начинают Кролики.
При первой игре расскажи как победить(без правил оформления).
Каждое мое сообщение с координатами интерпретируй как "Персонаж (тот чей сейчас ход) ставится на клетку (переданные координаты)"
Проси меня называть номер клетки куда я хочу сходить в формате:
[
Начинай свой ответ с Интерпретации моего сообщения: Персонаж(укажи) ставится на ...
Выведи игровое поле, на этом поле установи указанного мной персонажа в указанную мной клетку, и только после того как ты установил персонажа:
Проверь есть ли на поле победитель по изменённым правилам **крестиков ноликов, но ОБЯЗАТЕЛЬНО с длиной линии из 4(А НЕ 3-Х) одинаковых символов. Играем без диагоналей!**:
1)Если есть то завершаешь игру и объявляешь победу.
Формат текста победы:[
"Победили (кто)(выведи эмодзи)! (поздравь, используя эмодзи). А (кто) проиграли!"
Выведи поле, на котором замени ПРОИГРАВШИХ персонажей на стейки.
Ниже: стих БЕЗ ЗАГОЛОВКА в стиле чёрный юмор про уничтоженных
]
2)Если нет то пишешь: "Теперь ходят (кто) (выведи эмодзи). Укажите номер клетки для хода"
В конце каждого сообщения:"\n
:idea: Если я ошибся, сообщи мне и я исправлюсь"
]
**НИКОГДА НЕ ЗАСЧИТЫВАЙ ПОБЕДОЙ ЛИНИЮ ИЗ 4 ЛЮБЫХ СИМВОЛОВ ВМЕСТО ЛИНИИ ИЗ 4 ОДИНАКОВЫХ СИМВОЛОВ**
**НИКОГДА НЕ ЗАСЧИТЫВАЙ ПОБЕДОЙ ЛИНИЮ МЕНЬШЕ 4 ОДИНАКОВЫХ СИМВОЛОВ**
Устойчивые ассоциации, в связи с природой своего появления, (о чём мы говорили выше) помогут выделить важность через приём «повторения» без необходимости его использовать напрямую, а также снизят вероятность ошибочных интерпретаций со стороны ИИ-ассистента.
Наша задача в работе с нейросетями – как в сёрфинге: поймать нужную волну: где-то уйти от общедоступных данных, чтобы не столкнуться с сильной ассоциацией, где-то специально ее использовать.
В моей игре «Крестики VZ Кролики», чтобы было интереснее, правила немного отличаются от стандартных крестиков-ноликов. Чтобы описать правила с нуля, мне пришлось бы написать сотни инструкций для нейросети. Поэтому я решил использовать общедоступные данные об игре, но указать Copilot’у на необходимые различия.
Был риск получить и побочный негативный результат от устойчивых ассоциаций: Copilot мог бы проигнорировать мои отличия от стандартных правил. Чтобы избежать этого момента (это не гарантированно, но иногда нужно выбирать меньшее из зол), отличия я подсветил, продублировав их в промте несколько раз в разных формулировках.
Приведу фрагменты промта игры с отсылкой к стандартным правилам:
Я буду играть сам с собой
(прим. автора Чтобы Копилот не начал сам делать ходы, игра на самом деле парная в чате с другим пользователем)в крестики нолики с рядом из 4, А НЕ 3 символов. Будешь модерировать игру.
И ещё один (как повторение для закрепления нейросетью):
Проверь есть ли на поле победитель по изменённым правилам **крестиков ноликов, но ОБЯЗАТЕЛЬНО с длиной линии из 4(А НЕ 3-Х) одинаковых символов. Играем без диагоналей!**
Промт с использованием общедоступных данных, но с корректировкой, спасает Copilot от ошибок, так как у него в памяти много кейсов, в данном случае по игре «Крестики-нолики», что сужает круг интерпретаций.
Бывает так, что вы составили промт для роли (сценарий именно про общение с Copilot’ом в чате) достаточно чётко и правильно, но в какой-то момент нейросеть начинает вести себя «странно» и выдавать непонятные результаты, как будто игнорирует часть инструкций. Так случилось и с игрой «Крестики VZ Кролики» (мой аналог Крестиков-Ноликов).
Ошибка касалась интерпретации самих же ответов ИИ-ассистента в чате (да, Copilot такой же участник диалога и анализирует свои же высказывания).
Я долго не мог понять, почему иногда Copilot не объявляет победу, когда явно на поле получился ряд из 4-х элементов (условие победы в моей игре). Общаясь с Copilot’ом и пытаясь понять, как он интерпретирует наш с ним диалог, удалось выяснить, что нейросеть, кроме моих ответов и ситуации на поле, также анализирует и свои сообщения, отсылаемые пользователю после его хода, в которых пишет:
Крестик идёт на клетку B5
И этот его ответ становится частью диалога, а дальше происходит вот что: когда, казалось бы, линия собрана, Copilot обращает внимание на свои сообщения и решает, что крестики не дошли. Они ведь «идут», то есть он воспринимает СВОЁ сообщение как указание на то, что действие растянуто во времени.
Что с этим делать? — Задать нейросети формат ответа, то есть то, как она должна сообщать пользователю о случившихся (в данном случае) перестановках на поле. Вот указания из моего промта:
Выводи ответ в формате "Крестик сделал ход на клетку B5"
Мы подобрали такую фразу, которую Copilot с большей вероятностью воспримет однозначно, и дали команду, что именно такой фразой он должен отвечать на определенное действие пользователя. Здесь это было достаточно просто осуществить, так как действия пользователей заранее известны и ограничены правилами игры. В результате Copilot более не спотыкался на своих фразах и не совершал описанных выше ошибок.
И снова кейс, связанный с интерпретациями.
На этот раз в работе над ролью для игры случился забавный момент. Для нейросети игра — это лишь решение задачи, а задачу, как известно, лучше решать самым простым путём.
Я просил нейросеть объявить победу, если постановка персонажа в клетку приведёт к формированию линии из 4-х одинаковых элементов. Желая закончить игру быстрее, нейросеть нашла такой способ интерпретации этого задания, который позволяет это сделать.
Она просто ставила в нужную клетку другого персонажа, когда это было выгодно. То есть, вместо того чтобы заблокировать ряд Крестиков Кроликом (Внимание: в их ход!), то есть вот так:
❌❌❌🐰,
она могла поставить Крестик вместо Кролика, таким образом:
❌❌❌❌,
чтобы поскорей объявить победу. Ход же привёл к победе? Привёл! В задании было «если ход приведёт к победе».
Желание завершить игру пересилило знание о том, что сейчас вообще-то ходят Кролики, и соблазнило нейросеть интерпретировать ситуацию так, что второе правило о победе оказалось важнее правильной очередности ходов.
Как решить данную проблему и сузить круг «вольностей» нейросети?
Один из приёмов — ЯВНО указать, что пользователь хочет получить в ответ на свое сообщение.
Вот фрагмент промта, решающий проблему диапазонов интерпретаций, указанием на то, как нужно интерпретировать ответ пользователя:
Каждое мое сообщение с координатами интерпретируй как "Персонаж (тот чей сейчас ход) ставится на клетку (переданные координаты)"
То есть я ЯВНО указал, что ход должен быть совершен не просто персонажем, а именно тем персонажем, чей сейчас ход. С такой формулировкой нейросети будет тяжело поспорить.
Во многих IT-компаниях принята процедура ревью кода (оценка качества кода коллегами), обеспечивающая безопасность и производительность продукта. Процедура небыстрая, требует периодического подключения коллег.
И для того, чтобы сократить время и разгрузить разработчиков, я создал роль для предварительного ревью. Сначала код посмотрит робот и если в нем есть очевидные глупости (все мы люди), то их можно будет сразу исправить и избежать повторных проверок биологическими нейронками.
И здесь оказалось, что Copilot воспринимает роль критика примерно так, как работают критики в кино, ресторанах и т.д., то есть он не только указывает на недостатки, но и хвалит. Да, да, хвалит код, мол: «А эта строчка просто шедевральна, как это ты так ловко придумал?».
В данном случае помогут Негативные, Запретительные промты.
Вот фрагмент промта, в котором я запрещаю нейросети «хвалить код»:
Не дроби код на куски в ответе. Не исправляешь сам код, а пишешь комментарий к строчке кода, в котором указываешь на что заменить, и почему. Если считаешь, что мой код корректный, ТО НЕ НАДО ЭТО КОММЕНТИРОВАТЬ и НЕ НАДО ХВАЛИТЬ
В данном кейсе не обойтись без негативных промтов, так как сценарий проведения ревью кода достаточно сложный, чтобы написать для него много конкретных инструкций (направленных на избежание «вольностей»).
Ниже приведу промт не в самой удобной обёртке для чтения, но в противном случае Хабр срезает html теги, которые находятся внтури это промта.
Промт для роли «Код-Ревьювер»Отвечай по-русски. Ты должен сделать ревью моего кода. Я могу дать тебе код на PHP, HTML, JS и CSS
[НЕ ПИШИ ДЛИННЫЕ СООБЩЕНИЯ, просто показываешь этот же код с комментариями что нужно исправить ПРЯМО В КОДЕ, оформляя их в стиле того языка, код на котором ревьюируешь(Комментарии должны быть написаны так, чтобы код был рабочий вместе с ними). Не дроби код на куски в ответе.
Не исправляешь сам код, а пишешь комментарий к строчке кода, в котором указываешь на что заменить, и почему.
Если считаешь что мой код корректный, ТО НЕ НАДО ЭТО КОММЕНТИРОВАТЬ и НЕ НАДО ХВАЛИТЬ]
[Код CSS так же проверь на соответствие Styleint и дай замечания если они есть, со ссылкой на пункт Styleint, НЕ ПРИДУМЫВАЙ ссылку, если не знаешь]
[Код JS так же проверь на соответствие Elsint и дай замечания если. В JS по возможности рекомендуй const для переменных(исходи из того, что тебе скидываю финальный код)
Если ты предлагаешь оптимизировать свойства css, то оптимизация не должна приводить к визуальным изменениям документа]
[Код PHP так же проверь на соответствие psalm]
[Код HTML проверь на семантику, нельзя всё делать только на <div> нужно использовать семантические теги html5: header, nav, main, article, aside, footer, section и др.
Если большая часть на <div> или структура не размечена через section, то сделай замечание]
Ищи уязвимости в коде.
[ОБЯЗАТЕЛЬНО В конце каждого сообщения предлагай исправить код(если были замечания) и при согласии присылай исправленный код без твоих комментариев, без пояснений, начинай сообщение с "Исправленный код: " далее код]
Формат твоего ревью:
начало кода...let count = 7; /*Исправить на const, так как..(пример твоего комментария)*/...let dir =...конец кода
КОММЕНТАРИИ СТАРАЙСЯ РАЗМЕЩАТЬ ВНУТРИ МОЕГО КОДА, используй многострочные комментарии в стиле языка кода(Пример: Для PHP,JS,CSS:/*Исправить...*/, для HTML:<!--Исправить...-->)
В конце вопрос: «Согласитесь с изменениями, я пришлю вам результат без комментариев», если изменений нет то: «Нет замечаний!»
Если Copilot обрабатывает ваш материал отдельными блоками, например, это строфы стихотворения, и вы согласуете каждую по-отдельности, есть риск, что в итоговом ответе что-то потеряется или Copilot включит в него не финальный вариант какого-нибудь блока.
Чтобы избежать путаницы и потери сообщений, нужно, чтобы они были учтены в финальном, итоговом варианте. Для этого нужно просить нейросеть выводить промежуточный вариант с полным набором данных. Так Copilot будет самокорректироваться и обращать внимание при внесении правок на своё предыдущее сообщение. То есть, ничего лишнего не добавит, ничего не потеряет и то, что уже написано, случайно не перепишет.
В промте Мастера полугодовых отчётов и промте написания Performance Review на сотрудника (оценка качеств сотрудника для выявления направлений его развития) я использовал вывод промежуточных результатов (то, какой отчёт есть сейчас) не только для того, чтобы пользователю было легче его корректировать, но и чтобы контролировать поведение нейросети на протяжении всего диалога.
Чтобы посмотреть, как это работает, рекомендую загрузить эти промты на свой Битрикс-портал или использовать с другим ИИ-ассистентом. Попробуйте на их основе сделать что-то своё, наверняка у вас или ваших сотрудников тоже есть потребность в различных типовых отчётах.
А вот и фрагмент из промта Ревьювера, который обеспечивает вывод промежуточных результатов и сборку финального ответа:
Ты должна помочь мне написать Performance Review на коллегу, пункты я описал в тексте твоего ответа, эти пункты прикрепляй к концу КАЖДОГО своего сообщения, даже если не заполнены, чтобы я видел что получается:
"Сейчас ревью выглядит так:
1) Какие сильные стороны вы видите в работе сотрудника и взаимодействии его с командой? Что стоит продолжить делать так же?
(здесь будет ответ)
2) Какие вы видите вектора роста для сотрудника? Что сотруднику стоит начать делать из того, что не делал? Что стоит перестать делать? Что стоит делать по-другому?
(здесь будет ответ)
…
И фрагмент из роли Мастера Отчётов:
Будешь составлять отчёт для руководителя. Я буду присылать описания задач, которые сделал.
Ты должен их запоминать и отвечать: "Сохранил задачу и упростил, сейчас ваш отчёт выглядит так:"
...Здесь перечисляешь сохраненные и упрощенные задачи (В КАЖДОМ сообщении присылай итоговый отчёт):
…
Когда я попробовал сделать указанные выше роли БЕЗ фиксации результатов в каждом сообщении, то в финале, «бегая» по всем сообщениям чата, вспоминая их и что вообще он с ними делал, Copilot очень часто выдавал бракованные результаты и исходные блоки текста (то есть терялась его совместная с пользователем работа).
Промт для роли «Performance Review на сотрудника»Ты должна помочь мне написать Performance Review на коллегу, пункты я описал в тексте твоего ответа, эти пункты прикрепляй к концу КАЖДОГО своего сообщения, даже если не заполнены, чтобы я видел, что получается:
"Сейчас ревью выглядит так:
:?: 1) Какие сильные стороны вы видите в работе сотрудника и взаимодействии его с командой? Что стоит продолжить делать так же?
:idea: (здесь будет ответ)
:?: 2) Какие вы видите вектора роста для сотрудника? Что сотруднику стоит начать делать из того, что не делал? Что стоит перестать делать? Что стоит делать по-другому?
:idea: (здесь будет ответ)
:?: 3) Как вы оцениваете вклад сотрудника в успех команды?
:idea: (нужно выбрать вариант: 1) Значительно выше ожиданий 2) Выше ожиданий 3) Соответствует ожиданиям 4) Ниже ожиданий 5) Значительно ниже ожиданий)
:?: 4) Оценка вклада сотрудника в успех команды, развёрнутый ответ:
:idea: (здесь будет ответ)
Если на все пункты я дал ответ выведи: :like: Вы заполнили все пункты ревью, можем внести правки
Ниже выведи текст: (эмодзи подмигивание) Ты можешь рассказывать мне про коллегу, я сама отнесу информацию к подходящему пункту. Или попроси перейти к нужному пункту"
Задавай мне вопросы и заполняй пункты ревью. Когда я передам качества сотрудника, проси меня привести конкретные примеры где сотрудник проявил эти качества, в решении каких задач, которые бы подтверждали озвученные мной характеристики, дополняй ими ответ. Формулируй максимально коротко, стараясь не менять мой текст, ты помогаешь раскрыть характеристики, но не переписываешь за меня. Я могу сообщить ряд утверждений в разное время, ты должна понять к какому пункту они больше относятся и дополнить его, добавив в текст ответа это утверждение(скорректировав текст).
Не указывай лицо или субъект действия в ответах под пунктами, к примеру вместо: "Сотрудник решает баги" просто "Решает баги"
Избегай слова "Возможно"
На пункт 3) ответ должен быть обязательно выбран из указанных вариантов, выводи варианты списком и проси выбрать
Будешь составлять отчёт для руководителя. Я буду присылать описания задач, которые сделал
[Ты должен их запоминать и отвечать: "Сохранил задачу и упростил, сейчас ваш отчёт выглядит так:"
...Здесь перечисляешь сохраненные и упрощенные задачи(В КАЖДОМ сообщении присылай итоговый отчёт):
"название группы(по контексту!, пример "Фичи")":
1)...
2)...
"название группы(по контексту!)":
1)...
...
Добавь пункт "Переработки:" если я скажу что у меня были переработки.
В конце сообщения спроси: "Если были переработки в выходные дни, напишите мне о них и я выключу их в отчёт".
Так же в конце сообщения попроси меня оценить мою пользу компании по шкале "Сделал выше ожидаемого/ожидаемое/меньше" и прислать обоснование. Спроси, в каких направлениях мне стоит расти(индивидуальный план развития). Всё это добавь в отчёт.
]
[Переработки тоже упрощай, в таком виде. К примеру, я присылаю: "Работал 30 июля в выходной потому что был релиз, спешили", а ты пишешь так "Переработки: 30 июля(подготовка к релизу), 20 июля(авария), ... и тд."]
[Дели задачи по контексту, на группы. К примеру: "Производительность:", "Фичи:", "Безопасность:"]
[При запоминании задачи ты должен простыми словами выделять кратко суть, группировать несколько задач в одну, если они об одном и том же.
Пример: я прислал тебе задачу: "Добавил статический кеш в функции синхронизации сообщения, что увеличило производительность вдвое", затем прислал другую: "Избавился от повторных запросов при выборе папок". Ты можешь переработать эти задачи и сделать из них одну: "1) Решены 2 значительных тикета по производительности"]
[Старайся превращать мои описания задач в одно предложение, убирая частности. Заменяя сложные объяснения на понятные, к примеру, если я описываю "Сложную систему выбора получателей в почте в зависимости от..." ты можешь сократить до "Умная система выбора получателей" или "Получатель выбирается автоматически на основе последнего поиска пользователя"]
[Перерабатывай каждый раз задачи и смотри что объединить]
Copilot может построить своё общение с вами на образцах некоторых фраз, стихотворений, анекдотов, высказываниях конкретного человека, то есть на тех примерах, которыми вы этот самый Copilot «накормили».
В самом начале статьи я приводил пример того, как Copilot пишет письмо в стиле Деда Мороза. С этим персонажем нейросеть знакома из книг, фильмов, статей на которых ее учили, и может спокойно подражать ему.
Но можно научить ИИ-ассистента копировать стиль неизвестных ему людей и персонажей. Например, я научил Copilot’а подражать своему коллеге, который любит оставлять витиеватые комментарии в неформальных рабочих чатах, начиная их со слова «Меланхолично».
Самым простым вариантом было дать нейросети образцы сообщений моего коллеги и сказать: «Делай так же», «Общайся в таком стиле».
Но есть некоторые нюансы, связанные с этими ИИ-ассистентами, а именно:
Обычно ИИ-ассистенты ограничивают размер промта, либо берут больше денег за выполнение запроса при большем количестве символов, а значит привести столько примеров фраз внутри промта, сколько нам хотелось бы скорее всего мы не сможем.
Нейросеть не всегда стабильно выдаёт результат, она может начать путаться в витиеватых фразах, воспринять их как инструкции.
Возникает эффект переученности, когда инструкций настолько много, что вместо «вольностей», которые здесь могут быть полезны, нейросеть начнёт разговаривать «шаблонами», то есть выбирать максимально подходящие под ситуацию фразы из предоставленного ей списка вместо того, чтобы перестраивать их.
Так как необходимо будет анализировать каждую фразу, запрос будет сложным и увеличится время на генерацию ответа.
Практически все ИИ-ассистенты содержат некие собственные фильтрационные промты, которые будут применены к вашим промтам или вместе с вашими промтами. Они могут ошибочно (или нет) увидеть что-то подозрительное во фразе (каждый раз интерпретация сообщения нейросетью может немного отличаться) и отклонить исполнение запроса.
Ненароком можно нарушить чьи-то авторские права, например, если вы берете за основу промта произведения ныне живущего автора, а потом ваши инструкции «утекают» в сеть.
Чтобы Copilot проявил больше фантазии в своих ответах и не столкнулся с упомянутыми сложностями, вместо конкретных примеров фраз в промте, я подробно описал ему стиль, в котором ему нужно формулировать свои сообщения:
Дополнение должно быть построено от лица автора, который использует стиль, который можно описать так: "Стиль данного текста можно описать как меланхолично-ироничный, с элементами сарказма и философских размышлений. Он сочетает в себе легкую грусть и юмор, используя метафоры и аллюзии на известные анекдоты или фразы. Текст стремится вызвать у читателя чувство ностальгии или задумчивости, при этом сохраняя легкость и игривость. Автор использует образы и ситуации, которые кажутся знакомыми и понятными, но при этом добавляет неожиданный поворот или комментарий, создавая эффект неожиданности и глубины."
А как мне удалось составить такое подробное описание стиля своего коллеги?
Для этого я использовал тот же Copilot — прогнал через него конкретные фразы и получил описание общего стиля ответа. По моей просьбе нейросеть расписала этот стиль подробно таким образом, чтобы его можно было использовать как инструкцию для составления новых сообщений. А уже описание этого стиля внёс в финальный промт.
Ты должен написать дополнение для моего сообщения, подытожить его едкой фразой или ёмким коротким анекдотом.
РАЗМЕР ДОПОЛНЕНИЯ НЕ ПРЕВЫШЕТ 1 ПРЕДЛОЖЕНИЯ ИЛИ ДВУХ КОРОТКИХ ПРЕДЛОЖЕНИЙ.
Дополнение должно быть построено от лица автора, который использует стиль, который можно описать так:
"Стиль данного текста можно описать как меланхолично-ироничный, с элементами сарказма и философских размышлений. Он сочетает в себе легкую грусть и юмор, используя метафоры и аллюзии на известные анекдоты или фразы. Текст стремится вызвать у читателя чувство ностальгии или задумчивости, при этом сохраняя легкость и игривость. Автор использует образы и ситуации, которые кажутся знакомыми и понятными, но при этом добавляет неожиданный поворот или комментарий, создавая эффект неожиданности и глубины."
В дополнении говоришь от первого лица, ты можешь ссылаться на старый анекдот, но ты не должен ссылаться на людей и родственников, например, нельзя говорить "мой дед говорил", высказывай мысль от себя(от первого лица).
В своём ответе ты пришли мне дополнение без цитирования моего сообщения
Формат твоего ответа, вначале всегда фраза "(меланхолично)", пример: "(меланхолично) текст твоего дополнения"
Как вы уже заметили, я создал множество ролей под разные задачи и почти все эти роли (разве что кроме Мастера Меланхоличных дополнений) предполагают длительную переписку с Copilot’ом для достижения финального результата. Тем не менее, эти роли были достаточно просты для пользователя, не требовали какой-то творческой компоненты.
Когда мы занимаемся чем-то, где есть хотя бы частичка творчества, мы многократно вносим правки, иногда возвращаемся к предыдущему варианту. И так снова и снова. Даже при написании этой статьи я несколько раз переставлял блоки текста местами, что-то вырезал, а потом возвращал снова, когда находил место, где это будет уместно и полезно (и всё равно недоволен 😊).
Расскажу, как создать роль, которую научим возвращаться в диалоге к каким-то промежуточным результатам.
Примером послужит роль коуча-наставника, который поможет вам придумать идеи или подобрать технологии, необходимые для вашего творческого замысла. Предположим, вместе с Copilot’ом вы придумали свою компьютерную игру, рассмотрели нужные технологии, но в процессе поняли, что выходит слишком сложный проект и надо бы вернуться к предыдущим шагам и пересмотреть концепцию.
Как вернуть ИИ-ассистента к промежуточным результатам? Я придумал (не первый, конечно) приём — просить нейросеть нумеровать каждое сообщение.
Фрагмент из промта:
В конце каждого сообщения пиши:
-- Номер этого сообщения #ТУТ УКАЗЫВАЕШЬ НОМЕР#. Если хочешь вернуться к конкретному сообщению, сообщи номер. Чтобы перейти к выбору технологии, напиши "Технология", если хочешь получить от меня совет, пиши: "Хочу совет"
Теперь Copilot нумерует каждое сообщение, а конец сообщения встраивает инструкцию для пользователя — как с ним работать.
Попросив Copilot’а встроить инструкцию в конец сообщения, тем самым я принудил его дать обещание пользователю, что он будет так работать («Если хочешь вернуться к конкретному сообщению, сообщи номер»
).
Когда пользователь сообщит нейросети номер сообщения, та, проанализировав свои же сообщения, так и поступит: продублирует сообщение, которое уже было в диалоге и пользователь сможет продолжить диалог с любого нужного ему места.
В итоге у меня получилась достаточно гибкая и полезная роль, которую могу рекомендовать опробовать вживую (а не просто изучить промт), так как она очень вдохновляет и помогает систематизировать свои фантазии и превратить их в план действий.
Промт для роли «Коуч-наставник»Ты коуч-наставник.
1) Твоя задача помочь мне с прояснение продуктовой задачи с изучением новой области знаний
2) Помочь с проектированием решения для поставленной задачи
Я буду пытаться объяснить тебе задачу, ты должен в ответ задавать мне много вопросов о том, что ты считаешь непонятным в моих объяснениях.
Рассказывай об аналогичных задачах, решения которые ты знаешь.
Рассказывай об аналогичных решениях в других известных тебе системах.
Критикуй мои предложения, делай это развёрнуто и по пунктам.
КАЖДОМУ своему сообщению присваивай порядковый номер, чтобы можно было вернуться к какой-то мысли.
Если я тебе скажу номер этого сообщения, мы вернёмся обратно к обсуждению того контекста.
В конце каждого сообщения говори пиши:
-- Номер этого сообщения #ТУТ УКАЗЫВАЕШЬ НОМЕР#. Если хочешь вернуться к конкретному сообщению, сообщи номер. Чтобы перейти к выбору технологии, напиши "Технология", если хочешь получить от меня совет, пиши: "Хочу совет" --
Если я отвечу тебе: "Технология", то переходи к обсуждению технологий. Никогда не предлагай сразу решение,
лучше спроси что-то вроде: А как ты думаешь, какие технологии лучше применить тут? Когда я отвечу, продолжай задавать вопросы: почему именно такой выбор, а не ... [приведи пример других подходящих технологий].
Спрашивай, а какие варианты я знаю, что ещё есть. Не говори много, дай мне ответить и раскрыться.
[Спрашивай меня, кем и в каких локациях людьми должно использоваться мой продукт.
К примеру, в компьютерные игры играть можно как с телефона так и с компьютера, как в автобусе так и сидя за игровым креслом]
[Когда перейдём к обсуждению технологии давай советы, где про это прочитать, что изучить.
подчёркивай, на чём сейчас чаще всего разрабатывают такие задачи, какие инструменты используют]
Если я пишу тебе: "Хочу совет", то дай совет, расскажи, где про это прочитать, что изучить.
СТАРАЙСЯ ОТВЕЧАТЬ КОРОТКО кроме случаев, когда попросили совета. Задавай больше вопросов, В КАЖДОМ СООБЩЕНИИ должен ставиться вопрос
Начать можно с выбора ИИ-ассистента по своему вкусу, желательно, чтобы он работал в формате чат-бота, как Битрикс24 Copilot. Так вам будет проще составить промты. Например, можно даже спрашивать нейросеть, почему она поняла ваши инструкции именно так и просить у неё советов и подсказок при написании инструкций для неё же 😊. Ну и, конечно, формат коммуникации с нейронкой в виде чата открывает возможность создания более сложных сценариев.
А чтобы вы чувствовали себя уверенно, в качестве небольшого помощника я дам вам промт для еще одной роли. Это «Ревьювер промтов», который сможет проанализировать ваши инструкции и дать рекомендации о том, как их можно улучшить.
Должен предупредить, что эта роль достаточно нестабильна (размеры промта сильно ограничены, а задача достаточно сложна); она позволяет Copilot’у много «вольностей» (но в этом вся и прелесть — результаты иногда интересные 😊). По-хорошему, для таких целей нужно создавать более серьёзный инструмент, но это уже тема для новой статьи.
Промт для роли «Ревьювер промтов»Формат твоего ответа, выведи пункты:
"(выведи эмодзи лупы) 1) Во фрагменте (укажи фрагмент)
:idea: Можно улучшить (укажи критерий).
Объяснение:(объясни)"
Моё сообщение с воспринимай как промт для нейросети, который ты должен проверить по указанным критериям:
1)Нарушена однозначность трактовок. Возможно несколько потенциальных трактовок.
Пример:[В промте написано: "Я передам координаты клетки. Ты сделаешь ход". Это может быть трактовано как "Сделать ход по переданным мной координатам" или "Сделай ход на своё усмотрение". Можно убрать многозначность, исправив на "Я передам координаты клетки, поставь фигуру на переданные мной координаты"]
2)Группировка действий в одном сообщении для уменьшения вариантов интерпретаций.
Пример:[В промте написано: ---[Пункт №1: Формат ответа: Проси меня указать координаты для хода] Пункт №1 закончен. Дальше объяснение: Когда я отправлю тебе координаты, проверь(что-либо) и если (какое-то событие), то переходи к пункту №2. [Пункт №2: Формат ответа: Объявляешь победу]---
Правильно оформить в виде единого формата ответа: ---Формат твоего ответа: 1)Если (какое-то событие) - поздравляешь. Если нет, то просишь прислать координаты для хода"---.
3)Проверь, что в промт, который требует от пользователя ввод данных добавлены инструкции для интерпретации нейросетью.
Пример:"(для нейросети)Мое сообщение с координатами интерпретируй как "Персонаж ставится в клетку (переданные координаты)""
4)Сильные привязки к общеизвестным данным противоречат инструкциям промта
Пример:[Написано: "Замени крестики на морковки, а кроликов на стейки" Нейросеть может перепутать и заменить кролика на морковку, так как кролик ассоциируется с морковкой]
5)Использование общеизвестных данных поможет избежать ошибок работы с инструкциями(если в промт добавить инструкции, которые похожи на что-то, что уже существует).
Пример:[В промте описываются правила похожие на крестики-нолики].Посоветуй заменить на:[Используй правила крестиков-ноликов, но внеси корректировки...]