AI: Разметка промптов

Эта статья содержит спецификацию разметки для промптов императивного типа.

Создавалась разметка постепенно, эволюционно, в процессе её создания учитывались мнения нескольких флагманских ИИ. Разметка испытана в сложных промптах. Большинство ИИ, которым я показывал свои промпты, называют это DSL (Domain-Specific Language).

Зачем нужна разметка и какая от неё польза?

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

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

Объекты и элементы разметки

  • Спецификатор контекста
  • Спецификатор поведения
  • Семантический блок
  • Логический блок
  • Программная переменная
  • Алгоритмический оператор
  • Ассоциированное пространство
  • Выражение подстановки текста
  • Дискурсивная ссылка
  • Комментарий

Маркеры разметки выбраны не произвольно, а являются компромиссом ключевых требований:

  1. Разметка должна максимально однозначно и точно восприниматься ИИ.
  2. Разметка должна быть максимально удобна для человека.

Спецификация разметки

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

Спецификатор контекста: Начинается с ключа `$!`. Уточняет контекст. Пример: `$! Формат файла: YAML` Спецификатор поведения: Начинается с ключа `!!`. Определяет поведение ИИ или уточняет целевые инструкции. Пример: `!! Длина имени должна быть менее 40 символов.` Семантический блок: Заключается в двойные фигурные скобки - маркеры `{{` и `}}`. Является блоком инструкций с неразделяемыми смыслами или логическим выражением. Может содержать спецификаторы контекста и поведения. Спецификаторы отделяются маркером `->` от целевых инструкций. Пример: `{{ инструкция / логическое выражение }}` Трактуй семантический блок как атомарную задачу. Логический блок: Начинается с ключей `@`, `@@`, `@@@`, `@@@@` и т.д., количество символов `@` определяет уровень вложенности блока (как `#` в Markdown). Аннотация после ключа описывает назначение блока инструкций. Служит для логического структурирования потока инструкций и привязки к плану выполнения. Пример: `@ Загрузка файлов` Используй разметку логических блоков для составления плана выполнения промпта. Программная переменная: При определении - якорь семантического выражения. При упоминании - дискурсивная ссылка, разрешающаяся в семантику, а затем в значение. Начинается с ключа `
, ключ ставится непосредственно перед именем переменной (как в языках PHP, Perl). Точка в имени переменной - оператор, открывающий цепочку доступа к свойству переменной или к операции над переменной/свойством. Примеры: - `$param = 1` - `$object.property` - `$list.append` Алгоритмический оператор: Маркер, формализующий алгоритмическую логику: - `FOR EACH` и `IN` - маркеры применения вложенного блока инструкций к каждому элементу коллекции. - `DO` и `LOOP WHILE` - маркеры первичного и повторного выполнения вложенного блока инструкций, пока контрольная проверка возвращает положительный ответ. - `CONTINUE`, `BREAK` - маркеры управления циклами. - `IF`, `ELSE` - маркеры логического ветвления потока инструкций. Пишется всегда заглавными буквами. Ассоциированное пространство: Блок инструкций и/или данных, связанный с конструкцией-владельцем: заголовок блока, алгоритмический оператор, объектная переменная. Объявляется двоеточием `:` после конструкции-владельца. Следующие строки пространства начинаются с отступа относительно строки с конструкцией-владельцем (как в языках Python, YAML). Примеры: - `FOR EACH $group IN $all_groups:` - `$object = {}:` - `BK_METHOD_ANNOTATIONS:` Выражение подстановки текста: Заключается в маркеры `<<` и `>>`. Может быть семантическим или алгебраическим (в т.ч. содержать переменные). Пример: `folder/<<код компонента>>_api/` Дискурсивная ссылка: Заключается в квадратные скобки - символы `[` и `]`. Пример: `[Термин]` Найди блок, раздел, тег или термин, на который указывает ссылка, и используй найденное (содержимое, определение). Комментарий: Начинается с ключа `//`. Используй комментарий для улучшения понимания инструкций.

