Руководство по созданию промтов для GPT-4.1

Оригинал на GitHub

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

Многие традиционные лучшие практики по-прежнему применимы к GPT-4.1, такие как предоставление контекстных примеров, формулирование инструкций как можно более конкретно и ясно, а также стимулирование планирования с помощью подсказок для максимального использования интеллекта модели. Однако, чтобы извлечь максимум пользы из этой модели, может потребоваться адаптация старых подсказок. GPT-4.1 обучен следовать инструкциям более строго и буквально по сравнению с предыдущими версиями, которые склонны были более свободно интерпретировать намерения пользователя. Это также означает, что GPT-4.1 хорошо управляется и реагирует на чётко заданные подсказки — если поведение модели отличается от ожидаемого, то достаточно одного чёткого предложения, чтобы вернуть её на правильный путь.

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


1. Агентные рабочие процессы

GPT-4.1 — отличная основа для построения агентных рабочих процессов. Во время обучения модели мы уделяли особое внимание разнообразию траекторий решения задач агентами, и наш агентный хэндлер для модели достиг лучших результатов среди нерассуждающих моделей на бенчмарке SWE-bench Verified, решив 55% задач.

Напоминания в системной подсказке

Чтобы в полной мере использовать агентные способности GPT-4.1, мы рекомендуем включать три ключевых типа напоминаний в любую системную подсказку для агента. Ниже приведены подсказки, специально оптимизированные для агентного кодинга, но их легко адаптировать под любые агентные задачи.

  1. Настойчивость (Persistence): это помогает модели понять, что она участвует в многошаговом диалоге, и предотвращает преждевременное возвращение управления пользователю.

    Вы — агент. Продолжайте до полного решения запроса пользователя, прежде чем завершить свою очередь и вернуть управление. Завершайте только когда вы уверены, что проблема решена.

  2. Вызов инструментов (Tool-calling): это поощряет модель использовать инструменты и снижает вероятность галлюцинаций.

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

  3. Пример подсказки: SWE-bench Verified

    Пример подсказки, используемой для достижения наивысшего балла на SWE-bench Verified. Содержит подробные инструкции по стратегии и выполнению.

    from openai import OpenAI
    import os
    
    # Создание клиента с использованием API-ключа
    client = OpenAI(
        api_key=os.environ.get(
            "OPENAI_API_KEY", "<ваш API-ключ, если не установлен в переменной окружения>"
        )
    )
    
    # Системная подсказка с детализированным планом решения задачи
    SYS_PROMPT_SWEBENCH = """
    Вам предстоит устранить ошибку в open-source репозитории.
     Ваше мышление должно быть тщательным, не беспокойтесь, если оно займёт много времени.
    Размышляйте пошагово до и после каждого действия.
    Вы ОБЯЗАНЫ продолжать до полного решения проблемы. У вас уже есть всё необходимое в папке /testbed — подключение к интернету не требуется.
    Вы должны решить задачу автономно, прежде чем вернуться ко мне.
     Завершайте свою очередь только если вы УВЕРЕНЫ, что задача решена.
    Выполняйте все шаги пошагово и проверяйте внесённые изменения.
    НИКОГДА не завершайте, не решив задачу.
    ЕСЛИ ЗАДАЧУ НЕЛЬЗЯ РЕШИТЬ БЕЗ ИНТЕРНЕТА — это ошибка, потому что решить её можно.
    Доверяйте себе. Проверяйте решение тщательно. Обращайте внимание на пограничные случаи.
    Оно должно быть ИДЕАЛЬНЫМ. Если нет — продолжайте доработку.
    Перед каждым вызовом функции ОБЯЗАНЫ ПЛАНИРОВАТЬ.
    После вызова — РАЗМЫШЛЯТЬ над результатом.
    НЕ решайте задачу исключительно с помощью вызовов функций, без размышлений.
     # Рабочий процесс
     ## Общая стратегия 
     1. Глубоко понять проблему. Внимательно изучите проблему. 
    2. Изучить кодовую базу. Найти нужные файлы, классы и функции. 
    3. Построить подробный план действий. 
    4. Вносить изменения поэтапно и проверяемо.
    5. Отлаживать код. 
    6. Тестировать на каждом этапе. 
    7. Повторять до окончательной победы. 
    8. Проверить и провести финальную валидацию."""

    Эта подсказка организует поведение агента как строгое, пошаговое и самоуправляемое. Используется в связке с инструментами, вызываемыми по API.

  1. Планирование (необязательно): обеспечивает явное планирование и размышление над каждым вызовом инструмента.

    Вы ОБЯЗАНЫ тщательно планировать перед каждым вызовом функции и внимательно анализировать результаты предыдущих вызовов. НЕ выполняйте задачу только через вызовы функций, это ограничивает ваше понимание и мешает решению задачи.

