AI Агенты
От теории к практике:
что это, зачем и как строить
Игорь Ковач · Comoon Workshop · 30.06.2026
Кто я
- Manager, Cloud Platform @ Kuehne+Nagel
- 9 internal + 4 external engineers
- AWS, Platform Engineering, GenAI
- Speaker: AWS Summit 2026
- Строю AI-агентов с 2024
AWS Terraform GenAI Claude
Вроцлав · Kuehne+Nagel (€20B+ revenue)
Cloud Platform team
О чём поговорим
- Что такое агентность — LLM vs Agent, определение
- Когда нужны агенты — а когда достаточно промпта
- Анатомия агента — контекст, инструменты, память
- MCP и инструменты — как агент взаимодействует с миром
- Паттерны — router, skills, autonomy
- Живой пример — Jeeves, мультиагентная система
- Hands-on — собираем агента с нуля
~60 минут + вопросы
🤖 Что такое агентность?
LLM ≠ Agent
LLM vs AI Agent
LLM (ChatGPT, Claude chat):
Вход: текст → Выход: текст
Одноразовый разговор
Нет памяти между сессиями
Нет действий в реальном мире
Человек = исполнитель
AI Agent:
Вход: цель → Выход: результат (действие в мире)
Планирует шаги самостоятельно
Использует инструменты (файлы, API, код)
Помнит контекст между сессиями
Человек = постановщик задачи
Определение агентности
Агент = LLM + 3 свойства
- Инструменты — может действовать в мире
- Автономность — сам решает что делать
- Цикл — наблюдает результат → корректирует
Агент — это LLM, который может не только думать, но и действовать
┌─────────────────────────┐
│ Agent Loop │
│ │
│ Цель / Задача │
│ │ │
│ ▼ │
│ ┌───────────┐ │
│ │ Думаю │ ←─────┐ │
│ └─────┬─────┘ │ │
│ ▼ │ │
│ ┌───────────┐ │ │
│ │ Действую │ │ │
│ └─────┬─────┘ │ │
│ ▼ │ │
│ ┌───────────┐ │ │
│ │ Наблюдаю │───────┘ │
│ └───────────┘ │
│ │ │
│ ▼ │
│ Результат │
└─────────────────────────┘
Спектр агентности
Меньше автономности Больше автономности
├──────────────────────────────────────────────────────────────┤
Промпт Цепочка Агент Мульти-агент
"Напиши X" LLM→LLM→LLM Plan+Act Agent↔Agent
Loop Специализация
Нет tools Фиксированный Динамич. Routing +
Нет цикла pipeline план координация
Примеры:
ChatGPT Summarize→ Coding Jeeves
prompt Translate→ assistant (8 агентов)
Format (Cursor)
Когда нужны агенты?
✅ Используй агента
- Задача требует нескольких шагов
- Нужны инструменты (API, файлы, DB)
- Результат зависит от промежуточных данных
- Задача повторяется регулярно
- Нужна адаптация к контексту
❌ Достаточно промпта
- Один вопрос → один ответ
- Нет внешних действий
- Фиксированный pipeline
- Результат не зависит от среды
- Разовая задача (дешевле руками)
Агент = overhead. Не используй пушку на воробьёв.
🧬 Анатомия агента
Из чего состоит и как работает
Компоненты агента
┌─────────────────────────────────────────────────────┐
│ AI AGENT │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────────────┐ │
│ │ Промпт │ │ Контекст │ │ Инструменты │ │
│ │ │ │ │ │ │ │
│ │ Кто я │ │ Профиль │ │ fs_read/write │ │
│ │ Что делаю│ │ История │ │ web_search │ │
│ │ Правила │ │ Данные │ │ execute_bash │ │
│ │ Workflow │ │ Память │ │ API calls │ │
│ └──────────┘ └──────────┘ └──────────────────┘ │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────────────┐ │
│ │ Память │ │ Правила │ │ Планирование │ │
│ │ │ │ │ │ │ │
│ │ Файлы │ │ Границы │ │ Цель → шаги │ │
│ │ Vector DB│ │ Security │ │ Adapt on failure │ │
│ │ Sessions │ │ Guardrails│ │ Loop until done │ │
│ └──────────┘ └──────────┘ └──────────────────┘ │
└─────────────────────────────────────────────────────┘
Контекст: самый важный компонент
Что такое контекст?
Всё, что агент "знает" в момент работы:
- System prompt — кто он и что делает
- User profile — о пользователе
- History — предыдущие сообщения
- Resources — файлы, загруженные при старте
- Tool results — данные из инструментов
Context Window
┌─────────────────────────┐
│ System prompt (~2K) │ ← Всегда
│ Rules (~1K) │ ← Всегда
│ User profile (~500) │ ← Всегда
├─────────────────────────┤
│ Conversation history │ ← Растёт
│ ... │
│ Tool call results │ ← Растёт
│ ... │
├─────────────────────────┤
│ ⚠️ ЛИМИТ (128K-200K tokens)│
└─────────────────────────┘
Больше контекста → дороже + медленнее
Слишком много → теряет фокус
Управление контекстом
Проблема: Агент не может знать всё одновременно
Решение: layered context
Level 1: Always loaded (system prompt, rules, profile)
└── Маленький, критически важный
Level 2: Loaded on start (resources — data files, skills)
└── Контролируемый размер, релевантно задаче
Level 3: On-demand (tool calls — read files, search, API)
└── Только когда нужно, агент сам решает
Level 4: External memory (vault, DB, knowledge base)
└── Персистентная память между сессиями
Правило: если агент не использует данные каждую сессию —
не грузи их в Level 1-2. Пусть запрашивает через Level 3.
Инструменты (Tools)
Что это?
Функции, которые агент может вызвать для взаимодействия с миром.
| Tool | Действие |
fs_read | Прочитать файл |
fs_write | Записать файл |
execute_bash | Shell команда |
web_search | Поиск в Google |
web_fetch | HTTP запрос |
use_subagent | Вызвать агента |
Как LLM вызывает tool?
LLM думает:
"Мне нужно прочитать файл
portfolio.md чтобы ответить"
LLM генерирует:
{
"tool": "fs_read",
"params": {
"path": "/vault/Finance/portfolio.md"
}
}
Runtime исполняет tool
→ читает файл с диска
→ возвращает содержимое LLM
LLM получает результат
→ продолжает рассуждение
→ может вызвать ещё tool
→ или дать финальный ответ
Tool Calling: как это работает
┌────────┐ ┌────────────┐ ┌──────────┐
│ User │──(1)──▶│ Runtime │──(2)──▶│ LLM │
└────────┘ │ (Kiro, │ │ (Claude, │
│ Cursor, │◀──(3)──│ GPT) │
│ custom) │ └──────────┘
│ │
│ (4) Execute tool │
│ │ │
│ ▼ │
│ ┌──────────┐ │
│ │ Tool │ (filesystem, │
│ │ execution │ API, DB, etc.) │
│ └────┬─────┘ │
│ │ │
│ (5) Result back to LLM │
│ │ │
└───────┼─────────────────────────┘
▼
(6) LLM continues or responds
Ключевой момент: LLM НЕ исполняет код. Runtime исполняет. LLM только просит.
🔌 MCP и инструменты
Как агент подключается к миру
MCP: Model Context Protocol
Проблема
Каждый LLM провайдер = свой формат tools. Каждая интеграция = свой код.
N моделей × M сервисов = N×M интеграций 😱
Решение: стандарт
MCP — открытый протокол (от Anthropic). Единый интерфейс для подключения инструментов к любому LLM.
Как USB для AI — одна спецификация, все совместимы.
Без MCP:
Claude ←→ custom code ←→ Gmail
Claude ←→ custom code ←→ Calendar
GPT ←→ different code ←→ Gmail
GPT ←→ different code ←→ Calendar
(всё разное, ничего не переиспользуется)
С MCP:
Claude ─┐
GPT ─┼──▶ MCP Client ──▶ MCP Server: Gmail
Gemini ─┘ ──▶ MCP Server: Calendar
──▶ MCP Server: Slack
──▶ MCP Server: DB
Один сервер = все клиенты могут использовать
MCP: архитектура
┌──────────────────────────────────────────────────────────┐
│ MCP Host │
│ (Claude Desktop, IDE, CLI) │
│ │
│ ┌─────────────────┐ │
│ │ MCP Client │ ← Один на MCP server │
│ │ │ │
│ │ • Maintains │ JSON-RPC 2.0 (stdio / HTTP+SSE) │
│ │ connection │◀══════════════════════════════════╗ │
│ │ • Routes calls │ ║ │
│ └─────────────────┘ ║ │
└───────────────────────────────────────────────────────║──┘
║
┌────────╨────────┐
│ MCP Server │
│ │
│ Exposes: │
│ • Tools │
│ • Resources │
│ • Prompts │
│ │
│ Connects to: │
│ • APIs │
│ • Databases │
│ • File systems │
└─────────────────┘
MCP: три примитива
| Примитив | Что это | Кто управляет | Пример |
| Tools | Функции, которые LLM вызывает | Модель решает когда | send_email(to, body) |
| Resources | Данные, которые клиент подгружает | Приложение решает когда | file://config.json |
| Prompts | Шаблоны для типовых задач | Пользователь выбирает | /summarize-meeting |
Tools — "Model-controlled": LLM сам решает вызвать или нет
Пример: "Мне нужно отправить email" → вызывает send_email tool
Resources — "Application-controlled": приложение подгружает в контекст
Пример: IDE показывает открытый файл как resource
Prompts — "User-controlled": человек выбирает шаблон
Пример: Slash-команда /debug в IDE
MCP Server: пример
// Конфигурация MCP сервера Google Calendar
{
"mcpServers": {
"google-calendar": {
"command": "npx",
"args": ["-y", "@anthropic/mcp-gsuite"],
"env": {
"GOOGLE_CLIENT_ID": "...",
"GOOGLE_CLIENT_SECRET": "..."
}
}
}
}
// Что появляется у агента:
// Tools: calendar_list_events, calendar_create_event,
// calendar_update_event, calendar_delete_event
// Resources: calendar://primary/events
Агент видит эти tools как обычные функции. Не знает что это MCP.
🧩 Паттерны
Как проектировать агентные системы
Паттерн: Single Agent
┌─────────────────────┐
│ Single Agent │
│ │
│ System prompt │
│ + Tools │
│ + Memory │
│ │
│ ┌───────────────┐ │
│ │ Task 1 │ │
│ │ Task 2 │ │
│ │ Task 3 │ │
│ │ ... │ │
│ └───────────────┘ │
└─────────────────────┘
Когда использовать
- Одна область ответственности
- Помещается в один промпт
- Не нужна координация
Проблемы при масштабировании
- Промпт растёт → теряет фокус
- Слишком много tools → путается
- Противоречивые инструкции
Паттерн: Router + Specialists
┌──────────────────────┐
User ──────▶│ Router Agent │
│ │
│ • Понимает intent │
│ • Выбирает агента │
│ • Передаёт контекст │
│ • Суммирует результат│
└───┬──────┬──────┬────┘
│ │ │
┌─────────┘ │ └─────────┐
▼ ▼ ▼
┌────────────┐ ┌────────────┐ ┌────────────┐
│ Specialist │ │ Specialist │ │ Specialist │
│ Finance │ │ Health │ │ Research │
│ │ │ │ │ │
│ Свой prompt│ │ Свой prompt│ │ Свой prompt│
│ Свои tools │ │ Свои tools │ │ Свои tools │
│ Свой scope │ │ Свой scope │ │ Свой scope │
└────────────┘ └────────────┘ └────────────┘
Ключ: Router НЕ делает доменную работу. Только маршрутизирует.
Паттерн: Память
Виды памяти
| Тип | Что | Как |
| Short-term | Текущий разговор | Context window |
| Working | Данные задачи | Tool results |
| Long-term | Факты, история | Files, DB |
| Episodic | Что было раньше | Logs, journal |
| Procedural | Как делать | Skills, instincts |
Простое решение
Файлы = память
Не нужна Vector DB для старта.
Obsidian vault:
/Journal/ → episodic
/Projects/ → working
/Areas/ → long-term
/Resources/ → procedural
Git = version control для памяти
Можно откатить любое изменение
Правило:
Начни с файлов.
Добавляй Vector DB только когда
grep перестанет справляться.
Паттерн: Gradual Autonomy
Уровни доверия:
Level 0: Inform
Агент предлагает действие → человек исполняет
"Предлагаю отправить этот email"
Level 1: Ask
Агент готов действовать → ждёт подтверждения
"Отправить? [yes/no]"
Level 2: Act + Report
Агент делает → сообщает что сделал
"✅ Email отправлен: тема, получатель"
Level 3: Full Auto
Агент делает → логирует → человек может проверить позже
Cron job → результат в Telegram
Начинай с Level 0-1. Повышай по мере доверия.
Разные действия = разные уровни (read=auto, delete=ask)
Паттерн: Guardrails
Зачем?
LLM ошибаются. Агент с инструментами может навредить. Нужны ограждения.
Слои защиты
- Config — allowedPaths, allowedTools
- Hooks — pre/post tool validation
- Prompt — правила в system prompt
- Audit — логи + review agent
Пример: pre-tool-validator
#!/bin/bash
# Блокируем опасные команды
BLOCKED_PATTERNS=(
"rm -rf"
"DROP TABLE"
"cat.*\.env"
"curl.*token"
)
for pattern in "${BLOCKED_PATTERNS[@]}"; do
if echo "$TOOL_INPUT" | grep -q "$pattern"; then
echo "BLOCKED: $pattern"
exit 1
fi
done
⚡ Живой пример: Jeeves
Мультиагентная система для автоматизации жизни
Jeeves: архитектура
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ Telegram │ │ CLI │ │ Cron │
└──────┬───────┘ └──────┬───────┘ └──────┬───────┘
└────────────────────┼────────────────────┘
▼
┌─────────────────────────┐
│ Jeeves (Router) │
│ • Intent matching │
│ • Context injection │
│ • Result summary │
└─────┬─────┬─────┬──────┘
┌──────────┘ │ └──────────┐
▼ ▼ ▼
┌───────────┐ ┌───────────┐ ┌───────────┐
│ Finance │ │ Health │ │ Research │
│ Planner │ │ Guard │ │ Career │
│ Infra │ │ Lawyer │ │ Journal │
└─────┬─────┘ └─────┬─────┘ └─────┬─────┘
└────────────────┼────────────────┘
▼
┌───────────────────────────────────────────────┐
│ Obsidian Vault (Memory) │
└───────────────────────────────────────────────┘
Jeeves: 8 агентов
| Агент | Задача | Расписание |
| 💰 investment-analyst | Портфель, Trading212, crypto, net worth | Пн 09:00 |
| 🏋️ health-coach | Привычки, Garmin, питание, ДНК | Вс 09:00 |
| 📅 agent-planner | Календарь, утренний брифинг, дневник | Ежедневно |
| 🔬 agent-research | Исследования, события, тренды | Чт 10:00 |
| 🛡️ agent-guard | Аудит безопасности, observability | Пт 18:00 |
| 💼 career-intel | Навыки, рынок, AI-риски, карьера | Ежемесячно |
| ⚖️ lawyer | Контракты, права, налоги | Квартально |
| 🏗️ agent-infra | Deploy, DNS, Cloudflare, GCP | Реактивный |
14 scheduled jobs. Cron → kiro-cli → agent → Telegram. Полная автономность.
Конфиг агента (JSON)
{
"name": "health-coach",
"description": "Health and habits tracker",
"prompt": "file://prompts/health.md",
"tools": ["fs_read", "fs_write", "web_fetch", "execute_bash"],
"toolsSettings": {
"fs_write": {
"allowedPaths": ["/opt/jeeves/vault/03 Areas/Health/**"]
}
},
"resources": [
"file://rules/logging.md",
"file://skills/health-analysis/SKILL.md",
"file://data/garmin-latest.json"
],
"hooks": {
"preToolUse": [{
"matcher": "execute_bash|fs_write",
"command": "bash scripts/hooks/pre-tool-validator.sh"
}]
}
}
Вся конфигурация = один JSON. Логика = markdown prompt. Код = 0 строк.
Типичный день Jeeves
07:30 📅 Planner → "Доброе утро! Сегодня 3 встречи, конфликтов нет."
09:00 💰 Investment → "Портфель 392K PLN, -0.6% за неделю. Алерт: MU>10%"
12:00 📊 System → midweek portfolio alert (без LLM, чистый скрипт)
14:00 🛡️ Guard → "Observability: все агенты OK, cost $4.2 за 7 дней"
18:00 🛡️ Guard → "Аудит: agent-infra — 2 missing configs. Fixed."
20:00 📝 Journal → "Как прошёл день?" → запись в дневник
22:00 📅 Planner → "Завтра: architecture review в 11:00. Подготовить."
Всё это:
• Работает автоматически (cron)
• Отправляет в Telegram (на русском)
• Логирует в файлы (git-tracked)
• Стоит ~$3-4/день
Jeeves: обучение на ошибках
User: "Нет, не так. Используй subfolder config, не root."
1. Логирует коррекцию:
corrections.jsonl: {"wrong":"edited root config", "right":"use subfolder"}
2. Создаёт/обновляет инстинкт:
instincts/subfolder-config-first.md
confidence: 0.3 → 0.4 → 0.5 → ... → 0.8
3. Применяет автоматически:
confidence ≥ 0.7 → следует без вопросов
confidence < 0.4 → только подсказка
4. Эволюция (confidence ≥ 0.8 + 3 evidence):
→ Предлагает: новое правило / навык / контекст
→ Требует одобрения пользователя
Результат: система становится лучше с каждой ошибкой
Стоимость
| Компонент | $/мес |
| VM (e2-medium, GCP) | ~$25 |
| Claude Opus 4 (тяжёлые) | ~$50 |
| Claude Sonnet 4 (интерактив) | ~$30 |
| Haiku 4.5 (лёгкие) | ~$5 |
| Cloudflare, Telegram | $0 |
| Total | ~$110/мес |
ROI
- Экономит 5-10 часов/мес ручной работы
- При зарплате $3000+/мес → окупается 10x
- + качество решений (данные, не интуиция)
- + consistency (агент не забывает)
Модельная стратегия
- Opus — сложные задачи
- Sonnet — повседневные
- Haiku — дешёвые/частые
🚀 Как начать
Минимальный рецепт и путь роста
Агент за 5 минут
# 1. Структура
mkdir -p my-agent/.kiro/agents
# 2. Конфиг (единственный файл!)
cat > my-agent/.kiro/agents/assistant.json << 'EOF'
{
"name": "assistant",
"description": "Помогает с задачей X",
"prompt": "You are a helpful assistant that manages my TODO list.\nYou can read and write files in ./data/ folder.\nAlways confirm before deleting.",
"tools": ["fs_read", "fs_write", "execute_bash"]
}
EOF
# 3. Запуск
cd my-agent && kiro-cli chat --agent assistant
# Готово. Один JSON. Без Python. Без зависимостей.
Усложняй потом: rules, skills, hooks, scheduling, multi-agent.
Путь роста
Неделя 1: Один агент + один промпт
└── Решает одну конкретную проблему
Неделя 2: Добавляем файлы как память
└── Агент помнит между сессиями
Неделя 3: Добавляем cron (scheduling)
└── Агент работает по расписанию
Месяц 2: Второй агент + router
└── Специализация и маршрутизация
Месяц 3: Guard + learning + MCP
└── Самоконтроль и эволюция
Не строй всё сразу. Каждая неделя = +1 capability.
Ошибка новичков: проектировать архитектуру до первого работающего агента.
Чем запускать агентов?
| Runtime | Тип | Плюсы | Минусы |
| Kiro CLI | CLI agent runtime | Конфигурация без кода, hooks, multi-agent | Только Claude |
| Claude Code | CLI coding agent | Мощный, tools из коробки | Только Claude, дорого |
| Cursor/Windsurf | IDE agent | Удобно для разработки | Привязка к IDE |
| LangGraph | Python framework | Гибкость, граф workflows | Сложный, много кода |
| CrewAI | Python multi-agent | Быстрый старт | Ограничения при масштабе |
| OpenAI Agents SDK | Python SDK | Handoffs, guardrails | Только OpenAI |
| Custom (Python/TS) | Свой код | Полный контроль | Всё писать самому |
Для персонального агента фреймворк не нужен. JSON + markdown + cron = достаточно.
Ключевые мысли
- Агент ≠ чатбот — агент действует, чатбот отвечает
- Контекст — главное — без правильного контекста agent = random
- Tools дают суперсилы — но и опасность (guardrails!)
- MCP — стандарт — один сервер = все клиенты
- Начни с одного агента — не с архитектуры
- Файлы > база данных для старта (grep > vector search)
- Автономность постепенно — доверие растёт, а не даётся
- Git = undo button — агенты ошибаются, откат бесплатный
Вопросы?
Telegram: @ikovach
LinkedIn: in/ikovach
Эта презентация создана и задеплоена AI-агентом 🤖