Принципы проектирования — прочтите это в первую очередь
Как настроить агентов, которые действительно работают: одна задача на агента, немного навыков, опора на факты, проверка.
get_agentsearch_knowledge_baseБольшинство проблем «агент дает плохие ответы» связаны с конфигурацией, а не с моделью. Следуйте этим рекомендациям перед созданием агента, и результаты будут стабильными. Пренебрегайте ими, и легко собрать нечто, что выглядит правдоподобно, но ведет себя плохо, — затем ошибочно принять это за ограничение платформы.
Исследуйте перед созданием — проводите интервью, а не просто выполняйте команды
«Создать агента поддержки» — это начало разговора, а не техническое задание. Никогда не отвечайте на него одним вызовом create_agent и возвратом пустой оболочки. Работайте как мастер настройки: сначала проведите интервью, спланируйте всю настройку, проговорите её вслух, а затем создавайте. Задавайте вопросы на понятном языке — по несколько за раз, о реальной ситуации, а не о параметрах инструментов, — пока вы не сможете представить конечный результат:
- Задача и целевая аудитория. Для чего нужен этот агент, кто с ним общается, как выглядит хороший ответ? Один агент — одна задача — если описывают три задачи, это три разных агента.
- Что он должен отвечать на основе → базы знаний. Есть ли у них документы, сайт, политики, прайс-лист? Если факты должны быть точными, они становятся базой знаний, которую вы создаете и подключаете, — а не текстом в промпте. Если их пока нет, скажите им, что нужно собрать.
- Процедуры, которые он выполняет → навыки (skills). Любое поведение вида «когда X, выполни эти шаги» (бронирование, проверка, расчет стоимости)? Каждое из них становится загружаемым по требованию навыком с четким условием «использовать, когда…».
- Действия, которые он должен выполнять в других системах → MCP. Проверить календарь, найти заказ, открыть тикет? Это инструменты MCP, которые нужно связать — спросите, какая система и могут ли они подключиться.
- Управляемый поток с сохранением состояния → Storyline. Это процесс с памятью (сбор данных → квалификация → follow-up), а не разовый вопрос-ответ? Это Storyline, а не просто агент.
- Как он открывается и его жесткие ограничения. Первая строка, которую видят посетители (→ playbook страницы) и границы, которые задаются в
task(«никогда не цитируйте цену», «никогда не давайте юридических консультаций»).
Затем проговорите план перед тем, как трогать инструменты — «так что я создам: агента Support, базу знаний на основе ваших PDF-файлов политик, навык booking и свяжу ваш календарь через MCP — верно?» — и создавайте только после подтверждения. Пропуск этого шага — именно так вы получаете пустого агента, который никому не нужен. Размытый запрос — это сигнал задать уточняющий вопрос, а не угадывать.
Один агент — одна задача
Дайте каждому агенту одну четко ограниченную задачу. Агент, который «делает всё» — поддержка и продажи и бронирование, — имеет размытый task, конкурирует сам с собой за внимание и хуже отвечает на каждый вопрос. Если у вас три задачи, создайте три агента.
Держите количество навыков небольшим
Подключайте только те навыки, которые нужны для задачи этого агента — примерно пять или меньше. Навыки выбираются моделью на основе их однострочного description; чем их больше, тем сложнее этот выбор, и тем чаще загружается неверный навык или ни один. Сфокусированный набор с четкими описаниями «использовать, когда…» лучше, чем большая куча.
descriptionкаждого навыка говорит когда к нему обращаться, в одной строке.- Процедуры живут в
instructions(загружаются по требованию), никогда вsoul(оплачивается за каждый ход). - Если два навыка пересекаются по когда, объедините их — перекрывающиеся триггеры превращают выбор в подбрасывание монеты.
Факты привязывайте к базе знаний; границы задавайте в task
- Факты (тарифы, политика, каталог) принадлежат базе знаний, которая извлекается каждый ход, — а не в промпте, где они устаревают и не имеют ссылок. См. Создание базы знаний.
- Ограничения принадлежат
task, в виде отрицаний: «никогда не обещайте дату», «для расчета стоимости вызовите инструмент». Отрицательные границы лучше предотвращают отклонения, чем позитивное описание. Не помещайте правила безопасности вsoul— платформа добавляет глобальную модерацию за вас. - Включите
grounding_required, когда ответы должны исходить из материала, а не из априорных знаний модели.
Никогда не передавайте детерминизм вероятности
Самое полезное правило проектирования на этой платформе: если что-то можно вычислить, сгенерировать или проверить системой, никогда не оставляйте это на волю модели. Модель, которой поручают создать детерминированный артефакт, не выдает громкой ошибки — она создает правдоподобный. Пользователь получает несуществующий номер тикета, звонок, забронированный на семь часов позже, цветовую палитру, не соответствующую контрастности. Ничего не ошибается; просто результат неверен.
Каждый из этих пунктов начинался как реальная производственная ошибка и стал функцией платформы:
| Детерминированная вещь | Неправильный способ (вероятность) | Правильный способ (система) |
|---|---|---|
| Ссылки / номера тикетов | В инструкциях сказано «скажите пользователю номер тикета» → модель выдумывает один | save_contact / schedule_followup возвращают реальный сохраненный код — инструктируйте модель передать его дословно |
| Абсолютное время | Модель вручную вычисляет delay_seconds для «завтра 10:00» → ошибка на часы | Передайте run_at (локальное время в формате ISO); сервер разрешит часовой пояс |
| Цвета текста на фирменном цвете | Модель выбирает «подходящие» цвета → нечитаемые в одной из тем | Отправляйте только theme_color; цвета переднего плана с контрастом WCAG вычисляются на сервере |
| Маршрутизация в потоке | Выход ai для «если пользователь согласился» | Выходы rule / user_choice; резервируйте выходы ai для суждений. Циклы получают явный счетчик и ограничение — никогда не полагайтесь на то, что «LLM в конце концов остановится» |
| «Сработал ли триггер?» | Предполагайте, что промпт работает | test_skill_trigger измеряет это; платформа также вводит детерминированную подсказку при обнаружении телефона/электронной почты |
| Формулировка, передаваемая инструменту | Надеемся, что модель превратит «есть ли еще что-то подобное?» в правильный вызов | Платформа выясняет, что было запрошено, затем составляет инструкцию из собственного определения инструмента и показывает этот ход одному инструменту. Измерено: 80% → 97%; позволение модели переписать свой собственный запрос ничего не дало (82%) |
| Фраза, которая никогда не должна появляться | Добавьте еще одну строку «не говорите X» в промпт | Удалите её после факта. Правило, которое можно проверить в готовом ответе, — это правило, которое можно enforcing; правило в промпте — это просьба |
| Машинно-читаемый вывод | «Ответьте только валидным JSON» и парсите строго | Попросите форму, затем извлеките одно поле, которое имеет значение. Строгость отбрасывает ответы, которые были правильными |
Следствие для написания навыков: ваши instructions должны говорить модели, какую функцию системы использовать («передайте run_at, передайте возвращенный код»), а не учить её имитировать функцию («вычислите секунды, отформатируйте номер тикета»). Если вы обнаруживаете, что скриптите вывод детерминированного процесса, найдите инструмент, который его производит, — или запросите такой.
Два следствия о выводе
Правило промпта — это просьба; пост-проверка — это правило. «Никогда не говорите X» принадлежит промпту — это снижает частоту — но это не enforcement. Модель, которая соглашается с инструкцией, все равно может прийти к тому же запрещенному идее через формулировку, которую ваше слово не предвидело, и каждое переписывание правила обычно ловит только те формулировки, которые вы уже видели. Слова не могут контролировать слова. Поэтому задайте другой вопрос: узнаваема ли нежелательная фраза в готовом ответе? Если да, удалите её там, и оставьте строку в промпте также.
Сначала добейтесь правильности контента; не позволяйте синтаксису стоить вам контента. Меньшая модель часто сделает правильный выбор, а затем запишет его в форме, которую ваш парсер отклоняет — один объект на строку вместо массива, запятая в конце, текст вокруг блока. Строгий парсинг означает, что правильный ответ отбрасывается из-за неверной скобки, и симптом выглядит как неспособность модели. Решите, какое поле в ответе является несущим — обычно ровно одно: id, ссылка, выбор — и извлеките это поле любым способом. Остальная часть полезной нагрузки, как правило, является данными, которые вы все равно собирались заменить своими собственными, поэтому строгость в этом отношении ничего не защищает.
Показывайте агенту только правильные паттерны
Когда вы передаете агенту примеры, делайте их правильными. Не вставляйте фрагмент «вот неправильный способ» рядом с правильным — модель может имитировать ближайший пример, а не читать оговорку. Описывайте, чего следует избегать, словами; держите исполняемые примеры примерными.
Проверяйте — написание не означает работу
После каждого изменения проверяйте, сделало ли оно то, что вы задумали. Создание агента не означает, что он настроен так, как вы думаете; добавление в базу знаний не означает, что вопрос извлекается.
get_agent(name="Support") # подтвердите конфигурацию, которая применилась
search_knowledge_base(kb_name="Company policy", query="…") # подтвердите, что ответ извлекаемПустой результат search означает, что на этот вопрос ответят «не охвачено» — найдите это сейчас, а не от клиента.
Передавайте результат — и следующий шаг
После каждого действия не просто сообщайте, что вы закончили. Передавайте четыре вещи: что вы произвели, кликабельную ссылку на консоль для просмотра, одну строку о том, как им пользоваться, и естественный следующий шаг — предложенный и предложенный к выполнению. Они все равно спросят «где я это вижу?», «как я им пользуюсь?» и «что дальше?»; ответьте на все три вопроса заранее. URL-кодируйте имена, содержащие пробелы.
| После того как вы… | Передайте |
|---|---|
| Создали или импортировали в базу знаний | Её страницу — которая включает звездную карту знаний (3D-вид того, что было поглощено): https://console.agent4.io/#/knowledge-bases/<name> |
| Создали агента | Её страницу для обзора/тестирования: https://console.agent4.io/#/agents/<name> — и отметьте, что для предоставления конечным пользователям доступа к нему они создают ссылку для обмена в консоли |
| Создали навык | https://console.agent4.io/#/skills/<name> |
| Опубликовали Storyline | https://console.agent4.io/#/storylines/<id> (id из create_storyline) |
| Зарегистрировали MCP-сервер | https://console.agent4.io/#/mcp/<id> |
Например, после импорта документов в базу знаний, ответьте, сколько чанков попало, ссылкой выше, чтобы они могли открыть её звездную карту знаний и увидеть, что именно было поглощено, и подтвердите, прикреплено ли оно теперь к агенту (или как его прикрепить). Простое «готово» просто заставляет их спрашивать.
Всегда заканчивайте следующим шагом и предлагайте выполнить его — настройка — это цепочка, а не одно действие:
- Создали базу знаний? → предложите прикрепить её к агенту (спросите, к какому).
- Создали агента? → предложите прикрепить базу знаний, добавить навык или создать ссылку для обмена, чтобы конечные пользователи могли получить к нему доступ (пустое пространство = выключено).
- Написали навык? → предложите прикрепить его к агенту, которому он нужен.
- Опубликовали Storyline? → предложите установить её как стандартную для агента или подключить триггер записи.
- Зарегистрировали MCP-сервер? → предложите предоставить агенту его инструменты.
«Вот что я сделал, вот ссылка, вот как этим пользоваться, и вот что я сделаю дальше — хотите, чтобы я?» — поддерживает движение сборки; простое «готово» оставляет арендатора в недоумении.