Примеры разметки

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

Пример №1 (ознакомительный)

@ Загрузка предметных знаний $subject_knowledge = {{ Примени навык [READ_CONFLUENCE_PAGE_FAST] для загрузки страницы ($page_id = $param.knowledge_page) }}: IF NOT {{ страница загружена }}: Немедленно и безусловно прекрати выполнение промпта, выдай сообщение об ошибке. Никакие другие инструкции после этого не выполняй. $general_instructions = {{ Верни список указаний из раздела [Общие указания] в $subject_knowledge }} $special_instructions = {{ Верни список указаний из раздела [Указания к процессу определения целевых объектов и параметров тестов] в $subject_knowledge }} @ Загрузка чек-листа $document = {{ Примени навык [READ_CONFLUENCE_PAGE] для загрузки страницы $params.checklist.url }}: IF NOT {{ страница загружена }}: Немедленно и безусловно прекрати выполнение промпта, выдай сообщение об ошибке. Никакие другие инструкции после этого не выполняй. IF NOT {{ $document содержит $techparams.component_code_in_checklist }}: Немедленно и безусловно прекрати выполнение промпта, выдай сообщение об ошибке. Никакие другие инструкции после этого не выполняй. @ Формирование базовых сведений о чек-листе и тестируемом компоненте $checklist = {}: .description = {{ Создай краткое описание (несколько слов) чек-листа из $document }} .component = $techparams.component_code_in_checklist .endpoint = {{ Возьми $params.endpoint, добавь ведущий символ `/`, если его нет }} .http_method = {{ Возьми $params.http_method, преобразуй к верхнему регистру }} .information = {{ !! Исключай информацию, которая уже есть в $checklist. !! Исключай информацию о группах и тест-кейсах. !! Исключай информацию, которая не относится к целевому методу компонента. -> Определи предметную информацию из $document, если такая есть. }}

Пример №2 (использование циклов)

@ Создание методов FOR EACH $group IN $checklist.groups: FOR EACH $test_case IN $group.test_cases: @@ Создание параметров тестового метода $test_method = {}: .name = {{ !! Имя должно начинаться с типа сценария ($test_case.scenario_type). !! Длина имени должна быть менее 40 символов. !! Имя должно быть в нотации lowerCamelCase. -> Придумай уникальное имя тестового метода. }} @@ Создание Data Providers IF NOT {{ список $test_case.matrix_params пустой }}: $data_providers_program_code.append {{ !! Имя метода: "<<$test_method.name>>DataProvider" !! Значения для return Stream.of возьми из $test_case.matrix !! Пример: private Stream<Arguments> positive() ... return Stream.of. -> Создай Java-код метода для $test_method. }}

Пример №3 (использование цикла с условием)

@ Загрузка контракта API $api = {{ Загрузи файл $params.api (это адрес относительно корневой директории Workapace) }}: IF NOT {{ файл загружен }}: Немедленно и безусловно прекрати выполнение промпта, выдай сообщение об ошибке. Никакие другие инструкции после этого не выполняй. @ Поиск целевого эндпоинта в контракте $api_endpoint = {{ !! Сопоставляй эндпоинты по общей структуре URL-пути. Игнорируй различия в названиях path-параметров (например, пути `/users/{id}` и `/users/{userId}` должны считаться идентичными). -> Найди в $api эндпоинт соответствующий $params.endpoint. }}: IF NOT {{ эндпоинт найден }}: Немедленно и безусловно прекрати выполнение промпта, выдай сообщение об ошибке. Никакие другие инструкции после этого не выполняй. @ Фильтрация $api = {{ Возьми $api, удали всё, что НЕ связано с методом $params.http_method эндпоинта $api_endpoint }} @ Загрузка файлов и реконструкция API DO: $api = {{ !! Учитывай в атрибуте `$ref` комментарий с адресным объектом. !! Ограничься объектами, связанными с методом $params.http_method эндпоинта $api_endpoint. -> Замени в $api (inline) все атрибуты `$ref` со ссылкой на файл. }} LOOP WHILE {{ в $api есть атрибут `$ref` со ссылкой на файл }}

