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

О чём поговорим

  1. Что такое агентность — LLM vs Agent, определение
  2. Когда нужны агенты — а когда достаточно промпта
  3. Анатомия агента — контекст, инструменты, память
  4. MCP и инструменты — как агент взаимодействует с миром
  5. Паттерны — router, skills, autonomy
  6. Живой пример — Jeeves, мультиагентная система
  7. Hands-on — собираем агента с нуля

~60 минут + вопросы

🤖 Что такое агентность?

LLM ≠ Agent

LLM vs AI Agent

LLM (ChatGPT, Claude chat): Вход: текст → Выход: текст Одноразовый разговор Нет памяти между сессиями Нет действий в реальном мире Человек = исполнитель AI Agent: Вход: цель → Выход: результат (действие в мире) Планирует шаги самостоятельно Использует инструменты (файлы, API, код) Помнит контекст между сессиями Человек = постановщик задачи

Определение агентности

Агент = LLM + 3 свойства

  1. Инструменты — может действовать в мире
  2. Автономность — сам решает что делать
  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_bashShell команда
web_searchПоиск в Google
web_fetchHTTP запрос
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 ошибаются. Агент с инструментами может навредить. Нужны ограждения.


Слои защиты

  1. Config — allowedPaths, allowedTools
  2. Hooks — pre/post tool validation
  3. Prompt — правила в system prompt
  4. 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-infraDeploy, 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 CLICLI agent runtimeКонфигурация без кода, hooks, multi-agentТолько Claude
Claude CodeCLI coding agentМощный, tools из коробкиТолько Claude, дорого
Cursor/WindsurfIDE agentУдобно для разработкиПривязка к IDE
LangGraphPython frameworkГибкость, граф workflowsСложный, много кода
CrewAIPython multi-agentБыстрый стартОграничения при масштабе
OpenAI Agents SDKPython SDKHandoffs, guardrailsТолько OpenAI
Custom (Python/TS)Свой кодПолный контрольВсё писать самому

Для персонального агента фреймворк не нужен. JSON + markdown + cron = достаточно.

Ключевые мысли

  1. Агент ≠ чатбот — агент действует, чатбот отвечает
  2. Контекст — главное — без правильного контекста agent = random
  3. Tools дают суперсилы — но и опасность (guardrails!)
  4. MCP — стандарт — один сервер = все клиенты
  5. Начни с одного агента — не с архитектуры
  6. Файлы > база данных для старта (grep > vector search)
  7. Автономность постепенно — доверие растёт, а не даётся
  8. Git = undo button — агенты ошибаются, откат бесплатный

Вопросы?


Telegram: @ikovach

LinkedIn: in/ikovach


Эта презентация создана и задеплоена AI-агентом 🤖