使用 Claude 建構之前
決定是否使用 Claude 進行支援聊天
以下是一些關鍵指標,表明您應該使用像 Claude 這樣的 LLM 來自動化客戶支援流程的部分:
Claude 擅長高效處理大量類似問題,讓人工代理能專注於更複雜的問題。
Claude 可以快速檢索、處理和整合來自龐大知識庫的資訊,而人工代理可能需要時間進行研究或諮詢多個來源。
Claude 可以提供全天候支援而不會疲勞,而為持續覆蓋配置人工代理可能成本高昂且具有挑戰性。
Claude 可以處理查詢量的突然增加,無需雇用和培訓額外員工。
您可以指示 Claude 一致地代表您品牌的語調和價值觀,而人工代理的溝通風格可能會有所不同。
選擇 Claude 而非其他 LLM 的一些考量:
您優先考慮自然、細緻的對話:Claude 的精密語言理解能力允許更自然、情境感知的對話,比與其他 LLM 的聊天感覺更像人類。
您經常收到複雜和開放式的查詢:Claude 可以處理廣泛的主題和查詢,而不會產生制式回應或需要對用戶話語的排列組合進行大量程式設計。
您需要可擴展的多語言支援:Claude 的多語言能力使其能夠以超過 200 種語言進行對話,無需為每種支援的語言建立單獨的聊天機器人或進行大量翻譯流程。
定義您理想的聊天互動
概述理想的客戶互動,以定義您期望客戶如何以及何時與 Claude 互動。此概述將有助於確定您解決方案的技術需求。
以下是汽車保險客戶支援的聊天互動範例:
客戶 :啟動支援聊天體驗
客戶 :詢問關於他們新電動車的保險
客戶 :詢問與電動車保險獨特需求相關的問題
Claude :以準確和資訊豐富的答案回應,並提供來源連結
客戶 :詢問與保險或汽車無關的離題問題
Claude :澄清它不討論無關主題,並引導用戶回到汽車保險
客戶 :表達對保險報價的興趣
Claude :詢問一系列問題以確定適當的報價,根據他們的回應進行調整
Claude :發送使用報價生成 API 工具的請求,連同從用戶收集的必要資訊
Claude :從 API 工具使用中接收回應資訊,將資訊整合成自然回應,並向用戶呈現提供的報價
客戶 :詢問後續問題
Claude :根據需要回答後續問題
Claude :引導客戶進入保險流程的下一步並結束對話
在您為自己的用例編寫的實際範例中,您可能會發現寫出此互動中的實際用詞很有用,這樣您也可以了解您希望 Claude 具有的理想語調、回應長度和詳細程度。
將互動分解為獨特任務
客戶支援聊天是多個不同任務的集合,從問題回答到資訊檢索到對請求採取行動,全部包裝在單一客戶互動中。在開始建構之前,將您理想的客戶互動分解為您希望 Claude 能夠執行的每個任務。這確保您可以為每個任務提示和評估 Claude,並讓您很好地了解在編寫測試案例時需要考慮的互動範圍。
客戶有時發現將此視覺化為可能對話轉折點的互動流程圖很有幫助,這取決於用戶請求。
以下是與上述保險互動範例相關的關鍵任務:
問候和一般指導
熱情問候客戶並開始對話
提供關於公司和互動的一般資訊
產品資訊
提供關於電動車保險的資訊
這將需要 Claude 在其上下文中擁有必要的資訊,並可能意味著需要
RAG 整合 。
回答與電動車保險獨特需求相關的問題
回答關於報價或保險詳情的後續問題
適當時提供來源連結
對話管理
報價生成
詢問適當問題以確定報價資格
根據客戶回應調整問題
將收集的資訊提交給報價生成 API
向客戶呈現提供的報價
建立成功標準
與您的支援團隊合作,定義明確的成功標準 並編寫詳細評估 ,包含可測量的基準和目標。
以下是可用於評估 Claude 成功執行定義任務的標準和基準:
此指標評估 Claude 在各種主題上準確理解客戶查詢的程度。通過審查對話樣本並評估 Claude 是否對客戶意圖、關鍵下一步、成功解決方案的樣子等有正確解釋來測量此項。目標是理解準確性達到 95% 或更高。
這評估 Claude 的回應如何很好地解決客戶的具體問題或議題。評估一組對話並評估每個回應的相關性(使用基於 LLM 的評分進行規模化)。目標相關性分數為 90% 或以上。
評估向用戶提供的一般公司和產品資訊的正確性,基於在上下文中提供給 Claude 的資訊。在此介紹性資訊中目標 100% 準確性。
追蹤提供連結或來源的頻率和相關性。目標是在 80% 的可能有益於額外資訊的互動中提供相關來源。
測量 Claude 保持主題的程度,例如我們範例實作中的汽車保險主題。目標是 95% 的回應直接與汽車保險或客戶的具體查詢相關。
測量 Claude 在確定何時生成資訊內容以及該內容的相關性方面的成功程度。例如,在我們的實作中,我們將確定 Claude 理解何時生成報價以及該報價的準確性。目標 100% 準確性,因為這是成功客戶互動的重要資訊。
這測量 Claude 識別查詢何時需要人工干預並適當升級的能力。追蹤正確升級對話的百分比與應該升級但沒有升級的對話。目標升級準確性為 95% 或更高。
以下是可用於評估使用 Claude 進行支援的業務影響的標準和基準:
這評估 Claude 在整個對話過程中維持或改善客戶情感的能力。使用情感分析工具測量每次對話開始和結束時的情感。目標是在 90% 的互動中維持或改善情感。
聊天機器人成功處理而無需人工干預的客戶查詢百分比。通常目標轉移率為 70-80%,取決於查詢的複雜性。
衡量客戶對其聊天機器人互動滿意度的指標。通常通過互動後調查完成。目標 CSAT 分數為 4 分(滿分 5 分)或更高。
聊天機器人解決查詢的平均時間。這根據問題的複雜性而有很大差異,但通常目標是比人工代理更低的 AHT。
如何實作 Claude 作為客戶服務代理
選擇正確的 Claude 模型
模型的選擇取決於成本、準確性和回應時間之間的權衡。
對於客戶支援聊天,claude-opus-4-1-20250805 很適合平衡智能、延遲和成本。然而,對於包含多個提示(包括 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_message 和 process_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 ( "使用了意外的工具" )
建構您的用戶介面
使用 Streamlit 和主方法測試部署此代碼。此 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()
使用以下命令運行程式:
評估您的提示
提示通常需要測試和優化才能準備好投入生產。要確定您解決方案的準備程度,請使用結合定量和定性方法的系統化過程評估聊天機器人性能。基於您定義的成功標準創建強大的實證評估 將允許您優化您的提示。
改善性能
在複雜情況下,除了標準提示工程技術 和防護欄實施策略 之外,考慮額外策略來改善性能可能會有所幫助。以下是一些常見情況:
使用 RAG 減少長上下文延遲
在處理大量靜態和動態上下文時,在提示中包含所有資訊可能導致高成本、較慢的回應時間和達到上下文窗口限制。在這種情況下,實施檢索增強生成(RAG)技術可以顯著改善性能和效率。
通過使用像 Voyage 這樣的嵌入模型 將資訊轉換為向量表示,您可以創建更可擴展和響應的系統。這種方法允許基於當前查詢動態檢索相關資訊,而不是在每個提示中包含所有可能的上下文。
為支援用例實施 RAG RAG 配方 已被證明可以在具有廣泛上下文需求的系統中提高準確性、減少回應時間並降低 API 成本。
使用工具使用整合即時資料
在處理需要即時資訊的查詢時,例如帳戶餘額或政策詳情,基於嵌入的 RAG 方法是不夠的。相反,您可以利用工具使用來顯著增強您聊天機器人提供準確、即時回應的能力。例如,您可以使用工具使用來查找客戶資訊、檢索訂單詳情,並代表客戶取消訂單。
這種方法,在我們的工具使用:客戶服務代理配方中概述 ,允許您無縫地將即時資料整合到 Claude 的回應中,並提供更個人化和高效的客戶體驗。
加強輸入和輸出防護欄
在部署聊天機器人時,特別是在客戶服務情況下,防止與濫用、超出範圍查詢和不當回應相關的風險至關重要。雖然 Claude 本身對這些情況具有彈性,但以下是加強您聊天機器人防護欄的額外步驟:
減少幻覺 :實施事實檢查機制和引用 以將回應建立在提供的資訊上。
交叉檢查資訊:驗證代理的回應是否與您公司的政策和已知事實一致。
避免合約承諾:確保代理不會做出承諾或簽訂它無權簽訂的協議。
緩解越獄 :使用無害性篩選和輸入驗證等方法來防止用戶利用模型漏洞,旨在生成不當內容。
避免提及競爭對手:實施競爭對手提及過濾器以保持品牌焦點,不提及任何競爭對手的產品或服務。
保持 Claude 的角色 :防止 Claude 改變他們的風格或上下文,即使在長時間、複雜的互動中也是如此。
移除個人識別資訊(PII):除非明確要求和授權,否則從回應中剔除任何 PII。
使用串流減少感知回應時間
在處理可能冗長的回應時,實施串流可以顯著改善用戶參與度和滿意度。在這種情況下,用戶逐步接收答案,而不是等待整個回應生成。
以下是如何實施串流:
使用 Anthropic 串流 API 來支援串流回應。
設置您的前端來處理傳入的文字塊。
顯示每個塊到達時的內容,模擬即時打字。
實施一個機制來保存完整回應,允許用戶在導航離開並返回時查看它。
在某些情況下,串流使得能夠使用具有更高基礎延遲的更先進模型,因為漸進顯示減輕了較長處理時間的影響。
擴展您的聊天機器人
隨著您聊天機器人複雜性的增長,您的應用程式架構可以演進以匹配。在您向架構添加進一步層次之前,請考慮以下較不詳盡的選項:
確保您充分利用您的提示並通過提示工程進行優化。使用我們的提示工程指南 來編寫最有效的提示。
向提示添加額外的工具 (可以包括提示鏈 )並查看您是否可以實現所需的功能。
如果您的聊天機器人處理極其多樣化的任務,您可能想要考慮添加單獨的意圖分類器 來路由初始客戶查詢。對於現有應用程式,這將涉及創建一個決策樹,通過分類器路由客戶查詢,然後到專門的對話(具有自己的工具集和系統提示)。注意,此方法需要對 Claude 的額外調用,可能會增加延遲。
將 Claude 整合到您的支援工作流程中
雖然我們的範例專注於在 Streamlit 環境中可調用的 Python 函數,但為即時支援聊天機器人部署 Claude 需要 API 服務。
以下是您可以採取的方法:
創建 API 包裝器:圍繞您的分類函數開發簡單的 API 包裝器。例如,您可以使用 Flask API 或 Fast API 將您的代碼包裝成 HTTP 服務。您的 HTTP 服務可以接受用戶輸入並完整返回助理回應。因此,您的服務可以具有以下特徵:
伺服器發送事件(SSE):SSE 允許從伺服器到客戶端的即時串流回應。這對於在使用 LLM 時提供流暢、互動的體驗至關重要。
快取:實施快取可以顯著改善回應時間並減少不必要的 API 調用。
上下文保留:當用戶導航離開並返回時保持上下文對於對話的連續性很重要。
建構網頁介面:實施用戶友好的網頁 UI 來與 Claude 驅動的代理互動。