确定是否使用Claude进行工单路由

以下是一些关键指标,表明您应该使用像Claude这样的LLM而非传统机器学习方法进行分类任务:


构建和部署您的LLM支持工作流程

了解您当前的支持方法

在深入自动化之前,了解您现有的工单系统至关重要。首先调查您的支持团队当前如何处理工单路由。

考虑以下问题:

  • 使用什么标准来确定应用哪种SLA/服务产品?
  • 工单路由是否用于确定工单应该分配给哪个级别的支持或产品专家?
  • 是否已经有任何自动化规则或工作流程?在哪些情况下它们会失败?
  • 如何处理边缘情况或模糊工单?
  • 团队如何确定工单优先级?

您对人类如何处理某些情况了解得越多,就越能更好地与Claude合作完成任务。

定义用户意图类别

一个定义明确的用户意图类别列表对于Claude准确分类支持工单至关重要。Claude在您系统中有效路由工单的能力与您系统类别的定义程度成正比。

以下是一些用户意图类别和子类别的示例。

除了意图外,工单路由和优先级还可能受到其他因素的影响,如紧急程度、客户类型、SLA或语言。在构建自动化路由系统时,请确保考虑其他路由标准。

建立成功标准

与您的支持团队合作,定义明确的成功标准,包括可衡量的基准、阈值和目标。

以下是使用LLM进行支持工单路由的一些标准标准和基准:

以下是一些常见的成功标准,无论是否使用LLM都可能有用:

选择合适的Claude模型

模型的选择取决于成本、准确性和响应时间之间的权衡。

许多客户发现claude-3-5-haiku-20241022是工单路由的理想模型,因为它是Claude 3系列中最快速和最具成本效益的模型,同时仍能提供出色的结果。如果您的分类问题需要深入的专业知识或大量的意图类别复杂推理,您可能会选择更大的Sonnet模型

构建强大的提示

工单路由是一种分类任务。Claude分析支持工单的内容,并根据问题类型、紧急程度、所需专业知识或其他相关因素将其分类为预定义的类别。

让我们编写一个工单分类提示。我们的初始提示应包含用户请求的内容,并返回推理和意图。

尝试在Anthropic控制台上使用提示生成器,让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.
        """

让我们分解这个提示的关键组成部分:

  • 我们使用Python f-strings创建提示模板,允许将ticket_contents插入到<request>标签中。
  • 我们给Claude一个明确定义的角色,作为一个分类系统,仔细分析工单内容以确定客户的核心意图和需求。
  • 我们指导Claude关于正确的输出格式,在这种情况下,在<reasoning>标签内提供其推理和分析,然后在<intent>标签内提供适当的分类标签。
  • 我们指定有效的意图类别:“Support, Feedback, Complaint”、“Order Tracking”和”Refund/Exchange”。
  • 我们包含了几个示例(即少样本提示)来说明输出应该如何格式化,这提高了准确性和一致性。

我们希望Claude将其响应分成各种XML标签部分的原因是,这样我们可以使用正则表达式从输出中分别提取推理和意图。这允许我们在工单路由工作流程中创建有针对性的下一步,例如仅使用意图来决定将工单路由给哪个人。

部署您的提示

如果不在测试生产环境中部署并运行评估,很难知道您的提示效果如何。

让我们构建部署结构。首先定义包装我们对Claude调用的方法签名。我们将继续编写已经开始的方法,该方法以ticket_contents作为输入,并返回reasoningintent的元组作为输出。如果您有使用传统ML的现有自动化,您将需要遵循该方法签名。

import anthropic
import re

# 创建Anthropic API客户端实例
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字符串。
  • 使用classification_promptticket_contents发送给Claude进行分类
  • 返回从响应中提取的模型的reasoningintent

由于我们需要等待生成整个推理和意图文本才能解析,我们设置stream=False(默认值)。


评估您的提示

提示通常需要测试和优化才能准备好用于生产。要确定您的解决方案的准备程度,请根据您之前建立的成功标准和阈值评估性能。

要运行您的评估,您将需要测试用例来运行它。本指南的其余部分假设您已经开发了测试用例

构建评估函数

本指南中的示例评估从三个关键指标衡量Claude的性能:

  • 准确性
  • 每次分类的成本

根据对您重要的因素,您可能需要在其他方面评估Claude。

为了评估这一点,我们首先必须修改我们编写的脚本,并添加一个函数来比较预测的意图与实际意图,并计算正确预测的百分比。我们还必须添加成本计算和时间测量功能。

import anthropic
import re

# 创建Anthropic API客户端实例
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()

    # 返回推理、意图、正确性和使用情况。
    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的工单路由脚本如何适应您更大的工单路由系统架构做出一些决定。有两种方法可以做到这一点:

  • 推送式: 您使用的支持工单系统(例如Zendesk)通过向您的路由服务发送webhook事件来触发您的代码,然后该服务对意图进行分类并进行路由。
    • 这种方法更具网络可扩展性,但需要您公开一个公共端点。
  • 拉取式: 您的代码根据给定的计划拉取最新工单,并在拉取时对其进行路由。
    • 这种方法更容易实现,但当拉取频率过高时可能会对支持工单系统进行不必要的调用,或者当拉取频率过低时可能会过于缓慢。

对于这两种方法,您都需要将脚本包装在服务中。方法的选择取决于您的支持工单系统提供的API。