在開始使用 Claude 之前

決定是否使用 Claude 進行支援對話

以下是一些關鍵指標,可以判斷是否應該使用像 Claude 這樣的 LLM 來自動化部分客戶支援流程:

選擇 Claude 而非其他 LLM 的考量因素:

  • 您重視自然、細膩的對話: Claude 的高級語言理解能力可以實現更自然、更具情境感知的對話,比其他 LLM 更接近人類對話。
  • 您經常收到複雜和開放式查詢: Claude 可以處理廣泛的主題和查詢,無需生成制式回應或需要對用戶話語進行大量程式設計。
  • 您需要可擴展的多語言支援: Claude 的多語言能力使其能夠用超過 200 種語言進行對話,無需為每種支援的語言設置單獨的聊天機器人或進行大量翻譯。

定義理想的對話互動

概述理想的客戶互動,以定義您期望客戶如何以及何時與 Claude 互動。這個概述將有助於確定解決方案的技術要求。

以下是汽車保險客服對話的範例:

  • 客戶: 開始支援對話體驗
    • Claude: 熱情地問候客戶並開始對話
  • 客戶: 詢問關於他們新電動車的保險
    • Claude: 提供相關的電動車承保資訊
  • 客戶: 詢問有關電動車保險的特殊需求
    • Claude: 提供準確且資訊豐富的答案,並提供資訊來源連結
  • 客戶: 詢問與保險或汽車無關的問題
    • Claude: 澄清不討論不相關的主題,並引導用戶回到汽車保險話題
  • 客戶: 表示對保險報價感興趣
    • Claude: 詢問一系列問題以確定適當的報價,根據他們的回答進行調整
    • Claude: 發送請求使用報價生成 API 工具,並附上從用戶收集的必要資訊
    • Claude: 接收來自 API 工具使用的回應資訊,將資訊整合成自然的回應,並向用戶提供報價
  • 客戶: 提出後續問題
    • Claude: 根據需要回答後續問題
    • Claude: 引導客戶進入保險流程的下一步並結束對話
在您為自己的使用案例撰寫真實範例時,您可能會發現寫出這個互動中的實際用詞很有幫助,這樣您也可以了解您希望 Claude 具有的理想語氣、回應長度和細節程度。

將互動分解為獨特任務

客服對話是多個不同任務的集合,從問答到資訊檢索再到處理請求,這些都包含在單一客戶互動中。在開始建置之前,將您理想的客戶互動分解為您希望 Claude 能夠執行的每個任務。這確保您可以針對每個任務提示和評估 Claude,並讓您在撰寫測試案例時能夠很好地了解需要考慮的互動範圍。

客戶有時會發現將此視覺化為互動流程圖很有幫助,根據用戶請求顯示可能的對話轉折點。

以下是上述保險互動範例中的關鍵任務:

  1. 問候和一般指引

    • 熱情地問候客戶並開始對話
    • 提供有關公司和互動的一般資訊
  2. 產品資訊

    • 提供電動車承保資訊
      這將需要 Claude 在其上下文中擁有必要的資訊,並可能意味著需要 RAG 整合
    • 回答有關電動車保險特殊需求的問題
    • 回答有關報價或保險細節的後續問題
    • 在適當時提供資訊來源連結
  3. 對話管理

    • 保持在主題上(汽車保險)
    • 將離題問題重新導向相關主題
  4. 報價生成

    • 詢問適當的問題以確定報價資格
    • 根據客戶回應調整問題
    • 將收集的資訊提交給報價生成 API
    • 向客戶提供報價

建立成功標準

與您的支援團隊合作定義明確的成功標準並撰寫詳細評估,包含可衡量的基準和目標。

以下是可用於評估 Claude 執行定義任務的成功程度的標準和基準:

以下是可用於評估使用 Claude 進行支援的業務影響的標準和基準:

如何將 Claude 實作為客服代理

選擇合適的 Claude 模型

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

對於客服對話,claude-3-7-sonnet-20250219 很適合平衡智能、延遲和成本。然而,對於具有多個提示的對話流程,包括 RAG、工具使用和/或長上下文提示,claude-3-haiku-20240307 可能更適合優化延遲。

建立強大的提示

使用 Claude 進行客服需要 Claude 有足夠的指示和上下文來適當回應,同時具有足夠的靈活性來處理各種客戶查詢。

讓我們從系統提示開始,撰寫強大提示的元素:

