MRKL (произносится «miracle», читается как «миракл») — архитектурный подход, в котором языковая модель выступает как маршрутизатор, направляющий запросы к специализированным внешним модулям: калькуляторам, базам данных, API, поисковым системам. Вместо того чтобы «знать всё самой», модель определяет, какой инструмент нужен, и делегирует ему задачу.
В 2026 году MRKL лучше читать как исторический precursor современного tool routing. Сам термин используется реже, но сама идея никуда не делась: function calling, tool use, MCP-интеграции, agent routers и workflow engines по сути реализуют тот же модульный принцип.
Представьте секретаря в крупной компании. Он не знает ответы на все вопросы, но знает, к кому обратиться. Нужны финансовые данные? Он звонит бухгалтеру. Юридический вопрос? Переключает на юриста. Техническая проблема? Связывает с IT-отделом. MRKL работает так же: нейросеть — это умный «секретарь», который маршрутизирует задачи к нужным специалистам (инструментам).
LLM (языковая модель) — «мозг», который понимает запрос и решает, что с ним делать
Модули (experts) — специализированные инструменты: калькулятор, поиск, база данных, API
Маршрутизатор (router) — логика, которая соединяет запрос с нужным модулем
Модель не пытается считать в уме или запоминать актуальные данные. Она определяет: «Для ответа мне нужно посчитать — вызову калькулятор» или «Нужны свежие данные — обращусь к поиску».
ПромптChatGPT
Ты — MRKL-система с доступом к модулям:
- КАЛЬКУЛЯТОР: математические вычисления
- ПОИСК: актуальная информация
- БАЗА_ЗНАНИЙ: внутренняя документация
Для каждого шага:
1. Определи, какой модуль нужен
2. Сформулируй запрос к модулю
3. Покажи результат
Задача: Рассчитай, сколько стоит подписка на ChatGPT Plus для команды из 12 человек на год в рублях.
Ответ модели
Шаг 1: ПОИСК
Запрос: «ChatGPT Plus price 2026»
Результат: ChatGPT Plus стоит $20/мес за пользователя.
Финальный ответ:
Подписка ChatGPT Plus для 12 человек на год обойдётся примерно в 270 720 рублей (при курсе 94 руб/доллар). Это $20 × 12 пользователей × 12 месяцев = $2 880 × 94 = 270 720 руб.
MRKL — это фундамент, на котором построены современные AI-агенты и tool use в ChatGPT, Claude и других системах.
Ты — MRKL-система. Доступные модули:
- CALCULATOR: точные вычисления
- DATABASE: данные о продажах компании
- SEARCH: внешняя информация
Задача: Наши продажи в январе были 2.4 млн руб., в феврале — 2.8 млн, в марте — 3.1 млн. Какой средний рост в процентах? Как это соотносится со средним по рынку?
Ответ модели
Шаг 1: DATABASE
Запрос: продажи за январь-март
Результат: Янв: 2 400 000, Фев: 2 800 000, Мар: 3 100 000
Шаг 2: CALCULATOR
Запрос: рассчитать помесячный рост
Шаг 3: SEARCH
Запрос: «средний рост продаж IT-компаний Q1 2026 Россия»
Результат: Средний рост продаж IT-сектора в Q1 2026: 8-12%
Итоговый ответ:
Ваш средний месячный рост — 13.7%, что выше среднерыночных 8-12%. Динамика положительная: хотя темпы замедлились с 16.7% до 10.7%, оба значения превышают отрасль.
Ты — 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 уже не выглядит как отдельная “техника промптинга”. Это скорее базовый архитектурный слой для систем, где есть несколько внешних capabilities и нужен явный routing. Именно в этом смысле MRKL по-прежнему актуален: он помогает чётко разделять, что должна делать сама модель, а что нужно вынести в отдельный модуль.
Важно и ограничение: MRKL объясняет routing, но почти не решает orchestration целиком. Ему обычно не хватает памяти и состояния, trace/observability, approval layers и политики безопасности для инструментов. Поэтому в современном стеке MRKL — это фундамент, на который уже сверху навешиваются ReAct loops, workflow engines и guardrails.
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 или системные команды.