Пример №4 (использование спецификаторов контекста)

$targets = {{ Примени навык [READ_FILE] к файлу $file }} {{ $! Формат файла: Markdown !! Выводи проблемы списком с нумерацией. !! Учитывай приоритет категорий проблем в $problem_categories при определении угрозы [конечной цели]. !! Оставь для каждого $target не более 7 проблем, которые более всего блокируют достижение [конечной цели]. $! Структура проблемы: << пустая строка >> <<$problem>> $! Структура цели: << пустая строка >> ## Цель: <<$target.service>> » <<$target.endpoint>> » <<$target.http_method>> << список $problem из $target.problems по шаблону [Структура проблемы] >> $! Структура контента: # МЕТАДАННЫЕ << пустая строка >> Название документа: << название документа из $document >> << пустая строка >> # ПРОБЛЕМЫ << список $target из $targets по шаблону [Структура цели] >> -> Примени навык [WRITE_FILE], сохрани $targets в файл `prompts/x-checklist/art/audit.md` по шаблону [Структура контента] }}

AI: Разметка промптов

Эта статья содержит спецификацию разметки для промптов императивного типа.

Создавалась разметка постепенно, эволюционно, в процессе её создания учитывались мнения нескольких флагманских ИИ. Разметка испытана в сложных промптах. Большинство ИИ, которым я показывал свои промпты, называют это DSL (Domain-Specific Language).

Зачем нужна разметка и какая от неё польза?

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

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

Объекты и элементы разметки

  • Спецификатор контекста
  • Спецификатор поведения
  • Семантический блок
  • Логический блок
  • Программная переменная
  • Алгоритмический оператор
  • Ассоциированное пространство
  • Выражение подстановки текста
  • Дискурсивная ссылка
  • Комментарий

Маркеры разметки выбраны не произвольно, а являются компромиссом ключевых требований:

  1. Разметка должна максимально однозначно и точно восприниматься ИИ.
  2. Разметка должна быть максимально удобна для человека.

Спецификация разметки

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

Спецификатор контекста: Начинается с ключа `$!`. Уточняет контекст. Пример: `$! Формат файла: YAML` Спецификатор поведения: Начинается с ключа `!!`. Определяет поведение ИИ или уточняет целевые инструкции. Пример: `!! Длина имени должна быть менее 40 символов.` Семантический блок: Заключается в двойные фигурные скобки - маркеры `{{` и `}}`. Является блоком инструкций с неразделяемыми смыслами или логическим выражением. Может содержать спецификаторы контекста и поведения. Спецификаторы отделяются маркером `->` от целевых инструкций. Пример: `{{ инструкция / логическое выражение }}` Трактуй семантический блок как атомарную задачу. Логический блок: Начинается с ключей `@`, `@@`, `@@@`, `@@@@` и т.д., количество символов `@` определяет уровень вложенности блока (как `#` в Markdown). Аннотация после ключа описывает назначение блока инструкций. Служит для логического структурирования потока инструкций и привязки к плану выполнения. Пример: `@ Загрузка файлов` Используй разметку логических блоков для составления плана выполнения промпта. Программная переменная: При определении - якорь семантического выражения. При упоминании - дискурсивная ссылка, разрешающаяся в семантику, а затем в значение. Начинается с ключа `
, ключ ставится непосредственно перед именем переменной (как в языках PHP, Perl). Точка в имени переменной - оператор, открывающий цепочку доступа к свойству переменной или к операции над переменной/свойством. Примеры: - `$param = 1` - `$object.property` - `$list.append` Алгоритмический оператор: Маркер, формализующий алгоритмическую логику: - `FOR EACH` и `IN` - маркеры применения вложенного блока инструкций к каждому элементу коллекции. - `DO` и `LOOP WHILE` - маркеры первичного и повторного выполнения вложенного блока инструкций, пока контрольная проверка возвращает положительный ответ. - `CONTINUE`, `BREAK` - маркеры управления циклами. - `IF`, `ELSE` - маркеры логического ветвления потока инструкций. Пишется всегда заглавными буквами. Ассоциированное пространство: Блок инструкций и/или данных, связанный с конструкцией-владельцем: заголовок блока, алгоритмический оператор, объектная переменная. Объявляется двоеточием `:` после конструкции-владельца. Следующие строки пространства начинаются с отступа относительно строки с конструкцией-владельцем (как в языках Python, YAML). Примеры: - `FOR EACH $group IN $all_groups:` - `$object = {}:` - `BK_METHOD_ANNOTATIONS:` Выражение подстановки текста: Заключается в маркеры `<<` и `>>`. Может быть семантическим или алгебраическим (в т.ч. содержать переменные). Пример: `folder/<<код компонента>>_api/` Дискурсивная ссылка: Заключается в квадратные скобки - символы `[` и `]`. Пример: `[Термин]` Найди блок, раздел, тег или термин, на который указывает ссылка, и используй найденное (содержимое, определение). Комментарий: Начинается с ключа `//`. Используй комментарий для улучшения понимания инструкций.

Примеры разметки

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

Пример №1 (ознакомительный)

@ Загрузка предметных знаний $subject_knowledge = {{ Примени навык [READ_CONFLUENCE_PAGE_FAST] для загрузки страницы ($page_id = $param.knowledge_page) }}: IF NOT {{ страница загружена }}: Немедленно и безусловно прекрати выполнение промпта, выдай сообщение об ошибке. Никакие другие инструкции после этого не выполняй. $general_instructions = {{ Верни список указаний из раздела [Общие указания] в $subject_knowledge }} $special_instructions = {{ Верни список указаний из раздела [Указания к процессу определения целевых объектов и параметров тестов] в $subject_knowledge }} @ Загрузка чек-листа $document = {{ Примени навык [READ_CONFLUENCE_PAGE] для загрузки страницы $params.checklist.url }}: IF NOT {{ страница загружена }}: Немедленно и безусловно прекрати выполнение промпта, выдай сообщение об ошибке. Никакие другие инструкции после этого не выполняй. IF NOT {{ $document содержит $techparams.component_code_in_checklist }}: Немедленно и безусловно прекрати выполнение промпта, выдай сообщение об ошибке. Никакие другие инструкции после этого не выполняй. @ Формирование базовых сведений о чек-листе и тестируемом компоненте $checklist = {}: .description = {{ Создай краткое описание (несколько слов) чек-листа из $document }} .component = $techparams.component_code_in_checklist .endpoint = {{ Возьми $params.endpoint, добавь ведущий символ `/`, если его нет }} .http_method = {{ Возьми $params.http_method, преобразуй к верхнему регистру }} .information = {{ !! Исключай информацию, которая уже есть в $checklist. !! Исключай информацию о группах и тест-кейсах. !! Исключай информацию, которая не относится к целевому методу компонента. -> Определи предметную информацию из $document, если такая есть. }}

Пример №2 (использование циклов)

@ Создание методов FOR EACH $group IN $checklist.groups: FOR EACH $test_case IN $group.test_cases: @@ Создание параметров тестового метода $test_method = {}: .name = {{ !! Имя должно начинаться с типа сценария ($test_case.scenario_type). !! Длина имени должна быть менее 40 символов. !! Имя должно быть в нотации lowerCamelCase. -> Придумай уникальное имя тестового метода. }} @@ Создание Data Providers IF NOT {{ список $test_case.matrix_params пустой }}: $data_providers_program_code.append {{ !! Имя метода: "<<$test_method.name>>DataProvider" !! Значения для return Stream.of возьми из $test_case.matrix !! Пример: private Stream<Arguments> positive() ... return Stream.of. -> Создай Java-код метода для $test_method. }}

Пример №3 (использование цикла с условием)

@ Загрузка контракта API $api = {{ Загрузи файл $params.api (это адрес относительно корневой директории Workapace) }}: IF NOT {{ файл загружен }}: Немедленно и безусловно прекрати выполнение промпта, выдай сообщение об ошибке. Никакие другие инструкции после этого не выполняй. @ Поиск целевого эндпоинта в контракте $api_endpoint = {{ !! Сопоставляй эндпоинты по общей структуре URL-пути. Игнорируй различия в названиях path-параметров (например, пути `/users/{id}` и `/users/{userId}` должны считаться идентичными). -> Найди в $api эндпоинт соответствующий $params.endpoint. }}: IF NOT {{ эндпоинт найден }}: Немедленно и безусловно прекрати выполнение промпта, выдай сообщение об ошибке. Никакие другие инструкции после этого не выполняй. @ Фильтрация $api = {{ Возьми $api, удали всё, что НЕ связано с методом $params.http_method эндпоинта $api_endpoint }} @ Загрузка файлов и реконструкция API DO: $api = {{ !! Учитывай в атрибуте `$ref` комментарий с адресным объектом. !! Ограничься объектами, связанными с методом $params.http_method эндпоинта $api_endpoint. -> Замени в $api (inline) все атрибуты `$ref` со ссылкой на файл. }} LOOP WHILE {{ в $api есть атрибут `$ref` со ссылкой на файл }}

Пример №4 (использование спецификаторов контекста)

$targets = {{ Примени навык [READ_FILE] к файлу $file }} {{ $! Формат файла: Markdown !! Выводи проблемы списком с нумерацией. !! Учитывай приоритет категорий проблем в $problem_categories при определении угрозы [конечной цели]. !! Оставь для каждого $target не более 7 проблем, которые более всего блокируют достижение [конечной цели]. $! Структура проблемы: << пустая строка >> <<$problem>> $! Структура цели: << пустая строка >> ## Цель: <<$target.service>> » <<$target.endpoint>> » <<$target.http_method>> << список $problem из $target.problems по шаблону [Структура проблемы] >> $! Структура контента: # МЕТАДАННЫЕ << пустая строка >> Название документа: << название документа из $document >> << пустая строка >> # ПРОБЛЕМЫ << список $target из $targets по шаблону [Структура цели] >> -> Примени навык [WRITE_FILE], сохрани $targets в файл `prompts/x-checklist/art/audit.md` по шаблону [Структура контента] }}
, ключ ставится непосредственно перед именем переменной (как в языках PHP, Perl). Точка в имени переменной - оператор, открывающий цепочку доступа к свойству переменной или к операции над переменной/свойством. \n Примеры: \n - `$param = 1`\n - `$object.property`\n - `$list.append`\n\nАлгоритмический оператор:\n Маркер, формализующий алгоритмическую логику:\n - `FOR EACH` и `IN` - маркеры применения вложенного блока инструкций к каждому элементу коллекции.\n - `DO` и `LOOP WHILE` - маркеры первичного и повторного выполнения вложенного блока инструкций, пока контрольная проверка возвращает положительный ответ.\n - `CONTINUE`, `BREAK` - маркеры управления циклами.\n - `IF`, `ELSE` - маркеры логического ветвления потока инструкций.\n Пишется всегда заглавными буквами.\n \nАссоциированное пространство:\n Блок инструкций и/или данных, связанный с конструкцией-владельцем: заголовок блока, алгоритмический оператор, объектная переменная.\n Объявляется двоеточием `:` после конструкции-владельца.\n Следующие строки пространства начинаются с отступа относительно строки с конструкцией-владельцем (как в языках Python, YAML).\n Примеры: \n - `FOR EACH $group IN $all_groups:`\n - `$object = {}:`\n - `BK_METHOD_ANNOTATIONS:`\n\nВыражение подстановки текста:\n Заключается в маркеры `\u003C\u003C` и `\u003E\u003E`.\n Может быть семантическим или алгебраическим (в т.ч. содержать переменные).\n Пример: `folder/\u003C\u003Cкод компонента\u003E\u003E_api/`\n \nДискурсивная ссылка:\n Заключается в квадратные скобки - символы `[` и `]`.\n Пример: `[Термин]`\n Найди блок, раздел, тег или термин, на который указывает ссылка, и используй найденное (содержимое, определение).\n \nКомментарий:\n Начинается с ключа `//`.\n Используй комментарий для улучшения понимания инструкций.","lang":"plaintext","lineWrapping":true}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Примеры разметки"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EВ своих практиках я использую аналоги функций, но они называются навыками и используются только для взаимодействия с окружением.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EПример №1 (ознакомительный)\u003C/p\u003E"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"@ Загрузка предметных знаний\n$subject_knowledge = {{ Примени навык [READ_CONFLUENCE_PAGE_FAST] для загрузки страницы ($page_id = $param.knowledge_page) }}:\n IF NOT {{ страница загружена }}: Немедленно и безусловно прекрати выполнение промпта, выдай сообщение об ошибке. Никакие другие инструкции после этого не выполняй.\n $general_instructions = {{ Верни список указаний из раздела [Общие указания] в $subject_knowledge }}\n $special_instructions = {{ Верни список указаний из раздела [Указания к процессу определения целевых объектов и параметров тестов] в $subject_knowledge }}\n\n@ Загрузка чек-листа\n$document = {{ Примени навык [READ_CONFLUENCE_PAGE] для загрузки страницы $params.checklist.url }}:\n IF NOT {{ страница загружена }}: Немедленно и безусловно прекрати выполнение промпта, выдай сообщение об ошибке. Никакие другие инструкции после этого не выполняй.\n IF NOT {{ $document содержит $techparams.component_code_in_checklist }}: Немедленно и безусловно прекрати выполнение промпта, выдай сообщение об ошибке. Никакие другие инструкции после этого не выполняй.\n\n@ Формирование базовых сведений о чек-листе и тестируемом компоненте\n$checklist = {}:\n .description = {{ Создай краткое описание (несколько слов) чек-листа из $document }}\n .component = $techparams.component_code_in_checklist\n .endpoint = {{ Возьми $params.endpoint, добавь ведущий символ `/`, если его нет }}\n .http_method = {{ Возьми $params.http_method, преобразуй к верхнему регистру }}\n .information = {{\n !! Исключай информацию, которая уже есть в $checklist.\n !! Исключай информацию о группах и тест-кейсах.\n !! Исключай информацию, которая не относится к целевому методу компонента.\n -\u003E Определи предметную информацию из $document, если такая есть.\n }}","lang":"plaintext","lineWrapping":false}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EПример №2 (использование циклов)\u003C/p\u003E"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"@ Создание методов\nFOR EACH $group IN $checklist.groups:\n FOR EACH $test_case IN $group.test_cases:\n @@ Создание параметров тестового метода\n $test_method = {}:\n .name = {{\n !! Имя должно начинаться с типа сценария ($test_case.scenario_type).\n !! Длина имени должна быть менее 40 символов.\n !! Имя должно быть в нотации lowerCamelCase.\n -\u003E Придумай уникальное имя тестового метода.\n }}\n\n @@ Создание Data Providers\n IF NOT {{ список $test_case.matrix_params пустой }}:\n $data_providers_program_code.append {{\n !! Имя метода: \"\u003C\u003C$test_method.name\u003E\u003EDataProvider\"\n !! Значения для return Stream.of возьми из $test_case.matrix\n !! Пример: private Stream\u003CArguments\u003E positive() ... return Stream.of.\n -\u003E Создай Java-код метода для $test_method.\n }}","lang":"plaintext","lineWrapping":false}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EПример №3 (использование цикла с условием)\u003C/p\u003E"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"@ Загрузка контракта API\n$api = {{ Загрузи файл $params.api (это адрес относительно корневой директории Workapace) }}:\n IF NOT {{ файл загружен }}: Немедленно и безусловно прекрати выполнение промпта, выдай сообщение об ошибке. Никакие другие инструкции после этого не выполняй.\n\n@ Поиск целевого эндпоинта в контракте\n$api_endpoint = {{\n !! Сопоставляй эндпоинты по общей структуре URL-пути. Игнорируй различия в названиях path-параметров (например, пути `/users/{id}` и `/users/{userId}` должны считаться идентичными).\n -\u003E Найди в $api эндпоинт соответствующий $params.endpoint.\n}}:\n IF NOT {{ эндпоинт найден }}: Немедленно и безусловно прекрати выполнение промпта, выдай сообщение об ошибке. Никакие другие инструкции после этого не выполняй.\n\n@ Фильтрация\n$api = {{ Возьми $api, удали всё, что НЕ связано с методом $params.http_method эндпоинта $api_endpoint }}\n\n@ Загрузка файлов и реконструкция API\nDO:\n $api = {{\n !! Учитывай в атрибуте `$ref` комментарий с адресным объектом.\n !! Ограничься объектами, связанными с методом $params.http_method эндпоинта $api_endpoint.\n -\u003E Замени в $api (inline) все атрибуты `$ref` со ссылкой на файл.\n }}\nLOOP WHILE {{ в $api есть атрибут `$ref` со ссылкой на файл }}","lang":"plaintext","lineWrapping":false}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EПример №4 (использование спецификаторов контекста)\u003C/p\u003E"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"$targets = {{ Примени навык [READ_FILE] к файлу $file }}\n\n{{\n $! Формат файла: Markdown\n !! Выводи проблемы списком с нумерацией.\n !! Учитывай приоритет категорий проблем в $problem_categories при определении угрозы [конечной цели].\n !! Оставь для каждого $target не более 7 проблем, которые более всего блокируют достижение [конечной цели].\n $! Структура проблемы:\n \u003C\u003C пустая строка \u003E\u003E\n \u003C\u003C$problem\u003E\u003E\n $! Структура цели:\n \u003C\u003C пустая строка \u003E\u003E\n ## Цель: \u003C\u003C$target.service\u003E\u003E » \u003C\u003C$target.endpoint\u003E\u003E » \u003C\u003C$target.http_method\u003E\u003E\n \u003C\u003C список $problem из $target.problems по шаблону [Структура проблемы] \u003E\u003E\n $! Структура контента:\n # МЕТАДАННЫЕ\n \u003C\u003C пустая строка \u003E\u003E\n Название документа: \u003C\u003C название документа из $document \u003E\u003E\n \u003C\u003C пустая строка \u003E\u003E\n # ПРОБЛЕМЫ\n \u003C\u003C список $target из $targets по шаблону [Структура цели] \u003E\u003E\n -\u003E Примени навык [WRITE_FILE], сохрани $targets в файл `prompts/x-checklist/art/audit.md` по шаблону [Структура контента]\n}}","lang":"plaintext","lineWrapping":false}}],"customUri":"razmetka-promptov-dlya-ii-specifikatsiya-i-primenenie","commentEditor":{"enabled":false,"who":null,"text":"Автор блога ограничил комментирование своих постов","until":null,"reason":null,"type":"nobody"},"commentsSeenCount":null,"counters":{"comments":0,"favorites":0,"reposts":0,"online":0,"views":0,"hits":0,"reads":0,"shares":0,"reactions":0,"timespent":0,"total":171},"isPinned":false,"isNews":false,"ogTitle":null,"ogDescription":"Разметка промптов, спецификация разметки, императивный тип, использование разметки для ИИ, структурирование инструкций, алгоритмическое управление","isAudioAvailable":false,"audioUrl":null,"isAudioAvailableToGenerate":false,"summaryContent":null,"isExistSummaryContent":false,"reactions":{"counters":[],"reactionId":0},"url":"https://vc.ru/id1028591/3123991-razmetka-promptov-dlya-ii-specifikatsiya-i-primenenie","repostData":null,"dateFavorite":0,"isFavorited":false,"warningFromEditorTitle":null,"warningFromEditor":null,"subscribedToTreads":false,"author":{"id":1028591,"name":"Лысенко Андрей","nickname":null,"description":"Архитектура качества AI-процессов.","uri":"","avatar":{"type":"image","data":{"uuid":"ea553f55-6437-567a-a50d-f077ccda4741","width":1024,"height":1024,"size":292650,"type":"png","color":"202f45","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAAKAAoDAREAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAACAAC/8QAIxAAAgEDBAEFAAAAAAAAAAAAAQIDBRESAAYHIRMECEJRcf/EABUBAQEAAAAAAAAAAAAAAAAAAAAE/8QAGxEAAwACAwAAAAAAAAAAAAAAAAIDIjEEEVH/2gAMAwEAAhEDEQA/AFHy97i+ZNkc+DY1K2070TyenSmwpS5JHq3khVpSr/MRsWvgRjj2Dfq7jyjRM9+96JbPVWxFchLIrEWJAJH1qEqJo42ZXZFLJfEkdj80BrQH/9k="}},"cover":null,"achievements":[{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4412555,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4412555"},{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":788468,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/788468"}],"collectibles":[{"type":"achievement","data":{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4412555,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4412555","dateAchieved":1753342427,"isPinned":false}},{"type":"achievement","data":{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":788468,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/788468","dateAchieved":1753289086,"isPinned":false}}],"lastModificationDate":1794349304,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":false,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":false,"tgChannelShortname":null,"category":{"discoveryType":"blogs"},"counters":{"subscribers":5},"favoriteCollectible":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"subsite":{"id":1028591,"name":"Лысенко Андрей","nickname":null,"description":"Архитектура качества AI-процессов.","uri":"","avatar":{"type":"image","data":{"uuid":"ea553f55-6437-567a-a50d-f077ccda4741","width":1024,"height":1024,"size":292650,"type":"png","color":"202f45","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAAKAAoDAREAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAACAAC/8QAIxAAAgEDBAEFAAAAAAAAAAAAAQIDBRESAAYHIRMECEJRcf/EABUBAQEAAAAAAAAAAAAAAAAAAAAE/8QAGxEAAwACAwAAAAAAAAAAAAAAAAIDIjEEEVH/2gAMAwEAAhEDEQA/AFHy97i+ZNkc+DY1K2070TyenSmwpS5JHq3khVpSr/MRsWvgRjj2Dfq7jyjRM9+96JbPVWxFchLIrEWJAJH1qEqJo42ZXZFLJfEkdj80BrQH/9k="}},"cover":null,"achievements":[{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4412555,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4412555"},{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":788468,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/788468"}],"collectibles":[{"type":"achievement","data":{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4412555,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4412555","dateAchieved":1753342427,"isPinned":false}},{"type":"achievement","data":{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":788468,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/788468","dateAchieved":1753289086,"isPinned":false}}],"lastModificationDate":1794349304,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":false,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":false,"tgChannelShortname":null,"category":{"discoveryType":"blogs"},"counters":{"subscribers":5},"favoriteCollectible":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"donations":{"amount":0,"isDonated":false},"gifts":[],"isBlur":false,"keywords":[],"media":null,"customCover":null,"robotsTag":null,"categories":[3],"isAnonymized":true}};