IDENTITY = """您是 Eva,Acme 保險公司友善且知識豐富的 AI 助理。
您的角色是熱情地歡迎客戶並提供有關 Acme 的保險產品資訊,
包括汽車保險和電動車保險。您也可以幫助客戶獲得他們所需的保險報價。"""
雖然您可能會想把所有資訊都放在系統提示中,作為將指示與用戶對話分開的方式,但 Claude 實際上在第一個 User 回合中寫入大部分提示內容時效果最好(唯一的例外是角色提示)。詳情請參閱使用系統提示賦予 Claude 角色

最好將複雜的提示分解為子部分,一次寫一部分。對於每個任務,您可能會發現按照步驟來定義 Claude 需要做好該任務的提示部分會更成功。對於這個汽車保險客服範例,我們將逐步寫出”問候和一般指引”任務的所有部分。這也使得調試您的提示更容易,因為您可以更快地調整整體提示的個別部分。

我們將把所有這些部分放在一個名為 config.py 的檔案中。

STATIC_GREETINGS_AND_GENERAL = """
<static_context>
Acme 汽車保險:您在路上值得信賴的夥伴

關於我們:
在 Acme 保險,我們了解您的車輛不僅僅是一種交通工具—它是您生活冒險的通行證。
1985 年以來,我們一直在制定汽車保險政策,讓駕駛者能夠自信地探索、通勤和旅行。
無論您是在城市街道上行駛還是展開跨國公路旅行,Acme 都在那裡保護您和您的車輛。
我們創新的汽車保險政策旨在適應您的獨特需求,涵蓋從小擦撞到重大碰撞的一切。
憑藉 Acme 屢獲殊榮的客戶服務和快速理賠解決方案,您可以專注於駕駛的樂趣,而我們來處理其餘的事情。
我們不僅僅是保險提供者—我們是您人生旅程中的副駕駛。
選擇 Acme 汽車保險,體驗卓越承保和真誠關懷帶來的保障。因為在 Acme,我們不僅僅是為您的車投保—我們為您在開闊道路上的冒險提供動力。

注意:我們還為電動車提供專門的承保,確保所有類型的車輛駕駛者都能受益於我們的保護。

Acme 保險提供以下產品:
- 汽車保險
- 電動車保險
- 二輪車保險

營業時間:週一至週五,上午 9 點至下午 5 點 EST
客服電話:1-800-123-4567
</static_context>
"""

然後我們將為我們的汽車保險和電動車保險資訊做同樣的事情。

STATIC_CAR_INSURANCE="""
<static_context>
汽車保險承保範圍:
Acme 的汽車保險政策通常涵蓋:
1. 責任險:支付您造成他人的人身傷害和財產損失。
2. 碰撞險:支付您的車輛在事故中的損壞。
3. 綜合險:支付非碰撞事故造成的車輛損壞。
4. 醫療費用險:支付事故後的醫療費用。
5. 無保險/保險不足駕駛人險:在被保險不足的駕駛人撞到時保護您。

可選承保範圍包括:
- 租車補償
- 道路救援
- 新車更換
</static_context>
"""

STATIC_ELECTRIC_CAR_INSURANCE="""
<static_context>
電動車保險:
我們專門的電動車保險超越傳統汽車承保範圍,
為您的高科技投資提供量身定制的保護。除了標準承保範圍外,我們還提供:
- 保護昂貴的電池系統
- 承保家用充電設備
- 適應快速發展的電動車世界

無論您駕駛的是 Rivian、Nissan Leaf、Chevrolet Bolt
還是任何其他電動車,我們知識豐富的代理人都準備好為您制定一份政策,
讓您能夠自信地享受每一英里的電力驅動旅程。
</static_context>
"""

現在我們有了靜態內容,讓我們添加至少 4-5 個”良好”互動的範例來指導 Claude 的回應。這些範例應該代表您理想的客戶互動,可以包括護欄、工具調用等。

