Protocolli di trasferimento a operatori umani
Rilevamento dei criteri di trasferimento e passaggio fluido agli operatori umani.
Protocolli di trasferimento a operatori umani è una lezione AI Agents gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento AI Agents, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso AI Agents include 4 lezioni in totale.
Quando deve intervenire una persona?
Non tutte le conversazioni devono essere gestite interamente da un agente AI. Sapere quando passare la conversazione a una persona è importante quanto sapere come rispondere. Cause comuni:
- Il cliente chiede esplicitamente di parlare con una persona
- Rabbia o stato di agitazione rilevati
- Situazione complessa o ambigua, al di fuori dell'ambito dell'agente
- Questioni delicate sul piano legale, della sicurezza o della conformità
Rilevamento delle cause di passaggio a una persona
Utilizzi un classificatore LLM per rilevare in tempo reale le cause che richiedono il passaggio a una persona. Esegua il controllo a ogni turno dell'agente, non solo sul primo messaggio.
import openai, json
client = openai.OpenAI(api_key='YOUR_OPENAI_KEY')
def should_handoff(message: str, history: list[dict]) -> dict:
context = '\n'.join(f"{m['role']}: {m['content']}" for m in history[-4:])
prompt = (
f'Conversation context:\n{context}\n'
f'Latest message: "{message}"\n'
f'Should this be handed to a human agent? Reasons: '
f'angry_customer, explicit_human_request, complex_issue, legal_risk, other.\n'
f'JSON: {{"handoff": true/false, "reason": "..."}}'
)
resp = client.chat.completions.create(
model='gpt-4o-mini',
messages=[{'role': 'user', 'content': prompt}],
response_format={'type': 'json_object'}
)
return json.loads(resp.choices[0].message.content)Passaggio assistito e non assistito
Esistono due modalità di passaggio a una persona:
- Passaggio assistito: l'agente presenta sé stesso e il cliente all'operatore umano, riepiloga la conversazione e attende la conferma dell'operatore prima di terminare.
- Passaggio non assistito: la conversazione viene trasferita con un riepilogo della trascrizione e l'agente si disconnette immediatamente.
Il passaggio assistito riduce la frustrazione del cliente, ma richiede la disponibilità in tempo reale di un operatore umano.
Generazione del riepilogo della conversazione
Prima di passare la conversazione a una persona, l'agente genera un riepilogo strutturato della conversazione. Questo riepilogo viene mostrato all'operatore umano come contesto, evitando che il cliente debba ripetersi.
def generate_handoff_summary(history: list[dict]) -> str:
transcript = '\n'.join(
f"{m['role'].upper()}: {m['content']}" for m in history
)
prompt = (
f'Summarize this support conversation for a human agent.\n'
f'Include: customer issue, what was tried, current status, and urgency level.\n'
f'Be brief (3-5 sentences).\n\n'
f'TRANSCRIPT:\n{transcript}'
)
resp = client.chat.completions.create(
model='gpt-4o-mini',
messages=[{'role': 'user', 'content': prompt}]
)
return resp.choices[0].message.content
summary = generate_handoff_summary([
{'role': 'user', 'content': 'My account was charged twice for January'},
{'role': 'assistant', 'content': 'I can look into that for you...'}
])
print(summary)Creazione di un ticket Zendesk durante il passaggio
Quando passa la conversazione a una persona, crei un ticket Zendesk con il riepilogo e la trascrizione completa. L'operatore umano apre il ticket e dispone immediatamente del contesto.
import requests
ZENDESK_DOMAIN = 'yourcompany.zendesk.com'
ZENDESK_TOKEN = 'YOUR_ZENDESK_API_TOKEN'
ZENDESK_EMAIL = 'agent@yourcompany.com'
def create_zendesk_ticket(customer_email: str, subject: str,
summary: str, transcript: str) -> str:
payload = {
'ticket': {
'subject': subject,
'comment': {'body': f'AI Agent Summary:\n{summary}\n\nFull Transcript:\n{transcript}'},
'requester': {'email': customer_email},
'tags': ['ai_handoff'],
'priority': 'high'
}
}
resp = requests.post(
f'https://{ZENDESK_DOMAIN}/api/v2/tickets.json',
json=payload,
auth=(f'{ZENDESK_EMAIL}/token', ZENDESK_TOKEN)
)
resp.raise_for_status()
return str(resp.json()['ticket']['id'])Passaggio di una conversazione a un operatore in Intercom
Con Intercom, effettui il passaggio assegnando la conversazione a un team o a un agente specifico tramite l'API di Intercom. L'operatore umano riceve una notifica con la conversazione pronta per essere ripresa.
import requests
INTERCOM_TOKEN = 'YOUR_INTERCOM_ACCESS_TOKEN'
def handoff_to_intercom_team(conversation_id: str, team_id: str,
note: str) -> bool:
headers = {
'Authorization': f'Bearer {INTERCOM_TOKEN}',
'Content-Type': 'application/json'
}
# Add a note with the AI summary
requests.post(
f'https://api.intercom.io/conversations/{conversation_id}/parts',
headers=headers,
json={'type': 'note', 'body': note}
)
# Assign to human team
resp = requests.put(
f'https://api.intercom.io/conversations/{conversation_id}/parts',
headers=headers,
json={'type': 'assignment', 'assignee_id': team_id,
'message_type': 'assignment'}
)
return resp.status_code == 200Il messaggio di passaggio al cliente
È importante il messaggio che il cliente riceve durante il passaggio. Deve riconoscere il trasferimento, indicare i tempi di attesa previsti e comunicare che il problema viene preso sul serio.
def generate_handoff_message(reason: str, wait_minutes: int = 5) -> str:
messages = {
'explicit_human_request':
f'Of course! I am connecting you with a human agent right now. '
f'Estimated wait: {wait_minutes} minutes. Your conversation history '
f'has been shared so you will not need to repeat anything.',
'angry_customer':
f'I completely understand your frustration. Let me get a senior '
f'team member on the line immediately. Wait: ~{wait_minutes} min.',
'complex_issue':
f'This situation needs specialist attention. I am escalating now '
f'and sharing all the context we have discussed. Wait: ~{wait_minutes} min.',
'legal_risk':
f'This matter requires our compliance team. Connecting you now.'
}
return messages.get(reason, f'Connecting you with a human agent. ~{wait_minutes} min wait.')
if __name__ == '__main__':
print(generate_handoff_message('angry_customer', wait_minutes=3))
print(generate_handoff_message('explicit_human_request'))
Accodamento quando non è disponibile alcuna persona
Al di fuori dell'orario lavorativo o nei periodi di forte affluenza, potrebbe non essere subito disponibile alcun operatore umano. Metta in coda il passaggio, invii al cliente una conferma con un numero di riferimento e avvisi il personale reperibile tramite Slack o PagerDuty.
import requests
SLACK_WEBHOOK = 'https://hooks.slack.com/services/YOUR/WEBHOOK/URL'
def notify_on_call(ticket_id: str, summary: str, priority: str):
payload = {
'text': f'*New AI Handoff* [{priority.upper()}]',
'attachments': [{
'color': '#ff0000' if priority == 'high' else '#ffcc00',
'fields': [
{'title': 'Ticket ID', 'value': ticket_id, 'short': True},
{'title': 'Summary', 'value': summary[:500]}
]
}]
}
requests.post(SLACK_WEBHOOK, json=payload)Comportamento dell'agente dopo il passaggio
Dopo aver attivato un passaggio a una persona, l'agente deve smettere di tentare di risolvere il problema. Può comunque rispondere a domande fattuali, come lo stato di un ordine o i link alle policy, ma non deve assumere impegni né prendere decisioni.
def agent_post_handoff_response(message: str, handoff_complete: bool) -> str:
if not handoff_complete:
return 'Connecting you now...'
# Still answer simple factual questions
simple_keywords = ['status', 'where', 'when', 'policy', 'link']
if any(kw in message.lower() for kw in simple_keywords):
return 'I can help with that while you wait for the agent.'
# Defer everything else
return (
'Your case has been assigned to a specialist. '
'They will respond shortly. I will step back to avoid confusion.'
)
if __name__ == '__main__':
print(agent_post_handoff_response('Where is my order?', handoff_complete=True))
print(agent_post_handoff_response('I want a refund now', handoff_complete=True))
Monitoraggio delle metriche dei passaggi
Misuri il tasso di passaggio, la distribuzione delle cause e il tempo di risoluzione successivo al passaggio. Un tasso elevato di passaggi per uno specifico intento indica che l'agente necessita di una copertura migliore per quell'argomento.
from collections import Counter
import json
handoff_log = [] # In production: a database table
def record_handoff(session_id: str, reason: str, turn_number: int):
handoff_log.append({
'session_id': session_id,
'reason': reason,
'turns_before_handoff': turn_number
})
def handoff_analytics() -> dict:
reasons = Counter(h['reason'] for h in handoff_log)
avg_turns = sum(h['turns_before_handoff'] for h in handoff_log) / max(len(handoff_log), 1)
return {
'total_handoffs': len(handoff_log),
'reason_breakdown': dict(reasons),
'avg_turns_before_handoff': round(avg_turns, 1)
}
if __name__ == '__main__':
record_handoff('s1', 'angry_customer', 4)
record_handoff('s2', 'complex_issue', 7)
record_handoff('s3', 'angry_customer', 2)
stats = handoff_analytics()
print(f"Total handoffs: {stats['total_handoffs']}")
print(f"Reasons: {stats['reason_breakdown']}")
print(f"Avg turns before handoff: {stats['avg_turns_before_handoff']}")
Orchestrazione completa del passaggio
Combini tutti i passaggi in una funzione execute_handoff() che l'agente chiama quando rileva una causa di passaggio.
def execute_handoff(session: dict, reason: str) -> str:
# 1. Generate summary
summary = generate_handoff_summary(session['history'])
transcript = '\n'.join(
f"{m['role']}: {m['content']}" for m in session['history']
)
# 2. Create ticket
ticket_id = create_zendesk_ticket(
session['customer_email'],
f'AI Handoff: {reason}',
summary,
transcript
)
# 3. Notify on-call team
notify_on_call(ticket_id, summary, priority='high')
# 4. Record metrics
record_handoff(session['id'], reason, len(session['history']))
# 5. Return customer-facing message
wait = 5 # fetch from queue depth in production
return generate_handoff_message(reason, wait)Qual è la differenza fondamentale tra un passaggio assistito e uno non assistito?
La scelta della modalità di passaggio corretta influisce sull'esperienza del cliente e sulla complessità operativa. Comprendere la differenza aiuta a implementare il protocollo appropriato.
Riepilogo dei protocolli di passaggio a una persona
Un passaggio efficace richiede: rilevamento delle cause, come rabbia, richiesta esplicita o complessità, generazione di un riepilogo per l'operatore umano, creazione di un ticket in Zendesk/Intercom con la trascrizione completa, notifica al personale reperibile e un messaggio chiaro al cliente sulle aspettative.
Dopo il passaggio, l'agente si fa da parte e rimette ogni decisione all'operatore umano.
Impara AI Agents con un tutor IA — gratis
Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.
- Corsi
- 60
- Lezioni
- 239
Domande Frequenti
La lezione «Protocolli di trasferimento a operatori umani» è gratuita?
Sì — il testo completo di «Protocolli di trasferimento a operatori umani» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso AI Agents, passa a CoddyKit PRO. Il corso AI Agents include 4 lezioni in totale.
Cosa imparerò in «Protocolli di trasferimento a operatori umani»?
Rilevamento dei criteri di trasferimento e passaggio fluido agli operatori umani. Eserciti AI Agents con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare AI Agents?
Non è richiesta alcuna esperienza precedente. AI Agents su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.
Quanto tempo richiede la lezione «Protocolli di trasferimento a operatori umani»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione AI Agents?
Sì. Ogni lezione AI Agents include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Instradamento dei ticket e logica di escalation
- Integrazione CRM: Salesforce e HubSpot
- Protocolli di trasferimento a operatori umani
- Gestione del contesto e della cronologia dei clienti