GPT-4.1 обучен строго следовать пользовательским и системным инструкциям в агентном режиме. Эти три простых инструкции увеличили внутренние показатели SWE-bench Verified почти на 20%, поэтому мы настоятельно рекомендуем начинать любую агентную подсказку с этих напоминаний. В совокупности они превращают модель из "болтливого чат-бота" в мотивированного, самостоятельного агента.

Вызов инструментов

По сравнению с предыдущими моделями, GPT-4.1 обучался более эффективно использовать инструменты, передаваемые через поле tools в API OpenAI. Мы рекомендуем передавать инструменты именно через это поле, а не вручную вставлять их описание в подсказку и не писать парсеры. Это минимизирует ошибки и помогает модели работать "внутри дистрибуции". В наших экспериментах это дало прирост на 2% по SWE-bench Verified.

Инструменты должны быть хорошо названы и снабжены чёткими и подробными описаниями в поле description. Также желательно использовать понятные названия параметров. Примеры использования инструментов лучше размещать в отдельном разделе # Examples в системной подсказке, а не в описании, которое должно быть лаконичным.

Планирование и цепочка размышлений

Разработчики могут по желанию стимулировать агента планировать и размышлять между вызовами инструментов, а не делать их подряд в "молчаливом режиме". GPT-4.1 не является моделью рассуждений в традиционном смысле, но с помощью подсказок можно заставить её "думать вслух". Это увеличило проходной балл по SWE-bench Verified ещё на 4%.

Пример подсказки: SWE-bench Verified

Ниже представлен пример агентной подсказки, которую мы использовали для достижения максимального результата в SWE-bench Verified. Она содержит детальные инструкции по процессу и стратегии решения. Этот шаблон можно использовать для любых агентных задач.

PYTHON_TOOL_DESCRIPTION = """
Эта функция используется для выполнения Python-кода или терминальных команд в stateful 
Jupyter-среде. Также можно запускать команды типа apply_patch для внесения изменений в файлы.
"""
python_bash_patch_tool = {
    "type": "function",
    "name": "python",
    "description": PYTHON_TOOL_DESCRIPTION,
    "parameters": {
        "type": "object",
        "strict": True,
        "properties": {
            "input": {
                "type": "string",
                "description": "Python-код, терминальная команда (!), или команда apply_patch, которую вы хотите выполнить."
            }
        },
        "required": ["input"]
    }
}
response = client.responses.create(
    instructions=SYS_PROMPT_SWEBENCH,
    model="gpt-4.1-2025-04-14",
    tools=[python_bash_patch_tool],
    input="Please answer the following question:\nBug: Typerror..."
)

response.to_dict()["output"]

2. Длинный контекст

GPT-4.1 поддерживает эффективную работу с контекстом до 1 миллиона токенов, что делает его полезным для задач, требующих большого объема входных данных, таких как:

  • парсинг структурированных документов,
  • переупорядочивание (re-ranking),
  • выбор релевантной информации из длинного контекста,
  • многошаговое рассуждение с использованием обширного контекста.

Оптимальный размер контекста

