Представьте: у вас есть корпоративная шина (ESB), которая десятилетиями исправно таскает сообщения между CRM, ERP и legacy-системой на COBOL. И тут приходит начальник и говорит: «А давай-ка мы во все эти потоки вставим нейросеть, чтобы она сама отвечала клиентам, классифицировала заявки и подсказывала аналитикам». Первая мысль — поднять отдельный микросервис на Python с FastAPI и дёргать его REST-ом. Вторая — попробовать прикрутить LLM напрямую к шине. И тут-то оказывается, что стандартные маршруты ESB не умеют работать с асинхронными вызовами моделей, управлять контекстом и считать токены. Знакомо?
В 2025 году появилась библиотека redb.Route.Llm — электростанция для .NET, которая расширяет Enterprise Integration Patterns (EIP) для работы с большими языковыми моделями. Она не заставляет вас переписывать шину, а даёт набор готовых компонентов: LLM-транспорт, семантические фильтры, обогатители контекста и агрегаторы с поддержкой tool calling. Без этого (и без лишней боли).
Disclaimer: Библиотека распространяется как NuGet-пакет Redb.Route.Llm (версия 2.1.0 на июнь 2026). Исходники открыты, лицензия MIT. Демо-маршруты лежат в репозитории на GitHub — ссылка будет в конце статьи.
ESB vs LLM: почему вместе, а не порознь?
Обычная практика — выносить AI в отдельный сервис. Это логично с точки зрения изоляции, но порождает зоопарк: нужно стыковать очереди, думать про timeouts, дублировать логику маршрутизации. А если модель нужно вставить в середину длинного пайплайна (например, перед отправкой письма клиенту), приходится резать шину и городить костыли.
redb.Route.Llm решает это элегантно: вы просто объявляете LLM как ещё один транспорт в вашей шине. Всё, что раньше работало с HTTP, Kafka или RabbitMQ, теперь умеет работать и с нейросетью. Сообщения, проходящие через такой транспорт, автоматически оборачиваются в промпты, получают ответ и возвращаются обратно в конвейер. А Enterprise Integration Patterns (Content Enricher, Splitter, Aggregator) позволяют оперировать контекстом модели как обычным корпоративным сообщением.
Возможности, которые заставят архитектора улыбнуться
- Полиглотия провайдеров: OpenAI / Azure, Ollama, vLLM, lmstudio — подключай любого. Для локальных моделей можно использовать инструкции из нашего обзора.
- Tool Calling из коробки: библиотека автоматически превращает методы ваших сервисов в инструменты для LLM. Достаточно пометить их атрибутом — и модель сможет вызывать ERP-функции или обновлять статус заказа. (Похожий механизм разбирали в статье про локальные LLM с tool calling.)
- Семантическая маршрутизация: можно настроить, чтобы сообщения с определённой интенцией (например, «жалоба на качество») автоматически направлялись в LLM с особым промптом, а остальные шли по старым маршрутам.
- Контекст с умом: Контекстуализация встроена — можно подтянуть данные из реляционной БД, обогатить запрос историей диалога и уложиться в лимит токенов.
- Rate Limiting и мониторинг стоимости: встроенный модуль
LlmCostTrackerпишет метрики в Prometheus. Больше никаких сюрпризов в счете за API.
Разбираем на примере: как НЕ надо
Допустим, нужно реализовать такой сценарий: клиент пишет в чат-поддержки, система должна извлечь суть проблемы, найти похожие тикеты в Jira, предложить решение и зарегистрировать новый тикет, если решения нет. Типичный «монолитный» подход — написать один метод контроллера, который вызывает LLM, потом базу, потом снова LLM. Это быстро превращается в спагетти.
Как НЕ надо: Сувать все вызовы LLM в один сервис, забыть про паузы между запросами и молиться, что модель не словит таймаут. В ESB такое не скоммутировать — получите жёсткую связность.
Правильный путь с redb.Route.Llm — разбить процесс на несколько маршрутов, соединённых через шину. Каждый маршрут отвечает за один шаг и может быть легко заменён или протестирован.
// Пример конфигурации маршрута с использованием RouteBuilder
public class SupportRoute : IRouteConfigurator
{
public void Configure(IRouteBuilder builder)
{
// Принимаем входящее сообщение из шины (например, с топика "chat.incoming")
builder.From("chat.incoming")
.Enrich(context =>
{
// Обогащаем запрос данными клиента из CRM
var crmService = context.Resolve<ICrmService>();
var ticket = crmService.GetCustomer(context.Message.CustomerId);
context.Message.AttachPayload("customer_data", ticket);
})
.SendToLlm("gpt-4o", prompt =>
{
prompt.WithSystemMessage("Ты — классификатор инцидентов. Определи категорию: 'баг', 'улучшение', 'вопрос'.");
prompt.WithTools(typeof(ITicketService)); // разрешаем вызывать методы сервиса как функции
})
.If(response => response.Category == "баг")
.SendTo("jira.incoming")
.Else()
.SendTo("solution.suggester");
// Второй маршрут для предложения решения
builder.From("solution.suggester")
.SendToLlm("llama-3.1-70b-local", prompt =>
{
prompt.WithTools(typeof(IFaqService));
})
.Aggregate(TimeSpan.FromSeconds(5), 100) // собираем ответы от нескольких LLM
.SendTo("chat.outgoing");
}
}
За счёт библиотеки каждый “.SendToLlm()” — это полноценный шаг ESB: он поддерживает повторные попытки, таймауты, idempotency и трассировку. Агрегатор в конце ждёт 5 секунд или 100 ответов (выбирается минимум) и объединяет результаты. Никакой ручной работы с таймерами и параллельными задачами.
Enterprise Integration Patterns в мире LLM
Главная фишка redb.Route.Llm — это не просто враппер для HTTP-запроса, а полноценная реализация EIP для AI. Вот несколько паттернов, которые работают из коробки:
- Scatter-Gather: отправляем один запрос сразу к трём разным LLM (GPT-4o, Claude*, локальная Llama) и собираем результаты голосованием. Полезно для критичных классификаций.
- Claim Check: если промпт с контекстом не влезает в лимит токенов, модель может сохранить промежуточное состояние в blob-хранилище и вернуть чек — потом шина подгрузит контекст для следующего шага.
- Content Filter: перед отправкой пользователю ответ LLM фильтруется на предмет конфиденциальных данных (PII). Реализуется как простой Content Enricher с regex.
- Router with LLM: семантический роутер, который сам решает, какому downstream-сервису отдать сообщение. Экономит разработку сложных правил.
Кстати, недавно LLMRouter показал, как можно снизить расходы на API до 50% — в redb.Route.Llm такой роутер встроен как отдельный компонент, так что можете не беспокоиться о бюджете.
Сравнение с альтернативами
| Инструмент | Язык | Интеграция с ESB | Tool Calling | Enterprise Patterns |
|---|---|---|---|---|
| redb.Route.Llm | C# (.NET 8+) | Нативная (любая шина через IMessageBus) | Да (через атрибуты) | Полный набор (20+ паттернов) |
| LangChain / LangGraph | Python / JS | Через отдельные коннекторы (не ESB) | Да, но без EIP | Нет (только цепочки вызовов) |
| Semantic Kernel (Microsoft) | C# | Через функцию orchestration (не ESB) | Да (плагины) | Минимально (только последовательность) |
| Самописный микросервис | Любой | Через REST/очереди (велосипед) | Требует реализации | Нет |
Главный козырь redb.Route.Llm — единый стек. Если ваша инфраструктура уже использует шину (NServiceBus, MassTransit или кастомную на основе .NET), вы получаете полную наблюдаемость, повторные попытки и маршрутизацию без дополнительных слоёв. Для сравнения: Semantic Kernel требует ручной настройки orchestration, а LangChain вообще живёт в Python и не дружит с C#-экосистемой.
Кому это точно надо (а кому — нет)
Берите, если:
- У вас .NET-стек и есть ESB (или планируете её внедрить).
- Нужно встроить AI-агентов в существующие бизнес-процессы, не ломая архитектуру.
- Хочется использовать Tool Calling для интеграции с корпоративными сервисами без написания тысяч строк boilerplate.
- Бюджет на LLM нужно контролировать на уровне шины (rate limiting + cost tracker).
Проходите мимо, если:
- Ваша команда пишет на Python и не планирует переходить на .NET.
- ESB — это для вас ругательство, и вы предпочитаете serverless или event sourcing на Kafka без посредника.
- У вас простой сценарий «один запрос — один ответ LLM» без сложной маршрутизации. Тут и обычный HttpClient справится.
Кстати, если вы только начинаете знакомство с LLM on-premise, обязательно взгляните на гайд по деплою — он поможет выбрать железо и модель для вашей шины.
Никакого «заключения», только совет
Не пытайтесь засунуть все бизнес-решения в LLM. Используйте инструмент точечно — там, где нужна гибкость и понимание естественного языка. А для строгих математических расчётов или транзакций с гарантией лучше оставить старый добрый код на C#. redb.Route.Llm не заменяет, а дополняет вашу шину. И да: не забудьте выключить зеркала.
Примеры кода, демо-маршруты и полный репозиторий доступны на GitHub (лицензия MIT). Документация включает пошаговое руководство по подключению к RabbitMQ и настройке первого AI-маршрута.