LLM:企业AI应用实例(2)-智能带教

适用于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转换为语音),或者直接使用端到端模型。【本文旨在讲述提示词的撰写和基础使用,故不展开】

值得注意的时,上述整一套逻辑由提示词起到支撑作用,角色的身份,背景,台词,行为逻辑等等均由提示词定义,读者可以尝试撰写多种提示词观察效果,达到练习目的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lzc1009840152

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值