Tentukan apakah menggunakan Claude untuk perutean tiket

Berikut adalah beberapa indikator utama bahwa Anda sebaiknya menggunakan LLM seperti Claude daripada pendekatan ML tradisional untuk tugas klasifikasi Anda:


Bangun dan terapkan alur kerja dukungan LLM Anda

Pahami pendekatan dukungan Anda saat ini

Sebelum terjun ke otomatisasi, penting untuk memahami sistem tiket Anda yang ada. Mulailah dengan menyelidiki bagaimana tim dukungan Anda saat ini menangani perutean tiket.

Pertimbangkan pertanyaan seperti:

  • Kriteria apa yang digunakan untuk menentukan SLA/layanan apa yang diterapkan?
  • Apakah perutean tiket digunakan untuk menentukan ke tingkat dukungan atau spesialis produk mana tiket akan diarahkan?
  • Apakah ada aturan atau alur kerja otomatis yang sudah ada? Dalam kasus apa mereka gagal?
  • Bagaimana kasus-kasus khusus atau tiket ambigu ditangani?
  • Bagaimana tim memprioritaskan tiket?

Semakin banyak yang Anda ketahui tentang bagaimana manusia menangani kasus-kasus tertentu, semakin baik Anda akan dapat bekerja dengan Claude untuk melakukan tugas tersebut.

Tentukan kategori niat pengguna

Daftar kategori niat pengguna yang terdefinisi dengan baik sangat penting untuk klasifikasi tiket dukungan yang akurat dengan Claude. Kemampuan Claude untuk merutekan tiket secara efektif dalam sistem Anda berbanding lurus dengan seberapa baik kategori sistem Anda didefinisikan.

Berikut adalah beberapa contoh kategori dan subkategori niat pengguna.

Selain niat, perutean dan prioritas tiket juga dapat dipengaruhi oleh faktor lain seperti urgensi, jenis pelanggan, SLA, atau bahasa. Pastikan untuk mempertimbangkan kriteria perutean lain saat membangun sistem perutean otomatis Anda.

Tetapkan kriteria keberhasilan

Bekerja sama dengan tim dukungan Anda untuk menentukan kriteria keberhasilan yang jelas dengan tolok ukur, ambang batas, dan tujuan yang dapat diukur.

Berikut adalah beberapa kriteria dan tolok ukur standar saat menggunakan LLM untuk perutean tiket dukungan:

Berikut adalah beberapa kriteria keberhasilan umum yang mungkin berguna terlepas dari apakah LLM digunakan:

Pilih model Claude yang tepat

Pilihan model tergantung pada pertimbangan antara biaya, akurasi, dan waktu respons.

Banyak pelanggan telah menemukan claude-3-haiku-20240307 sebagai model ideal untuk perutean tiket, karena ini adalah model tercepat dan paling hemat biaya dalam keluarga Claude 3 sambil tetap memberikan hasil yang sangat baik. Jika masalah klasifikasi Anda memerlukan keahlian subjek yang mendalam atau volume kategori niat yang besar dengan penalaran kompleks, Anda mungkin memilih model Sonnet yang lebih besar.

Bangun prompt yang kuat

Perutean tiket adalah jenis tugas klasifikasi. Claude menganalisis konten tiket dukungan dan mengklasifikasikannya ke dalam kategori yang telah ditentukan berdasarkan jenis masalah, urgensi, keahlian yang diperlukan, atau faktor relevan lainnya.

Mari kita tulis prompt klasifikasi tiket. Prompt awal kita harus berisi konten permintaan pengguna dan mengembalikan baik penalaran maupun niatnya.

Coba generator prompt di Anthropic Console untuk meminta Claude menulis draf pertama untuk Anda.

Berikut adalah contoh prompt klasifikasi perutean tiket:

