Всем привет! Сегодня разберём, как проектировать агента, который доезжает до продакшена и приносит пользу бизнесу: от вопросов на старте до стека и практик, без которых он развалится в эксплуатации.
Меня зовут Владимир, на данный момент работаю ML-инженером и разрабатываю мультиагентные системы. К сожалению, пока не могу похвастаться тем, что сократил 20 процентов сотрудников, но достижения имеются...

Дизайн системы
Я сторонник подхода, что лучше один раз заранее описать, чем потом сто раз переделывать.
При разработке системы перво-наперво необходимо попробовать переложить её на бумагу. Что нам нужно, на какие метрики мы будем влиять, какие есть ограничения: по железу, безопасности, людским ресурсам, срокам и так далее.
Приведу лишь несколько примеров вопросов и ответов, которые влияют на разработку в дальнейшем:
На какую бизнес-метрику мы ориентируемся?
Если это CTR/конверсия в целевое действие/time-to-first-value, то нам необходимо как можно быстрее показать пользователю некую выдачу. Минимум вопросов, быстрая выдача, уточнения после.
Длина диалогов — используем постоянно добивки, задаем больше вопросов, проводим более тщательное дискавери.
Лайки/дизлайки (NPS в общем случае) — сначала проводим глубокое исследование, что пользователям нравится/не нравится, и только потом выстраиваем систему.
Есть ли требования по поводу безопасности?
Жесткие требования. Безопасники против любой утечки информации куда-либо. Здесь мы выбираем внутренний сервинг моделей, обычно используют vLLM или SGLang.
Есть ограничения: можем отправлять текст внешней LLM, но нужно следить за персональными данными. Здесь все вполне обусловлено требованиями российского законодательства. Вам нужно использовать либо открытые модели маскирования, либо писать кастомный пайплайн (обычно состоящий из регулярок).
Нет ограничений: можем отправлять любые данные. Поздравляю, вам выпал самый легкий путь. Здесь я бы рекомендовал использовать OpenRouter как одну точку входа для разных моделей. Тарификация одна из самых приятных на рынке, очень хороший SLA и доступ практически ко всем моделькам.
Сколько у вас железа?
Много, целый кластер лежит, бери железа сколько хочешь,
главное не майни. Здесь рекомендую использовать самые большие модели, которые наилучшим образом справляются с данной задачей, подключать к ним tools, использовать несколько агентов в пайплайне.Железо прям впритык, больше не можем дать. Рекомендую поэкспериментировать с LLM, промптами, квантизациями, включаем кэширование, шаблонизаторы и максимально пытаемся снизить потребление столь ценного GPU.
Только CPU. Здесь лучше нанять пару индусов и дальше попробовать продержаться, чтобы вас не спалили. Вроде истории успеха имеются, привет Builder.ai.
Какие нефункциональные ограничения имеются (RPS, SLA, Latency)? Разберем на примере latency:
Можно подумать (latency до 1 минуты). Здесь можно использовать более сложные пайплайны, больше агентов и так далее. Делаем упор в качество ответа.
Думаем, но не так много (до 10 секунд). Здесь рекомендую уже не использовать reasoning, делать меньше агентов в графе.
Здесь и сразу (до 1 секунды). Рекомендую использовать легковесные модели и максимально снижать нагрузку на LLM путем шаблонизации ответов, регулярок и кэширования.
Сколько времени на разработку?
Work-life balance. Здесь можно больше времени уделить экспериментам. Можно не стесняться промптить модель, дообучать ее, изменять архитектуру агентной системы и т.д.
Пятилетки необходимо выполнить за 2 спринта. Здесь рекомендую больше времени уделить простому промптингу и оценки LLM.
Ответы на эти и другие вопросы, помогают вам составить образ будущего результата. Поэтому в первую очередь описываем, а уж потом реализуем.
Технологии
На все базовые вопросы ответили, все узнали, теперь осталось это реализовать. Здесь нам пригодятся конкретные технологии. Давайте разбираться, что нам может помочь.
LangChain
Для написания одного агента нам понадобится фреймворк LangChain.
LangChain — это open-source фреймворк для разработки приложений на базе LLM. В нем уже есть встроенная реализация самых популярных инструментов для построения агентных систем: память, tools, RAG и многое другое.
Здесь я рекомендую его использовать для написания одного агента. Не рекомендую на его основе строить взаимодействие агентов и так далее. Иначе может получиться вот такое:
# 1. Initial Generation: Creates the first draft of the product description.
# The input to this chain will be a dictionary, so we update the prompt template.
generation_chain = (
ChatPromptTemplate.from_messages([
("system", "Write a short, simple product description for a new smart coffee mug."),
("user", "{product_details}")
])
| llm
| StrOutputParser()
)
# 2. Critique: Evaluates the generated description and provides feedback.
critique_chain = (
ChatPromptTemplate.from_messages([
("system", """Critique the following product description based on clarity, conciseness, and appeal.
Provide specific suggestions for improvement."""),
# This will receive 'initial_description' from the previous step.
("user", "Product Description to Critique:\n{initial_description}")
])
| llm
| StrOutputParser()
)
# 3. Refinement: Rewrites the description based on the original details and the critique.
refinement_chain = (
ChatPromptTemplate.from_messages([
("system", """Based on the original product details and the following critique,
rewrite the product description to be more effective.
Original Product Details: {product_details}
Critique: {critique}
Refined Product Description:"""),
("user", "") # User input is empty as the context is provided in the system message
])
| llm
| StrOutputParser()
)
# --- Build the Full Reflection Chain (Refactored) ---
# This chain is structured to be more readable and linear.
full_reflection_chain = (
RunnablePassthrough.assign(
initial_description=generation_chain
)
| RunnablePassthrough.assign(
critique=critique_chain
)
| refinement_chain
)Этот код взял из учебника от Google по написанию агентных систем. Сам учебник носит скорее пропагандистский характер, поэтому авторы всячески пытались показать недостатки других фреймворков, и им легко это удалось сделать ;)
Выглядит эффектно — и так же эффектно ломается при первой попытке поддерживать это в проде.
Поэтому не нужно городить такие конструкции! Только 1 агент и только 1 логика!!!
LangGraph
Для написания взаимодействия агентов очень хорошо подходит LangGraph.
Сразу оговоримся, что есть еще фреймворки: например Google ADK, CrewAI, Claude SDK и так далее. Автор больше писал на LangGraph, поэтому он больше предан ему. Далее попытаюсь раскрыть почему.
LangGraph — фреймворк, который позволяет собирать агентные системы. У него есть такие примитивы, как:
Node — сущность, которая может быть нашим агентом. В рамках одной ноды желательно выполнять одну бизнес-логику.
State — сущность, которая передается между нодами. Она может включать все, что пожелаете и что важно для вас.
Transition — это условия перехода между нодами.
Вот так выглядит типичный граф

