Claude Certified Architect · Модуль 1 · Урок 1.4
Рабочие процессы с программным контролем и передачей эстафеты
Суть
Детерминированные бизнес-правила (проверка личности, лимиты возвратов) навязываются программными воротами (gates) в коде приложения, а не инструкциями в промпте. Промпт — рекомендация с ненулевой долей сбоев; ворота — обязательное правило.
Предусловия и эстафета
Ворота-предусловия перехватывают вызов инструмента и блокируют исполнение, пока не выполнены предыдущие условия (например, get_customer установил флаг проверенного клиента). При эскалации к человеку передавайте структурированный пакет (ID клиента, первопричина, находки, рекомендованное действие), а не голый сигнал «нужна помощь».
func beforeToolCall(toolName string, toolInput map[string]any, session *Session) GateResult {
// Финансовые/идентификационные операции защищены воротами.
needsIdentity := map[string]bool{"lookup_order": true, "process_refund": true}
if needsIdentity[toolName] && session.VerifiedCustomerID == "" {
// Жёстко блокируем до проверки личности, даже если клиент сам назвал ID.
return Block{Reason: "Сначала вызовите get_customer и подтвердите личность клиента"}
}
if toolName == "process_refund" {
if amount, _ := toolInput["amount"].(float64); amount > 500 {
return Handoff{
To: "human_manager",
Package: map[string]any{
"customer_id": session.VerifiedCustomerID,
"amount": amount,
"root_cause": session.Investigation,
"recommended_action": "approve_refund",
},
}
}
}
return Allow{}
}Anti-patterns
| Ловушка | Почему не работает | Верный паттерн |
|---|---|---|
| Сделать проверку «обязательной» через system prompt | У промптов ненулевая доля сбоев; «обязательно» — рекомендация | Программные ворота физически блокируют вызов инструмента |
| Добавить few-shot примеры правильного порядка вызовов | Повышают вероятность, но не дают гарантии | Ворота для финансов/личности; few-shot — для классификации |
| Эскалировать фразой «нужна помощь человека» | У человека нет контекста — расследование с нуля | Структурированная эстафета: ID, первопричина, находки, действие |
Exam traps
| Ловушка | Почему не работает | Верный паттерн |
|---|---|---|
Валидировать null-ID в самом process_refund | Ловит ошибку на 3 шага позже источника | Ворота на выходе lookup_order: ошибка и остановка сразу |
| Постфактум-аудит вместо предзащиты | Деньги уже ушли — это восстановление, не предотвращение | Предвызовная проверка (pre-call guard) до движения средств |
Практическое задание (T4)
- Хранить
verified_customer_idв состоянии сессии. - Построить ворота, блокирующие
lookup_orderиprocess_refund, покаget_customerне установит флаг. - Проверить обход: клиент сам называет order ID — ворота всё равно срабатывают.
- Реализовать эстафету для возвратов >$500 с полным пакетом.
- Сравнить с подходом «только промпт»: 10 тестов, посчитать обходы.
Проверка знаний
Агент поддержки клиентов
12% обращений пропускают get_customer и вызывают lookup_order лишь по имени клиента. Иногда путают аккаунты и оформляют неверные возвраты. Что сделать?
Верный ответ: A
A верно. 12% сбоев доказывают, что подход через промпт недостаточен. Программные ворота дают детерминированную гарантию. B и C вероятностны. D решает, какие инструменты существуют, а не порядок их вызова.
Агент поддержки клиентов
Процесс из 5 шагов (identify → lookup → assess → calculate → process_refund). У 8% возвратов customer_id равен null из-за тихого сбоя lookup_order тремя шагами ранее. Что исправить?
Верный ответ: D
D верно. Ворота у источника сбоя не дают null распространиться дальше. Валидация в process_refund ловит проблему на 3 шага позже. Повторы помогают при временных сбоях, но не предотвращают распространение null. Промпт-инструкции имеют долю несоблюдения.
Агент поддержки клиентов
Правило: возврат не может превышать сумму заказа. Сумма заказа берётся из lookup_order (шаг 2), размер возврата — из calculate_compensation (шаг 4). Иногда process_refund превышает заказ из-за ошибок расчёта. Что сделать?
Верный ответ: B
B верно. Предвызовная проверка в коде срабатывает до движения средств; детерминированное сравнение — 100% контроль. A вероятностно. C — это восстановление, а не предотвращение. D добавляет аудируемость, но не контроль.