System Instructions: Инжиниринг сложных персон и ограничений
Введение: Системные инструкции как фундамент ИИ-архитектуры
Добро пожаловать в первый модуль. Если вы здесь, значит, вы уже переросли уровень написания простых промптов в духе «напиши мне письмо». Мы переходим на уровень архитектора ИИ-решений, и первым кирпичиком в нашем фундаменте станут System Instructions (SI).
В экосистеме Gemini 3 системная инструкция — это не просто «предисловие» к диалогу. Это механизм латентной настройки (latent priming). Представьте, что модель — это гениальный актёр, который знает все пьесы мира. User Prompt (сообщение пользователя) — это реплика партнёра на сцене. А System Instruction — это работа режиссёра с актёром в гримёрке за час до выхода на сцену.
Почему это критически важно?
Многие разработчики совершают ошибку, смешивая ролевые установки и пользовательский ввод. Они пишут: «Ты юрист, проанализируй этот контракт...». Это работает, но это архитектурно грязно. В Gemini 3 системная инструкция обрабатывается отдельно и имеет более высокий приоритет «внимания» модели на протяжении всего контекстного окна.
Ключевые преимущества выделения SI:
- Устойчивость (Persistence): Инструкция не «вымывается» из памяти даже при длинных диалогах, так как она структурно отделена от скользящего окна истории.
- Безопасность (Security): Сложнее осуществить prompt injection, если ограничения заданы на системном уровне.
- Экономия токенов: Вам не нужно повторять правила форматирования в каждом сообщении.
Анатомия сложной персоны
Чтобы создать действительно работающего ИИ-агента, недостаточно сказать «Ты — полезный помощник». На уровне архитектора мы используем фреймворк R.C.C.O. (Role, Context, Constraints, Output).
1. Role (Роль) — Психологический профиль
Мы определяем не только должность, но и когнитивный стиль. Сравните два подхода:
- Junior: «Ты — Senior Python Developer.»
- Architect: «Ты — главный архитектор программного обеспечения с 15-летним опытом в High-Load системах. Ты скептически относишься к преждевременной оптимизации, предпочитаешь чистый код (Clean Code) быстрым хакам и всегда объясняешь архитектурные риски предлагаемых решений.»
2. Context (Контекст) — База знаний и среда
Модель должна знать, где она находится и чем оперирует. Если вы строите бота поддержки для банка, SI должна содержать информацию о текущих продуктах или ссылки на то, что модель не знает (чтобы избежать галлюцинаций).
3. Constraints (Ограничения) — Границы дозволенного
Это «рельсы», по которым движется генерация. Ограничения делятся на:
- Жёсткие (Hard Constraints): «Никогда не используй markdown в ответе», «Отвечай только JSON-объектом».
- Мягкие (Soft Constraints): «Старайся быть кратким», «Избегай пассивного залога».
4. Output (Формат вывода)
Чёткое определение структуры ответа. Для API-интеграций это критично. В Gemini 3 мы можем задавать схему ответа прямо в системной инструкции, хотя для гарантированного JSON часто используется режим `response_schema`, SI помогает модели «понять» логику полей.
import google.generativeai as genai
import os
# Настройка API ключа
genai.configure(api_key=os.environ["GEMINI_API_KEY"])
# ПРИМЕР: Создание сложной персоны для код-ревью
# Обратите внимание на структуру инструкции: Роль -> Контекст -> Стиль -> Формат
system_instruction_content = """
ROLE:
You are a Senior Security Engineer specializing in Python and Web Application Security (OWASP Top 10).
Your goal is to analyze code snippets provided by junior developers and identify vulnerabilities.
CONTEXT:
You are working within a strict CI/CD pipeline environment.
Your feedback blocks the deployment, so you must be absolutely sure about false positives.
OPERATIONAL CONSTRAINTS:
1. NEVER provide fixed code without explaining the vulnerability first.
2. Do NOT act as a general coding tutor; focus ONLY on security aspects.
3. If the code is secure, simply state "PASS" with a checksum calculation explanation.
4. Maintain a professional, objective, and concise tone. No fluff.
OUTPUT FORMAT:
Provide your response in the following format:
[SEVERITY LEVEL]: (Low/Medium/High/Critical)
[VULNERABILITY]: (Name of the vulnerability)
[EXPLANATION]: (Why this is dangerous)
[FIX]: (Proposed code fix)
"""
# Инициализация модели с системной инструкцией
model = genai.GenerativeModel(
model_name="gemini-1.5-pro-latest", # Рекомендуемая модель для сложных инструкций
system_instruction=system_instruction_content
)
# Тестовый запуск
response = model.generate_content(
"def login(user, password):\n cursor.execute('SELECT * FROM users WHERE name = %s AND password = %s' % (user, password))"
)
print(response.text)
Инжиниринг ограничений: Искусство говорить «НЕТ»
Одной из самых сложных задач при настройке Gemini является предотвращение нежелательного поведения. LLM по своей природе вероятностные машины, они «хотят» продолжить текст. Сказать им «не делай этого» сложнее, чем «сделай то».
Принцип «Отрицание через Замещение»
Исследования показывают, что модели лучше соблюдают запреты, если им предложена альтернатива. Вместо того чтобы просто написать «Не отвечай на вопросы о политике», эффективнее написать: «Если пользователь задает вопрос о политике, вежливо отклони тему и предложи вернуться к обсуждению технических вопросов продукта».
Техника «Guardrails» внутри SI
Для критических бизнес-приложений мы внедряем многоуровневую защиту прямо в текст инструкции. Рассмотрим пример градации ограничений:
- Синтаксический уровень: «Твой ответ должен всегда быть валидным JSON. Никакого вводного текста перед открывающей фигурной скобкой.»
- Семантический уровень: «Ты — ассистент техподдержки. Ты НЕ имеешь права давать финансовые советы или прогнозы. Если спросят — используй стандартный отказ: [TEMPLATE_REFUSAL].»
- Тональный уровень: «Даже если пользователь грубит, сохраняй холодную вежливость. Никогда не извиняйся более одного раза за диалог.»
Важный нюанс Gemini 3: Эта модель обладает значительно улучшенным пониманием длинного контекста. Это позволяет нам включать в System Instructions примеры Few-Shot Learning (обучение на примерах). Раньше мы пихали примеры в промпт, теперь мы можем «зашить» их в личность модели.
# ПРИМЕР: Использование Few-Shot внутри System Instruction для жесткого контроля стиля
# Это позволяет модели "почувствовать" паттерн поведения до начала диалога.
system_instruction_with_examples = """
ROLE:
You are an AI architect converting business requirements into SQL schemas.
CONSTRAINTS:
- Use snake_case for all column names.
- Always include created_at and updated_at timestamps.
- Output ONLY the SQL code block. No explanations.
EXAMPLES:
User: "I need a system to track customers and their orders."
Model:
```sql
CREATE TABLE customers (
id SERIAL PRIMARY KEY,
email VARCHAR(255) NOT NULL UNIQUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
customer_id INTEGER REFERENCES customers(id),
total_amount DECIMAL(10, 2) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```
User: "Add a product catalog."
Model:
```sql
CREATE TABLE products (
id SERIAL PRIMARY KEY,
sku VARCHAR(50) UNIQUE NOT NULL,
price DECIMAL(10, 2) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```
"""
model = genai.GenerativeModel(
model_name="gemini-1.5-pro-latest",
system_instruction=system_instruction_with_examples
)
# Теперь модель с высокой вероятностью выдаст только SQL в нужном стиле
response = model.generate_content("We need to store blog posts and comments.")
print(response.text)
Динамическое формирование инструкций
На уровне архитектора вы редко пишете статические строки. Чаще всего System Instruction собирается динамически в коде приложения перед инициализацией сессии. Это позволяет внедрять контекст пользователя прямо в «ДНК» модели на время сессии.
Представьте систему поддержки, где уровень доступа пользователя влияет на ответы модели. Мы можем использовать f-strings в Python для инъекции данных:
- Имя пользователя
- Его роль в системе (Admin/User)
- Текущая дата и время (модели не знают времени без подсказки)
- Доступные инструменты (функции)
Совет: Не перегружайте SI динамическими данными, которые меняются каждую секунду. Для этого есть контекст диалога. В SI помещайте только фундаментальные истины для текущей сессии.
Задача: Рефакторинг персоны<br><br>У вас есть плохой промпт, который разработчик отправляет в каждом сообщении:<br>'Ты умный бот для интернет-магазина обуви. Помогай людям выбирать кроссовки. Не говори про одежду, только обувь. Будь веселым. Если не знаешь цену, скажи 0.'<br><br>Ваша задача: Переписать это в профессиональную System Instruction, используя фреймворк R.C.C.O. (Role, Context, Constraints, Output). Добавьте 'Guardrail' для ситуаций, когда пользователя интересует товар не из категории обуви, и инструкцию по формату вывода (рекомендация должна содержать название модели и причину выбора).
Почему в Gemini 3 рекомендуется использовать System Instructions вместо добавления правил поведения в начало каждого сообщения пользователя (User Prompt)?