MRKL Systems — модульные агенты

[object Object]

MRKL (произносится «miracle», читается как «миракл») — архитектурный подход, в котором языковая модель выступает как маршрутизатор, направляющий запросы к специализированным внешним модулям: калькуляторам, базам данных, API, поисковым системам. Вместо того чтобы «знать всё самой», модель определяет, какой инструмент нужен, и делегирует ему задачу.

В 2026 году MRKL лучше читать как исторический precursor современного tool routing. Сам термин используется реже, но сама идея никуда не делась: function calling, tool use, MCP-интеграции, agent routers и workflow engines по сути реализуют тот же модульный принцип.

Представьте секретаря в крупной компании. Он не знает ответы на все вопросы, но знает, к кому обратиться. Нужны финансовые данные? Он звонит бухгалтеру. Юридический вопрос? Переключает на юриста. Техническая проблема? Связывает с IT-отделом. MRKL работает так же: нейросеть — это умный «секретарь», который маршрутизирует задачи к нужным специалистам (инструментам).

Суть в двух словах

MRKL — это архитектура, где:

  • LLM (языковая модель) — «мозг», который понимает запрос и решает, что с ним делать
  • Модули (experts) — специализированные инструменты: калькулятор, поиск, база данных, API
  • Маршрутизатор (router) — логика, которая соединяет запрос с нужным модулем

Модель не пытается считать в уме или запоминать актуальные данные. Она определяет: «Для ответа мне нужно посчитать — вызову калькулятор» или «Нужны свежие данные — обращусь к поиску».

ПромптChatGPT
Ты — MRKL-система с доступом к модулям:
- КАЛЬКУЛЯТОР: математические вычисления
- ПОИСК: актуальная информация
- БАЗА_ЗНАНИЙ: внутренняя документация

Для каждого шага:
1. Определи, какой модуль нужен
2. Сформулируй запрос к модулю
3. Покажи результат

Задача: Рассчитай, сколько стоит подписка на ChatGPT Plus для команды из 12 человек на год в рублях.
Ответ модели

Шаг 1: ПОИСК Запрос: «ChatGPT Plus price 2026» Результат: ChatGPT Plus стоит $20/мес за пользователя.

Шаг 2: ПОИСК Запрос: «курс доллара к рублю сегодня» Результат: 1 USD ≈ 94 RUB

Шаг 3: КАЛЬКУЛЯТОР Запрос: 20 × 12 × 12 × 94 Результат: 270 720 руб.

Финальный ответ: Подписка ChatGPT Plus для 12 человек на год обойдётся примерно в 270 720 рублей (при курсе 94 руб/доллар). Это $20 × 12 пользователей × 12 месяцев = $2 880 × 94 = 270 720 руб.

MRKL — это фундамент, на котором построены современные AI-агенты и tool use в ChatGPT, Claude и других системах.

Зачем нужен MRKL

Языковые модели имеют три фундаментальных ограничения:

  1. Не умеют точно считать — LLM «угадывают» числа, а не вычисляют
  2. Знания устаревают — модель не знает, что произошло после обучения
  3. Нет доступа к внешним данным — не видят вашу базу данных или CRM

MRKL решает все три проблемы: модель определяет, что ей нужно, и обращается к правильному инструменту.

Точность LLM vs MRKL на задачах, требующих инструментов
LLM (без инструментов) — математика58%
MRKL с калькулятором — математика99%
LLM (без инструментов) — актуальные данные12%
MRKL с поиском — актуальные данные87%

Архитектура MRKL

Примеры использования

Финансовый анализ

ПромптClaude Sonnet 4
Ты — MRKL-система. Доступные модули:
- CALCULATOR: точные вычисления
- DATABASE: данные о продажах компании
- SEARCH: внешняя информация

Задача: Наши продажи в январе были 2.4 млн руб., в феврале — 2.8 млн, в марте — 3.1 млн. Какой средний рост в процентах? Как это соотносится со средним по рынку?
Ответ модели

Шаг 1: DATABASE Запрос: продажи за январь-март Результат: Янв: 2 400 000, Фев: 2 800 000, Мар: 3 100 000

