Определите, следует ли использовать Claude для маршрутизации тикетов

Вот некоторые ключевые признаки того, что вам следует использовать LLM, такую как Claude, вместо традиционных подходов машинного обучения для вашей задачи классификации:


Создайте и разверните свой рабочий процесс поддержки LLM

Поймите свой текущий подход к поддержке

Прежде чем погружаться в автоматизацию, важно понять вашу существующую систему тикетов. Начните с изучения того, как ваша команда поддержки в настоящее время обрабатывает маршрутизацию тикетов.

Рассмотрите такие вопросы, как:

  • Какие критерии используются для определения того, какое SLA/предложение услуг применяется?
  • Используется ли маршрутизация тикетов для определения того, к какому уровню поддержки или специалисту по продукту попадает тикет?
  • Есть ли уже какие-либо автоматизированные правила или рабочие процессы? В каких случаях они не срабатывают?
  • Как обрабатываются крайние случаи или неоднозначные тикеты?
  • Как команда расставляет приоритеты тикетов?

Чем больше вы знаете о том, как люди обрабатывают определенные случаи, тем лучше вы сможете работать с Claude для выполнения задачи.

Определите категории намерений пользователей

Четко определенный список категорий намерений пользователей имеет решающее значение для точной классификации тикетов поддержки с помощью Claude. Способность Claude эффективно маршрутизировать тикеты в вашей системе прямо пропорциональна тому, насколько хорошо определены категории вашей системы.

Вот некоторые примеры категорий и подкатегорий намерений пользователей.

Помимо намерения, на маршрутизацию и приоритизацию тикетов также могут влиять другие факторы, такие как срочность, тип клиента, SLA или язык. Обязательно учитывайте другие критерии маршрутизации при создании автоматизированной системы маршрутизации.

Установите критерии успеха

Работайте со своей командой поддержки, чтобы определить четкие критерии успеха с измеримыми ориентирами, пороговыми значениями и целями.

Вот некоторые стандартные критерии и ориентиры при использовании LLM для маршрутизации тикетов поддержки:

Вот некоторые общие критерии успеха, которые могут быть полезны независимо от того, используется ли LLM:

Выберите правильную модель Claude

Выбор модели зависит от компромиссов между стоимостью, точностью и временем отклика.

Многие клиенты обнаружили, что claude-3-haiku-20240307 является идеальной моделью для маршрутизации тикетов, поскольку она является самой быстрой и экономичной моделью в семействе Claude 3, обеспечивая при этом отличные результаты. Если ваша задача классификации требует глубоких предметных знаний или большого объема категорий намерений со сложными рассуждениями, вы можете выбрать более крупную модель Sonnet.

Создайте эффективную подсказку

Маршрутизация тикетов - это тип задачи классификации. Claude анализирует содержание тикета поддержки и классифицирует его по предопределенным категориям на основе типа проблемы, срочности, требуемой экспертизы или других релевантных факторов.

Давайте напишем подсказку для классификации тикетов. Наша начальная подсказка должна содержать содержимое запроса пользователя и возвращать как рассуждение, так и намерение.

Попробуйте генератор подсказок на консоли Anthropic, чтобы Claude написал для вас первый черновик.

Вот пример подсказки для классификации маршрутизации тикетов:

def classify_support_request(ticket_contents):
    # Определите подсказку для задачи классификации
    classification_prompt = f"""Вы будете выступать в роли системы классификации тикетов службы поддержки клиентов. Ваша задача - анализировать запросы поддержки клиентов и выводить соответствующее намерение классификации для каждого запроса вместе с вашими рассуждениями.

        Вот запрос поддержки клиента, который вам нужно классифицировать:

        <request>{ticket_contents}</request>

        Пожалуйста, внимательно проанализируйте приведенный выше запрос, чтобы определить основное намерение и потребности клиента. Подумайте, о чем спрашивает клиент и что его беспокоит.

        Сначала запишите свои рассуждения и анализ того, как классифицировать этот запрос, внутри тегов <reasoning>.

        Затем выведите соответствующую метку классификации для запроса внутри тега <intent>. Допустимые намерения:
        <intents>
        <intent>Поддержка, Обратная связь, Жалоба</intent>
        <intent>Отслеживание заказа</intent>
        <intent>Возврат/Обмен</intent>
        </intents>

        Запрос может иметь ТОЛЬКО ОДНО применимое намерение. Включите только то намерение, которое наиболее применимо к запросу.

        В качестве примера рассмотрим следующий запрос:
        <request>Здравствуйте! В субботу мне установили высокоскоростной оптоволоконный интернет, и мой установщик Кевин был абсолютно фантастическим! Где я могу отправить свой положительный отзыв? Спасибо за помощь!</request>

        Вот пример того, как должен быть отформатирован ваш вывод (для приведенного выше примера запроса):
        <reasoning>Пользователь ищет информацию, чтобы оставить положительный отзыв.</reasoning>
        <intent>Поддержка, Обратная связь, Жалоба</intent>

        Вот еще несколько примеров:
        <examples>
        <example 2>
        Пример 2 Ввод:
        <request>Я хотел написать и лично поблагодарить вас за сочувствие, которое вы проявили к моей семье во время похорон моего отца на прошлых выходных. Ваш персонал был настолько внимателен и полезен на протяжении всего этого процесса; это действительно сняло с наших плеч груз. Брошюры для посещения были прекрасны. Мы никогда не забудем доброту, которую вы нам оказали, и мы очень благодарны за то, как гладко прошли процедуры. Еще раз спасибо, Амаранта Хилл от имени семьи Хилл.</request>

        Пример 2 Вывод:
        <reasoning>Пользователь оставляет положительный отзыв о своем опыте.</reasoning>
        <intent>Поддержка, Обратная связь, Жалоба</intent>
        </example 2>
        <example 3>

        ...

        </example 8>
        <example 9>
        Пример 9 Ввод:
        <request>Ваш веб-сайт продолжает отправлять всплывающие окна с рекламой, которые блокируют весь экран. У меня ушло двадцать минут только на то, чтобы наконец найти номер телефона, по которому можно позвонить и пожаловаться. Как я могу получить доступ к информации своей учетной записи со всеми этими всплывающими окнами? Можете ли вы получить доступ к моей учетной записи за меня, так как ваш веб-сайт не работает? Мне нужно знать, какой адрес указан в файле.</request>

        Пример 9 Вывод:
        <reasoning>Пользователь запрашивает помощь в доступе к информации своей веб-учетной записи.</reasoning>
        <intent>Поддержка, Обратная связь, Жалоба</intent>
        </example 9>

        Не забывайте всегда включать свои рассуждения о классификации перед фактическим выводом намерения. Рассуждение должно быть заключено в теги <reasoning>, а намерение - в теги <intent>. Возвращайте только рассуждение и намерение.
        """

Давайте разберем ключевые компоненты этой подсказки:

  • Мы используем f-строки Python для создания шаблона подсказки, позволяя вставлять ticket_contents в теги <request>.
  • Мы даем Claude четко определенную роль в качестве системы классификации, которая тщательно анализирует содержание тикета, чтобы определить основное намерение и потребности клиента.
  • Мы инструктируем Claude о правильном форматировании вывода, в данном случае предоставить свои рассуждения и анализ внутри тегов <reasoning>, а затем соответствующую метку классификации внутри тегов <intent>.
  • Мы указываем допустимые категории намерений: “Поддержка, Обратная связь, Жалоба”, “Отслеживание заказа” и “Возврат/Обмен”.
  • Мы включаем несколько примеров (т.н. few-shot prompting), чтобы проиллюстрировать, как должен быть отформатирован вывод, что повышает точность и согласованность.

Причина, по которой мы хотим, чтобы Claude разделил свой ответ на различные секции с XML-тегами, заключается в том, чтобы мы могли использовать регулярные выражения для отдельного извлечения рассуждений и намерения из вывода. Это позволяет нам создавать целевые следующие шаги в рабочем процессе маршрутизации тикетов, например, использовать только намерение для определения того, кому направить тикет.

Разверните свою подсказку

Трудно узнать, насколько хорошо работает ваша подсказка, не развернув ее в тестовой производственной среде и не проведя оценки.

Давайте построим структуру развертывания. Начните с определения сигнатуры метода для обертывания нашего вызова к Claude. Мы возьмем метод, который мы уже начали писать, который имеет ticket_contents в качестве входных данных, и теперь вернем кортеж reasoning и intent в качестве выходных данных. Если у вас есть существующая автоматизация с использованием традиционного машинного обучения, вы захотите следовать этой сигнатуре метода.