EXAMPLES="""
以下是您與客戶互動的一些範例:

<example 1>
H:嗨,你們有提供小型企業的商業保險嗎?

A:啊!很抱歉,我們目前不提供商業保險。
不過,我們確實提供一系列個人保險產品,包括汽車保險和電動車保險。
您想了解更多關於這些產品的資訊嗎?
</example 1>

<example 2>
H:嗨,你們的營業時間是什麼時候?

A:我們的營業時間是週一至週五,上午 9 點至下午 5 點 EST。
如果您有任何問題或需要協助,歡迎在這些時間內聯繫我們。
今天我還能為您提供什麼協助嗎?
</example 2>

<example 3>
H:我正在購買汽車保險。Acme 提供什麼?

A:很好的選擇!Acme 的汽車保險政策通常包括:
- 責任險:在您造成事故時保護您
- 碰撞險:支付您的車輛在事故中的損壞
- 綜合險:承保非碰撞事故如盜竊或破壞
- 醫療費用險:支付事故後的醫療費用
- 無保險/保險不足駕駛人險:保護您免受保險不足的駕駛人傷害

我們還提供可選承保範圍,如租車補償、道路救援和新車更換。
您想了解更多關於這些承保範圍的詳情,還是對於為您的車輛投保有具體問題?
</example 3>

<example 4>
H:我想了解你們的電動車保險。

A:當然!我們的電動車保險是專門設計來滿足電動車車主的獨特需求。
除了我們為一般汽車提供的所有標準承保範圍外,我們的電動車保單還包括:

- 電池承保:保護您車輛昂貴的電池系統免受損壞或退化
- 科技套件:承保先進電子設備和車載電腦系統的維修或更換
- 充電站承保:保護家用和便攜式充電設備
- 網路安全保護:承保駭客攻擊或數位威脅
- 專門道路救援:包括平板拖車以保護車輛底盤

我們承保各種電動車,包括來自 Tesla、Rivian、Nissan、Chevrolet 等品牌的熱門車型。
您想為特定的電動車投保,還是想了解更多關於這些承保範圍的詳情?
</example 4>

<example 5>
H:我想為我的車子獲得保險報價。

A:當然!我很樂意幫您獲得汽車保險報價。
為了提供準確的報價,我需要收集一些關於您的車輛和主要駕駛人的資訊。
讓我們從基本資訊開始:

1. 您的車輛是什麼品牌和型號?
2. 車輛是哪一年製造的?
3. 大約行駛了多少英里?
4. 主要駕駛人的年齡是多少?

一旦您提供這些資訊,我會使用我們的報價工具為您生成個人化的保險報價。
</example 5>
"""

您還需要包含任何重要的指示,概述 Claude 應該如何與客戶互動的注意事項和禁止事項。 這可能來自品牌護欄或支援政策。

ADDITIONAL_GUARDRAILS = """請遵守以下護欄:
1. 僅提供我們產品列表中列出的保險類型資訊。
2. 如果被問到我們不提供的保險類型,請禮貌地說明
我們不提供該服務。
3. 不要推測未來的產品供應或公司計劃。
4. 不要做出未經授權的承諾或協議。
您只提供資訊和指導。
5. 不要提及任何競爭對手的產品或服務。
"""

現在讓我們將所有這些部分組合成一個字串,用作我們的提示。

TASK_SPECIFIC_INSTRUCTIONS = ' '.join([
   STATIC_GREETINGS_AND_GENERAL,
   STATIC_CAR_INSURANCE,
   STATIC_ELECTRIC_CAR_INSURANCE,
   EXAMPLES,
   ADDITIONAL_GUARDRAILS,
])

透過工具使用添加動態和代理功能

Claude 能夠使用客戶端工具使用功能來採取行動和動態檢索資訊。首先列出提示應該使用的任何外部工具或 API。

對於這個範例,我們將從一個用於計算報價的工具開始。

提醒一下,這個工具不會執行實際的計算,它只會向應用程式發出信號,表示應該使用具有指定參數的工具。

保險報價計算器範例:

TOOLS = [{
  "name": "get_quote",
  "description": "根據用戶輸入計算保險報價。返回值為每月保費。",
  "input_schema": {
    "type": "object",
    "properties": {
      "make": {"type": "string", "description": "車輛品牌。"},
      "model": {"type": "string", "description": "車輛型號。"},
      "year": {"type": "integer", "description": "車輛製造年份。"},
      "mileage": {"type": "integer", "description": "車輛里程數。"},
      "driver_age": {"type": "integer", "description": "主要駕駛人年齡。"}
    },
    "required": ["make", "model", "year", "mileage", "driver_age"]
  }
}]

def get_quote(make, model, year, mileage, driver_age):
    """返回每月保費(美元)"""
    # 您可以呼叫 http 端點或資料庫來獲取報價。
    # 在這裡,我們模擬 1 秒的延遲並返回固定報價 100。
    time.sleep(1)
    return 100

部署您的提示

如果不在測試生產環境中部署並運行評估,很難知道您的提示效果如何,所以讓我們使用我們的提示、Anthropic SDK 和 streamlit 作為用戶界面來建立一個小應用程式。

在一個名為 chatbot.py 的檔案中,首先設置 ChatBot 類,該類將封裝與 Anthropic SDK 的互動。