Шаг 2: CALCULATOR Запрос: рассчитать помесячный рост

  • Янв→Фев: (2 800 000 − 2 400 000) / 2 400 000 × 100 = 16.7%
  • Фев→Мар: (3 100 000 − 2 800 000) / 2 800 000 × 100 = 10.7%
  • Средний рост: (16.7 + 10.7) / 2 = 13.7%

Шаг 3: SEARCH Запрос: «средний рост продаж IT-компаний Q1 2026 Россия» Результат: Средний рост продаж IT-сектора в Q1 2026: 8-12%

Итоговый ответ: Ваш средний месячный рост — 13.7%, что выше среднерыночных 8-12%. Динамика положительная: хотя темпы замедлились с 16.7% до 10.7%, оба значения превышают отрасль.

Клиентская поддержка

ПромптChatGPT
Ты — MRKL-система поддержки клиентов. Модули:
- CRM: данные о клиенте
- KB: база знаний (FAQ, документация)
- TICKET: создание тикетов

Запрос клиента: «Я оплатил подписку Pro 3 дня назад, но у меня до сих пор базовый тариф. Мой ID: 42857»
Ответ модели

Шаг 1: CRM Запрос: информация о клиенте ID 42857 Результат: Клиент: Иванов И.И., email: ivanov@mail.ru. Тариф: Basic. Последний платёж: 20.02.2026, 990 руб (Pro Monthly).

Шаг 2: KB Запрос: «подписка не активировалась после оплаты» Результат: Причина #1: платёж обрабатывается (до 24ч). Причина #2: несовпадение email в платёжной системе. Причина #3: технический сбой — эскалация в биллинг.

Шаг 3: Анализ Платёж прошёл 3 дня назад — превышает лимит 24ч. Вероятен технический сбой.

Шаг 4: TICKET Запрос: создать тикет «Активация тарифа Pro — клиент 42857, платёж от 20.02.2026». Приоритет: высокий. Назначить: команда биллинга. Результат: Тикет #BIL-2847 создан.

Ответ клиенту: Иван Иванович, мы видим ваш платёж от 20 февраля. К сожалению, произошёл технический сбой при активации. Мы создали приоритетную заявку #BIL-2847 — наша команда биллинга активирует тариф Pro в течение 2 часов. Приносим извинения за неудобства.

MRKL (2022) стал теоретической основой для практических реализаций: Function Calling в OpenAI, Tool Use в Anthropic, плагины ChatGPT. Когда Claude вызывает калькулятор или ищет в интернете — это MRKL-паттерн в действии.

Как понимать MRKL в 2026

Сегодня MRKL уже не выглядит как отдельная “техника промптинга”. Это скорее базовый архитектурный слой для систем, где есть несколько внешних capabilities и нужен явный routing. Именно в этом смысле MRKL по-прежнему актуален: он помогает чётко разделять, что должна делать сама модель, а что нужно вынести в отдельный модуль.

Где паттерн реально полезен

MRKL-подход особенно хорошо работает, когда:

  • задача естественно раскладывается на разные capability lanes;
  • часть ответов должна быть детерминированной;
  • данные живут во внешних системах и их нельзя “запомнить” в модели.

Это делает MRKL практичным для enterprise assistants, support tools, BI/copilot workflows и агентных систем с несколькими доменными интеграциями.

Где MRKL недостаточен сам по себе

Важно и ограничение: MRKL объясняет routing, но почти не решает orchestration целиком. Ему обычно не хватает памяти и состояния, trace/observability, approval layers и политики безопасности для инструментов. Поэтому в современном стеке MRKL — это фундамент, на который уже сверху навешиваются ReAct loops, workflow engines и guardrails.

Плюсы и минусы

Плюсы

  • Точные вычисления — делегирование калькулятору вместо «угадывания»
  • Актуальные данные — обращение к поиску и базам данных в реальном времени
  • Масштабируемость — новые модули добавляются без переобучения модели
  • Прозрачность — видно, какой модуль использован и почему
  • Фундамент для AI-агентов — ReAct, LangChain, Claude Tools основаны на этом