import anthropic
import re

# Создайте экземпляр клиента Anthropic API
client = anthropic.Anthropic()

# Установите модель по умолчанию
DEFAULT_MODEL="claude-3-haiku-20240307"

def classify_support_request(ticket_contents):
    # Определите подсказку для задачи классификации
    classification_prompt = f"""Вы будете выступать в роли системы классификации тикетов службы поддержки клиентов.
        ...
        ... Рассуждение должно быть заключено в теги <reasoning>, а намерение - в теги <intent>. Возвращайте только рассуждение и намерение.
        """
    # Отправьте подсказку в API для классификации запроса поддержки.
    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

    # Используйте библиотеку регулярных выражений Python для извлечения `reasoning`.
    reasoning_match = re.search(
        r"<reasoning>(.*?)</reasoning>", reasoning_and_intent, re.DOTALL
    )
    reasoning = reasoning_match.group(1).strip() if reasoning_match else ""

    # Аналогично, также извлеките `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

Этот код:

  • Импортирует библиотеку Anthropic и создает экземпляр клиента, используя ваш API-ключ.
  • Определяет функцию classify_support_request, которая принимает строку ticket_contents.
  • Отправляет ticket_contents в Claude для классификации, используя classification_prompt
  • Возвращает reasoning и intent модели, извлеченные из ответа.

Поскольку нам нужно дождаться генерации всего текста рассуждения и намерения перед анализом, мы устанавливаем stream=False (по умолчанию).


Оцените свою подсказку

Подсказки часто требуют тестирования и оптимизации, чтобы быть готовыми к производству. Чтобы определить готовность вашего решения, оцените производительность на основе критериев успеха и пороговых значений, которые вы установили ранее.

Чтобы запустить оценку, вам понадобятся тестовые случаи, на которых ее можно запустить. Остальная часть этого руководства предполагает, что вы уже разработали свои тестовые случаи.

Создайте функцию оценки

Наш пример оценки для этого руководства измеряет производительность Claude по трем ключевым показателям:

  • Точность
  • Стоимость на классификацию

Возможно, вам потребуется оценить Claude по другим осям в зависимости от того, какие факторы важны для вас.

Чтобы провести эту оценку, мы сначала должны изменить написанный нами скрипт и добавить функцию для сравнения предсказанного намерения с фактическим намерением и расчета процента правильных предсказаний. Мы также должны добавить функциональность расчета стоимости и измерения времени.

import anthropic
import re

# Создайте экземпляр клиента Anthropic API
client = anthropic.Anthropic()

# Установите модель по умолчанию
DEFAULT_MODEL="claude-3-haiku-20240307"

def classify_support_request(request, actual_intent):
    # Определите подсказку для задачи классификации
    classification_prompt = f"""Вы будете выступать в роли системы классификации тикетов службы поддержки клиентов.
        ...
        ...Рассуждение должно быть заключено в теги <reasoning>, а намерение - в теги <intent>. Возвращайте только рассуждение и намерение.
        """

    message = client.messages.create(
        model=DEFAULT_MODEL,
        max_tokens=500,
        temperature=0,
        messages=[{"role": "user", "content": classification_prompt}],
    )
    usage = message.usage  # Получите статистику использования для вызова API о том, сколько входных и выходных токенов было использовано.
    reasoning_and_intent = message.content[0].text

    # Используйте библиотеку регулярных выражений Python для извлечения `reasoning`.
    reasoning_match = re.search(
        r"<reasoning>(.*?)</reasoning>", reasoning_and_intent, re.DOTALL
    )
    reasoning = reasoning_match.group(1).strip() if reasoning_match else ""

    # Аналогично, также извлеките `intent`.
    intent_match = re.search(r"<intent>(.*?)</intent>", reasoning_and_intent, re.DOTALL)
    intent = intent_match.group(1).strip() if intent_match else ""

      # Проверьте, правильно ли предсказание модели.
    correct = actual_intent.strip() == intent.strip()

    # Верните рассуждение, намерение, правильность и использование.
    return reasoning, intent, correct, usage

Давайте разберем изменения, которые мы внесли:

  • Мы добавили actual_intent из наших тестовых случаев в метод classify_support_request и настроили сравнение, чтобы оценить, соответствует ли классификация намерения Claude нашей эталонной классификации намерения.
  • Мы извлекли статистику использования для вызова API, чтобы рассчитать стоимость на основе использованных входных и выходных токенов.