def classify_support_request(ticket_contents):
    # Tentukan prompt untuk tugas klasifikasi
    classification_prompt = f"""Anda akan bertindak sebagai sistem klasifikasi tiket dukungan pelanggan. Tugas Anda adalah menganalisis permintaan dukungan pelanggan dan menghasilkan klasifikasi niat yang sesuai untuk setiap permintaan, beserta penalaran Anda. 

        Berikut adalah permintaan dukungan pelanggan yang perlu Anda klasifikasikan:

        <request>{ticket_contents}</request>

        Harap analisis dengan cermat permintaan di atas untuk menentukan niat dan kebutuhan inti pelanggan. Pertimbangkan apa yang diminta pelanggan atau yang menjadi perhatiannya.

        Pertama, tuliskan penalaran dan analisis Anda tentang cara mengklasifikasikan permintaan ini di dalam tag <reasoning>.

        Kemudian, keluarkan label klasifikasi yang sesuai untuk permintaan tersebut di dalam tag <intent>. Niat yang valid adalah:
        <intents>
        <intent>Dukungan, Umpan Balik, Keluhan</intent>
        <intent>Pelacakan Pesanan</intent>
        <intent>Pengembalian Dana/Penukaran</intent>
        </intents>

        Sebuah permintaan mungkin hanya memiliki SATU niat yang berlaku. Hanya sertakan niat yang paling berlaku untuk permintaan tersebut.

        Sebagai contoh, pertimbangkan permintaan berikut:
        <request>Halo! Saya baru saja memasang internet fiber kecepatan tinggi pada hari Sabtu dan teknisi pemasang saya, Kevin, benar-benar luar biasa! Di mana saya bisa mengirimkan ulasan positif saya? Terima kasih atas bantuan Anda!</request>

        Berikut adalah contoh bagaimana output Anda harus diformat (untuk contoh permintaan di atas):
        <reasoning>Pengguna mencari informasi untuk memberikan umpan balik positif.</reasoning>
        <intent>Dukungan, Umpan Balik, Keluhan</intent>

        Berikut adalah beberapa contoh lagi:
        <examples>
        <example 2>
        Contoh 2 Input:
        <request>Saya ingin menulis dan secara pribadi berterima kasih atas belas kasihan yang Anda tunjukkan kepada keluarga saya selama pemakaman ayah saya akhir pekan lalu. Staf Anda sangat perhatian dan membantu selama seluruh proses ini; itu benar-benar meringankan beban kami. Brosur kunjungan sangat indah. Kami tidak akan pernah melupakan kebaikan yang Anda tunjukkan kepada kami dan kami sangat menghargai betapa lancarnya prosesnya berjalan. Terima kasih lagi, Amarantha Hill atas nama Keluarga Hill.</request>

        Contoh 2 Output:
        <reasoning>Pengguna memberikan ulasan positif tentang pengalaman mereka.</reasoning>
        <intent>Dukungan, Umpan Balik, Keluhan</intent>
        </example 2>
        <example 3>

        ...

        </example 8>
        <example 9>
        Contoh 9 Input:
        <request>Situs web Anda terus mengirimkan pop-up iklan yang memblokir seluruh layar. Butuh waktu dua puluh menit bagi saya untuk akhirnya menemukan nomor telepon untuk menelepon dan mengeluh. Bagaimana mungkin saya dapat mengakses informasi akun saya dengan semua pop-up ini? Bisakah Anda mengakses akun saya untuk saya, karena situs web Anda rusak? Saya perlu tahu alamat apa yang tercatat.</request>

        Contoh 9 Output:
        <reasoning>Pengguna meminta bantuan untuk mengakses informasi akun web mereka.</reasoning>
        <intent>Dukungan, Umpan Balik, Keluhan</intent>
        </example 9>

        Ingatlah untuk selalu menyertakan penalaran klasifikasi Anda sebelum output niat sebenarnya. Penalaran harus disertakan dalam tag <reasoning> dan niat dalam tag <intent>. Kembalikan hanya penalaran dan niatnya.
        """