該類應該有兩個主要方法:generate_messageprocess_user_input

from anthropic import Anthropic
from config import IDENTITY, TOOLS, MODEL, get_quote
from dotenv import load_dotenv

load_dotenv()

class ChatBot:
   def __init__(self, session_state):
       self.anthropic = Anthropic()
       self.session_state = session_state

   def generate_message(
       self,
       messages,
       max_tokens,
   ):
       try:
           response = self.anthropic.messages.create(
               model=MODEL,
               system=IDENTITY,
               max_tokens=max_tokens,
               messages=messages,
               tools=TOOLS,
           )
           return response
       except Exception as e:
           return {"error": str(e)}

   def process_user_input(self, user_input):
       self.session_state.messages.append({"role": "user", "content": user_input})

       response_message = self.generate_message(
           messages=self.session_state.messages,
           max_tokens=2048,
       )

       if "error" in response_message:
           return f"發生錯誤:{response_message['error']}"

       if response_message.content[-1].type == "tool_use":
           tool_use = response_message.content[-1]
           func_name = tool_use.name
           func_params = tool_use.input
           tool_use_id = tool_use.id

           result = self.handle_tool_use(func_name, func_params)
           self.session_state.messages.append(
               {"role": "assistant", "content": response_message.content}
           )
           self.session_state.messages.append({
               "role": "user",
               "content": [{
                   "type": "tool_result",
                   "tool_use_id": tool_use_id,
                   "content": f"{result}",
               }],
           })

           follow_up_response = self.generate_message(
               messages=self.session_state.messages,
               max_tokens=2048,
           )

           if "error" in follow_up_response:
               return f"發生錯誤:{follow_up_response['error']}"

           response_text = follow_up_response.content[0].text
           self.session_state.messages.append(
               {"role": "assistant", "content": response_text}
           )
           return response_text
      
       elif response_message.content[0].type == "text":
           response_text = response_message.content[0].text
           self.session_state.messages.append(
               {"role": "assistant", "content": response_text}
           )
           return response_text
      
       else:
           raise Exception("發生錯誤:意外的回應類型")

   def handle_tool_use(self, func_name, func_params):
       if func_name == "get_quote":
           premium = get_quote(**func_params)
           return f"已生成報價:每月 ${premium:.2f}"
      
       raise Exception("使用了意外的工具")

建立您的用戶界面

使用主方法測試部署此程式碼。這個 main() 函數設置了基於 Streamlit 的聊天界面。

我們將在一個名為 app.py 的檔案中執行此操作

import streamlit as st
from chatbot import ChatBot
from config import TASK_SPECIFIC_INSTRUCTIONS

def main():
   st.title("與 Eva 聊天,Acme 保險公司的助理🤖")

   if "messages" not in st.session_state:
       st.session_state.messages = [
           {'role': "user", "content": TASK_SPECIFIC_INSTRUCTIONS},
           {'role': "assistant", "content": "已理解"},
       ]

   chatbot = ChatBot(st.session_state)

   # 顯示用戶和助理訊息,跳過前兩條
   for message in st.session_state.messages[2:]:
       # 忽略工具使用區塊
       if isinstance(message["content"], str):
           with st.chat_message(message["role"]):
               st.markdown(message["content"])

   if user_msg := st.chat_input("在此輸入您的訊息..."):
       st.chat_message("user").markdown(user_msg)

       with st.chat_message("assistant"):
           with st.spinner("Eva 正在思考..."):
               response_placeholder = st.empty()
               full_response = chatbot.process_user_input(user_msg)
               response_placeholder.markdown(full_response)

if __name__ == "__main__":
   main()

使用以下命令運行程式:

streamlit run app.py

評估您的提示

提示通常需要測試和優化才能準備好投入生產。要確定您的解決方案是否準備就緒,請使用系統化流程結合定量和定性方法來評估聊天機器人的表現。根據您定義的成功標準創建強大的實證評估將允許您優化您的提示。

Anthropic Console 現在提供評估工具,允許您在各種場景下測試您的提示。

改進性能

在複雜的場景中,除了標準的提示工程技術護欄實施策略之外,考慮其他策略來改進性能可能會有幫助。以下是一些常見場景:

使用 RAG 減少長上下文延遲

在處理大量靜態和動態上下文時,在提示中包含所有資訊可能會導致高成本、較慢的回應時間和達到上下文窗口限制。在這種情況下,實施檢索增強生成(RAG)技術可以顯著改善性能和效率。