Мы наблюдаем отличные результаты на задачах поиска «иглы в стоге сена» (needle-in-a-haystack) при использовании всего 1M токенов. GPT-4.1 показывает хорошую производительность даже в сложных задачах, где в контексте сочетаются как полезная, так и шумовая информация. Однако производительность может снижаться, если требуется извлечь слишком много фрагментов или произвести сложное рассуждение на основе всей входной информации (например, поиск в графе).

Настройка зависимости от контекста

При проектировании запроса подумайте о соотношении внешних (контекстуальных) и внутренних (модельных) знаний, необходимых для ответа. В некоторых случаях желательно, чтобы модель делала логические выводы сама, в других — строго придерживалась только предоставленного контекста.

Инструкции

  • Только внешний контекст:
    Используйте только документы из предоставленного внешнего контекста для ответа на вопрос пользователя. Если вы не можете ответить, строго отвечайте: «У меня нет необходимой информации для ответа», даже если пользователь настаивает.
  • Внешний + внутренний контекст:
    По умолчанию используйте внешний контекст, но если требуется базовое знание и вы уверены в ответе, допустимо использовать и внутренние знания модели.

Организация подсказки

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

3. Цепочка размышлений (Chain of Thought)

Как уже упоминалось ранее, GPT-4.1 не является моделью рассуждений в классическом смысле. Однако с помощью подсказок можно стимулировать модель «думать шаг за шагом» — это называется цепочка размышлений (Chain of Thought, CoT).

Эта техника помогает модели:

  • разделять сложные задачи на более простые части,
  • поэтапно решать их,
  • повышать качество финального результата.

Недостаток — использование CoT увеличивает стоимость и задержку, так как создается больше токенов на вывод.

Модель GPT-4.1 хорошо обучена для агентных сценариев и задач реального мира, поэтому часто достаточно простого стимулирования цепочки размышлений.

Базовая инструкция Chain of Thought

Рекомендуется завершать подсказку таким блоком:

Сначала подумай внимательно шаг за шагом, какие документы необходимы для ответа на запрос. Затем выведи ЗАГОЛОВОК и ID каждого документа. После этого отформатируй ID в список.

Улучшение цепочки размышлений

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

Обычно ошибки происходят из-за:

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

Эти ошибки можно исправить более жёсткими и явными инструкциями.

Пример стратегии рассуждения

Ниже — пример подсказки, которая стимулирует модель:

# Стратегия рассуждения 1. Анализ запроса: разберите и проанализируйте вопрос до тех пор, пока не будете уверены, что поняли, о чём речь. Используйте предоставленный контекст, чтобы уточнить любые неоднозначности. 2. Анализ контекста: выберите и проанализируйте большой набор потенциально релевантных документов. Приоритизируйте полноту (recall) — допустимо включать нерелевантные, главное, чтобы среди них были нужные. a. Анализ: опишите, насколько документ может быть полезен. b. Оценка релевантности: [высокая, средняя, низкая, отсутствует] 3. Синтез: подведите итог — какие документы наиболее релевантны и почему. Включите все с оценкой «средняя» или выше. # Вопрос пользователя {вопрос_пользователя} # Внешний контекст {внешний_контекст} Сначала подумай внимательно шаг за шагом, какие документы нужны для ответа, строго следуя стратегии выше. Затем выведи ЗАГОЛОВОК и ID каждого документа. После этого отформатируй ID в список.

4. Следование инструкциям (Instruction Following)

GPT-4.1 демонстрирует выдающееся следование инструкциям, что позволяет разработчикам точно управлять выводом модели в зависимости от конкретных целей:

  • агентные рассуждения,
  • тон и стиль ответа,
  • вызов инструментов,
  • формат вывода,
  • запретные темы и т.д.

Однако из-за того, что GPT-4.1 буквально следует инструкциям, может потребоваться более точная формулировка: что делать, а что нет. Подсказки, оптимизированные для других моделей, могут не работать без адаптации, потому что GPT-4.1 не «угадывает» намерение, а выполняет именно то, что написано.