Mari kita uraikan komponen kunci dari prompt ini:

  • Kita menggunakan f-string Python untuk membuat template prompt, memungkinkan ticket_contents untuk disisipkan ke dalam tag <request>.
  • Kita memberi Claude peran yang jelas didefinisikan sebagai sistem klasifikasi yang dengan cermat menganalisis konten tiket untuk menentukan niat dan kebutuhan inti pelanggan.
  • Kita menginstruksikan Claude tentang format output yang tepat, dalam hal ini untuk memberikan penalaran dan analisisnya di dalam tag <reasoning>, diikuti oleh label klasifikasi yang sesuai di dalam tag <intent>.
  • Kita menentukan kategori niat yang valid: “Dukungan, Umpan Balik, Keluhan”, “Pelacakan Pesanan”, dan “Pengembalian Dana/Penukaran”.
  • Kita menyertakan beberapa contoh (a.k.a. few-shot prompting) untuk mengilustrasikan bagaimana output harus diformat, yang meningkatkan akurasi dan konsistensi.

Alasan kita ingin Claude membagi responnya menjadi berbagai bagian tag XML adalah agar kita dapat menggunakan ekspresi reguler untuk secara terpisah mengekstrak penalaran dan niat dari output. Ini memungkinkan kita untuk membuat langkah-langkah selanjutnya yang ditargetkan dalam alur kerja perutean tiket, seperti hanya menggunakan niat untuk memutuskan kepada siapa tiket akan diarahkan.

Terapkan prompt Anda

Sulit untuk mengetahui seberapa baik prompt Anda bekerja tanpa menerapkannya dalam pengaturan produksi uji dan menjalankan evaluasi.

Mari kita bangun struktur penerapan. Mulailah dengan mendefinisikan tanda tangan metode untuk membungkus panggilan kita ke Claude. Kita akan mengambil metode yang sudah mulai kita tulis, yang memiliki ticket_contents sebagai input, dan sekarang mengembalikan tuple reasoning dan intent sebagai output. Jika Anda memiliki otomatisasi yang ada menggunakan ML tradisional, Anda akan ingin mengikuti tanda tangan metode itu sebagai gantinya.

import anthropic
import re

# Buat instance klien API Anthropic
client = anthropic.Anthropic()

# Tetapkan model default
DEFAULT_MODEL="claude-3-haiku-20240307"

def classify_support_request(ticket_contents):
    # Tentukan prompt untuk tugas klasifikasi
    classification_prompt = f"""Anda akan bertindak sebagai sistem klasifikasi tiket dukungan pelanggan. 
        ...
        ... Penalaran harus disertakan dalam tag <reasoning> dan niat dalam tag <intent>. Kembalikan hanya penalaran dan niatnya.
        """
    # Kirim prompt ke API untuk mengklasifikasikan permintaan dukungan.
    message = client.messages.create(
        model=DEFAULT_MODEL,
        max_tokens=500,
        temperature=0,
        messages=[{"role": "user", "content": classification_prompt}],
        stream=False,
    )
    reasoning_and_intent = message.content[0].text

    # Gunakan pustaka ekspresi reguler Python untuk mengekstrak `reasoning`.
    reasoning_match = re.search(
        r"<reasoning>(.*?)</reasoning>", reasoning_and_intent, re.DOTALL
    )
    reasoning = reasoning_match.group(1).strip() if reasoning_match else ""

    # Demikian juga, ekstrak juga `intent`.
    intent_match = re.search(r"<intent>(.*?)</intent>", reasoning_and_intent, re.DOTALL)
    intent = intent_match.group(1).strip() if intent_match else ""

    return reasoning, intent

Kode ini:

  • Mengimpor pustaka Anthropic dan membuat instance klien menggunakan kunci API Anda.
  • Mendefinisikan fungsi classify_support_request yang mengambil string ticket_contents.
  • Mengirim ticket_contents ke Claude untuk klasifikasi menggunakan classification_prompt
  • Mengembalikan reasoning dan intent model yang diekstrak dari respons.

Karena kita perlu menunggu seluruh teks penalaran dan niat dihasilkan sebelum parsing, kita mengatur stream=False (default).


Evaluasi prompt Anda

Prompting sering memerlukan pengujian dan optimisasi agar siap produksi. Untuk menentukan kesiapan solusi Anda, evaluasi kinerja berdasarkan kriteria keberhasilan dan ambang batas yang Anda tetapkan sebelumnya.

