Руководство по созданию промтов для 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, мы рекомендуем включать три ключевых типа напоминаний в любую системную подсказку для агента. Ниже приведены подсказки, специально оптимизированные для агентного кодинга, но их легко адаптировать под любые агентные задачи.
- Настойчивость (Persistence): это помогает модели понять, что она участвует в многошаговом диалоге, и предотвращает преждевременное возвращение управления пользователю.
Вы — агент. Продолжайте до полного решения запроса пользователя, прежде чем завершить свою очередь и вернуть управление. Завершайте только когда вы уверены, что проблема решена.
- Вызов инструментов (Tool-calling): это поощряет модель использовать инструменты и снижает вероятность галлюцинаций.
Если вы не уверены в содержимом файлов или структуре кода, используйте свои инструменты, чтобы прочитать файлы и собрать нужную информацию. НЕ делайте догадок и НЕ выдумывайте ответ.
Пример подсказки: 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.
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 не «угадывает» намерение, а выполняет именно то, что написано.
Рекомендуемый рабочий процесс
Вот рекомендуемая последовательность разработки и отладки подсказок:
- Начните с общего раздела "Правила ответа" или "Инструкции" — краткие и чёткие пункты.
- Хотите изменить поведение — добавьте секцию с деталями, например
# Примеры фраз
. - Нужно задать пошаговую логику — добавьте нумерованный список с явными шагами и укажите, что модель должна следовать им.
- Если поведение всё ещё не работает:
- Проверьте наличие противоречий или расплывчатых инструкций. GPT-4.1 склонен выполнять инструкции, расположенные ближе к концу.
- Добавьте примеры поведения, которое вы хотите получить, и убедитесь, что они отражены в правилах.
- Не обязательно использовать заглавные буквы, «взятки» или «подкупы» (например, "дай лучший ответ и получишь 5 звёзд"). GPT-4.1 может воспринимать их слишком буквально.
Использование AI-помогающих IDE (например, с автопроверкой) может быть полезным для:
- поиска противоречий,
- обновления примеров,
- синхронизации правил и поведения.
Типичные ошибки
Ниже перечислены распространённые проблемы (не уникальные для GPT-4.1):
- Жёсткое требование вызвать инструмент может привести к тому, что модель вызовет его даже без нужной информации. Добавьте инструкцию: «Если не хватает данных — спросите пользователя».
- Фразы-примеры могут использоваться буквально и повторяться. Уточните, что модель должна варьировать их.
- Без инструкций модель может добавлять избыточные пояснения или лишние форматы. Уточните это правилами и примерами.
Пример подсказки: Служба поддержки клиентов
Этот пример демонстрирует лучшие практики создания агента службы поддержки. Он содержит:
- разнообразные правила,
- конкретику,
- дополнительные секции с примерами,
- образец точного поведения.
Ниже приведён системный промпт (подсказка), которая задаёт поведение для вымышленного оператора службы поддержки компании NewTelco.
SYS_PROMPT_CUSTOMER_SERVICE = """Такая структура подсказки позволяет агенту действовать строго по сценарию, обеспечивая качественный пользовательский опыт и контроль над поведением.
5. Общие советы (General Advice)
Структура подсказки
Вот рекомендуемый шаблон для построения эффективной подсказки:
# Роль и цель
# Инструкции
## Подкатегории с детализированными инструкциями
# Шаги рассуждения
# Формат вывода
# Примеры
## Пример 1
# Контекст
# Финальная инструкция: думать пошагово
Добавляйте или убирайте секции в зависимости от задачи. Экспериментируйте, чтобы найти оптимальную структуру.
Разделители (Delimiters)
Ниже — рекомендации по выбору разделителей для структурирования больших входных данных.
- Markdown — рекомендуемый базовый формат. Используйте заголовки для разделов (до H4+), встроенные кавычки (backticks) для кода, списки и отступы.
- XML — тоже хорошо поддерживается. Удобен для:
- обрамления начала и конца секции,
- встраивания метаданных,
- вложенности элементов.
Пример:
<examples> <example1 type="Abbreviate"> <input>San Francisco</input> <output>- SF</output> </example1> </examples>
- 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 без экранирования внутри тегов.
Общие черты этих форматов:
- Не используют номера строк.
- Всегда указывают и старый, и новый код, с чёткими разделителями.
Пример формата 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>
Такие форматы легко читаются моделью и удобно используются в инструментах автоматизации. Выбор зависит от вашего окружения и предпочтений.