Воркфлоу Агентики — это граф узлов, но во время выполнения агент всегда находится только в одном узле. Эта страница объясняет, как агент решает покинуть текущий узел и перейти к следующему, и почему система устроена именно так.

Узел — это состояние, а не скрипт

Когда агент входит в узел, Агентика настраивает LLM специально для этого узла:
  • Промпт узла, объединенный с промптом глобального узла, становится системным промптом и говорит LLM, что здесь нужно сказать и сделать.
  • Исходящие ребра узла становятся единственными доступными выходами. LLM не может перепрыгнуть куда-то еще.
Поэтому узел лучше понимать как состояние разговора: сфокусированная инструкция плюс небольшой набор выходов. Граф никогда не «бежит вперед» — ничего в последующем узле не происходит, пока агент действительно не перешел в него.

Условия — то, как LLM выбирает выход

У каждого исходящего ребра есть condition: описание на естественном языке, когда должен произойти переход. Пока агент говорит внутри узла, LLM постоянно сопоставляет живой разговор с условием каждого исходящего ребра. Когда модель решает, что условие выполнено, она вызывает это ребро, и Агентика переключает агента на целевой узел.
Под капотом каждое исходящее ребро предлагается LLM как вызываемая функция (инструмент). condition ребра становится описанием функции — текстом, по которому модель решает, стоит ли ее «вызвать». Поэтому четкое и конкретное условие так важно: оно полностью определяет решение о маршрутизации.

Что происходит во время перехода

Когда ребро срабатывает, Агентика выполняет три действия по порядку, прежде чем следующий узел заговорит:
  1. Извлечение переменных — если в узле, из которого агент уходит, включено извлечение данных, настроенные переменные сначала извлекаются из разговора.
  2. Фраза перехода — если у ребра есть необязательный transition_speech, агент произносит его или проигрывает запись перед переходом.
  3. Активация целевого узла — целевой узел становится текущим: загружаются его промпт и его исходящие ребра, затем цикл повторяется.
Если целевой узел — «Конец звонка», звонок завершается вместо ожидания нового выхода.

Почему это так устроено

Разговоры недетерминированы. Нельзя жестко прописать «после второго ответа перейти к узлу Y»: реальный абонент может ответить не по порядку, передумать или уйти от сценария. Решение о том, когда переходить дальше, должно исходить из живого разговора, а LLM уже понимает этот разговор. Поэтому естественный способ — дать модели каждый возможный выход как функцию, которую можно вызвать. Граф — это защитное правило. В каждый момент LLM доступны только исходящие ребра текущего узла. Она может пойти только туда, куда позволяет граф, поэтому структура ограничивает свободу модели и удерживает звонок в спроектированном сценарии. У конечных узлов просто нет выходов. Узел «Конец звонка» не регистрирует исходящие переходы, поэтому у LLM нет «двери», через которую можно выйти. Единственный результат — завершить звонок. Завершение моделируется отсутствием ребер, а не специальной командой времени выполнения. Глобальный узел никогда не бывает целью. У него нет ребер, и вы никогда не переходите в него. Вместо этого его промпт объединяется с каждым узлом, что контролируется полем add_global_prompt. Поэтому в нем хранятся общие инструкции: персона, тон и защитные правила.

Как писать условия, которые надежно маршрутизируют

Поскольку condition — это то, над чем рассуждает LLM, формулировка напрямую влияет на точность маршрутизации:
  • Пишите полный предикат, а не тег. Используйте "Абонент подтвердил, что хочет записаться на демо", а не "заинтересован". Модели нужно достаточно информации, чтобы сопоставить условие с живым разговором.
  • Делайте ветки взаимоисключающими. Если два исходящих условия могут быть истинны одновременно, агент может выбрать не то ребро. Дайте каждому выходу отдельный, непересекающийся триггер.
  • Держите метки короткими и различимыми. label — краткий идентификатор в журналах звонков и конструкторе. Делайте метки короткими и уникальными внутри узла. Логика маршрутизации живет в condition, а не в label.
  • Одна задача на узел. Узел с двумя-тремя ясными выходами маршрутизирует намного лучше, чем узел, который пытается ветвиться в десяток сторон. Объединяйте там, где можно.

См. также