Eskalacja z udziałem człowieka
Zdefiniuj wyzwalacze eskalacji, które wstrzymują działanie agenta i proszą człowieka o wskazówki, gdy pewność jest niska, ma nastąpić destrukcyjne działanie lub wyczerpano limit ponowień.
Eskalacja z udziałem człowieka to bezpłatna lekcja AI Engineering Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej AI Engineering Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs AI Engineering Academy zawiera 4 lekcji w sumie.
Kiedy agenci potrzebują wskazówek człowieka
W pełni autonomiczne agenty sprawdzają się w dobrze zdefiniowanych zadaniach o niskim ryzyku. Jednak niektóre sytuacje wymagają ludzkiej oceny: niejednoznaczne instrukcje, niska pewność modelu, destrukcyjne działania, których nie można cofnąć, lub zadania, w których błąd miałby poważne konsekwencje. Eskalacja human-in-the-loop (HITL) wstrzymuje agenta w takich punktach decyzyjnych i prosi człowieka o dane wejściowe przed kontynuowaniem, łącząc wydajność automatyzacji z ludzką oceną.
Definiowanie wyzwalaczy eskalacji
Eskalacja powinna być uruchamiana przez konkretne, mierzalne warunki, a nie przez niejasne przeczucia. Zdefiniuj dla swojej aplikacji jawne wyzwalacze eskalacji. Typowe wyzwalacze obejmują: pewność modelu poniżej ustalonego progu, zamiar wykonania destrukcyjnego działania, zbliżanie się do granicy zasad, wyczerpanie limitu ponowień lub przekroczenie limitu czasu zadania. Udokumentuj wyzwalacze w kodzie jako nazwane stałe, aby można było je dostrajać bez zmieniania logiki sterowania przepływem.
from enum import Enum
class EscalationReason(Enum):
LOW_CONFIDENCE = 'low_confidence' # model uncertainty
DESTRUCTIVE_ACTION = 'destructive_action' # irreversible change
AMBIGUOUS_TASK = 'ambiguous_task' # unclear instructions
RETRY_BUDGET_EXHAUSTED = 'retry_exhausted' # too many failures
POLICY_BOUNDARY = 'policy_boundary' # approaching limit
HUMAN_REQUESTED = 'human_requested' # explicit request
TIMEOUT = 'timeout' # took too long
ESCALATION_THRESHOLDS = {
'min_confidence': 0.6,
'max_retries': 5,
'max_runtime_minutes': 30,
}Wykrywanie niskiej pewności
Poproś model o wyrażenie poziomu pewności proponowanego działania przed jego wykonaniem. Wynik poniżej ustalonego progu uruchamia eskalację. Użyj ustrukturyzowanego sprawdzenia pewności, obejmującego zarówno wartość liczbową, jak i krótkie uzasadnienie, aby osoba dokonująca oceny dokładnie rozumiała, dlaczego agent nie był pewny. Uzasadnienie pomaga człowiekowi udzielić ukierunkowanych wskazówek zamiast przeglądać całą historię zadania.
from pydantic import BaseModel
class ConfidenceCheck(BaseModel):
proposed_action: str
confidence: float # 0.0 to 1.0
uncertainty_reason: str | None
proceed: bool
async def check_confidence(context: str, proposed_action: str) -> ConfidenceCheck:
return await judge_client.chat.completions.create(
model='gpt-4o',
response_model=ConfidenceCheck,
messages=[{
'role': 'user',
'content': f'Context: {context}\n\nI am about to: {proposed_action}\n\nHow confident am I that this is correct? Be honest about uncertainty.'
}]
)Wykrywanie destrukcyjnych działań
Oznacz narzędzia wykonujące nieodwracalne działania flagą destructive=True i wymagaj potwierdzenia człowieka przed ich uruchomieniem. Przykłady to usuwanie plików, wysyłanie wiadomości e-mail do rzeczywistych użytkowników, wprowadzanie niemożliwych do wycofania zmian w bazie danych, obciążanie klienta lub publikowanie treści publicznie. Agent musi zatrzymać się przed tymi działaniami i zaczekać na wyraźną zgodę człowieka, nawet jeśli poza tym działa autonomicznie.
from dataclasses import dataclass
from typing import Callable
@dataclass
class Tool:
name: str
func: Callable
destructive: bool = False
description: str = ''
tools = [
Tool('search_web', search_web, destructive=False),
Tool('read_file', read_file, destructive=False),
Tool('write_file', write_file, destructive=True, description='Overwrites existing file'),
Tool('send_email', send_email, destructive=True, description='Sends real email to user'),
Tool('delete_records', delete_records, destructive=True, description='Permanent DB deletion'),
]
def requires_approval(tool: Tool) -> bool:
return tool.destructiveWstrzymywanie agenta i oczekiwanie na dane wejściowe
Gdy zadziała wyzwalacz eskalacji, zapisz punkt kontrolny (aby można było wznowić zadanie), utwórz rekord żądania eskalacji i powiadom osobę dokonującą oceny. Agent przerywa przetwarzanie i oczekuje. Człowiek analizuje eskalację za pomocą panelu lub powiadomienia, przekazuje wskazówki albo zgodę, a agent wznawia działanie od punktu kontrolnego, uwzględniając te wskazówki jako nową wiadomość w historii.
import asyncio
async def escalate_and_wait(task_id: str, reason: EscalationReason, context: str,
question: str, timeout_hours: int = 24) -> str:
# Save checkpoint
save_checkpoint(load_checkpoint(task_id))
# Create escalation record
escalation_id = create_escalation(task_id, reason, context, question)
# Notify reviewer
notify_reviewer(escalation_id, question)
# Wait for response (polling with timeout)
deadline = asyncio.get_event_loop().time() + timeout_hours * 3600
while asyncio.get_event_loop().time() < deadline:
response = get_escalation_response(escalation_id)
if response:
return response.guidance
await asyncio.sleep(60) # check every minute
raise TimeoutError(f'Escalation {escalation_id} not answered within {timeout_hours}h')Tworzenie interfejsu osoby dokonującej oceny
Recenzenci potrzebują prostego interfejsu do obsługi eskalacji. Należy wyświetlać co najmniej: opis zadania, dotychczasowy postęp agenta, konkretne pytanie lub proponowane działanie wymagające zatwierdzenia oraz przyciski „Zatwierdź”, „Odrzuć” i „Przekaż wskazówki”. Każdą decyzję recenzenta należy rejestrować wraz z jego tożsamością i znacznikiem czasu na potrzeby audytu. Zarówno bot Slack, jak i prosty formularz internetowy dobrze sprawdzą się w zespołach wewnętrznych.
# FastAPI escalation endpoint
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class EscalationResponse(BaseModel):
escalation_id: str
decision: str # 'approve', 'reject', 'guide'
guidance: str | None = None
reviewer_id: str
@app.post('/escalations/{escalation_id}/respond')
async def respond_to_escalation(esc_id: str, response: EscalationResponse):
escalation = get_escalation(esc_id)
if not escalation or escalation.status != 'pending':
return {'error': 'Escalation not found or already resolved'}
save_escalation_response(esc_id, response)
return {'status': 'response_recorded', 'task_will_resume': True}Wprowadzanie wskazówek człowieka do kontekstu agenta
Po odpowiedzi człowieka należy wprowadzić jego wskazówki jako nową wiadomość do historii konwersacji agenta, zanim agent wznowi działanie. Należy oznaczyć je jako pochodzące od „supervisor”, aby odróżnić je od własnych obserwacji agenta. Agent może następnie odwołać się do tych wskazówek w kolejnym kroku. Jeśli człowiek odrzucił proponowane działanie, należy uwzględnić instrukcje określające, co zrobić zamiast niego.
def inject_human_guidance(messages: list, decision: str, guidance: str | None) -> list:
if decision == 'approve':
messages.append({
'role': 'user',
'content': 'Supervisor: Your proposed action has been approved. Proceed.'
})
elif decision == 'reject':
messages.append({
'role': 'user',
'content': f'Supervisor: Your proposed action was rejected. Instead: {guidance}'
})
elif decision == 'guide':
messages.append({
'role': 'user',
'content': f'Supervisor: Additional guidance: {guidance}'
})
return messagesŚledzenie metryk eskalacji
Należy monitorować liczbę eskalacji, ich przyczyny oraz czas odpowiedzi. Duża liczba eskalacji wskazuje, że agent nie jest wystarczająco pewny siebie — zadanie może być zbyt niejednoznaczne, model może potrzebować lepszych instrukcji albo progi pewności mogą być ustawione zbyt nisko. Długi czas odpowiedzi wskazuje na problemy z obciążeniem recenzentów. Metryki te pomagają dostosować równowagę między automatyzacją a udziałem człowieka, aby ograniczyć niepotrzebne przerwy, a jednocześnie pozostawić człowieka w procesie przy decyzjach rzeczywiście ryzykownych.
def escalation_report(db_connection, days: int = 7) -> dict:
# SQL query (pseudocode)
rows = db_connection.execute('''
SELECT
reason,
COUNT(*) as count,
AVG(EXTRACT(EPOCH FROM (responded_at - created_at)) / 3600) as avg_response_hours,
SUM(CASE WHEN decision = 'approve' THEN 1 ELSE 0 END) as approvals,
SUM(CASE WHEN decision = 'reject' THEN 1 ELSE 0 END) as rejections
FROM escalations
WHERE created_at > NOW() - INTERVAL '%s days'
GROUP BY reason
ORDER BY count DESC
''' % days).fetchall()
return [dict(r) for r in rows]Stopniowe rozszerzanie autonomii
Należy rozpocząć od wysokiej wrażliwości na eskalacje (niskiego progu pewności i eskalowania wszystkich działań destrukcyjnych), a następnie stopniowo zmniejszać częstotliwość eskalacji w miarę zdobywania zaufania do zachowania agenta. Należy śledzić, które eskalacje kończą się decyzją „Zatwierdź”, a które prowadzą do rzeczywistych korekt. Stale wysoki odsetek zatwierdzeń dla określonego typu wyzwalacza oznacza, że można bezpiecznie zautomatyzować ten wyzwalacz, zmniejszając obciążenie człowieka i zachowując nadzór tam, gdzie ma on rzeczywiste znaczenie.
# Autonomy expansion strategy:
# Week 1: escalate for ALL destructive actions
# Week 2: auto-approve file writes to /tmp (low-risk), escalate others
# Week 4: auto-approve all file writes, escalate only email/DB changes
# Week 8: auto-approve emails under 10 recipients, escalate mass emails
# Track approval rates per trigger type:
# Tool: write_file -> 98% approve -> safe to automate
# Tool: send_email -> 89% approve -> near-automate with content check
# Tool: delete_records -> 43% approve -> always escalateAwaryjne przejęcie kontroli i anulowanie zadania
Zawsze należy zapewnić mechanizm awaryjnego przejęcia kontroli, który pozwala człowiekowi natychmiast anulować wykonywane zadanie agenta. Jeśli agent działa nieprawidłowo — wywołuje narzędzia, których nie powinien wywoływać, lub podejmuje działania wykraczające poza jego zakres — człowiek musi mieć możliwość zatrzymania go w ciągu kilku sekund. Należy zaimplementować sygnał anulowania (flagę w bazie danych, którą agent sprawdza przy każdym kroku) i zadbać o odrzucanie wyników wywołań narzędzi, jeśli agent zostanie anulowany w trakcie kroku.
async def run_agent_with_cancel(task_id: str, messages: list) -> str:
for step in range(MAX_ITERATIONS):
# Check cancel flag at start of every step
if redis_client.get(f'agent:cancel:{task_id}'):
save_final_status(task_id, 'cancelled')
return 'Task cancelled by operator.'
response = await get_next_action(messages)
if response.is_final:
return response.answer
result = await execute_tool(response.tool, response.args)
messages.append({'role': 'user', 'content': result})
save_checkpoint_after_step(task_id, step, messages)
return 'Max iterations reached'Dostosowywanie progów eskalacji
Progi eskalacji wymagają dostrojenia. Jeśli próg pewności jest zbyt wysoki, agent eskaluje niemal każde działanie, przeciążając recenzentów. Jeśli jest zbyt niski, ryzykowne działania mogą przejść bez kontroli. W pierwszym tygodniu należy rozpocząć od konserwatywnych progów, śledzić liczbę eskalacji i odsetek zatwierdzeń przez recenzentów, a następnie wprowadzać korekty. Stabilny system powinien eskalować 5–15% zadań z powodu problemów z pewnością oraz niemal 100% działań destrukcyjnych, przy ogólnym odsetku zatwierdzeń przekraczającym 80%.
# Threshold tuning guide:
# Escalation rate vs quality trade-off:
#
# confidence_threshold=0.8 -> 35% escalation rate (too many)
# confidence_threshold=0.6 -> 12% escalation rate (target)
# confidence_threshold=0.4 -> 4% escalation rate (too few)
#
# Weekly review of escalation decisions:
# - Approval rate > 90%: lower threshold (too conservative)
# - Approval rate < 70%: raise threshold (not catching real issues)
# - Target: 75-85% approval rateSzybkie sprawdzenie
Sprawdź swoją wiedzę na temat projektowania eskalacji z udziałem człowieka.
Podsumowanie lekcji
W tej lekcji dowiedziałeś się, że: wyzwalacze eskalacji określają precyzyjne warunki, w których agent musi wstrzymać działanie i poprosić człowieka o wskazówki, flagi działań destrukcyjnych przy narzędziach wymuszają zatwierdzenie operacji nieodwracalnych, a stopniowe rozszerzanie autonomii pozwala bezpiecznie zwiększać poziom automatyzacji w miarę zdobywania zaufania do agenta. W następnej części zaprojektujemy architekturę produkcyjną naszego projektu końcowego.
Często zadawane pytania
Czy lekcja „Eskalacja z udziałem człowieka” jest bezpłatna?
Tak — pełny tekst „Eskalacja z udziałem człowieka” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu AI Engineering Academy, przejdź na CoddyKit PRO. Kurs AI Engineering Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Eskalacja z udziałem człowieka”?
Zdefiniuj wyzwalacze eskalacji, które wstrzymują działanie agenta i proszą człowieka o wskazówki, gdy pewność jest niska, ma nastąpić destrukcyjne działanie lub wyczerpano limit ponowień. Ćwiczysz AI Engineering Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć AI Engineering Academy?
Nie wymagamy żadnego doświadczenia. AI Engineering Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.
Ile czasu zajmuje lekcja „Eskalacja z udziałem człowieka”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji AI Engineering Academy?
Tak. Każda lekcja AI Engineering Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Klasyfikowanie trybów awarii agentów
- Samokorekta i refleksyjne promptowanie
- Punkty kontrolne i wznawianie zadań
- Eskalacja z udziałem człowieka