"Я построил orchestration engine без LangChain — и понял, где проходит главная граница"

Я построил orchestration engine без LangChain — и понял, где проходит главная граница

На Reddit разработчик поделился опытом: выкинул LangChain и написал orchestration engine с нуля на 80 строках Python. Пост набрал десятки апвотов, и дискуссия ушла не в холивар «фреймворк vs без фреймворка», а в разговор об архитектуре. Потому что автор нашёл паттерн, который решает главную проблему AI-агентов в production.

Инцидент, который всё начал

LangChain-агент вызвал DELETE-эндпоинт, который не предполагался к использованию. Фреймворк передал решение LLM напрямую в исполнение — без промежуточного слоя, где это решение можно было бы проверить.

Это не баг LangChain. Это архитектурная проблема: фреймворк трактует выход LLM как программный вывод. А выход LLM — это вероятностный результат стохастического процесса.

Два мира и граница между ними

Инсайт, ради которого стоит читать:

**Всё до Executor — вероятностное. Всё после — детерминированное. Executor — контракт между этими мирами.**

LLM генерирует правдоподобный текст. Может быть правильным, может быть галлюцинацией. Это нормально — так работают генеративные модели.

Executor вызывает API, меняет данные, отправляет деньги. Каждое действие необратимо.

Между ними нужна формальная граница: Pydantic-схема на структуру, allowlist на инструменты, бизнес-правила на аргументы. Не промпт «будь аккуратным». Код, который не пропускает невалидное.

Три слоя вместо фреймворка

Архитектура — три компонента:

**Planner LLM** — решает, что делать. Выдаёт JSON: инструмент + аргументы + обоснование. Ничего не исполняет.

**Trust Boundary** — валидирует решение. Схема, allowlist, правила. Это функция, которую пишешь один раз.

**Executor** — исполняет только то, что прошло валидацию. Никакой интерпретации.

``` plan = call_planner(query) validated = validate_plan(plan) result = execute(validated) ```

80 строк. Без магии.

Цифры из production

Без валидационного слоя: - 2-5% невалидный JSON от LLM - ~1% несуществующий инструмент - ~3% неверные аргументы при правильном инструменте

Итого 6-9% вызовов привели бы к ошибкам или непредсказуемым побочным эффектам. С Trust Boundary все ловятся до исполнения: retry, reject, log.

LLM не становится надёжнее. Система становится надёжнее за счёт контракта.

Почему не LangChain

LangChain оптимизирует скорость прототипирования. Для демо — отлично. Для production проблемы начинаются:

- Отладка через три слоя абстракции - Фреймворк принимает неявные решения за вас: как парсить ответ, когда ретраить - Быстрые релизы ломают существующий код

LangGraph лучше — даёт графовую структуру без тяжёлых абстракций. Но для одного агента с чёткой цепочкой actions — самописное решение проще.

Когда строить с нуля

С нуля — когда инструменты имеют необратимые побочные эффекты (платежи, удаление, отправка) и нужен полный контроль над границей.

Фреймворк — когда мультиагентная система с разделяемым состоянием или когда нужен прототип завтра.

Главный вывод

При проектировании AI-агента начните не с выбора фреймворка. Начните с рисования границы: слева — вероятностный мир LLM, справа — детерминированный мир API и данных. На границе — Executor-контракт.

Эта единственная архитектурная деталь определяет надёжность агента в production. Всё остальное — детали реализации.

А у вас как устроена граница между тем, что LLM решил, и тем, что система делает?

Начать дискуссию