适用于LLM初学者。学习调用常规的大语言模型,并进行简单的智能带教(角色扮演)。
1 前言
随着大模型应用的普及,一些企业开始尝试将新员工带教场景与大模型进行融合,旨在利用大模型的对话能力进行角色扮演,帮助新员工快速上手技能和练习。
本文以酒店前台员工的接待演练为例,帮助新人快速学习。
2 数据准备
带教场景的落地需要企业内的业务方(如培训部门)积极配合,包括提供对话场景,对话内容,对话打分标准等。
以下是简单的数据示例:
{"responsibility": "前台员工:作为酒店前线的代表,该角色承担着礼貌接待客户、满足客人需求、解决客户问题的重任。", "description": "现在是一个非常宁静的午后,酒店前台正在值班,突然有个客户走了过来", "male_background": "背景故事:\n客户叫做小明,是一位勤奋敬业的软件工程师,在一家大型科技公司工作。他热衷于他的工作。\n入住酒店的原因:\n因工作出差需要入住酒店。他选择该酒店是因为其便利的位置和良好的声誉。", "male_motivation": "他是一个注重细节的人,他希望保持自己的衣服干净整洁。他到前台询问酒店是否提供洗衣服务,以便他可以清洗他的衣服。","assessment_points": "考核要点主要包括五个方面:1)礼貌问候(20分): 使用温和亲切的语气,确保客户感受到热情友好的氛围(10分)。\n2)询问客人要求(20分): 主动询问客人的具体需求,使用清晰、准确的语言进行交流(20分)。\n3)提供问询服务(40分): 根据客人的询问,提供详尽、准确的信息或解决方案。(40分)。\n4)礼貌道别(20分): 确认客人已无其他询问,用礼貌的语言进行道别,表达希望客人满意的愿望(20分)。", "scoring_criteria": [{"content": "使用亲切的标准的问候语", "score": 20, "expected_behavior": true}, {"content": "前台人员主动询问问询客户的具体需求", "score": 20, "expected_behavior": true}, {"content": "可以15min内解决的问题,应向问询客户提供详尽、准确的信息或解决方案。", "score": 40, "expected_behavior": true}, {"content": "使用礼貌的道别语结束通话,出现了感谢和再见的话术", "score": 20, "expected_behavior": true}], "dialogue_example": "前台员工: 您好,这里是XX酒店,有什么能够为您服务的?\n问询客户: 你好,请问酒店提供洗衣服务吗?\n前台员工: “是的,先生,我们酒店确实提供洗衣服务。您可以将您的衣物送到前台,我们的工作人员会将它们送到洗衣房。洗衣服务通常需要 24 小时。您希望我们为您提供洗衣服务吗?”\n问询客户: 需要,稍后我会将衣服送过来。\n前台员工: 好的先生,祝您有美好的一天,再见。", "end_condition": "前台回答内容包括:再见。匹配到再见语义则触发结束。"}
3 实现代码
3.1 准备环境
import pandas as pd
import os
os.environ['DASHSCOPE_API_KEY']='sk-806b105ccce348079245360fbb4602d3'
import json
from dashscope import Generation
3.2 读取数据
df = pd.read_csv("带教表.csv")
json_str = df.at[0, 'info']
data = json.loads(json_str)
responsibility = data['responsibility']
description = data['description']
male_background = data['male_background']
male_motivation = data['male_motivation']
dialogue_example = data['dialogue_example']
end_condition = data['end_condition']
3.3 准备提示词
真实使用的时候,对话的一位是真实用户,另外一位由大模型扮演。
但由于在开发的过程中,每次需要模拟输入真实用户的输入,故使用大模型扮演真实用户。
即实现如下对话时,一位是大模型扮演的真实用户,另外一位是真实使用时的陪练大模型。
这里准备了两套提示词,角色分别为酒店前天员工和顾客。
def employee_system_prompt(male_background, male_motivation, dialogue_example):
employee_multi_template = f'''
现在是一场酒店培训的模拟演练考核。
user是酒店的客户,assistant是酒店前台员工
user的背景:{male_background}
user的情况:{male_motivation}
模拟演练考核的例子:{dialogue_example}
现在开始模拟演练,你是assistant,即酒店前台员工。请你时刻牢记自己的身份。你只需要输出自己的话术即可。请以“您好,这里是酒店前台,有什么能够为您服务的?”为开头。
如果你判断客人没有别的问题或者的需求已经被满足,请回复:“祝您有一个美好的一天!”作为结束
'''
return employee_multi_template
employee_system_prompt = employee_system_prompt(male_background, male_motivation, dialogue_example)
def customer_system_prompt(male_background, male_motivation, dialogue_example):
customer_multi_template = f'''
现在是一场酒店培训的模拟演练考核。
assistant是酒店的客户,user是酒店前台员工
assistant的背景:{male_background}
assistant的情况:{male_motivation}
模拟演练考核的例子:{dialogue_example}
现在开始模拟演练,你是assistant,即酒店的客户。请你时刻牢记自己的身份。你只需要输出自己的话术即可。你需要根据你的背景,向前台员工发起对话。
如果前天已经解决了你的问题,请你回复:“谢谢你的解答,我没有别的问题了”
'''
return customer_multi_template
customer_system_prompt = customer_system_prompt(male_background, male_motivation, dialogue_example)
3.4 循环使得两个大模型相互对话
注意,这里我们制定了一些对话规则,如最多对话8轮,并且在之前的提示词中,我们设计了前台作为话题的开启者和结束者,客人表示没有疑问或需求已经被满足是结束对话的条件之一等等。
这里具体的规则需要研发和业务方共同制定,并且受模型能力的影响,一些逻辑在实际落地时会有一定挑战。
for i in range(8):
# 酒店前台llm先启动
if i == 0:
employee_messages = [{'role': 'system', 'content': employee_system_prompt},
{'role': 'user', 'content': '你好'}]
else:
employee_messages.append({'role': 'user', 'content': customer_response})
response = Generation.call(model="qwen-max",
messages=employee_messages,
result_format='message')
employee_response = response.output.choices[0]['message']['content']
print("【酒店前台】:", employee_response)
# 将酒店前台的回复添加到消息列表中
employee_messages.append({'role': 'assistant', 'content': employee_response})
# 检查关键词
if "美好的一天" in employee_response:
print("----------------")
print("对话完成,停止循环。")
break
# 客人llm回应
customer_messages = [{'role': 'system', 'content': customer_system_prompt}]
customer_messages.append({'role': 'user', 'content': employee_response})
response = Generation.call(model="qwen-max",
messages=customer_messages,
result_format='message')
customer_response = response.output.choices[0]['message']['content']
print("【客人回复】:", customer_response)
# 将客人的回复添加到消息列表中,为下一轮做准备
customer_messages.append({'role': 'assistant', 'content': customer_response})
执行后的结果:
3.5 对话打分
content 就是3.4中循环对话得到的内容。现在对话术进行判分。
def get_prompt(content, requirement, standard, output_format):
prompt = f'''
你是一名自然语言处理专家,擅长理解、分析文本的语义,判断语义是否符合给定的标准,给出语义与标准的吻合程度,并给出合理的解释和建议。
下面给你的是一段酒店前台员工的话术,请根据评分标准进行评分。在评分时遵循以下步骤或原则:
1. 如果话术没有满足requirement,请具体指出。
2. 严格遵守standard对话术进行打分。
3. 严格按照output_format的要求进行输出,确保输出结果可以被Python的json.loads()函数解析。
话术:
{content}
requirement:
{requirement}
standard:
{standard}
output_format:
{output_format}
'''
return prompt
content = f'''
【酒店前台员工】: 您好,请问有什么可以为您服务的吗?
【客人】: 您好,我需要叫一辆出租车,但是我年纪大了,不太会用手机软件叫车,希望你们能帮我安排一下。我要去机场,大约下午两点钟出发。
【酒店前台员工】: 您好,非常理解您的需求。当然可以帮您叫车。首先,我可以为您推荐使用叫车软件网约叫车,我们会协助您完成这个过程。如果您更愿意的话,我们也可以帮您直接通过电话叫车。请问您希望哪种方式呢?同时,请告诉我您的房间号、姓名、联系电话以及具体的乘车人数,以便我们可以更好地为您安排。
【客人】: 我还是希望您能帮我电话叫一辆出租车吧,我的房间号是503,姓名是张华,联系电话是138XXXX5678,就我一个人乘车,两点钟准时出发。
【酒店前台员工】: 好的,张华先生,我已经记录下了您的信息:房间号503,姓名张华,联系电话138XXXX5678,乘车人数1人,出发时间为下午两点整,目的地是机场。我现在马上为您拨打电话联系出租车公司,预计很快就能帮您安排好车辆。在叫车成功后,我会立即向您提供司机的联系电话和车牌号码,请您稍等片刻。
(几分钟后)
张华先生,我已经成功为您预订了一辆出租车,司机将在下午两点准时在酒店门口等候您。以下是司机的联系方式和车牌信息:司机电话是139YYYYY7777,车牌号码为京A12345。请您按时到酒店大堂,工作人员会协助您上车。确认无误后,我想问一下,您现在还有其他需要我们帮助的地方吗?
【客人】: 我没有其他需要了,非常感谢!
【酒店前台员工】: 不客气,张华先生。如果有任何其他需要,欢迎随时告诉我们。祝您有一个愉快的一天,一路平安,再见!
'''
requirement = f'''
1. 优先推荐客人手机叫车软件网约叫车,如话术:“您好!您可直接使用叫车软件网上约车 , 更快捷方便”。
2. 如果客人需要酒店帮忙叫车,则记录下客人房号、姓名、电话、用车时间、目的地以及其他需求 。
3. 根据客人选择,为客人操作网约车或拨打电话叫车。如前台员工利用本人手机为客人网络叫车,或者打出租汽车公司电话,为客人叫车。
4. 结果反馈:叫车成功后,向客人提供司机的联系电话及车牌号码等明细信息,确保客人能顺利找到车辆。
5. 结束服务时,问询客人是否还有其他需要帮助的地方,礼貌道别
'''
standard = f'''
1)叫车服务介绍:详细介绍网络约车和电话叫车的优势与操作方法(10分)。 准确传达电话叫车服务的联系方式,提供选择(10分)。
2)客户需求确认与记录: 准确捕捉并确认客人的叫车需求,如目的地、出发时间等(10分)。
如有必要,正确记录客人信息,以备电话叫车时使用(10分)。
3)操作叫车流程:根据客人选择,为客人操作网约车或拨打电话叫车(15分)。 与叫车服务沟通时,准确传达客人需求(15分)。
4)提供司机信息: 叫车成功后,向客人提供司机的联系电话及车牌号码等明细信息,确保客人能顺利找到车辆(20分)。
5)结束服务: 问询客人是否还有其他需要帮助的地方,礼貌道别(10分)。
'''
output_format = f'''
{{
"Thinking": [
{{
"Item": "评分项A",
"Score": 分值,
"Explanation": "如何评分的解释。"
}},
{{
"Item": "评分项B",
"Score": 分值,
"Explanation": "如何评分的解释。"
}}
],
"TotalScore": 总评分,
"Conclusion": "根据各项的打分情况,给出合理的解释和建议"
}}
'''
answer = llm_request(get_prompt(content, requirement, standard, output_format))
print(answer)
```json
{
"Thinking": [
{
"Item": "叫车服务介绍",
"Score": 20,
"Explanation": "员工首先推荐了使用叫车软件网约叫车,并表示可以协助完成,同时也提供了电话叫车的选择,满足了标准要求。"
},
{
"Item": "客户需求确认与记录",
"Score": 20,
"Explanation": "员工准确地捕捉并确认了客人的叫车需求,包括目的地、出发时间和乘车人数,并正确记录了客人的房号、姓名、电话等信息,完全满足标准要求。"
},
{
"Item": "操作叫车流程",
"Score": 30,
"Explanation": "员工按照客人选择的方式进行了电话叫车,并在过程中准确传达了客人需求,完成了叫车服务流程,满足标准要求。"
},
{
"Item": "提供司机信息",
"Score": 20,
"Explanation": "员工在叫车成功后,及时向客人提供了司机的联系电话和车牌号码等详细信息,确保客人能顺利找到车辆,满足标准要求。"
},
{
"Item": "结束服务",
"Score": 10,
"Explanation": "员工在服务结束后询问了客人是否还有其他需要帮助的地方,并礼貌地道别,满足标准要求。"
}
],
"TotalScore": 100,
"Conclusion": "根据各项评分,该酒店前台员工在处理客人叫车需求的过程中,完全遵循了标准要求,表现得专业且周到,总评分为满分100分。建议继续保持高质量的服务水平,关注并满足不同客户的需求。"
}
```
4 总结
至此,我们实现了多轮对话的交互和角色扮演。在实际生产中,我们只需使用其中一套提示词(另外一套直接由真实用户的输入替代)。
同时,在真实演练场景下,我们可以使用ASR和TTS来完成整个流程的衔接(用户可以语音输入,ASR将语音转换为文本后送入大模型,大模型的输出再由TTS转换为语音),或者直接使用端到端模型。【本文旨在讲述提示词的撰写和基础使用,故不展开】
值得注意的时,上述整一套逻辑由提示词起到支撑作用,角色的身份,背景,台词,行为逻辑等等均由提示词定义,读者可以尝试撰写多种提示词观察效果,达到练习目的。