继续第4课的客服助手总结提示词的讲解。
进一步改进提示 #
正如我们之前看到的,我们的提示目前正在为极端情况的客户记录单生成完整的摘要。我们想改变这种行为。我们有几个处理这些极端情况的选项:
- 以某种方式标记它们以表明它们不可总结,以便以后进行人工审核。
- 将它们单独分类(例如,“技术难度”、“语言障碍”等)。
为了简单起见,我们将选择通过要求模型输出如下所示的 JSON 来标记这些极端情况调用:
{
“status”:“INSUFFICIENT_DATA”
}
为了使其工作,我们需要通过以下方式更新我们的提示:
- 添加说明以解释所需的“INSUFFICIENT_DATA”输出
- 添加示例以显示可总结和不可总结的成绩单及其相应的 JSON 输出。
更新我们的说明 #
让我们在提示的说明部分中编写一个新的部分,以解释模型何时应输出我们的“INSUFFICIENT_DATA”JSON。
# 仅显示新内容。我们稍后会查看整个提示
new_instructions_addition = """
数据不足标准:
如果满足以下任一条件:
a) 记录中总共少于 5 次交流,或
b) 客户的问题不清楚
c) 通话混乱、不完整或受到语言障碍的阻碍
然后仅返回以下 JSON:
{
“status”:“INSUFFICIENT_DATA”
}
“”
添加示例 #
正如我们在本课程中前面讨论的那样,在提示中添加示例几乎总是一个好主意。在这个特定的用例中,示例将帮助 Claude 大致了解我们想要的可总结和不可总结的通话记录的摘要类型。
以下是我们可以包含在提示中的一组示例:
system = """
您是一位专业的客户服务分析师,擅长从通话记录中提取关键信息并以结构化格式进行总结。
您的任务是分析客户服务通话记录并生成简洁、准确的摘要,同时保持专业的语气。
"""
prompt = """
分析以下客户服务通话记录并生成交互的 JSON 摘要:
<transcript>
[在此处插入通话记录]
</transcript>
说明:
<instructions>
1. 仔细阅读记录。
2. 分析记录,重点关注主要问题、解决方案和任何所需的后续行动。
3. 根据指定的结构生成总结交互关键方面的 JSON 对象。
重要准则:
- 保密性:省略所有特定客户数据,如姓名、电话号码和电子邮件地址。
- 字符限制:将每个文本字段限制为最多 100 个字符。
- 保持专业的语气您的摘要。
输出格式:
生成具有以下结构的 JSON 对象:
<json>
{
“summary”:{
“customerIssue”:“简要描述通话的主要问题或原因”,
“resolution”:“如何处理或解决问题(如果适用)”,
“followUpRequired”:true/false,
“followUpDetails”:“描述任何必要的后续行动,如果不需要则为 null”
},
“status”:“COMPLETE”,
“ambiguities”:[“对话中任何不清楚或模糊的要点的列表,如果没有则为空数组”]
}
</json>
数据不足标准:
如果满足以下任何条件:
a) 记录的总交流次数少于 5 次
b) 客户的问题不清楚
c) 通话混乱、不完整或受到语言障碍的阻碍
然后仅返回以下 JSON:
{
“status”: “INSUFFICIENT_DATA”
}
示例:
<examples>
1. 完整交互:
<transcript>
代理:感谢您致电 Acme Smart Home Support。我是 Alex。我今天能为您提供什么帮助?
客户:嗨 Alex,我的 Acme SmartTherm 无法维持我设定的温度。它设置为 72 度,但房子里的温度要高得多。
代理:很遗憾听到这个消息。让我们排除故障。您的 SmartTherm 是否已连接到 Wi-Fi?
客户:是的,显示屏上显示了 Wi-Fi 符号。
代理:太好了。让我们重新校准您的 SmartTherm。按住菜单按钮 5 秒钟。
客户:好的,完成了。出现了一个新菜单。
代理:完美。导航到“校准”并按选择。调整温度以匹配您的室内温度计。
客户:好的,我已将其设置为 79 度以匹配。
代理:太好了。按选择确认。它会重新校准,这可能需要几分钟。一小时后再回来查看是否已修复。
客户:好的,我会这样做。谢谢你的帮助,亚历克斯。
代理:不客气!今天还有什么我可以帮你的吗?
客户:没有了,就这样。再次感谢。
代理:感谢您选择 Acme Smart Home。祝您有美好的一天!
</transcript>
<thinking>
主要问题:SmartTherm 未保持设定温度
解决方案:引导客户完成重新校准过程
跟进:不要求,但客户应在一小时后检查有效性
歧义:未发现
</thinking>
<json>
{
“summary”:{
“customerIssue”:“SmartTherm 未保持设定温度,显示高于设定的 72 度”,
“resolution”:“引导客户完成 SmartTherm 重新校准过程”,
“followUpRequired”:false,
“followUpDetails”:null
},
“status”:“COMPLETE”,
“ambiguities”:[]
}
</json>
2. 需要跟进的互动:
<transcript>
代理:Acme Smart Home 支持,我是 Jamie。我能为您做些什么?
客户:您好,我刚刚安装了新的 Acme SmartCam,但无法将其连接到 Wi-Fi。
代理:我很乐意提供帮助。您使用的是 Acme Smart Home 应用程序吗?
客户:是的,我的手机上有这个应用程序。
代理:太好了。请确保您的手机连接到 2.4GHz Wi-Fi 网络,而不是 5GHz 网络。
客户:哦,我在 5GHz 网络上。我应该切换吗?
代理:是的,请切换到 2.4GHz 网络。SmartCam 仅适用于 2.4GHz。
客户:好的,完成了。现在怎么办?
代理:打开应用程序,选择“添加设备”,选择“SmartCam”,然后按照屏幕上的说明进行操作。
客户:现在要求输入密码。
代理:输入您的 Wi-Fi 密码,它应该可以连接。
客户:它仍然不起作用。我一直收到错误消息。
代理:我明白了。在这种情况下,我想将此事上报给我们的技术团队。他们会在 24 小时内联系您。
客户:好的,听起来不错。感谢您的帮助。
代理:不客气。您还有什么需要帮助的吗?
客户:没有了,现在就这些。再次感谢。
代理:感谢您选择 Acme Smart Home。祝您有美好的一天!
</transcript>
<thinking>
主要问题:客户无法将新的 SmartCam 连接到 Wi-Fi
解决方案:初步故障排除失败,问题已上报给技术团队
跟进:需要,技术团队在 24 小时内联系客户小时
歧义:未提及客户收到的具体错误消息
</thinking>
<json>
{
“summary”:{
“customerIssue”:“无法将新的 SmartCam 连接到 Wi-Fi”,
“resolution”:“初始故障排除失败,问题上报给技术团队”,
“followUpRequired”:true,
“followUpDetails”:“技术团队将在 24 小时内联系客户以获得进一步帮助”
},
“status”:“COMPLETE”,
“ambiguities”:[“未提及客户收到的具体错误消息”]
}
</json>
3. 数据不足:
<transcript>
代理:Acme Smart Home 支持,我是 Sam。我可以为您提供什么帮助?
客户:您好,我的智能锁无法使用。
代理:很遗憾听到这个消息。您能告诉我有关该问题的更多信息吗?
客户:它就是无法使用。我不知道还能说什么。
客服人员:好的,您是什么时候第一次注意到这个问题的?您使用的是哪种型号的 Acme 智能锁?
客户:我不记得了。听着,我得走了。我稍后再打来。
客服人员:好的,如果您需要进一步的帮助,我们 24/7 全天候为您服务。祝您有美好的一天。
</transcript>
<thinking>
此记录的交流次数少于 5 次,客户的问题不清楚。客户没有提供有关智能锁问题的具体详细信息,也没有回答客服人员的问题。此互动没有提供足够的信息来进行完整的总结。
</thinking>
<json>
{
“status”:“INSUFFICIENT_DATA”
}
</json>
</examples>
</instructions>
在生成 JSON 之前,请分析 <thinking> 标签中的记录。
包括您对主要问题的识别、解决方案、后续要求以及任何歧义。
然后,在 <json> 标签中提供您的 JSON 输出。
上面的提示很长,但大致结构如下:
- 系统提示为模型设置上下文、角色和基调。
- 主要提示包括以下内容:
- 通话记录
- 一组说明,包含:
- 一般说明
- 指南
- 输出格式要求
- 处理边缘情况通话的详细信息
- 示例
- 输出中使用的 XML 标签的详细信息
以下是帮助可视化提示流程的摘要:
分析以下客户服务通话记录并生成交互的 JSON 摘要:
[在此处插入通话记录]
一般说明和指南
输出 JSON 格式说明
数据不足(边缘情况)标准
各种示例输入和输出
在生成 JSON 之前,请分析 标签中的记录。
包括您对主要问题的识别、解决方案、后续要求以及任何歧义。
然后,在 标记中提供您的 JSON 输出。
让我们使用新函数测试最终提示。请注意,此函数提取 标记内的 JSON 摘要内容:
import re
def summarize_call_with_final_prompt(transcript):
final_prompt = prompt.replace("[INSERT CALL TRANSCRIPT HERE]", transcript)
# Make the API call
response = client.messages.create(
model="claude-3-sonnet-20240229",
system=system,
max_tokens=4096,
messages=[
{"role": "user", "content": final_prompt}
]
)
# Extract content between <json> tags
json_content = re.search(r'<json>(.*?)</json>', response.content[0].text, re.DOTALL)
if json_content:
print(json_content.group(1).strip())
else:
print("No JSON content found in the response.")
让我们用一堆现有的调用变量来测试它:
summary_call_with_final_prompt(call1)
output:
{
"summary": {
"customerIssue": "无法打开智能灯泡",
"resolution": "代理引导客户通过关闭和打开电源重置灯泡",
"followUpRequired": false,
"followUpDetails": null
},
"status": "COMPLETE",
"ambiguities": []
}
summarize_call_with_final_prompt(call3)
{
"summary": {
"customerIssue": "Acme SecureHome 警报系统在夜间多次随机响起,没有明显原因",
"resolution": "已采取初步故障排除步骤,但问题未解决。客户转至技术团队进行诊断",
"followUpRequired": true,
"followUpDetails": "技术团队诊断并解决警报系统问题"
},
"status": "COMPLETE",
“ambiguities”:[]
}
# 让我们尝试一下我们的通话记录,它应该会产生一个包含非空歧义数组的摘要:
summarize_call_with_final_prompt(ambiguous_call)
{
“summary”:{
“customerIssue”:“SmartLock 无法可靠地自动锁定或通过应用程序锁定,行为不一致”,
“resolution”:“尝试进行故障排除但由于缺乏型号详细信息,但未完成,客户不得不离开”,
“followUpRequired”:true,
“followUpDetails”:“客户在可用时回电以进一步排除 SmartLock 问题”
},
“status”:“COMPLETE”,
“ambiguities”:[
“不清楚是否提到了相关的 SmartTherm 问题”,
“未识别 SmartLock 型号”,
“未确认客户的联系电话”
]
}
# 现在让我们尝试一些我们不想要的边缘案例提示总结:
summarize_call_with_final_prompt(garbled_call)
{
“status”:“INSUFFICIENT_DATA”
}
summarize_call_with_final_prompt(language_barrier_call)
{
“status”:“INSUFFICIENT_DATA”
}
summarize_call_with_final_prompt(incomplete_call)
{
“status”:“INSUFFICIENT_DATA”
}
# 太棒了!我们得到了我们想要的确切输出!让我们尝试进一步推动它:
summarize_call_with_final_prompt(“blah blah blah”)
{
“status”:“INSUFFICIENT_DATA”
}
summarize_call_with_final_prompt(“”)
{
“status”:“INSUFFICIENT_DATA”
}
# 太棒了,提示正在处理我们所有的极端情况!
总结 #
在本课中,我们介绍了开发用于总结客户服务通话记录的复杂提示的过程。让我们回顾一下我们采用的提示技术:
- 系统提示:我们使用系统提示为 Claude 设置整体背景和角色。
- 结构化输入:我们使用 XML 标签将通话记录放在提示的开头。
- 清晰的说明:我们提供了有关关注点以及如何构造输出的详细指南。
- 输出格式:我们为摘要指定了 JSON 结构,确保结果一致且易于解析。
- 处理极端情况:我们添加了用于识别数据不足的呼叫的标准。
- 示例:我们提供了各种示例来说明不同场景所需的输出。
- 大声思考:我们要求 Claude 在提供最终的 JSON 输出之前在标签中显示其分析。
通过采用这些技术,我们创建了一个强大的提示,能够为各种客户服务通话记录生成结构化摘要,同时适当地处理边缘情况。除了通话摘要之外,这种方法还可以适应许多其他复杂的提示场景。
重要提示:虽然我们已经开发出一种复杂的提示,似乎可以很好地处理我们的测试用例,但必须了解,该提示尚未投入生产。
我们创建的是一个有希望的起点,但它需要进行广泛的测试和评估,才能在实际环境中可靠地使用。我们目前的目测测试评估基于一小部分示例。这不能代表真实客户服务电话的多样性和通常不可预测的性质。为了确保提示的有效性和可靠性,我们需要实施包括定量指标的全面评估流程。
强大的数据驱动评估是弥合有希望的原型与可靠的生产级解决方案之间差距的关键。