0Pricing
AI Agents · Lekcja

Protokoły przekazywania obsługi człowiekowi

Wykrywanie wyzwalaczy przekazania i płynne przekazywanie sprawy konsultantom.

Protokoły przekazywania obsługi człowiekowi to bezpłatna lekcja AI Agents na CoddyKit. To lekcja 3 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 Agents, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs AI Agents zawiera 4 lekcji w sumie.

Kiedy agent powinien przekazać rozmowę?

Nie każdą rozmowę powinien od początku do końca obsługiwać agent AI. Wiedza o tym, kiedy przekazać rozmowę, jest równie ważna jak wiedza o tym, jak odpowiedzieć. Typowe sytuacje:

  • Klient wyraźnie prosi o kontakt z człowiekiem
  • Wykryta złość lub silne zdenerwowanie
  • Złożona lub niejednoznaczna sytuacja wykraczająca poza zakres agenta
  • Kwestia wymagająca szczególnej uwagi prawnej, związanej z bezpieczeństwem lub zgodnością

Wykrywanie sytuacji wymagających przekazania

Należy używać klasyfikatora LLM do wykrywania w czasie rzeczywistym sytuacji wymagających przekazania rozmowy. Trzeba sprawdzać każdą turę agenta, a nie tylko pierwszą wiadomość.

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)

Przekazanie ciepłe a zimne

Istnieją dwa sposoby przekazania rozmowy:

  • Przekazanie ciepłe: agent przedstawia siebie i klienta agentowi będącemu człowiekiem, podsumowuje rozmowę i czeka na potwierdzenie człowieka przed zakończeniem swojego udziału.
  • Przekazanie zimne: rozmowa jest przekazywana wraz z podsumowaniem transkrypcji, a agent natychmiast się rozłącza.

Ciepłe przekazanie zmniejsza frustrację klienta, ale wymaga dostępności człowieka w czasie rzeczywistym.

Generowanie podsumowania rozmowy

Przed przekazaniem rozmowy agent generuje jej ustrukturyzowane podsumowanie. Podsumowanie jest wyświetlane agentowi będącemu człowiekiem jako kontekst, dzięki czemu klient nie musi ponownie przedstawiać swojej sprawy.

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)

Tworzenie zgłoszenia w Zendesk przy przekazaniu rozmowy

Podczas przekazywania rozmowy należy utworzyć w Zendesk zgłoszenie zawierające podsumowanie i pełną transkrypcję. Agent będący człowiekiem otwiera zgłoszenie i natychmiast otrzymuje potrzebny kontekst.

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'])

Przekazywanie rozmowy w Intercom

W Intercom rozmowę należy przekazać, przypisując ją do konkretnego zespołu lub agenta za pomocą interfejsu Intercom API. Agent będący człowiekiem otrzymuje powiadomienie z rozmową gotową do kontynuowania.

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 == 200

Wiadomość dla klienta przy przekazaniu rozmowy

Wiadomość otrzymywana przez klienta podczas przekazywania rozmowy ma znaczenie. Powinna potwierdzać przekazanie, określać oczekiwany czas oczekiwania i wyrażać, że problem jest traktowany poważnie.

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'))

Kolejkowanie, gdy żaden człowiek nie jest dostępny

Poza godzinami pracy lub w okresach dużego obciążenia żaden człowiek może nie być od razu dostępny. Należy umieścić przekazanie w kolejce, wysłać klientowi potwierdzenie z numerem referencyjnym oraz powiadomić dyżurujących pracowników za pośrednictwem Slack lub 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)

Zachowanie agenta po przekazaniu rozmowy

Po uruchomieniu przekazania agent powinien przestać próbować rozwiązywać problem. Może nadal odpowiadać na pytania o fakty (status zamówienia, odnośniki do zasad), ale nie powinien składać zobowiązań ani podejmować decyzji.

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))

Śledzenie wskaźników przekazywania rozmów

Należy mierzyć odsetek przekazań, rozkład ich przyczyn oraz czas rozwiązania problemu po przekazaniu. Wysoki odsetek przekazań dla konkretnej intencji wskazuje, że agent potrzebuje lepszego pokrycia tego tematu.

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']}")

Pełna orkiestracja przekazania rozmowy

Należy połączyć wszystkie kroki w funkcję execute_handoff(), którą agent wywołuje po wykryciu sytuacji wymagającej przekazania.

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)

Jaka jest kluczowa różnica między ciepłym a zimnym przekazaniem rozmowy?

Wybór właściwego sposobu przekazania wpływa na doświadczenie klienta i złożoność operacyjną. Zrozumienie tej różnicy pomaga wdrożyć odpowiedni protokół.

Podsumowanie protokołów przekazywania rozmów człowiekowi

Skuteczne przekazanie rozmowy wymaga: wykrywania sytuacji uruchamiających przekazanie (złości, wyraźnej prośby, złożoności), generowania podsumowania dla agenta będącego człowiekiem, tworzenia zgłoszenia w Zendesk/Intercom z pełną transkrypcją, powiadamiania dyżurujących pracowników oraz przekazania klientowi jasnego komunikatu określającego, czego może oczekiwać.

Po przekazaniu rozmowy agent wycofuje się i pozostawia wszystkie decyzje człowiekowi.

Często zadawane pytania

Czy lekcja „Protokoły przekazywania obsługi człowiekowi” jest bezpłatna?

Tak — pełny tekst „Protokoły przekazywania obsługi człowiekowi” 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 Agents, przejdź na CoddyKit PRO. Kurs AI Agents zawiera 4 lekcji w sumie.

Co nauczysz się w „Protokoły przekazywania obsługi człowiekowi”?

Wykrywanie wyzwalaczy przekazania i płynne przekazywanie sprawy konsultantom. Ćwiczysz AI Agents 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 Agents?

Nie wymagamy żadnego doświadczenia. AI Agents 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 3 z 4.

Ile czasu zajmuje lekcja „Protokoły przekazywania obsługi człowiekowi”?

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 Agents?

Tak. Każda lekcja AI Agents 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

  1. Kierowanie zgłoszeń i logika eskalacji
  2. Integracja z CRM: Salesforce i HubSpot
  3. Protokoły przekazywania obsługi człowiekowi
  4. Zarządzanie kontekstem i historią klienta
← Powrót do AI Agents