Промптинг для AI-агентов

Как писать system prompts, описывать инструменты и управлять поведением агента. 80% успеха агента — это качество промптов, а не модели.

← AI-агенты · Память · Безопасность → · 🇬🇧 English


Содержание

  1. Чем промптинг агента отличается от обычного
  2. Структура system prompt для агента
  3. Описание инструментов (tool description)
  4. Промпты для разных ролей
  5. Few-shot для агентов
  6. Анти-паттерны
  7. Что дальше

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"]
    }
}

Правила хорошего описания

  1. Укажите, КОГДА использовать — «Используй для поиска актуальных данных»
  2. Укажите, КОГДА НЕ использовать — «НЕ используй для общих вопросов»
  3. Дайте пример — «НАПРИМЕР: новости, цены, погода»
  4. Название должно быть говорящим — search_web а не func_1
  5. Описание параметров — что писать в 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