0Pricing
AI Agents · Pelajaran

Protokol Pengalihan ke Manusia

Mendeteksi pemicu pengalihan dan memindahkan percakapan dengan lancar ke agen manusia.

Protokol Pengalihan ke Manusia adalah pelajaran AI Agents gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar AI Agents, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus AI Agents mencakup 4 pelajaran total.

Kapan Agen Harus Mengalihkan Percakapan?

Tidak setiap percakapan sebaiknya ditangani sepenuhnya oleh agen AI. Mengetahui kapan harus mengalihkan percakapan sama pentingnya dengan mengetahui cara menjawab. Pemicu yang umum:

  • Pelanggan secara eksplisit meminta berbicara dengan manusia
  • Terdeteksi kemarahan atau kesusahan
  • Situasi kompleks atau ambigu di luar cakupan agen
  • Hal yang sensitif secara hukum, keselamatan, atau kepatuhan

Mendeteksi Pemicu Pengalihan

Gunakan pengklasifikasi LLM untuk mendeteksi pemicu pengalihan secara waktu nyata. Periksa pada setiap giliran agen, bukan hanya pada pesan pertama.

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)

Pengalihan Hangat vs Dingin

Ada dua gaya pengalihan:

  • Pengalihan hangat: agen memperkenalkan dirinya dan pelanggan kepada agen manusia, merangkum percakapan, lalu menunggu konfirmasi manusia sebelum mengakhiri sesi.
  • Pengalihan dingin: percakapan dialihkan bersama ringkasan transkrip, lalu agen segera memutuskan hubungan.

Pengalihan hangat mengurangi frustrasi pelanggan, tetapi memerlukan ketersediaan agen manusia secara waktu nyata.

Membuat Ringkasan Percakapan

Sebelum mengalihkan percakapan, agen membuat ringkasan percakapan yang terstruktur. Ringkasan ini ditampilkan kepada agen manusia sebagai konteks, sehingga pelanggan tidak perlu mengulangi ceritanya.

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)

Pembuatan Tiket Zendesk Saat Pengalihan

Saat mengalihkan percakapan, buat tiket Zendesk dengan ringkasan dan transkrip lengkap. Agen manusia dapat membuka tiket tersebut dan langsung memperoleh konteks.

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

Pengalihan Percakapan Intercom

Dengan Intercom, alihkan percakapan dengan menetapkannya kepada tim atau agen tertentu menggunakan API Intercom. Agen manusia menerima notifikasi bahwa percakapan siap dilanjutkan.

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

Pesan Pengalihan kepada Pelanggan

Pesan yang diterima pelanggan selama pengalihan sangat penting. Pesan tersebut harus mengakui adanya pengalihan, menyampaikan perkiraan waktu tunggu, dan menunjukkan bahwa masalah tersebut ditangani dengan serius.

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

Mengantre Saat Tidak Ada Manusia yang Tersedia

Di luar jam kerja atau saat volume tinggi, mungkin tidak ada manusia yang segera tersedia. Masukkan pengalihan ke antrean, kirim konfirmasi dengan nomor referensi kepada pelanggan, dan beri tahu staf piket melalui Slack atau 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)

Perilaku Agen Setelah Pengalihan

Setelah memicu pengalihan, agen harus berhenti berusaha menyelesaikan masalah tersebut. Agen masih boleh menjawab pertanyaan faktual (status pesanan, tautan kebijakan), tetapi tidak boleh membuat komitmen atau keputusan.

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

Melacak Metrik Pengalihan

Ukur tingkat pengalihan, distribusi alasan, dan waktu penyelesaian setelah pengalihan. Tingkat pengalihan yang tinggi pada maksud tertentu menunjukkan bahwa agen memerlukan cakupan yang lebih baik untuk topik tersebut.

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

Orkestrasi Pengalihan Lengkap

Gabungkan semua langkah ke dalam fungsi execute_handoff() yang dipanggil agen setelah suatu pemicu terdeteksi.

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)

Apa perbedaan utama antara pengalihan hangat dan pengalihan dingin?

Memilih gaya pengalihan yang tepat memengaruhi pengalaman pelanggan dan kompleksitas operasional. Memahami perbedaannya membantu Anda menerapkan protokol yang sesuai.

Ringkasan Protokol Pengalihan kepada Manusia

Pengalihan yang efektif memerlukan: mendeteksi pemicu (kemarahan, permintaan eksplisit, kompleksitas), membuat ringkasan untuk agen manusia, membuat tiket di Zendesk/Intercom dengan transkrip lengkap, memberi tahu staf piket, dan memberikan pelanggan pesan ekspektasi yang jelas.

Setelah pengalihan, agen mundur dan menyerahkan semua keputusan kepada manusia.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Protokol Pengalihan ke Manusia” gratis?

Ya — teks lengkap “Protokol Pengalihan ke Manusia” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus AI Agents, upgrade ke CoddyKit PRO. Kursus AI Agents mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Protokol Pengalihan ke Manusia”?

Mendeteksi pemicu pengalihan dan memindahkan percakapan dengan lancar ke agen manusia. Kamu berlatih AI Agents dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai AI Agents?

Tidak diperlukan pengalaman sebelumnya. AI Agents di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.

Berapa lama pelajaran “Protokol Pengalihan ke Manusia” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran AI Agents ini?

Ya. Setiap pelajaran AI Agents menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Perutean Tiket dan Logika Eskalasi
  2. Integrasi CRM: Salesforce dan HubSpot
  3. Protokol Pengalihan ke Manusia
  4. Pengelolaan Konteks dan Riwayat Pelanggan
← Kembali ke AI Agents