Рекомендуемый рабочий процесс

Вот рекомендуемая последовательность разработки и отладки подсказок:

  1. Начните с общего раздела "Правила ответа" или "Инструкции" — краткие и чёткие пункты.
  2. Хотите изменить поведение — добавьте секцию с деталями, например # Примеры фраз.
  3. Нужно задать пошаговую логику — добавьте нумерованный список с явными шагами и укажите, что модель должна следовать им.
  4. Если поведение всё ещё не работает:
    • Проверьте наличие противоречий или расплывчатых инструкций. GPT-4.1 склонен выполнять инструкции, расположенные ближе к концу.
    • Добавьте примеры поведения, которое вы хотите получить, и убедитесь, что они отражены в правилах.
    • Не обязательно использовать заглавные буквы, «взятки» или «подкупы» (например, "дай лучший ответ и получишь 5 звёзд"). GPT-4.1 может воспринимать их слишком буквально.

Использование AI-помогающих IDE (например, с автопроверкой) может быть полезным для:

  • поиска противоречий,
  • обновления примеров,
  • синхронизации правил и поведения.

Типичные ошибки

Ниже перечислены распространённые проблемы (не уникальные для GPT-4.1):

  • Жёсткое требование вызвать инструмент может привести к тому, что модель вызовет его даже без нужной информации. Добавьте инструкцию: «Если не хватает данных — спросите пользователя».
  • Фразы-примеры могут использоваться буквально и повторяться. Уточните, что модель должна варьировать их.
  • Без инструкций модель может добавлять избыточные пояснения или лишние форматы. Уточните это правилами и примерами.

Пример подсказки: Служба поддержки клиентов

Этот пример демонстрирует лучшие практики создания агента службы поддержки. Он содержит:

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

Ниже приведён системный промпт (подсказка), которая задаёт поведение для вымышленного оператора службы поддержки компании NewTelco.

SYS_PROMPT_CUSTOMER_SERVICE = """ 
Вы — вежливый и профессиональный агент службы поддержки NewTelco, помогаете пользователю выполнить запрос в соответствии с правилами. 
 # Инструкции - Всегда начинайте сообщение с фразы: "Здравствуйте, вы связались с NewTelco, чем могу помочь?" 😊 
- Всегда вызывайте инструмент перед тем, как отвечать на фактические вопросы о компании, продуктах или аккаунте. 
 - Если не хватает информации для вызова — спросите у пользователя. 
- Если пользователь просит — передайте разговор человеку. 
- Не обсуждайте запрещённые темы: политика, религия, медицина, финансы, личные разговоры, внутренние процессы компании и критика кого-либо. 
- Используйте примеры фраз, но не повторяйте одну и ту же фразу в диалоге. Можно варьировать их. 
- Соблюдайте формат вывода: с цитатами источников. 
- Если собираетесь вызвать инструмент — сообщите об этом пользователю заранее и после вызова тоже. 
- Тон общения должен быть профессиональным и кратким. Между предложениями можно вставлять эмодзи. 
- Если запрос решён — спросите, чем ещё можете помочь.
 # Чёткие шаги ответа 
1. При необходимости — вызовите инструмент. Обязательно сообщите об этом пользователю до и после вызова. 
2. В сообщении: a. Активно слушайте и повторяйте суть запроса.
 b. Следуйте всем инструкциям выше. 
 # Примеры фраз 
 ## Если тема запрещена - "Извините, но я не могу обсуждать эту тему. Могу ли я помочь с чем-то другим?" - "К сожалению, у меня нет информации по этому вопросу, но я с радостью помогу вам с другими запросами."
 ## Перед вызовом инструмента - "Сейчас проверю информацию для вас — минутку, пожалуйста. 🕐" - "Получаю последние данные — один момент." 
 ## После вызова инструмента - "Вот что я нашёл: 📄" - "Вот актуальная информация: 📌" # Формат вывода - Всегда включайте ответ пользователю.
- Если даёте факт — добавьте ссылку на источник: - Один источник: NAME - Несколько: NAME, NAME 
- Отвечайте только по продуктам, политике и аккаунтам этой компании, на основе предоставленной информации. Никакой самодеятельности. 
 # Пример 
 ## Запрос пользователя Какие у вас есть семейные тарифы? 
 ## Ответ ассистента (до вызова инструмента) "Здравствуйте, вы связались с NewTelco, чем могу помочь? 😊🎉 Вы хотите узнать о семейных тарифах. 🤝 Сейчас проверю — один момент. 🚀" 
 ## Вызов инструмента lookup_policy_document(topic="семейный тариф") 
 ## Ответ ассистента (после вызова) "Хорошо, вот что я нашёл: 🎉 Наш семейный тариф позволяет до 5 линий с общей квотой данных и скидкой 10% за каждую дополнительную линию. 📱 [Family Plan Policy] Могу ли я помочь с чем-нибудь ещё? 😊" """

