本文基于对于吴恩达老师的课程学习笔记,继续描述记录如何通过Expanding 扩展以及ChatBot 聊天机器人的概念更好的去得到和我们预期相符合的输出。
1. Expanding 扩展
扩展的概念实际上是我们给出一个文本,或者是指令或者是主题,然后借助ChatGPT这种大语言模型根据我们的指令去理解然后扩展成为更加符合我们预期的输出,或者是辅助我们进行头脑风暴,下面是课程中一段AI客服的简单示例。
# 示例
# 下面的示例是让模型理解客户发送过来的邮件,并且理解、提取用户反馈定制对客户电子邮件的自动回复
sentiment = "negative"
text = f"""
所以,他们仍然有季节性的 17 件系统
11 月份的售价约为 49 美元,大约
半价,但出于某种原因(称之为价格欺诈)
大约在 12 月的第二周,价格全部下跌
同样的价格高达 70 美元至 89 美元之间
系统。 11 件式系统上涨了大约 10 美元或
所以价格也低于之前的售价 29 美元。
所以它看起来还不错,但是如果你看一下底座,那部分
刀片锁定到位的地方看起来不太好
和几年前的以前的版本一样,但我
计划对它非常温柔(例如,我迷恋
非常坚硬的物品,如豆子、冰、米等。
先用搅拌机粉碎,然后按份量粉碎
我想在搅拌机里然后切换到鞭打
刀片用于更细的面粉,并使用横切刀片
先做冰沙,再用平刀片
如果我需要它们更细/更稀疏)。 制作时的特别提示
冰沙,切碎并冷冻水果,
蔬菜(如果使用菠菜,轻轻炖软化
菠菜然后冷冻直到可以使用——如果做的话
冰糕,使用中小型食品加工机)
你打算用那种方式你可以避免添加
做冰沙时,如果有的话,要加很多冰。
大约一年后,电机发出一种奇怪的声音。
我打电话给客户服务但保修已过期
已经,所以我不得不再买一个。 仅供参考:总体
这些类型的产品质量已经完成,所以
他们有点指望品牌知名度和
消费者忠诚度以维持销售。 大约在
两天。
"""
prompt = f"""
你是客服AI助理。
您的任务是向尊贵的客户发送电子邮件回复。
给定由 ``` 分隔的客户电子邮件,
生成回复以感谢客户的评论。
如果情绪是积极的或中立的,感谢他们
他们的评论。
如果情绪是负面的,道歉并建议
他们可以联系客户服务。
确保使用评论中的具体细节。
以简洁和专业的语气写作。
将电子邮件签名为“AI 客户代理”。
客户评论:```{text}```
评论情绪:{sentiment}
"""
# 输出结果:
尊敬的客户,
非常抱歉听到您的不满。我们深刻理解您对我们产品的期望和要求,我们感到非常遗憾,我们的产品未能满足您的期望。
我们建议您联系我们的客户服务团队,以便我们可以更好地了解您的问题,并为您提供更好的解决方案。我们将竭尽全力解
决您的问题,并确保您对我们的服务感到满意。
再次感谢您对我们的产品的关注和支持。我们期待着为您提供更好的服务。
祝您一切顺利。
AI客户代理
上面的输出结果可以看到模型对于客户的电子邮件进行了理解,并且针对用户不满意的地方进行了道歉。实际上在调用API构建请求的时候还有一个比较有效的参数:Temperature。
Temperature 的结合使用
通常我们的请求Temperature使用的默认值为0,这个时候模型的输出会更加的标准化,而Temperature 的数值越大Temperature的输出就会越来越不可控,但是这样子的参数也为模型给我们的输出带来了更多创意或者是帮助我们头脑风暴,下面课程中的这幅图很清晰的描述了这个概念。
我们可以看到模型预测我们最喜欢吃的3种食物分别有不同的机率。那么在Temperature 为0的时候一定会输出pizza的标准答案。如果Temperature 为0.3的时候有可能输出机率为百分之30的sushi,但是最后Temperature 为0.7的时候只有百分之5机率的tacos。这样子的一种能力可以根据我们实际的场景去配置。针对上面的输出,我们也可以调整一下Temperature 值去看一下最终模型的输出。
# 示例
# 修改调用函数,加入temperature的参数传递
def get_completion(prompt, model="gpt-3.5-turbo", temperature=0):
messages = [{"role": "user", "content": prompt}]
result = openai.ChatCompletion.create(
model=model,
messages=messages,
temperature=temperature,
).choices[0].message[content]
return result
# prompt不变,调用的时候修改temperature 为0.7
response = get_completion(prompt, temperature=0)
# 输出结果:
尊敬的客户,
我们非常抱歉您对我们的产品有不满意的经历。我们的目标是提供高品质的产品和服务,但是我们似乎没有达到您的期望
值。我们了解到您遇到了电机噪音的问题,并且因为保修期已过而无法提供更多信息。
我们建议您联系我们的客户服务团队,以获取更多帮助和支持。我们将尽力为您解决问题,并确保您的满意度。
在此,我们感谢您对我们产品的关注和反馈。我们一直在努力改进我们的产品和服务,以满足客户的需求和期望。如果您
有任何其他问题或意见,我们乐意听取。
祝一切顺利。
AI客户代理
相对于上面内容有点模版化的输出,当我们把temperature 值拉高的时候似乎模型给我的输出发现了更多不一样的观点。同时值得一提的是,当我们把值设为0的时候每次输出基本一致,而拉高之后会产生不同的输出。
2.ChatBot 聊天机器人
ChatGPT作为一个大型的语言模型,实际上可以接收一系列消息的输入,然后再返回模型生成的输出。因此下面我们可以通过一个在小吃店下单的示例,提前给予模型我们的预设提示词,然后让ChatGPT和用户之间完成一个下单的工作。下面的示例中我们提前预设好prompt之后会有两个角色,用户(user)和助手(assistant)。
# 示例
# 创建上下文
def collect_messages(_):
prompt = inp.value_input
inp.value = ''
context.append({'role': 'user', 'content': f"{prompt}"})
response = get_completion_from_messages(context)
context.append({'role': 'assistant', 'content': f"{response}"})
panels.append(
pn.Row('User:', pn.pane.Markdown(prompt, width=600)))
panels.append(
pn.Row('Assistant:', pn.pane.Markdown(response, width=600, style={'background-color': '#F6F6F6'})))
return pn.Column(*panels)
# 下面通过代码绘制GUI
pn.extension()
panels = [] # collect display
# 这里就不具体翻译了,实际上就是一些预设prompt,告诉助手自动服务的流程,然后是一份菜单
context = [{'role': 'system', 'content': """
You are OrderBot, an automated service to collect orders for a pizza restaurant.
You first greet the customer, then collects the order,
and then asks if it's a pickup or delivery.
You wait to collect the entire order, then summarize it and check for a final
time if the customer wants to add anything else.
If it's a delivery, you ask for an address.
Finally you collect the payment.
Make sure to clarify all options, extras and sizes to uniquely
identify the item from the menu.
You respond in a short, very conversational friendly style.
The menu includes
pepperoni pizza 12.95, 10.00, 7.00
cheese pizza 10.95, 9.25, 6.50
eggplant pizza 11.95, 9.75, 6.75
fries 4.50, 3.50
greek salad 7.25
Toppings:
extra cheese 2.00,
mushrooms 1.50
sausage 3.00
canadian bacon 3.50
AI sauce 1.50
peppers 1.00
Drinks:
coke 3.00, 2.00, 1.00
sprite 3.00, 2.00, 1.00
bottled water 5.00
"""}] # accumulate messages
inp = pn.widgets.TextInput(value="Hi", placeholder='Enter text here…')
button_conversation = pn.widgets.Button(name="Chat!")
interactive_conversation = pn.bind(collect_messages, button_conversation)
dashboard = pn.Column(
inp,
pn.Row(button_conversation),
pn.panel(interactive_conversation, loading_indicator=True, height=300),
)
dashboard
通过上面的代码我们一个自动化服务的简单demo就完成啦,我们可以通过实际运行结果看到ChatGPT遵循我们的prompt很好的为我们完成了下订单的操作。
这个过程中,助手首先向我们问好并且询问了我们需求,然后我们从产品到价格到配料的沟通最终形成一个订单,这个过程是非常优秀的。
总结:目前的人工智能水平其实还是处于AIUGC时代(AI辅助用户创作),所以能够理解并且很好的驾驭提示词成为发挥模型能力的关键因素之一,理解提示词可以帮助我们实现如何在更少的请求下完成更精准和高质量的输出。