Разделить предложение и исполнение
Модель получает задачу и формирует запрос к инструменту. Затем приложение определяет, есть ли такой инструмент среди разрешённых и допустимы ли его аргументы. Только после проверки выполняется конкретная функция. В нашем примере помощник может запросить остаток, но не изменить цену, оформить покупку или отправить сообщение клиенту. Эти полномочия нельзя добавлять только потому, что модель сочла действие полезным. Полезно предоставлять узкие функции с понятным назначением, а не универсальный доступ к командной оболочке или произвольным адресам. Границы определяет приложение и подтверждённая задача.
Проверить данные до вызова
В Go аргументы удобно описывать явными типами, однако успешное чтение JSON ещё не означает корректность запроса по смыслу. Идентификатор может оказаться пустым, иметь неподходящий формат или относиться к недоступному объекту. Поэтому отдельно проверяют обязательные поля, допустимые значения и права на конкретный объект. Возвращённый инструментом текст тоже остаётся данными. Если описание товара содержит фразу о необходимости отключить ограничения, её нельзя принимать за управляющую инструкцию. Проверка полномочий не должна зависеть от того, насколько убедительно написан такой текст.
Передавать отмену через контекст
Пакет context позволяет передавать срок выполнения и сигнал отмены между функциями. Для ограниченного по времени шага используется производный контекст, например через context.WithTimeout, а возвращённую функцию отмены вызывают для освобождения связанных ресурсов. Контекст нужно передавать дальше в операции, которые его поддерживают. Он не является волшебным выключателем: код должен реагировать на отмену, а уже выполненное внешнее действие не откатывается от закрытия Done. Если ответ не получен вовремя, результат иногда остаётся неизвестным. Это нужно отражать в состоянии операции, а не автоматически объявлять успех или неудачу.
Ограничить цикл и сохранить проверяемый след
Агент может несколько раз запрашивать инструменты, поэтому полезны пределы числа шагов и общего времени. Для каждого шага фиксируют выбранный инструмент, проверенные аргументы и результат без лишних секретов или персональных данных. Учебный помощник должен различать товар не найден, остаток равен нулю и сервис недоступен. Эти исходы нельзя превращать в одинаковую фразу товара нет. Финальный ответ опирается на действительно полученные сведения и обозначает неизвестность. При испытании полезно использовать заглушку инструмента, чтобы проверить отказ, задержку и неожиданный формат без изменения настоящих данных.
Попробуйте на практике
На бумаге опишите диспетчер инструментов для помощника, которому разрешено только читать остаток вымышленного товара. Подключать модель и сервисы не требуется.
- Задайте один разрешённый инструмент и обязательный аргумент: непустой идентификатор товара.
- Рассмотрите три запроса: корректное чтение, чтение с пустым идентификатором и изменение цены.
- Укажите, какой запрос выполняется, какой отклоняется из-за данных и какой из-за отсутствия полномочий.
- Добавьте исходы инструмента: остаток ноль, товар не найден и превышение времени ожидания.
- Определите ограничение числа шагов и сформулируйте итоговый ответ для случая, когда достоверный остаток не получен.
Как проверить результат. Выполняется только разрешённое чтение с проверенными аргументами. Нулевой остаток, отсутствие товара и неизвестный результат различаются. Предложение модели не расширяет полномочия программы.
Частые вопросы
Достаточно ли написать ограничения в системном запросе?
Нет. Текстовая инструкция полезна, но проверки доступа, аргументов и допустимых операций должны выполняться приложением независимо от ответа модели.
Отмена контекста гарантирует, что внешнее действие не произошло?
Нет. Она сигнализирует о прекращении работы и ожидания, но не доказывает отсутствие уже выполненного действия. При неизвестном исходе требуется проверка состояния, прежде чем решать вопрос о повторе.
Самостоятельный разбор темы. Содержание конкретной обучающей программы здесь не представлено.