Untuk menjalankan evaluasi Anda, Anda akan membutuhkan kasus uji untuk menjalankannya. Sisa panduan ini mengasumsikan Anda telah mengembangkan kasus uji Anda.

Bangun fungsi evaluasi

Contoh evaluasi untuk panduan ini mengukur kinerja Claude berdasarkan tiga metrik utama:

  • Akurasi
  • Biaya per klasifikasi

Anda mungkin perlu menilai Claude pada sumbu lain tergantung pada faktor apa yang penting bagi Anda.

Untuk menilai ini, pertama-tama kita harus memodifikasi skrip yang telah kita tulis dan menambahkan fungsi untuk membandingkan niat yang diprediksi dengan niat sebenarnya dan menghitung persentase prediksi yang benar. Kita juga harus menambahkan fungsionalitas perhitungan biaya dan pengukuran waktu.

import anthropic
import re

# Buat instance klien API Anthropic
client = anthropic.Anthropic()

# Tetapkan model default
DEFAULT_MODEL="claude-3-haiku-20240307"

def classify_support_request(request, actual_intent):
    # Tentukan prompt untuk tugas klasifikasi
    classification_prompt = f"""Anda akan bertindak sebagai sistem klasifikasi tiket dukungan pelanggan. 
        ...
        ...Penalaran harus disertakan dalam tag <reasoning> dan niat dalam tag <intent>. Kembalikan hanya penalaran dan niatnya.
        """

    message = client.messages.create(
        model=DEFAULT_MODEL,
        max_tokens=500,
        temperature=0,
        messages=[{"role": "user", "content": classification_prompt}],
    )
    usage = message.usage  # Dapatkan statistik penggunaan untuk panggilan API untuk berapa banyak token input dan output yang digunakan.
    reasoning_and_intent = message.content[0].text

    # Gunakan pustaka ekspresi reguler Python untuk mengekstrak `reasoning`.
    reasoning_match = re.search(
        r"<reasoning>(.*?)</reasoning>", reasoning_and_intent, re.DOTALL
    )
    reasoning = reasoning_match.group(1).strip() if reasoning_match else ""

    # Demikian juga, ekstrak juga `intent`.
    intent_match = re.search(r"<intent>(.*?)</intent>", reasoning_and_intent, re.DOTALL)
    intent = intent_match.group(1).strip() if intent_match else ""

      # Periksa apakah prediksi model benar.
    correct = actual_intent.strip() == intent.strip()

    # Kembalikan reasoning, intent, correct, dan usage.
    return reasoning, intent, correct, usage

Mari kita uraikan perubahan yang telah kita buat:

  • Kita menambahkan actual_intent dari kasus uji kita ke dalam metode classify_support_request dan menyiapkan perbandingan untuk menilai apakah klas ifikasi niat Claude cocok dengan klasifikasi niat emas kita.
  • Kita mengekstrak statistik penggunaan untuk panggilan API untuk menghitung biaya berdasarkan token input dan output yang digunakan

Jalankan evaluasi Anda

Evaluasi yang tepat memerlukan ambang batas dan tolok ukur yang jelas untuk menentukan apa yang merupakan hasil yang baik. Skrip di atas akan memberi kita nilai runtime untuk akurasi, waktu respons, dan biaya per klasifikasi, tetapi kita masih memerlukan ambang batas yang ditetapkan dengan jelas. Sebagai contoh:

  • Akurasi: 95% (dari 100 tes)
  • Biaya per klasifikasi: Pengurangan 50% rata-rata (di 100 tes) dari metode perutean saat ini

Memiliki ambang batas ini memungkinkan Anda untuk dengan cepat dan mudah mengetahui dalam skala besar, dan dengan empirisme yang tidak memihak, metode mana yang terbaik untuk Anda dan perubahan apa yang mungkin perlu dilakukan untuk lebih sesuai dengan kebutuhan Anda.


Tingkatkan kinerja

Dalam skenario yang kompleks, mungkin membantu untuk mempertimbangkan strategi tambahan untuk meningkatkan kinerja di luar teknik rekayasa prompt standar & strategi implementasi pagar pengaman. Berikut adalah beberapa skenario umum:

