確定是否使用Claude進行票務路由

以下是一些關鍵指標,表明您應該使用像Claude這樣的LLM而不是傳統的機器學習方法來進行分類任務:


構建和部署您的LLM支援工作流程

了解您當前的支援方法

在深入自動化之前,了解您現有的票務系統至關重要。首先調查您的支援團隊目前如何處理票務路由。

考慮以下問題:

  • 使用什麼標準來確定應用哪種SLA/服務產品?
  • 是否使用票務路由來確定票務應該分配給哪個級別的支援或產品專家?
  • 是否已經有任何自動化規則或工作流程? 在哪些情況下它們會失敗?
  • 如何處理邊緣案例或模糊票務?
  • 團隊如何對票務進行優先排序?

您越了解人類如何處理某些情況,就越能更好地與Claude合作完成任務。

定義用戶意圖類別

一個定義良好的用戶意圖類別列表對於使用Claude準確分類支援票務至關重要。Claude在您系統中有效路由票務的能力與您系統類別定義的好壞成正比。

以下是一些用戶意圖類別和子類別的示例。

除了意圖外,票務路由和優先級還可能受到其他因素的影響,如緊急程度、客戶類型、SLA或語言。在構建自動路由系統時,請務必考慮其他路由標準。

建立成功標準

與您的支援團隊合作,定義明確的成功標準,包括可衡量的基準、閾值和目標。

以下是使用LLM進行支援票務路由時的一些標準標準和基準:

以下是一些常見的成功標準,無論是否使用LLM都可能有用:

選擇合適的Claude模型

模型的選擇取決於成本、準確性和響應時間之間的權衡。

許多客戶發現claude-3-haiku-20240307是票務路由的理想模型,因為它是Claude 3系列中最快速和最具成本效益的模型,同時仍能提供出色的結果。如果您的分類問題需要深入的主題專業知識或大量的意圖類別複雜推理,您可以選擇更大的Sonnet模型

構建強大的提示

票務路由是一種分類任務。Claude分析支援票務的內容,並根據問題類型、緊急程度、所需專業知識或其他相關因素將其分類為預定義的類別。

讓我們編寫一個票務分類提示。我們的初始提示應包含用戶請求的內容,並返回推理和意圖。

嘗試使用Anthropic Console上的提示生成器,讓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>你好!我在週六安裝了高速光纖網絡,我的安裝人員Kevin絕對太棒了!我可以在哪裡發送我的正面評價?謝謝您的幫助!</request>

        以下是您的輸出應該如何格式化的示例(針對上述示例請求):
        <reasoning>用戶尋求信息以便留下正面反饋。</reasoning>
        <intent>支援、反饋、投訴</intent>

        以下是更多示例:
        <examples>
        <example 2>
        示例2輸入:
        <request>我想寫信親自感謝您在上週末我父親的葬禮期間對我家人表現出的同情。您的員工在整個過程中都非常體貼和樂於助人;這真的減輕了我們的負擔。追悼會的小冊子很漂亮。我們永遠不會忘記您對我們表現出的善意,我們非常感謝整個過程進行得如此順利。再次感謝您,Amarantha Hill代表Hill家族。</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>標籤中。只返回推理和意圖。
        """

讓我們分解這個提示的關鍵組成部分:

  • 我們使用Python f-字符串創建提示模板,允許將ticket_contents插入到<request>標籤中。
  • 我們給Claude一個明確定義的角色,作為一個分類系統,仔細分析票務內容以確定客戶的核心意圖和需求。
  • 我們指示Claude如何正確格式化輸出,在本例中是在<reasoning>標籤內提供其推理和分析,然後在<intent>標籤內提供適當的分類標籤。
  • 我們指定有效的意圖類別:“支援、反饋、投訴”、“訂單跟踪”和”退款/換貨”。
  • 我們包括了幾個示例(又稱少量提示)來說明輸出應該如何格式化,這可以提高準確性和一致性。

我們希望Claude將其回應分成各種XML標籤部分的原因是,這樣我們可以使用正則表達式從輸出中分別提取推理和意圖。這允許我們在票務路由工作流程中創建有針對性的下一步,例如只使用意圖來決定將票務路由給誰。

部署您的提示

如果不在測試生產環境中部署並運行評估,很難知道您的提示效果如何。

讓我們構建部署結構。首先定義包裝我們對Claude調用的方法簽名。我們將採用我們已經開始編寫的方法,它以ticket_contents作為輸入,現在返回reasoningintent的元組作為輸出。如果您有使用傳統機器學習的現有自動化,您應該遵循該方法簽名。

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字符串。
  • 使用classification_promptticket_contents發送給Claude進行分類
  • 返回從響應中提取的模型的reasoningintent

由於我們需要等待整個推理和意圖文本生成後才能解析,我們設置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基於票務路由腳本如何適應更大的票務路由系統架構做出一些決定。您可以通過兩種方式做到這一點:

  • 推送式: 您使用的支援票務系統(例如Zendesk)通過向您的路由服務發送webhook事件來觸發您的代碼,然後對意圖進行分類並路由。
    • 這種方法更具網絡可擴展性,但需要您公開一個公共端點。
  • 拉取式: 您的代碼根據給定的時間表拉取最新的票務,並在拉取時對其進行路由。
    • 這種方法更容易實施,但當拉取頻率過高時可能會對支援票務系統進行不必要的調用,或者當拉取頻率過低時可能會過於緩慢。

對於這兩種方法,您都需要將您的腳本包裝在一個服務中。方法的選擇取決於您的支援票務系統提供的API。