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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Создайте сильный промпт

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

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

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

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

def classify_support_request(ticket_contents):
    # Определяем промпт для задачи классификации
    classification_prompt = f"""You will be acting as a customer support ticket classification system. Your task is to analyze customer support requests and output the appropriate classification intent for each request, along with your reasoning. 

        Here is the customer support request you need to classify:

        <request>{ticket_contents}</request>

        Please carefully analyze the above request to determine the customer's core intent and needs. Consider what the customer is asking for has concerns about.

        First, write out your reasoning and analysis of how to classify this request inside <reasoning> tags.

        Then, output the appropriate classification label for the request inside a <intent> tag. The valid intents are:
        <intents>
        <intent>Support, Feedback, Complaint</intent>
        <intent>Order Tracking</intent>
        <intent>Refund/Exchange</intent>
        </intents>

        A request may have ONLY ONE applicable intent. Only include the intent that is most applicable to the request.

        As an example, consider the following request:
        <request>Hello! I had high-speed fiber internet installed on Saturday and my installer, Kevin, was absolutely fantastic! Where can I send my positive review? Thanks for your help!</request>

        Here is an example of how your output should be formatted (for the above example request):
        <reasoning>The user seeks information in order to leave positive feedback.</reasoning>
        <intent>Support, Feedback, Complaint</intent>

        Here are a few more examples:
        <examples>
        <example 2>
        Example 2 Input:
        <request>I wanted to write and personally thank you for the compassion you showed towards my family during my father's funeral this past weekend. Your staff was so considerate and helpful throughout this whole process; it really took a load off our shoulders. The visitation brochures were beautiful. We'll never forget the kindness you showed us and we are so appreciative of how smoothly the proceedings went. Thank you, again, Amarantha Hill on behalf of the Hill Family.</request>

        Example 2 Output:
        <reasoning>User leaves a positive review of their experience.</reasoning>
        <intent>Support, Feedback, Complaint</intent>
        </example 2>
        <example 3>

        ...

        </example 8>
        <example 9>
        Example 9 Input:
        <request>Your website keeps sending ad-popups that block the entire screen. It took me twenty minutes just to finally find the phone number to call and complain. How can I possibly access my account information with all of these popups? Can you access my account for me, since your website is broken? I need to know what the address is on file.</request>

        Example 9 Output:
        <reasoning>The user requests help accessing their web account information.</reasoning>
        <intent>Support, Feedback, Complaint</intent>
        </example 9>

        Remember to always include your classification reasoning before your actual intent output. The reasoning should be enclosed in <reasoning> tags and the intent in <intent> tags. Return only the reasoning and the intent.
        """

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

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

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

Разверните ваш промпт

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

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

import anthropic
import re

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

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

def classify_support_request(ticket_contents):
    # Определяем промпт для задачи классификации
    classification_prompt = f"""You will be acting as a customer support ticket classification system. 
        ...
        ... The reasoning should be enclosed in <reasoning> tags and the intent in <intent> tags. Return only the reasoning and the 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

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

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

def classify_support_request(request, actual_intent):
    # Определяем промпт для задачи классификации
    classification_prompt = f"""You will be acting as a customer support ticket classification system. 
        ...
        ...The reasoning should be enclosed in <reasoning> tags and the intent in <intent> tags. Return only the reasoning and the 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()

    # Возвращаем reasoning, intent, correct и usage.
    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 предоставляет ваша система поддержки заявок.