Запустите свою оценку

Правильная оценка требует четких пороговых значений и ориентиров для определения того, что является хорошим результатом. Приведенный выше скрипт даст нам значения времени выполнения для точности, времени отклика и стоимости на классификацию, но нам все равно нужны четко установленные пороговые значения. Например:

  • Точность: 95% (из 100 тестов)
  • Стоимость на классификацию: снижение в среднем на 50% (по 100 тестам) по сравнению с текущим методом маршрутизации

Наличие этих пороговых значений позволяет вам быстро и легко определить в масштабе и с беспристрастным эмпиризмом, какой метод лучше всего подходит для вас и какие изменения могут потребоваться, чтобы лучше соответствовать вашим требованиям.


Улучшите производительность

В сложных сценариях может быть полезно рассмотреть дополнительные стратегии для улучшения производительности помимо стандартных методов разработки подсказок и стратегий реализации ограничений. Вот некоторые распространенные сценарии:

Используйте таксономическую иерархию для случаев с более чем 20 категориями намерений

По мере увеличения количества классов также расширяется количество требуемых примеров, что потенциально может сделать подсказку громоздкой. В качестве альтернативы вы можете рассмотреть возможность реализации иерархической системы классификации с использованием смеси классификаторов.

  1. Организуйте свои намерения в структуру таксономического дерева.
  2. Создайте серию классификаторов на каждом уровне дерева, обеспечивая каскадный подход к маршрутизации.

Например, у вас может быть классификатор верхнего уровня, который в широком смысле классифицирует тикеты на “Технические проблемы”, “Вопросы выставления счетов” и “Общие запросы”. Каждая из этих категорий может затем иметь свой собственный субклассификатор для дальнейшего уточнения классификации.

  • Плюсы - большая детализация и точность: Вы можете создавать разные подсказки для каждого родительского пути, что позволяет более целенаправленно и контекстно-специфично классифицировать. Это может привести к повышению точности и более нюансированной обработке запросов клиентов.

  • Минусы - увеличенная задержка: Имейте в виду, что несколько классификаторов могут привести к увеличению задержки, и мы рекомендуем реализовать этот подход с нашей самой быстрой моделью Haiku.

Используйте векторные базы данных и поиск по сходству для обработки сильно различающихся тикетов

Несмотря на то, что предоставление примеров является наиболее эффективным способом улучшения производительности, если запросы поддержки сильно различаются, может быть трудно включить достаточное количество примеров в одну подсказку.

В этом сценарии вы можете использовать векторную базу данных для поиска по сходству из набора данных примеров и извлечения наиболее релевантных примеров для данного запроса.

Этот подход, подробно описанный в нашем рецепте классификации, как было показано, улучшает производительность с 71% точности до 93% точности.

Учитывайте специально ожидаемые крайние случаи

Вот некоторые сценарии, в которых Claude может неправильно классифицировать тикеты (могут быть и другие, уникальные для вашей ситуации). В этих сценариях рассмотрите возможность предоставления явных инструкций или примеров в подсказке о том, как Claude должен обрабатывать крайний случай:


Интегрируйте Claude в свой более широкий рабочий процесс поддержки

Правильная интеграция требует, чтобы вы приняли некоторые решения относительно того, как ваш скрипт маршрутизации тикетов на основе Claude вписывается в архитектуру вашей более широкой системы маршрутизации тикетов. Есть два способа сделать это:

  • На основе push: Используемая вами система тикетов поддержки (например, Zendesk) запускает ваш код, отправляя событие webhook в вашу службу маршрутизации, которая затем классифицирует намерение и маршрутизирует его.
    • Этот подход более масштабируем в Интернете, но требует, чтобы вы предоставили общедоступную конечную точку.
  • На основе pull: Ваш код запрашивает последние тикеты на основе заданного расписания и маршрутизирует их во время запроса.
    • Этот подход проще реализовать, но может делать ненужные вызовы в систему тикетов поддержки, когда частота запросов слишком высока, или может быть слишком медленным, когда частота запросов слишком низкая.

Для любого из этих подходов вам нужно будет обернуть свой скрипт в сервис. Выбор подхода зависит от того, какие API предоставляет ваша система тикетов поддержки.