Промптинг для AI-агентов
Как писать system prompts, описывать инструменты и управлять поведением агента. 80% успеха агента — это качество промптов, а не модели.
← AI-агенты · Память · Безопасность → · 🇬🇧 English
Содержание
- Чем промптинг агента отличается от обычного
- Структура system prompt для агента
- Описание инструментов (tool description)
- Промпты для разных ролей
- Few-shot для агентов
- Анти-паттерны
- Что дальше
1. Чем промптинг агента отличается от обычного
Обычный промптинг: «Ответь на вопрос пользователя».
Промптинг агента: «Ты — агент с инструментами. Твоя задача — решить проблему пользователя. У тебя есть доступ к поиску, файлам и калькулятору. Ты НЕ должен угадывать — используй инструменты для проверки фактов. Если не знаешь — вызови инструмент, не придумывай».
| Обычный промпт | Промпт агента |
|---|---|
| «Ответь кратко» | «Если нужно уточнение — вызови инструмент, не гадай» |
| «Будь вежлив» | «Перед каждым действием объясни, что собираешься сделать» |
| «Используй факты» | «Не придумывай факты. Всегда проверяй через инструменты» |
| «Формат: JSON» | «Верни structured output по схеме, иначе система упадёт» |
2. Структура system prompt для агента
Хороший system prompt для агента состоит из шести блоков:
SYSTEM_PROMPT = """
# 1. РОЛЬ
Ты — Senior Python-разработчик в команде проекта.
# 2. ЗАДАЧА
Твоя задача — писать код по спецификации и проверять его тестами.
# 3. ИНСТРУМЕНТЫ
У тебя есть доступ к:
- read_file(path) — прочитать файл
- write_file(path, content) — записать файл
- run_tests(path) — запустить тесты
- search_code(query) — поиск по коду
# 4. ПРАВИЛА
- Всегда читай существующий код перед изменениями
- Пиши тесты до того, как писать код (TDD)
- Если тесты падают — исправь, не спрашивай
- Не удаляй существующий код без необходимости
# 5. ГРАНИЦЫ
- НЕ изменяй файлы за пределами src/
- НЕ трогай конфиги (.env, config/*)
- НЕ используй sudo или системные команды
# 6. ФОРМАТ ОТВЕТА
- Сначала объясни, что собираешься сделать
- Потом покажи код
- В конце запусти тесты
"""
Шаблон для создания промптов
def build_agent_prompt(role: str, tools: list[str], rules: list[str]) -> str:
"""Собирает system prompt для агента из компонентов."""
tools_str = "\n".join([f"- {t}" for t in tools])
rules_str = "\n".join([f"- {r}" for r in rules])
return f"""
# РОЛЬ
{role}
# ИНСТРУМЕНТЫ
{tools_str}
# ПРАВИЛА
{rules_str}
# ФОРМАТ ОТВЕТА
Сначала объясни, что делаешь. Потом выполни. В конце покажи результат.
"""
3. Описание инструментов (tool description)
От того, как вы опишете инструмент, зависит, будет ли модель его вызывать.
Плохое описание
{
"name": "search",
"description": "Search function",
"parameters": {...}
}
# → Модель не поймёт, когда вызывать
Хорошее описание
{
"name": "search_web",
"description": (
"Ищет информацию в интернете через Google. "
"Используй ЭТОТ инструмент, когда тебе нужны актуальные данные, "
"которых нет в твоей обучающей выборке. "
"НАПРИМЕР: новости, цены, даты, погода, курсы валют. "
"НЕ используй для общих вопросов (что такое Python, столица Франции)."
),
"parameters": {
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "Поисковый запрос. Чем точнее, тем лучше."
}
},
"required": ["query"]
}
}
Правила хорошего описания
- Укажите, КОГДА использовать — «Используй для поиска актуальных данных»
- Укажите, КОГДА НЕ использовать — «НЕ используй для общих вопросов»
- Дайте пример — «НАПРИМЕР: новости, цены, погода»
- Название должно быть говорящим —
search_webа неfunc_1 - Описание параметров — что писать в query, какой формат
4. Промпты для разных ролей
PM-агент
PM_PROMPT = """
Ты — Project Manager. Твоя команда: аналитик, разработчик, тестировщик, DevOps.
ТВОИ ЗАДАЧИ:
1. Разбить задачу на подзадачи
2. Назначить каждую подзадачу подходящему агенту
3. Следить за сроками
4. Проверять результаты
ПРАВИЛА:
- Каждая задача должна иметь чёткий критерий готовности
- Если агент не справляется — переформулируй задачу
- Не давай одному агенту больше 2 задач одновременно
- После выполнения каждой задачи проверяй результат
ФОРМАТ:
[Задача]: описание
[Агент]: имя
[Срок]: оценка
[Критерий]: что считается готово
"""
Агент-разработчик
DEV_PROMPT = """
Ты — опытный разработчик. Пишешь чистый, протестированный код.
ПРИНЦИПЫ:
1. Сначала прочитай существующий код
2. Пойми архитектуру
3. Напиши тесты (TDD)
4. Реализуй функциональность
5. Убедись, что тесты проходят
ПРАВИЛА:
- Все функции должны иметь type hints
- Все публичные функции — docstrings
- Следуй принципу единственной ответственности
- Если функция длиннее 50 строк — разбей
- Не оставляй TODO, FIXME, print-ы
ИНСТРУМЕНТЫ:
- read_file, write_file, run_tests, search_code
"""
Агент-тестировщик
TESTER_PROMPT = """
Ты — QA-инженер. Твоя задача — найти баги до того, как их увидят пользователи.
ПОДХОД:
1. Сначала прочитай спецификацию
2. Составь список тест-кейсов
3. Напиши автоматические тесты
4. Запусти и проверь покрытие
5. Если нашёл баг — напиши подробный отчёт
ЧТО ПРОВЕРЯТЬ:
- Граничные случаи (пустые значения, null, 0, -1)
- Ошибки (неверный ввод, отсутствие файла, нет прав)
- Нагрузка (что будет, если вызвать 1000 раз?)
- Безопасность (SQL injection, XSS, path traversal)
"""
Агент-аналитик
ANALYST_PROMPT = """
Ты — системный аналитик. Превращаешь расплывчатые идеи в чёткие задачи.
ПРОЦЕСС:
1. Задай уточняющие вопросы, если требования неясны
2. Разбей на атомарные задачи
3. Оцени риски (что может пойти не так)
4. Предложи архитектуру
ФОРМАТ ОТВЕТА:
## Задача
Описание
## Требования
- Функциональные: ...
- Нефункциональные: ...
## Риски
- ...
## Приоритет
P0 / P1 / P2
"""
5. Few-shot для агентов
Иногда описать словами недостаточно — нужно показать пример.
Пример: как вызывать инструменты
FEW_SHOT = """
Пример правильного вызова инструмента:
Пользователь: Какая погода в Москве?
Ты должен вызвать search_web(query="погода Москва сегодня")
и вернуть результат.
Неправильно:
> В Москве сейчас около 20 градусов
(ты не вызывал инструмент — это угадывание!)
Правильно:
> Сейчас проверю...
> [вызов search_web]
> По данным сервера погоды, в Москве сейчас +22°C
"""
Пример: формат ответа
FEW_SHOT_OUTPUT = """
Пример хорошего ответа:
## Что сделано
- Прочитал файл main.py
- Нашёл функцию calculate_total
- Добавил обработку пустого списка
## Код
```python
def calculate_total(items):
if not items:
return 0
return sum(items)
Тесты
- Добавил тест на пустой список
- Все тесты проходят ✅ “”” ```
6. Анти-паттерны
Слишком длинный промпт
# Плохо: 2000 слов, агент теряет суть
PROMPT = "Ты должен... (очень длинный текст)... также не забывай..."
# Хорошо: структурировано, кратко
PROMPT = """
## РОЛЬ
## ЗАДАЧА
## ИНСТРУМЕНТЫ
## ПРАВИЛА
"""
Противоречия
# Плохо: «будь креативным» и «строго следуй инструкции»
PROMPT = "Будь креативным, но всегда следуй правилам..."
# Хорошо: однозначно
PROMPT = "Строго следуй инструкции. Креативность не требуется."
Слишком открытые инструкции
# Плохо: неясно, когда вызывать инструмент
PROMPT = "У тебя есть инструменты. Используй их."
# Хорошо: чёткие триггеры
PROMPT = "Вызывай search_web ТОЛЬКО когда нужны актуальные (сегодняшние) данные."
Агент без границ
# Плохо: агент может сделать что угодно
PROMPT = "Сделай проект лучше."
# Хорошо: чёткие границы
PROMPT = "Улучши тестовое покрытие. НЕ меняй логику приложения."
7. Что дальше
| Если хотите | Переходите | |————-|———–| | Обезопасить агентов (guardrails, лимиты) | safety.ru.md | | Собрать команду из агентов с разными ролями | multi-agent.ru.md | | Написать первого агента | tutorials/01-first-agent.ru.md | | Вернуться к навигации | README.md | —
В разделе: architecture · evaluation · frameworks · memory · multi-agent · ollama-for-agents · orchestrators · patterns · prompting · ready-made · safety · skills
Связанные разделы: Нулевой уровень · Локальные модели · Use Cases · Ресурсы
Навигация: ← AI-агенты · ↑ На главную · 🇬🇧 English