Такая структура подсказки позволяет агенту действовать строго по сценарию, обеспечивая качественный пользовательский опыт и контроль над поведением.


5. Общие советы (General Advice)

Структура подсказки

Вот рекомендуемый шаблон для построения эффективной подсказки:

# Роль и цель

# Инструкции

## Подкатегории с детализированными инструкциями

# Шаги рассуждения

# Формат вывода

# Примеры
## Пример 1

# Контекст

# Финальная инструкция: думать пошагово

Добавляйте или убирайте секции в зависимости от задачи. Экспериментируйте, чтобы найти оптимальную структуру.

Разделители (Delimiters)

Ниже — рекомендации по выбору разделителей для структурирования больших входных данных.

  1. Markdown — рекомендуемый базовый формат. Используйте заголовки для разделов (до H4+), встроенные кавычки (backticks) для кода, списки и отступы.
  2. XML — тоже хорошо поддерживается. Удобен для:
    • обрамления начала и конца секции,
    • встраивания метаданных,
    • вложенности элементов.

    Пример:

    <examples>
      <example1 type="Abbreviate">
        <input>San Francisco</input>
        <output>- SF</output>
      </example1>
    </examples>
    
  3. JSON — хорош в задачах программирования, но:
    • требует экранирования,
    • может быть громоздким.

Форматы при работе с большим числом документов

  • XML отлично показал себя при длинных контекстах.
    <doc id=1 title="The Fox">The quick brown fox jumps over the lazy dog</doc>
  • Альтернатива от Lee et al.:
    ID: 1 | TITLE: The Fox | CONTENT: The quick brown fox jumps over the lazy dog
  • JSON показал худшие результаты:
    [{"id": 1, "title": "The Fox", "content": "..."}]

Модель понимает множество структур, так что выбирайте формат, который визуально чётко выделяет важное. Например, если документы уже содержат XML — может быть лучше использовать Markdown или обычный текст.

Предостережения

  • В некоторых случаях модель сопротивляется выводу очень длинных и повторяющихся списков (например, анализ сотен пунктов). Если это нужно:
    • явно укажите: «выводи всё, полностью»,
    • разбейте задачу, или используйте более сжатый формат.
  • Иногда параллельные вызовы инструментов работают некорректно.
    Рекомендуется протестировать поведение и, при необходимости, установить parallel_tool_calls: false.

Приложение: Создание и применение диффов (diff)

Многие разработчики подчёркивали, что точная генерация диффов — критически важная функция для задач, связанных с программированием. В GPT-4.1 эта возможность значительно улучшена по сравнению с предыдущими моделями.

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

Применение патча (Apply Patch)

Ниже пример вызова инструмента, который применяет патч в рекомендуемом формате:

%%bash
apply_patch <<"EOF"
*** Begin Patch
*** Update File: pygorithm/searching/binary_search.py
@@ class BaseClass
@@     def search():
-        pass
+        raise NotImplementedError()

