Эта статья содержит спецификацию разметки для промптов императивного типа.
Создавалась разметка постепенно, эволюционно, в процессе её создания учитывались мнения нескольких флагманских ИИ. Разметка испытана в сложных промптах. Большинство ИИ, которым я показывал свои промпты, называют это DSL (Domain-Specific Language).
Зачем нужна разметка и какая от неё польза?
Разметка нужна ИИ и промпт-инженеру. В процессе инференса разметка активирует веса, связанные с максимальной процедурной дисциплиной и правильными шаблонами обработки данных, а автор получат возможность видеть промпт структурно.
Достаточно ли разметки, чтобы ИИ стал послушным семантическим процессором? Вовсе нет, разметка – это малая часть культуры, которая позволяет управлять сложными промптами и добиваться от ИИ безупречного выполнения инструкций.
Объекты и элементы разметки
Спецификатор контекста
Спецификатор поведения
Семантический блок
Логический блок
Программная переменная
Алгоритмический оператор
Ассоциированное пространство
Выражение подстановки текста
Дискурсивная ссылка
Комментарий
Маркеры разметки выбраны не произвольно, а являются компромиссом ключевых требований:
Разметка должна максимально однозначно и точно восприниматься ИИ.
Разметка должна быть максимально удобна для человека.
Спецификация разметки
ИИ будет понимать разметку и без спецификации, большинство элементов отлично знакомы ИИ, но я рекомендую поместить её в системный промпт.
Спецификатор контекста:
Начинается с ключа `$!`.
Уточняет контекст.
Пример: `$! Формат файла: 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` по шаблону [Структура контента]
}}
Эта статья содержит спецификацию разметки для промптов императивного типа.
Создавалась разметка постепенно, эволюционно, в процессе её создания учитывались мнения нескольких флагманских ИИ. Разметка испытана в сложных промптах. Большинство ИИ, которым я показывал свои промпты, называют это DSL (Domain-Specific Language).
Зачем нужна разметка и какая от неё польза?
Разметка нужна ИИ и промпт-инженеру. В процессе инференса разметка активирует веса, связанные с максимальной процедурной дисциплиной и правильными шаблонами обработки данных, а автор получат возможность видеть промпт структурно.
Достаточно ли разметки, чтобы ИИ стал послушным семантическим процессором? Вовсе нет, разметка – это малая часть культуры, которая позволяет управлять сложными промптами и добиваться от ИИ безупречного выполнения инструкций.
Объекты и элементы разметки
Спецификатор контекста
Спецификатор поведения
Семантический блок
Логический блок
Программная переменная
Алгоритмический оператор
Ассоциированное пространство
Выражение подстановки текста
Дискурсивная ссылка
Комментарий
Маркеры разметки выбраны не произвольно, а являются компромиссом ключевых требований:
Разметка должна максимально однозначно и точно восприниматься ИИ.
Разметка должна быть максимально удобна для человека.
Спецификация разметки
ИИ будет понимать разметку и без спецификации, большинство элементов отлично знакомы ИИ, но я рекомендую поместить её в системный промпт.
Спецификатор контекста:
Начинается с ключа `$!`.
Уточняет контекст.
Пример: `$! Формат файла: 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}};