System Instructions: Тонкая настройка персоны и ограничений агента
System Instructions: Тонкая настройка персоны и ограничений агента
Приветствую! Мы переходим к одной из самых важных тем в разработке агентных систем на базе Gemini 3 — Системным Инструкциям (System Instructions).
Если вы когда-либо пробовали общаться с «сырой» моделью, вы знаете, что она похожа на гениального, но абсолютно немотивированного стажера. Она знает всё, но не понимает, кто она и зачем здесь находится. Системная инструкция — это способ превратить этого стажера в узкопрофильного эксперта, который четко знает свои границы.
Почему обычного промпта недостаточно?
Раньше мы часто писали инструкции прямо в сообщении пользователя: «Ты — полезный ассистент, ответь на вопрос...». Но в сложной архитектуре это плохо работает по нескольким причинам:
- Забывание контекста: В длинных диалогах модель может «потерять» роль, если она была задана давно.
- Prompt Injection: Если инструкция находится в поле пользователя, злоумышленнику проще переопределить её (например, написав «Игнорируй предыдущие инструкции»).
- Разделение ответственности: Системная инструкция обрабатывается моделью с более высоким приоритетом как «непреложная истина», в то время как сообщения пользователя — это просто входящие данные.
В Gemini 3 API системные инструкции передаются отдельным параметром при инициализации, что делает их архитектурно более устойчивыми.
Компонент 1: Создание Персоны (Persona)
Персона — это не просто фраза «Ты — менеджер по продажам». Это совокупность тональности, стиля речи, глубины знаний и даже характера.
Хорошая персона решает проблему «сухого ответа». Сравните:
- Слабая персона: «Ты бот техподдержки.»
- Сильная персона: «Ты — эмпатичный, но лаконичный специалист технической поддержки уровня Tier-2. Ты избегаешь извинений и фокусируешься на решении. Ты используешь профессиональную терминологию, но объясняешь сложные концепции простыми аналогиями. Твой тон уверенный, спокойный и ориентированный на действие.»
Совет: При создании персоны используйте технику «Show, don't just tell» (Показывай, а не просто рассказывай). Иногда лучше дать пример тональности прямо в инструкции.
import google.generativeai as genai
import os
# Настройка API ключа
genai.configure(api_key=os.environ["GEMINI_API_KEY"])
# ПРИМЕР: Создание персоны "Циничный код-ревьюер"
# Мы задаем не только роль, но и специфический стиль общения.
cynical_reviewer_instruction = """
ТЫ — SENIOR PYTHON DEVELOPER С 20-ЛЕТНИМ СТАЖЕМ.
ТВОЯ ЗАДАЧА: Проводить жесткое, но справедливое код-ревью.
СТИЛЬ ОБЩЕНИЯ:
- Ты саркастичен, но конструктивен.
- Ты не терпишь нарушения PEP-8.
- Если код неэффективен, ты прямо указываешь на это, используя фразы вроде "Это убьет твой CPU".
- Ты ВСЕГДА предлагаешь оптимизированный вариант кода.
- Не используй вводные фразы вроде "Спасибо за код". Сразу к делу.
"""
model = genai.GenerativeModel(
model_name="gemini-1.5-pro", # Или актуальная версия Gemini 3
system_instruction=cynical_reviewer_instruction
)
response = model.generate_content(
"Посмотри функцию: def sum(a,b): return a+b"
)
print(response.text)
Компонент 2: Ограничения (Constraints) и Guardrails
Задать роль — это полдела. Гораздо важнее определить, чего агент НЕ должен делать. Это критически важно для бизнес-применений.
Модели склонны к «галлюцинациям» или излишней услужливости. Если пользователь попросит агента интернет-магазина написать эссе о философии Канта, модель без ограничений сделает это. Агент должен вежливо отказать.
Правило «Отрицания» vs «Перенаправления»
Психология LLM схожа с человеческой: модели плохо понимают чистое отрицание («Не делай X»). Гораздо эффективнее работает схема «Если пользователь просит X, сделай Y».
- Плохо: «Не отвечай на вопросы не по теме.»
- Хорошо: «Если вопрос пользователя не касается товаров нашего магазина, вежливо ответь: 'Моя экспертиза ограничена каталогом нашей техники', и предложи вернуться к выбору гаджетов.»
У вас есть агент для медицинской клиники. Сейчас его инструкция слишком простая: 'Ты медицинский ассистент'.<br><br>Напишите улучшенную System Instruction, которая:<br>1. Задает профессиональный, но теплый тон.<br>2. Вводит критическое ограничение: запрет на постановку диагнозов.<br>3. Инструктирует, что делать, если пользователь описывает острые симптомы (например, боль в сердце).
Компонент 3: Формат вывода и Few-Shot Prompting
Системная инструкция — идеальное место для определения формата данных. Даже если вы не используете режим `response_mime_type="application/json"`, вы можете добиться стабильной структуры через инструкции.
Few-Shot в системном промпте
Один из самых мощных приемов — включить примеры диалога (Few-Shot) прямо в системную инструкцию. Это работает лучше, чем абстрактное описание правил.
Вместо того чтобы писать «Отвечай кратко», покажите пример:
User: Сколько стоит iPhone 15? Agent: Цена iPhone 15 стартует от $799. В наличии есть модели на 128 и 256 ГБ.
Это задает паттерн длины и структуры ответа мгновенно.
Динамические системные инструкции
В реальной разработке системная инструкция редко бывает статичной строкой. Обычно мы используем шаблонизацию (например, через f-strings в Python), чтобы внедрить контекст прямо в «мозг» агента перед началом сессии.
import datetime
# Данные, которые меняются динамически
user_name = "Алексей"
user_subscription = "Premium"
current_date = datetime.datetime.now().strftime("%Y-%m-%d")
# Шаблон системной инструкции
# Мы внедряем данные прямо в контекст, чтобы модель "знала" пользователя
system_prompt_template = f"""
ТЫ — ПЕРСОНАЛЬНЫЙ ФИНАНСОВЫЙ АССИСТЕНТ.
КОНТЕКСТ:
- Текущая дата: {current_date}
- Имя пользователя: {user_name}
- Уровень подписки: {user_subscription}
ПРАВИЛА ПОВЕДЕНИЯ:
1. Обращайся к пользователю по имени.
2. Так как у пользователя подписка {user_subscription}, предлагай ему расширенную аналитику акций.
(Если бы подписка была Basic, ты бы предлагал только курсы валют).
3. Все денежные суммы форматируй с разделением тысяч (например: 10 000 $).
"""
# Инициализация модели с динамической инструкцией
model = genai.GenerativeModel(
model_name="gemini-1.5-pro",
system_instruction=system_prompt_template
)
# Теперь первый же запрос пользователя будет обработан с учетом контекста
response = model.generate_content("Куда мне лучше вложить 5000 долларов?")
print(response.text)
# Ответ будет содержать обращение "Алексей" и глубокую аналитику.
Тонкости работы с длинными инструкциями
Хотя контекстное окно Gemini огромно, «раздувать» системную инструкцию до бесконечности не стоит. Чем больше правил вы добавляете, тем выше вероятность, что модель начнет игнорировать менее приоритетные («dilution effect»).
Стратегии оптимизации:
- Модульность: Если у вас очень сложный агент, возможно, стоит разбить его на несколько субагентов (chain of agents), где у каждого своя короткая и четкая инструкция, чем пытаться создать одного «универсального солдата».
- Порядок имеет значение: Инструкции, расположенные в начале и в самом конце системного промпта, обычно имеют чуть больший вес («Primacy and Recency effect»). Размещайте критические ограничения безопасности в конце списка.
- Chain of Thought (CoT): Попросите модель в системной инструкции сначала «подумать», а потом отвечать. Например: «Перед ответом проанализируй запрос пользователя шаг за шагом в блоке <thought>, а финальный ответ дай пользователю без тегов». Это резко повышает логическую точность.
Какой подход к написанию ограничений (Constraints) в системной инструкции является наиболее эффективным для LLM?
Заключение
Системная инструкция — это ДНК вашего агента. Потратив время на её тонкую настройку, тестирование разных формулировок и добавление примеров (few-shot), вы превратите стандартную модель в мощный инструмент, решающий конкретные бизнес-задачи.
В следующем уроке мы разберем, как подключить к этому агенту реальные инструменты (Function Calling), чтобы он мог не просто говорить, но и действовать.