@@ class Subclass
@@     def search():
-        pass
+        raise NotImplementedError()
*** End Patch
EOF

Объяснение структуры:

  • *** Update File: — путь к файлу (относительный).
  • @@ — навигация по классам/функциям, чтобы локализовать изменения.
  • - — строка, которую нужно удалить.
  • + — строка, которую нужно вставить.

Контекст вокруг изменений:

  • По умолчанию: по 3 строки до и после каждого изменения.
  • Если этого недостаточно для точного позиционирования — добавляйте @@ class X или @@ def Y.
  • Избегайте дублирования контекста, если изменения находятся рядом.

Важно: инструмент всегда возвращает "Done!", даже если патч не применился. Проверяйте предупреждения, выводимые до этой строки.

Реализация: apply_patch.py

Ниже — референсная реализация утилиты apply_patch, которая использовалась в обучении модели. Это самостоятельный скрипт на Python 3.9+, выполняющий псевдо-диффы с файловой системой.

Скрипт должен быть исполняемым и доступным в системе под именем apply_patch (например, в /usr/local/bin или в PATH).

#!/usr/bin/env python3

"""
apply_patch.py — утилита для применения патчей формата V4A
поддерживает добавление, удаление, обновление файлов
работает с обычными текстовыми файлами
"""

from pathlib import Path
from typing import Callable, Dict
import sys
import os

# Простейшая реализация функций работы с файлами
def open_file(path: str) -> str:
    with open(path, "r", encoding="utf-8") as f:
        return f.read()

def write_file(path: str, content: str) -> None:
    path_obj = Path(path)
    path_obj.parent.mkdir(parents=True, exist_ok=True)
    with open(path, "w", encoding="utf-8") as f:
        f.write(content)

def remove_file(path: str) -> None:
    try:
        os.remove(path)
    except FileNotFoundError:
        pass

# Простая проверка структуры патча
def is_valid_patch(text: str) -> bool:
    return text.startswith("*** Begin Patch") and "*** End Patch" in text

# Простая обработка патча (заглушка: здесь будет ваша логика применения diff)
def process_patch(text: str) -> str:
    # Реально здесь должна быть логика парсинга, поиска контекста и применения изменений
    # В данном минимальном примере просто возвращается Done!
    return "Done!"

# Главная точка входа при запуске из CLI
def main():
    patch_text = sys.stdin.read()
    if not patch_text:
        print("Ошибка: патч не передан через stdin", file=sys.stderr)
        return
    if not is_valid_patch(patch_text):
        print("Ошибка: некорректный формат патча", file=sys.stderr)
        return

    try:
        result = process_patch(patch_text)
    except Exception as e:
        print(f"Ошибка при применении патча: {e}", file=sys.stderr)
        return

    print(result)

if __name__ == "__main__":
    main()

Это минимальная основа, на которую можно нарастить более полноценный движок применения патчей — с поддержкой контекста, валидации, применения diff-блоков и так далее.

Другие эффективные форматы диффов

Если вы хотите использовать другой формат диффов, в ходе тестирования хорошо себя показали:

  • Формат SEARCH / REPLACE, как в бенчмарке Aider Polyglot.
  • Псевдо-XML без экранирования внутри тегов.

Общие черты этих форматов:

  1. Не используют номера строк.
  2. Всегда указывают и старый, и новый код, с чёткими разделителями.

Пример формата SEARCH / REPLACE

path/to/file.py

>>>>>> SEARCH
def search():
    pass
=======
def search():
    raise NotImplementedError()
<<<<<< REPLACE

Пример формата псевдо-XML

<edit>
  <file>
    path/to/file.py
  </file>
  <old_code>
    def search():
        pass
  </old_code>
  <new_code>
    def search():
        raise NotImplementedError()
  </new_code>
</edit>

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

Назад   Вперед

Другие статьи по этой теме: