使用Claude构建之前

决定是否使用Claude进行支持聊天

以下是一些关键指标,表明您应该使用像Claude这样的LLM来自动化客户支持流程的部分内容:
Claude擅长高效处理大量类似问题,释放人工代理来处理更复杂的问题。
Claude可以快速检索、处理和组合来自庞大知识库的信息,而人工代理可能需要时间来研究或咨询多个来源。
Claude可以提供全天候支持而不会疲劳,而为持续覆盖配备人工代理可能成本高昂且具有挑战性。
Claude可以处理查询量的突然增加,而无需雇用和培训额外的员工。
您可以指导Claude始终代表您品牌的语调和价值观,而人工代理在沟通风格上可能有所不同。
选择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是否正确解释客户意图、关键下一步、成功解决方案的样子等来衡量这一点。目标是理解准确性达到95%或更高。
这评估Claude的回复如何很好地解决客户的具体问题或问题。评估一组对话并评估每个回复的相关性(使用基于LLM的评分进行规模化)。目标相关性得分为90%或以上。
评估向用户提供的一般公司和产品信息的正确性,基于在上下文中向Claude提供的信息。在这些介绍性信息中目标100%准确性。
跟踪提供的链接或来源的频率和相关性。目标是在80%的可能受益于额外信息的互动中提供相关来源。
衡量Claude保持主题的程度,例如我们示例实现中的汽车保险主题。目标是95%的回复直接与汽车保险或客户的具体查询相关。
衡量Claude在确定何时生成信息内容以及该内容的相关性方面的成功程度。例如,在我们的实现中,我们将确定Claude理解何时生成报价以及该报价的准确性。目标100%准确性,因为这是成功客户互动的重要信息。
这衡量Claude识别查询何时需要人工干预并适当升级的能力。跟踪正确升级的对话百分比与应该升级但没有升级的对话。目标升级准确性为95%或更高。
以下是可用于评估使用Claude进行支持的业务影响的标准和基准:
这评估Claude在整个对话过程中维护或改善客户情感的能力。使用情感分析工具来衡量每次对话开始和结束时的情感。目标是在90%的互动中维护或改善情感。
聊天机器人在没有人工干预的情况下成功处理的客户询问百分比。通常目标是70-80%的转移率,取决于询问的复杂性。
衡量客户对聊天机器人互动满意程度的指标。通常通过互动后调查完成。目标CSAT得分为5分中的4分或更高。
聊天机器人解决询问的平均时间。这根据问题的复杂性而有很大差异,但通常目标是比人工代理更低的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、日产Leaf、雪佛兰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、日产、雪佛兰等热门车型。
您有特定的电动汽车想要投保,还是想了解这些保险的更多详情?
</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("使用了意外的工具")

构建您的用户界面

使用主方法通过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()
使用以下命令运行程序:
streamlit run app.py

评估您的提示

提示通常需要测试和优化才能准备好投入生产。要确定您解决方案的准备情况,请使用结合定量和定性方法的系统过程评估聊天机器人性能。基于您定义的成功标准创建强大的经验评估将允许您优化提示。
Claude控制台现在具有评估工具,允许您在各种场景下测试提示。

提高性能

在复杂场景中,除了标准提示工程技术护栏实施策略之外,考虑其他策略来提高性能可能会有所帮助。以下是一些常见场景:

使用RAG减少长上下文延迟

在处理大量静态和动态上下文时,在提示中包含所有信息可能导致高成本、较慢的响应时间和达到上下文窗口限制。在这种情况下,实施检索增强生成(RAG)技术可以显著提高性能和效率。 通过使用像Voyage这样的嵌入模型将信息转换为向量表示,您可以创建更可扩展和响应更快的系统。这种方法允许基于当前查询动态检索相关信息,而不是在每个提示中包含所有可能的上下文。 为支持用例实施RAG RAG配方已被证明可以提高准确性、减少响应时间,并在具有大量上下文要求的系统中降低API成本。

使用工具使用集成实时数据

在处理需要实时信息的查询时,例如账户余额或政策详情,基于嵌入的RAG方法是不够的。相反,您可以利用工具使用来显著增强聊天机器人提供准确、实时响应的能力。例如,您可以使用工具使用来查找客户信息、检索订单详情,并代表客户取消订单。 这种方法,在我们的工具使用:客户服务代理配方中概述,允许您无缝地将实时数据集成到Claude的响应中,并提供更个性化和高效的客户体验。

加强输入和输出护栏

在部署聊天机器人时,特别是在客户服务场景中,防止与误用、超出范围查询和不当响应相关的风险至关重要。虽然Claude本身对此类场景具有弹性,但以下是加强聊天机器人护栏的其他步骤:
  • 减少幻觉:实施事实检查机制和引用,将响应建立在提供的信息基础上。
  • 交叉检查信息:验证代理的响应与您公司的政策和已知事实一致。
  • 避免合同承诺:确保代理不做出承诺或签订它无权签订的协议。
  • 缓解越狱:使用无害性筛选和输入验证等方法来防止用户利用模型漏洞,旨在生成不当内容。
  • 避免提及竞争对手:实施竞争对手提及过滤器以保持品牌焦点,不提及任何竞争对手的产品或服务。
  • 保持Claude的角色:防止Claude改变他们的风格或上下文,即使在长时间、复杂的互动中。
  • 删除个人身份信息(PII):除非明确要求和授权,否则从响应中删除任何PII。

使用流式传输减少感知响应时间

在处理可能冗长的响应时,实施流式传输可以显著提高用户参与度和满意度。在这种情况下,用户逐步接收答案,而不是等待整个响应生成。 以下是如何实施流式传输:
  1. 使用Anthropic流式API来支持流式响应。
  2. 设置您的前端来处理传入的文本块。
  3. 在每个块到达时显示它,模拟实时打字。
  4. 实施保存完整响应的机制,允许用户在导航离开并返回时查看它。
在某些情况下,流式传输使得能够使用具有更高基础延迟的更高级模型,因为渐进式显示减轻了更长处理时间的影响。

扩展您的聊天机器人

随着聊天机器人复杂性的增长,您的应用程序架构可以发展以匹配。在向架构添加更多层之前,请考虑以下不太详尽的选项:
  • 确保您充分利用提示并通过提示工程进行优化。使用我们的提示工程指南来编写最有效的提示。
  • 向提示添加其他工具(可以包括提示链),看看您是否可以实现所需的功能。
如果您的聊天机器人处理极其多样化的任务,您可能需要考虑添加单独的意图分类器来路由初始客户查询。对于现有应用程序,这将涉及创建一个决策树,通过分类器路由客户查询,然后到专门的对话(具有自己的工具集和系统提示)。注意,此方法需要对Claude的额外调用,可能会增加延迟。

将Claude集成到您的支持工作流程中

虽然我们的示例专注于在Streamlit环境中可调用的Python函数,但为实时支持聊天机器人部署Claude需要API服务。 以下是您可以采用的方法:
  1. 创建API包装器:围绕您的分类功能开发简单的API包装器。例如,您可以使用Flask API或Fast API将您的代码包装到HTTP服务中。您的HTTP服务可以接受用户输入并完整返回助手响应。因此,您的服务可以具有以下特征:
    • 服务器发送事件(SSE):SSE允许从服务器到客户端的响应实时流式传输。这对于在使用LLM时提供流畅、交互式体验至关重要。
    • 缓存:实施缓存可以显著提高响应时间并减少不必要的API调用。
    • 上下文保留:当用户导航离开并返回时保持上下文对于对话的连续性很重要。
  2. 构建Web界面:实施用户友好的Web UI,用于与Claude驱动的代理交互。