Минусы

  • Требует инфраструктуры — каждый модуль нужно разработать и поддерживать
  • Ошибки маршрутизации — модель может вызвать не тот модуль
  • Латентность — внешние вызовы замедляют ответ
  • Безопасность — доступ к инструментам создаёт риски (SQL-инъекции, неавторизованные действия)
  • Сложность отладки — ошибка может быть в маршрутизации, модуле или синтезе
LLM без инструментов
Сколько будет 17.3% от 847 293? (LLM: «примерно 146 582» — неточно)
MRKL-система
Сколько будет 17.3% от 847 293? → CALCULATOR: 847293 × 0.173 = 146 581.689 → Точный ответ: 146 581.69

Техническая реализация

Базовая MRKL-система

import json
import math
from openai import OpenAI

client = OpenAI()


def calculator(expression: str) -> str:
    """Модуль калькулятора — точные вычисления."""
    try:
        # Безопасное вычисление (без eval)
        allowed = {
            "abs": abs, "round": round,
            "min": min, "max": max,
            "sum": sum, "pow": pow,
            "sqrt": math.sqrt, "log": math.log,
        }
        result = eval(expression, {"__builtins__": {}}, allowed)
        return str(result)
    except Exception as e:
        return f"Ошибка вычисления: {e}"


def search(query: str) -> str:
    """Модуль поиска (заглушка — заменить на реальный API)."""
    # В продакшене: Tavily, SerpAPI, Exa
    return f"[Результаты поиска по запросу: '{query}']"


def database_query(query: str) -> str:
    """Модуль базы данных (заглушка)."""
    # В продакшене: SQL-запрос к реальной БД
    return f"[Результат запроса к БД: '{query}']"


MODULES = {
    "calculator": {
        "function": calculator,
        "description": "Точные математические вычисления",
    },
    "search": {
        "function": search,
        "description": "Поиск актуальной информации в интернете",
    },
    "database": {
        "function": database_query,
        "description": "Запрос к базе данных компании",
    },
}


def mrkl_system(
    question: str,
    model: str = "gpt-4o"
) -> dict:
    """
    Базовая MRKL-система: маршрутизация + выполнение + синтез.
    """
    modules_desc = "\n".join(
        f"- {name}: {info['description']}"
        for name, info in MODULES.items()
    )

    # Шаг 1: Маршрутизация — определяем, какие модули нужны
    routing_response = client.chat.completions.create(
        model=model,
        messages=[{
            "role": "user",
            "content": (
                f"Доступные модули:\n{modules_desc}\n\n"
                f"Вопрос: {question}\n\n"
                f"Определи, какие модули нужно вызвать и в "
                f"каком порядке. Для каждого вызова укажи "
                f"конкретный запрос.\n\n"
                f"Верни JSON:\n"
                f'{{"steps": ['
                f'{{"module": "имя", "query": "запрос"}}'
                f"]}}"
            )
        }],
        temperature=0,
        response_format={"type": "json_object"},
    )

    try:
        plan = json.loads(
            routing_response.choices[0].message.content
        )
        steps = plan.get("steps", [])
    except (json.JSONDecodeError, KeyError):
        steps = []

    # Шаг 2: Выполнение модулей
    results = []
    for step in steps:
        module_name = step.get("module", "")
        query = step.get("query", "")

        if module_name in MODULES:
            output = MODULES[module_name]["function"](query)
        else:
            output = f"Модуль '{module_name}' не найден"

        results.append({
            "module": module_name,
            "query": query,
            "output": output
        })

    # Шаг 3: Синтез ответа
    results_text = "\n".join(
        f"[{r['module']}] Запрос: {r['query']} → "
        f"Результат: {r['output']}"
        for r in results
    )

    synthesis = client.chat.completions.create(
        model=model,
        messages=[{
            "role": "user",
            "content": (
                f"Вопрос: {question}\n\n"
                f"Результаты модулей:\n{results_text}\n\n"
                f"Сформируй финальный ответ на основе "
                f"результатов модулей."
            )
        }],
        temperature=0.5,
    )

    return {
        "question": question,
        "plan": steps,
        "module_results": results,
        "answer": synthesis.choices[0].message.content,
    }


result = mrkl_system(
    "Сколько стоит 15 лицензий Notion по $10/мес на год "
    "в рублях при текущем курсе?"
)
print(result["answer"])

