Claude Certified Architect · Модуль 5 · Урок 5.3
Распространение ошибок в многоагентных системах
Суть
Структурированный контекст ошибки (errorType, attemptedQuery, partialResults, alternativeApproaches, isRetryable) позволяет координатору восстановиться разумно. Различайте пустой результат (успех, нет совпадений) и сбой доступа (ошибка, тайм-аут/недоступность).
Локальный повтор и чек-пойнты
Сначала локальный повтор с экспоненциальной паузой — лишь затем распространять ошибку координатору. Сбой одного субагента не обнуляет всё исследование. Для дорогих стадий (длинная выборка) применяйте чек-пойнты в долговременное хранилище.
func webSearchError(query string, partial any) map[string]any {
return map[string]any{
"errorType": "timeout", // timeout | invalid_query | unavailable
"attemptedQuery": query,
"partialResults": partial, // то, что успели получить
"alternativeApproaches": []string{
"narrow_query_by_date_range",
"use_cached_snapshot",
},
"isRetryable": true,
}
}Anti-patterns
| Ловушка | Почему не работает | Верный паттерн |
|---|---|---|
| Молча гасить ошибки, возвращая пустой результат как успех | Координатор примет недоступность за «тема не покрыта» — восстановление невозможно | Сбои доступа — как ошибки; пустой результат — лишь для успешных запросов без совпадений |
| Завершать весь процесс при сбое одного субагента | Сбой одного источника не обнуляет всё исследование | Распространить структурированную ошибку; координатор решит повтор/альтернативу/частичное |
| Возвращать общий статус «search unavailable» | Координатор не отличит тайм-аут (повторяемый) от неверного запроса (нет) | Включить errorType, isRetryable, attemptedQuery, partialResults, альтернативы |
Exam traps
| Ловушка | Почему не работает | Верный паттерн |
|---|---|---|
| Общий статус скрывает повторяемость | Координатор не знает, стоит ли повторять | Структурированный контекст с isRetryable |
| Пустой результат как успех при сбое доступа | Закрывает путь восстановления | Различать пустой результат и сбой доступа |
| Завершение процесса при одном сбое | Предполагает, что один сбой обнуляет всё | Распространить ошибку, продолжить с остальным |
Практическое задание (T3)
- Реализовать структурированную ошибку в поисковом субагенте:
errorType,attemptedQuery,partialResults,alternativeApproaches,isRetryable. - Смоделировать тайм-аут; убедиться, что координатор получает контекст и может повторить с изменённым запросом.
- Смоделировать валидный пустой результат; убедиться, что координатор отличает его от сбоя доступа и не повторяет тот же запрос.
- Реализовать локальный повтор с экспоненциальной паузой; ошибки распространяются лишь при провале локального восстановления.
- Внедрить аннотации покрытия в синтез: помечать темы с пробелами из-за сбоев субагентов.
Проверка знаний
Тайм-аут поискового субагента
Поисковый субагент упал по тайм-ауту на сложной теме. Как организовать возврат сбоя координатору для разумного восстановления?
Верный ответ: A
A верно. Структурированный контекст даёт координатору разумные решения (повтор, альтернатива, частичное). B — локальный повтор верен, но общий статус всё равно скрывает контекст. C — худший исход: молча гасит ошибку. D завершает процесс без нужды.
Конвейер с частичным выводом субагента
Субагент 3 упал, выполнив 60% назначенных источников. Координатор синтезирует по 5 полным агентам плюс 60% частичного вывода. Что включить?
Верный ответ: C
C верно. Структурированный блок говорит синтезатору, что готово (включить находки), чего нет (не переоценивать) и сами предварительные находки — информативнее простого флага. B беднее. A теряет 60% валидной работы. D сводит на нет смысл частичного восстановления.
Конвейер с 45-минутной стадией выборки
Трёхстадийный конвейер: Retrieval → Analysis → Synthesis. Analysis иногда падает, требуя полного перезапуска. Retrieval занимает 45 минут. Какое архитектурное изменение сократит время восстановления?
Верный ответ: C
C верно. Чек-пойнтинг в долговременное хранилище: сбой Analysis возобновляется с сохранённого состояния, устраняя 45-минутный повтор Retrieval. B «кэш» подразумевает память (не переживёт сбой). A не учитывает последовательные зависимости. D создаёт более крупную точку отказа.