Как проверить, что делает агент ИИ, когда его инструменты не работают

Агент ИИ вызывает средства: HTTP API, серверы MCP и другие службы. Эти средства завершаются по тайм-ауту, упираются в лимиты запросов, возвращают ошибки и отправляют данные в структурах, которых вы не ожидали. Модель решает, что делать дальше на основе того, что ваш код передает обратно в него. Если ваш код возвращает исключение, пустую строку или ничего не возвращает вообще после длительного ожидания, агент ведет себя по-другому, чем если он получает четкую ошибку.

Как происходят сбои инструментов

  • Агент зависает. Вызов средства без тайм-аута держит пользователя в ожидании.
  • Агент зацикливается. Модель снова и снова вызывает неисправный инструмент, используя маркеры и ограничение скорости инструмента.
  • Агент скрывает это. Код подавляет ошибку, и модель отвечает, как будто инструмент отработал успешно.
  • Агент аварийно завершает работу. Необработанное исключение прерывает весь диалог.

Как устранять сбои инструментов

  1. Задайте время ожидания для каждого вызова средства и бюджет для всего хода. Спецификация MCP говорит, что клиенты должны реализовывать время ожидания для вызовов инструментов.
  2. Повторите попытку при временных ошибках в коде. Обрабатывайте ответы 429 и 503 в коде инструмента, учитывайте Retry-After и ограничивайте число попыток, чтобы модели не приходилось решать, когда повторять попытку.
  3. Возвращать модели сбои в виде четких результатов. MCP отделяет ошибки протокола, такие как неизвестный инструмент или недопустимые аргументы, от ошибок выполнения инструмента, таких как сбой API. Он сообщает об ошибках выполнения в результате работы инструмента isError: true, поэтому модель может увидеть, что пошло не так. Скажите, что не удалось и имеет ли смысл повторить попытку.
  4. Ограничьте количество вызовов инструментов за ход. После заданного количества сбоев остановите и сообщите пользователю.
  5. Проверяйте результаты средства перед передачей их в модель. Спецификация MCP говорит, что клиенты должны делать это и должны проверять структурированные результаты по схеме выходных данных инструмента, если таковая имеется.
  6. Сообщите пользователю, что не работало. Ответ, основанный на неудачном вызове инструмента, должен прямо указать на это.

Как протестировать обработку сбоев инструмента в агенте

Approach Что вы найдете Чего вам не хватает
Проводите модульное тестирование оболочки средства с клиентом-заглушкой Как код сопоставляет ошибку, которую вы описали То, что модель делает с ней, и как настоящий инструмент не справляется
Нарушить работу реального инструмента, например остановить сервер или отозвать ключ Реальный отказ такого рода Лимиты частоты запросов, медленные ответы и неправильные данные, которые невозможно вызвать по запросу
Напишите поддельный API или сервер MCP Любой ответ, который вы прописываете Вам нужно указать агенту на подделку, и он отклоняется от реального инструмента
Перехват реального трафика инструмента агента и внедрение сбоев Что агент и модель делают с ошибками, задержками и плохими данными из реального средства Ваш код в изоляции. Оставьте это для модульных тестов.

Выходные данные модели могут отличаться от запуска к запуску, поэтому запустите каждый сценарий сбоя несколько раз.

Попробуйте в вашем приложении

Dev Proxy находится между агентом и его инструментами и внедряет сбои без изменений в коде агента.

Для инструментов, вызывающих HTTP API, объединяйте случайные ошибки, задержку и убедитесь, что агент ожидает столько, сколько запрашивает API:

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v3.3.1/rc.schema.json",
  "plugins": [
    {
      "name": "RetryAfterPlugin",
      "enabled": true,
      "pluginPath": "~appFolder/plugins/DevProxy.Plugins.dll"
    },
    {
      "name": "LatencyPlugin",
      "enabled": true,
      "pluginPath": "~appFolder/plugins/DevProxy.Plugins.dll",
      "configSection": "latencyPlugin"
    },
    {
      "name": "GenericRandomErrorPlugin",
      "enabled": true,
      "pluginPath": "~appFolder/plugins/DevProxy.Plugins.dll",
      "configSection": "errorsContosoApi"
    }
  ],
  "urlsToWatch": [
    "https://api.contoso.com/*"
  ],
  "latencyPlugin": {
    "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v3.3.1/latencyplugin.schema.json",
    "minMs": 2000,
    "maxMs": 10000
  },
  "errorsContosoApi": {
    "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v3.3.1/genericrandomerrorplugin.schema.json",
    "errorsFile": "errors-contoso-api.json",
    "rate": 50
  }
}

Определите ошибки в errors-contoso-api.json, как описано в Протестируйте мое приложение со случайными ошибками. Установите для Retry-After значение @dynamic в ваших ответах 429. RetryAfterPlugin проверяет только их.

Для серверов MCP, использующих STDIO, запустите сервер через devproxy stdio с конфигурацией, которая включает MockStdioResponsePlugin, как показано в stdio примере конфигурации. Сохраните его как devproxyrc-stdio.json. Затем поместите это в stdio-mocks.json, чтобы вернуть ошибку выполнения средства для каждого tools/call запроса:

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v3.3.1/mockstdioresponseplugin.mocksfile.schema.json",
  "mocks": [
    {
      "request": {
        "bodyFragment": "tools/call"
      },
      "response": {
        "stdout": "{\"jsonrpc\":\"2.0\",\"id\":@stdin.body.id,\"result\":{\"content\":[{\"type\":\"text\",\"text\":\"Failed to fetch weather data: API rate limit exceeded\"}],\"isError\":true}}\n"
      }
    }
  ]
}
devproxy stdio --config-file devproxyrc-stdio.json npx -y @modelcontextprotocol/server-filesystem

Чтобы ваш агент использовал это, измените команду в конфигурации сервера MCP агента, чтобы сервер запускался через devproxy stdio. Используйте nth свойство у mock-объекта, чтобы завершить только определенный вызов, и добавьте LatencyPlugin, чтобы замедлить ответы сервера.

Чтобы проверить, что делает агент при сбое самой модели, LanguageModelFailurePlugin заставляет модель галлюцинировать, игнорировать инструкции или отвечать в неправильном формате. См. статью "Тестирование приложения с ошибками языковой модели".

Чтобы установить Dev Proxy, см. статью «Настройка Dev Proxy».

Дальнейшие действия

См. также