Об основных фишках LangGraph
Низкий порог входа. Все концепции достаточно прозрачные и их можно объяснить на пальцах. Читать код достаточно понятно.
Тонкий контроль поведения: ветвления, лимиты, ретраи, fallback-логика.
Экосистема. Сюда входит: LangChain, LangSmith, Langfuse. Все эти инструменты позволяют выстроить end-to-end pipeline разработки агентных систем.
Приятные фишки: есть интеграции с различными базами данных, асинхронность из коробки, Human in the loop, Checkpointer и многое другое.
LLM Gateway
LLM Gateway — это способ проксирования запросов к LLM через одну точку входа. Внутри может быть разная логика, от менеджмента токенов до маскирования запросов. Здесь рекомендую использовать LiteLLM. На данный момент этот фреймворк позволяет легко поднять свою LLM платформу.
Перечислю основные плюсы:
Легкий способ настройки моделей, токенов и прав доступа.
Включенная тарификация в разрезе токенов/пользователей. Очень полезно, когда вам нужно сделать быстрый FinOPS из коробки.
Красивый UI

Tracing/Observability
Для повышения прозрачности и ответа на вопрос: "а че он так долго думает?" помогают инструменты для трейсинга:
LangSmith. Это платформа для трейсинга агентов и LLM. Очень легко интегрируется с LangChain/LangGraph. Для этого буквально нужна одна строчка.
Opik. Тот же самый инструмент, только бесплатный, чуть сложнее интегрировать, но если вы топите за безопасность — это ваш выбор.
Для дебага это очень ценный инструмент, многие баги были починены и не в последнюю очередь благодаря инструментам трейсинга агентов.
Оценка моделей
Хорошего фреймворка, который объединяет все аспекты современного тестирования языковых моделей и который можно легко адаптировать под ваш домен, я, к сожалению, не нашел. Если вы знаете хороший вариант — напишите в комментариях.
Здесь я рекомендую делать следующее:
Составить методологию тестирования. Обычно она базируется на ручной разметке + G-eval.
G-eval — это способ оценки большой языковой модели другой большой языковой модели.
Способ не новый, но показывает себя на практике достаточно хорошо. Вместо того, чтобы прогонять через людей (а это дорого и долго), можно все прогнать через LLM. Корреляция оценок очень высокая, поэтому можно утверждать, что оценка будет похожа на человеческую.
Для eval также нам могут пригодиться модельки, которые имитируют поведение пользователей. Здесь хорошо справляются проприетарные модели.
Стэйкхолдерам бывает интересно пощупать руками вашу систему. Здесь я бы порекомендовал использовать Chainlit. Данный фреймворк позволяет реализовать ChatGPT-like интерфейс.
По безопасности рекомендую воспользоваться фреймворком LLAMATOR. Здесь есть много разных атак, с основными из них вы можете ознакомиться здесь.
Вывод
Агентные системы только начинают внедряться в продакшен, но паттерны все те же: проектирование на бумаге, понимание ограничений и требований, простая и поддерживаемая архитектура, грамотно выбранный стек, наблюдаемость и оценка качества ответов. Если все вышеперечисленное вами соблюдается, то агент станет нормальным сервисом, а не лотереей на каждом запросе (хотя “сюрприз” в LLM — это фича по умолчанию).
Если статья показалась вам интересной, то буду благодарен за подписку на мой ТГ-канал ML без потерь, в нем описываю основные тренды в агентах, что я делаю на работе и как живу жизнь.