Gunakan hierarki taksonomi untuk kasus dengan 20+ kategori niat

Seiring bertambahnya jumlah kelas, jumlah contoh yang diperlukan juga bertambah, berpotensi membuat prompt menjadi tidak praktis. Sebagai alternatif, Anda dapat mempertimbangkan untuk menerapkan sistem klasifikasi hierarkis menggunakan campuran pengklasifikasi.

  1. Atur niat Anda dalam struktur pohon taksonomi.
  2. Buat serangkaian pengklasifikasi di setiap tingkat pohon, memungkinkan pendekatan perutean bertingkat.

Misalnya, Anda mungkin memiliki pengklasifikasi tingkat atas yang secara luas mengkategorikan tiket menjadi “Masalah Teknis,” “Pertanyaan Penagihan,” dan “Pertanyaan Umum.” Masing-masing kategori ini kemudian dapat memiliki sub-pengklasifikasinya sendiri untuk lebih memperbaiki klasifikasi.

  • **Pro - nuansa dan akurasi yang lebih besar: **Anda dapat membuat prompt yang berbeda untuk setiap jalur induk, memungkinkan klasifikasi yang lebih terarah dan spesifik konteks. Ini dapat mengarah pada peningkatan akurasi dan penanganan permintaan pelanggan yang lebih bernuansa.

  • Kontra - latensi meningkat: Perhatikan bahwa beberapa pengklasifikasi dapat menyebabkan peningkatan latensi, dan kami merekomendasikan menerapkan pendekatan ini dengan model tercepat kami, Haiku.

Gunakan basis data vektor dan pengambilan pencarian kesamaan untuk menangani tiket yang sangat bervariasi

Meskipun memberikan contoh adalah cara paling efektif untuk meningkatkan kinerja, jika permintaan dukungan sangat bervariasi, sulit untuk menyertakan cukup contoh dalam satu prompt.

Dalam skenario ini, Anda dapat menggunakan basis data vektor untuk melakukan pencarian kesamaan dari kumpulan data contoh dan mengambil contoh yang paling relevan untuk kueri tertentu.

Pendekatan ini, yang diuraikan secara rinci dalam resep klasifikasi kami, telah terbukti meningkatkan kinerja dari akurasi 71% menjadi 93%.

Perhitungkan secara khusus kasus-kasus khusus yang diharapkan

Berikut adalah beberapa skenario di mana Claude mungkin salah mengklasifikasikan tiket (mungkin ada yang lain yang unik untuk situasi Anda). Dalam skenario ini, pertimbangkan untuk memberikan instruksi eksplisit atau contoh dalam prompt tentang bagaimana Claude harus menangani kasus khusus tersebut:


Integrasikan Claude ke dalam alur kerja dukungan Anda yang lebih besar

Integrasi yang tepat memerlukan Anda membuat beberapa keputusan mengenai bagaimana skrip perutean tiket berbasis Claude Anda cocok dengan arsitektur sistem perutean tiket Anda yang lebih besar. Ada dua cara Anda bisa melakukan ini:

  • Berbasis push: Sistem tiket dukungan yang Anda gunakan (misalnya Zendesk) memicu kode Anda dengan mengirimkan peristiwa webhook ke layanan perutean Anda, yang kemudian mengklasifikasikan niat dan merutekannya.
    • Pendekatan ini lebih dapat diskalakan web, tetapi memerlukan Anda untuk mengekspos titik akhir publik.
  • Berbasis pull: Kode Anda menarik tiket terbaru berdasarkan jadwal tertentu dan merutekannya pada waktu penarikan.
    • Pendekatan ini lebih mudah diimplementasikan tetapi mungkin membuat panggilan yang tidak perlu ke sistem tiket dukungan ketika frekuensi penarikan terlalu tinggi atau mungkin terlalu lambat ketika frekuensi penarikan terlalu rendah.

Untuk salah satu pendekatan ini, Anda perlu membungkus skrip Anda dalam layanan. Pilihan pendekatan tergantung pada API apa yang disediakan oleh sistem tiket dukungan Anda.