透過使用像 Voyage 這樣的嵌入模型將資訊轉換為向量表示,您可以創建一個更可擴展和響應迅速的系統。這種方法允許基於當前查詢動態檢索相關資訊,而不是在每個提示中包含所有可能的上下文。

實施支援用例的 RAG RAG 配方已被證明可以提高準確性、減少回應時間,並降低具有大量上下文要求的系統的 API 成本。

使用工具整合即時數據

在處理需要即時資訊的查詢時,如帳戶餘額或保單詳情,基於嵌入的 RAG 方法是不夠的。相反,您可以利用工具使用來顯著增強您的聊天機器人提供準確、即時回應的能力。例如,您可以使用工具使用來查詢客戶資訊、檢索訂單詳情,並代表客戶取消訂單。

這種方法,在我們的工具使用:客服代理配方中概述,允許您將即時數據無縫整合到您的 Claude 回應中,並提供更個性化和高效的客戶體驗。

加強輸入和輸出護欄

在部署聊天機器人時,特別是在客服場景中,防止與誤用、超出範圍的查詢和不當回應相關的風險至關重要。雖然 Claude 本身對這些場景具有彈性,但以下是加強您的聊天機器人護欄的額外步驟:

  • 減少幻覺:實施事實檢查機制和引用以將回應建立在提供的資訊基礎上。
  • 交叉檢查資訊:驗證代理的回應是否符合您公司的政策和已知事實。
  • 避免合約承諾:確保代理不會做出未經授權的承諾或簽訂協議。
  • 減輕越獄:使用無害性篩選和輸入驗證等方法來防止用戶利用模型漏洞,試圖生成不當內容。
  • 避免提及競爭對手:實施競爭對手提及過濾器以保持品牌焦點,不提及任何競爭對手的產品或服務。
  • 保持 Claude 的角色:防止 Claude 在長期、複雜的互動中改變其風格或上下文。
  • 移除個人識別資訊(PII):除非明確要求並授權,否則從回應中刪除任何 PII。

使用串流減少感知回應時間

在處理可能較長的回應時,實施串流可以顯著改善用戶參與度和滿意度。在這種情況下,用戶會逐步收到答案,而不是等待整個回應生成完成。

以下是如何實施串流:

  1. 使用 Anthropic 串流 API 來支援串流回應。
  2. 設置您的前端以處理傳入的文本塊。
  3. 在收到每個塊時顯示它,模擬即時打字。
  4. 實施機制來保存完整回應,允許用戶在離開並返回時查看它。

在某些情況下,串流使得使用具有較高基礎延遲的更高級模型成為可能,因為漸進式顯示減輕了較長處理時間的影響。

擴展您的聊天機器人

隨著您的聊天機器人複雜性增加,您的應用程式架構可以相應發展。在向您的架構添加更多層之前,請考慮以下較少耗費的選項:

  • 確保您充分利用您的提示並透過提示工程進行優化。使用我們的提示工程指南來撰寫最有效的提示。
  • 向提示添加額外的工具(可以包括提示鏈)並查看是否可以實現所需的功能。

如果您的聊天機器人處理極其多樣的任務,您可能想考慮添加一個單獨的意圖分類器來路由初始客戶查詢。對於現有應用程式,這將涉及創建一個決策樹,該樹將透過分類器將客戶查詢路由到專門的對話(具有其自己的工具集和系統提示)。請注意,這種方法需要額外呼叫 Claude,可能會增加延遲。

將 Claude 整合到您的支援工作流程中

雖然我們的範例專注於 Python 函數可在 Streamlit 環境中呼叫,但部署 Claude 進行即時支援聊天機器人需要一個 API 服務。

以下是您可以採取的方法:

  1. 創建 API 包裝器:圍繞您的分類函數開發一個簡單的 API 包裝器。例如,您可以使用 Flask API 或 Fast API 將您的程式碼包裝成 HTTP 服務。您的 HTTP 服務可以接受用戶輸入並完整返回助理回應。因此,您的服務可以具有以下特徵:

    • 伺服器發送事件(SSE):SSE 允許從伺服器到客戶端的即時回應串流。這對於使用 LLM 時提供流暢、互動的體驗至關重要。
    • 快取:實施快取可以顯著改善回應時間並減少不必要的 API 呼叫。
    • 上下文保留:當用戶離開並返回時保持對話上下文對於對話的連續性很重要。
  2. 建立網頁界面:實施一個用戶友好的網頁 UI 來與 Claude 驅動的代理互動。

Was this page helpful?