MRKL через OpenAI Function Calling

tools = [
    {
        "type": "function",
        "function": {
            "name": "calculator",
            "description": "Выполняет математические вычисления",
            "parameters": {
                "type": "object",
                "properties": {
                    "expression": {
                        "type": "string",
                        "description": (
                            "Математическое выражение, "
                            "например: '2 * 3 + 4'"
                        ),
                    }
                },
                "required": ["expression"],
            },
        },
    },
    {
        "type": "function",
        "function": {
            "name": "search",
            "description": "Поиск актуальной информации",
            "parameters": {
                "type": "object",
                "properties": {
                    "query": {
                        "type": "string",
                        "description": "Поисковый запрос",
                    }
                },
                "required": ["query"],
            },
        },
    },
]


def mrkl_with_function_calling(
    question: str,
    model: str = "gpt-4o"
) -> str:
    """MRKL через OpenAI Function Calling (tool use)."""
    messages = [{"role": "user", "content": question}]

    # Цикл вызовов инструментов
    while True:
        response = client.chat.completions.create(
            model=model,
            messages=messages,
            tools=tools,
            tool_choice="auto",
        )

        message = response.choices[0].message
        messages.append(message)

        # Если модель не вызывает инструменты — готово
        if not message.tool_calls:
            return message.content

        # Выполняем вызовы инструментов
        for tool_call in message.tool_calls:
            fn_name = tool_call.function.name
            fn_args = json.loads(tool_call.function.arguments)

            if fn_name in MODULES:
                fn_result = MODULES[fn_name]["function"](
                    **fn_args
                )
            else:
                fn_result = f"Неизвестный модуль: {fn_name}"

            messages.append({
                "role": "tool",
                "tool_call_id": tool_call.id,
                "content": str(fn_result),
            })

MRKL через Claude Tool Use

import anthropic

client = anthropic.Anthropic()

claude_tools = [
    {
        "name": "calculator",
        "description": "Точные математические вычисления",
        "input_schema": {
            "type": "object",
            "properties": {
                "expression": {
                    "type": "string",
                    "description": "Математическое выражение",
                }
            },
            "required": ["expression"],
        },
    },
    {
        "name": "search",
        "description": "Поиск актуальной информации",
        "input_schema": {
            "type": "object",
            "properties": {
                "query": {
                    "type": "string",
                    "description": "Поисковый запрос",
                }
            },
            "required": ["query"],
        },
    },
]


def mrkl_claude(question: str) -> str:
    """MRKL через Claude Tool Use."""
    messages = [{"role": "user", "content": question}]

    while True:
        response = client.messages.create(
            model="claude-sonnet-4-20250514",
            max_tokens=2048,
            tools=claude_tools,
            messages=messages,
        )

        # Если модель закончила — возвращаем текст
        if response.stop_reason == "end_turn":
            return "".join(
                block.text for block in response.content
                if block.type == "text"
            )

        # Обрабатываем вызовы инструментов
        messages.append({
            "role": "assistant",
            "content": response.content
        })

        tool_results = []
        for block in response.content:
            if block.type == "tool_use":
                if block.name in MODULES:
                    result = MODULES[block.name]["function"](
                        **block.input
                    )
                else:
                    result = f"Модуль {block.name} не найден"

                tool_results.append({
                    "type": "tool_result",
                    "tool_use_id": block.id,
                    "content": str(result),
                })

        messages.append({"role": "user", "content": tool_results})
MRKL-система с доступом к базе данных или API — это потенциальная уязвимость. Валидируйте все запросы к модулям, используйте read-only доступ где возможно и ограничивайте scope инструментов. Никогда не передавайте сырой пользовательский ввод напрямую в SQL или системные команды.

Интеграция в продакшен

  • Клиентская поддержка — LLM + CRM + база знаний + тикетная система
  • Аналитические дашборды — LLM + SQL + калькулятор + визуализация
  • Финансовые приложения — LLM + рыночные данные + калькулятор
  • AI-ассистенты — LLM + календарь + почта + поиск + документы

Проверьте себя

Проверьте себя

1. Что такое MRKL?

2. Какую проблему LLM решает MRKL?

3. Какая современная технология является прямой реализацией идей MRKL?