Openai+Deeplearning.AI: ChatGPT Prompt Engineering(六)

news2024/9/21 2:38:38

想和大家分享一下最近学习的Deeplearning.AI和openai联合打造ChatGPT Prompt Engineering在线课程.以下是我写的关于该课程的前五篇博客:

ChatGPT Prompt Engineering(一)
ChatGPT Prompt Engineering(二)
ChatGPT Prompt Engineering(三)
ChatGPT Prompt Engineering(四)
ChatGPT Prompt Engineering(五)

今天我们来学习第五部分内容:个性化的聊天机器人。

个性化的聊天机器人是指以聊天的模式专门针对特定任务来和用户交流,以完成答疑、解惑、或完成某个特定任务。不过首先我们需要设置通过API来访问ChatGPT的主要代码:

import openai
 
openai.api_key ='YOUR_OPENAI_API_KEY'
def get_completion(prompt, model="gpt-3.5-turbo"):
    messages = [{"role": "user", "content": prompt}]
    response = openai.ChatCompletion.create(
        model=model,
        messages=messages,
        temperature=0, 
    )
    return response.choices[0].message["content"]

def get_completion_from_messages(messages, model="gpt-3.5-turbo", temperature=0):
    response = openai.ChatCompletion.create(
        model=model,
        messages=messages,
        temperature=temperature, 
    )
    return response.choices[0].message["content"]

上面我们定义了两个访问ChatGPT的函数get_completion和get_completion_from_messages这两个函数都使用了ChatGPT的"gpt-3.5-turbo"模型,而get_completion_from_messages比get_completion多了一个入口参数temperature,也就是说get_completion_from_messages允许外面外部调用改函数时修改模型的temperature参数,关于temperature参数的功能我已在上一篇博客中介绍过,这里不再赘述。

“gpt-3.5-turbo”模型与之前的“text-davinci-003”相比在和用户对话的数据结构上有所差异,“gpt-3.5-turbo”模型给对话的双方增加了角色(role), 这里角色会分成3种: system、user、assistant。system和assistant都是ChatGPT自身的角色,user是用户的角色,其中system是ChatGPT的初始角色,用来告知ChatGPT在接下来和用户对话的过程中将扮演什么样的角色,一般我们会这样来定义system角色:“你是一位XXXX,”(如,你是一位律师,你是一位老师,你是一个程序员。。。),assistant和user角色用来保存聊天机器人和用户之间的对话内容。一般情况下为了让ChatGPT能记住对话过程中的上下文,我们会把部分或者全部的对话内容保存在对话的结构体(messages)中,这样ChatGPT就有了记忆上下文的能力。下面我们看一下模拟的ChatGPT的对话结构体:

messages =  [  
{'role':'system', 'content':'You are an assistant that speaks like Shakespeare.'},    
{'role':'user', 'content':'tell me a joke'},   
{'role':'assistant', 'content':'Why did the chicken cross the road'},   
{'role':'user', 'content':'I don\'t know'}  ]

response = get_completion_from_messages(messages, temperature=1)
print(response)

messages =  [  
{'role':'system', 'content':'You are friendly chatbot.'},    
{'role':'user', 'content':'Hi, my name is Isa'}  ]
response = get_completion_from_messages(messages, temperature=1)
print(response)

 

messages =  [  
{'role':'system', 'content':'You are friendly chatbot.'},    
{'role':'user', 'content':'Yes,  can you remind me, What is my name?'}]
response = get_completion_from_messages(messages, temperature=1)
print(response)

 

messages =  [  
{'role':'system', 'content':'You are friendly chatbot.'},
{'role':'user', 'content':'Hi, my name is Isa'},
{'role':'assistant', 'content': "Hi Isa! It's nice to meet you. \
Is there anything I can help you with today?"},
{'role':'user', 'content':'Yes, you can remind me, What is my name?'}  ]
response = get_completion_from_messages(messages, temperature=1)
print(response)

这里我们调用了get_completion_from_messages函数,并传递了对话结构体messages和temperature参数,同时我们将temperature置位1,这告诉ChatGPT可以产生随机性的结果。因此如果我们执行多次get_completion_from_messages函数那么ChatGPT可能会每次产生多种不同的结果的回复。同时我们注意到在最后一次的对话中ChatGPT能记住用户的名字叫Isa, 这是因为在最后一次的messages中存储了用户和ChatGPT的多伦对话,其中也包含了用户的名字,所以最后ChatGPT能记住用户的名字叫 Isa, 而之前的对话ChatGPT无法记住用户的名字,这是因为之前的messages中没有记录用户的名字。

 订单机器人

接下来我们要让ChatGPT充当一个订单机器人,用户通过该机器人来订购披萨,而机器人的任务是为一个披萨店来收集用户的订单信息,并回答用户关于订购披萨的相关问题。下面我们看一下messages结构:

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)
import panel as pn  # GUI
pn.extension()

panels = [] # collect display 

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

 这里的context变量就是ChatGPT与客户对话的结构体,下面把context变量中的"system"角色的内容翻译成中文,以便大家能更好的理解system角色的定义:

context1 = [ {'role':'system', 'content':"""
你是一个订单机器人,这是一项为比萨餐厅收集订单的自动化服务。 \
你先问候客户,然后收集订单,\
然后问是自取还是送货。 \
您等待收集整个订单,然后对其进行汇总并最后检查客户是否还想添加任何其他内容。 \
如果是送货,你索要一个地址。 \
最后你收款了。\
确保阐明所有选项、附加功能和尺寸,以便从菜单中唯一标识该项目。\
你以简短、非常友好的对话方式回应。 \
菜单包括\
意大利辣香肠披萨 12.95, 10.00, 7.00 \
芝士披萨 10.95, 9.25, 6.50 \
茄子披萨 11.95, 9.75, 6.75 \
薯条 4.50, 3.50 \
希腊沙拉 7.25 \
配料:\
额外的奶酪 2.00, \
蘑菇 1.50 \
香肠 3.00 \
加拿大培根 3.50 \
艾酱1.50\
辣椒 1.00 \
饮料:\
可乐 3.00, 2.00, 1.00 \
雪碧 3.00, 2.00, 1.00 \
瓶装水 5.00 \
"""} ]  # accumulate messages

在定义system角色时我们首先告知ChatGPT它是一个订单机器人,主要任务是收集订单等待,在向ChatGPT交代了订购披萨的过程和步骤以后,接下来是菜单的内容,这样ChatGPT就可以根据菜单来向顾客推荐不同种类的披萨。下面是我们执行该程序后与订单机器人的聊天内容:

 

 

 这里我们全程使用中文与ChatGPT进行了对话,虽然我们在定义ChatGPT的system角色时用的全部是英语,ChatGPT仍然可以将英语的菜单内容翻译成中文后再回复给我们,整个对话过程显得得非常专业和流畅。

下面我们把订单信息通过JSON格式输出:

messages =  context.copy()
messages.append(
{'role':'system', 'content':'create a json summary of the previous food order. Itemize the price for each item\
 The fields should be 1) pizza, include size 2) list of toppings 3) list of drinks, include size   4) list of sides include size  5)total price '},    
)
 

response = get_completion_from_messages(messages, temperature=0)
print(response)

 

 

不足之处

这里我们定义的ChatGPT是一个订餐机器人,原则上它不应该回复和订餐无关的任何问题,我尝试了一些和订餐无关的话题,该订餐机器人也能正常回复,这说明我们的system角色定义仍然有改进的空间,应该在system角色定义的时候明确告知ChatGPT不应该回应任何与订餐无关的问题。

 

 尝试改进

在之前的system角色定义中我们没有告诉ChatGPT哪些问题不应该回答,因此该机器人会回答任何与订餐无关的问题,这也就违背了我们初衷。为此我们可以在system角色定义的时候加入一些限制性的话语,通过这些限制性话语我们可以尝试让机器人礼貌的回绝任何与订餐无关的问题,下面我们将在角色定义的时候插入这样的语句:

 这句话的意思是:“如果客户的问题与订购披萨无关,那么你就是说:抱歉,我只个订餐机器人,我无法回答任何与订购披萨无关的问题。”

import panel as pn  # GUI
pn.extension()

panels = [] # collect display 

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. \
If the customer's question has nothing to do with ordering pizza or \
ordering food, you say:Sorry, I'm an order bot and I can't answer questions \
not related to ordering pizza.\
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

 大体上说我们的改进取得了一定的效果,基本上机器人能够拒绝回答和订餐无关的问题,但我总感觉并不是十分完美,如果想要机器人严格的拒绝回答所有与订餐无关的问题,我们似乎还得教会机器人能够准确识别出客户的问题与订餐事件之间是否存在关系,以及这个关系的强弱。大家对这个问题有什么看法呢?

关于模型参数Temperature

如果模型有多个可选的结果,那么当temperature为0时,将会选择可能性最高的那个结果,如果调高temperature的值,那么就会增加模型挑选结果的随机性,也就是说可能性不高的结果也可能会选中,下面看个例子:

如果我对三种食物的实际喜爱程度分别是:pizza 53%, sushi 30%, tocos 5%, 也就是说我最喜欢的食物是pizza, 最不喜欢的是tacos, 居中的是sushi。当我们选中不同的Temperature时,会得到如下的结果:

 

 当temperature为0时,模型会100%选中pizza, 而当temperature为0.3时,模型会有2/3的概率选中pizza,有1/3的概率选中sushi, 当temperature为0.7时,选中三种食物的概率各位1/3。所以temperature的越大,随机性就越大。这样解释大家能理解temperature的作用了吗?

总结

今天我们学习了如果利用ChatGPT开发一个个性化的聊天机器人,让它能代替人类完成某些特定任务,这其中我们需要详细的定义机器的system角色,以避免机器人回答与任务本身无关的问题。

我们还介绍了模型参数temperature的功能和作业,比如temperature越大,会使模型的输出结果更有随机性。

参考资料

DLAI - Learning Platform Beta

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/594661.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QML Text 元素

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 在 QML 中,Text 和 Label 是两种常用的元素(Label 继承于 Text),用于显示文本内容。虽然它们看起来很相似,但在使用和功能上有一些不同。 对于 Text 元素,比较重要的是 text 与 font 属性,一旦指定了…

Linux常见IO模型-3

在前两篇博客中,我们讲述了常见的IO模型,并对多路转接模型中的select模型进行了细致介绍和具体的代码实现。那么接下来,我们在本篇博客中将对剩余的多路转接模型中的:poll和epoll进行介绍。 目录 1.poll 1.1操作流程 1.2代码实…

硬件系统工程师宝典(27)-----MOSFET、BJT搭配,干活不累

各位同学大家好,欢迎继续做客电子工程学习圈,今天我们继续来讲这本书,硬件系统工程师宝典。上篇我们说到场效应管的原理是通过“监测”栅极和源极间电压来实现控制漏极-源极之间电流的目的。今天我们来讲讲场效应管如何和BJT搭配设计控制电路…

【P44】JMeter 模块控制器(Module Controller)

文章目录 一、模块控制器(Module Controller)参数说明二、测试计划设计 一、模块控制器(Module Controller)参数说明 提供了一种在运行时将测试计划片段替换为当前测试计划的机制;模块控制器的目标是为增加脚本的复用…

springboot+vue实验室预约设备报修管理系统

本实验室管理系统管理员功能有个人中心,学生管理,教师管理,公告信息管理,知识库管理,实验课程管理,实验室信息管理,实验室预约管理,实验设备管理,采购记录管理&#xff0…

addon.MediaStream,erizo::MediaStream 还有addon.MediaXXX,erizo::MediaXXX

9. MediaStream 和erizo::MediaStream 类的继承关系 erizo::MediaStream source/agent/webrtc/rtcConn/erizo/src/erizo/MediaStream.h source/agent/webrtc/rtcConn/erizo/src/erizo/MediaDefinitions.h erizo::MediaSource source/agent/webrtc/rtcConn/erizo/src/erizo/…

【C++进阶4-AVLTree】尽可能条理清晰地为你讲解比普通BST更强的——AVLTree

今天,带来AVLTree的讲解。文中不足错漏之处望请斧正! 是什么 AVLTree是一种自平衡的二叉搜索树。 它通过控制左右子树的高度差不超过1来调节平衡,从而提高搜索,插入和删除的效率。 实现 结构 AVLTree为了能自动调节平衡&#…

第十四章行为性模式—策略模式

文章目录 命令模式解决的问题结构实例存在的问题适用场景 JDK源码解析 行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式…

Java阶段三Day07

Java阶段三Day07 文章目录 Java阶段三Day07Spring Security自定义UserDetails密码加密授权 JDK包结构文档注释规范JDK APIString APIString是不可变对象String常量池内存编码及长度使用indexOf实现检索使用substring获取子串trim去除两侧空白charAtstartsWith和endsWith大小写变…

3.1 矩阵连乘问题

博主简介:一个爱打游戏的计算机专业学生博主主页: 夏驰和徐策所属专栏:算法设计与分析 学习目标: 如果我要学习动态规划中的矩阵连乘问题,我会采取以下学习方法: 1. **理解问题的背景和目标:首…

pytorch中分布式Collective通信API学习

随着各种大模型的不断迭出,感觉现在的NLP领域已经来到了大模型的时代。那么怎么来训练一个大模型呢?其中比较关键的一个技术基础就是分布式训练。在阅读GLM源码的时候,感觉其中的分布式训练代码不是很熟悉,看起来有点吃力&#xf…

【Nature 2023】Computational approaches streamlining drug discovery

今天为大家介绍的是一篇发表于“Nature”上面的综述文章“Computational approaches streamlining drug discovery”, Computer-aided drug discovery has been around for decades, although the past few years have seen a tectonic shift towards embracing com…

马尔科夫链 Markov chain

马尔科夫链 1.实例参考文献 马尔科夫链(Markov chain)及其模型在机器学习中应用广泛,本文结合一些参考资料做一个总结。 注意的是,本文中提到的马尔科夫链,要与隐马尔科夫(HMM)作以区分。 1.实例 设某人的训练计划中有以下四项运动&#x…

通过VCP(VMware Certified Professional)认证

文章目录 小结要求考试证书参考 小结 通过VCP(VMware Certified Professional)认证,去年参加了VMware的培训,今年通过VMware Certified Professional (2V0-21.20)的考试,拿到证书。 要求 需要参加VMware的指定的培训,我在去年五…

【数据结构】 数组 array

一、什么是数组 连续内存空间,存储的一组相同类型的元素 二、常用操作 1.原理 access:通过索引直接读取元素的值 时间复杂度:O(1) search:遍历查找某个元素 时间复杂度:O(N) insert:插入位置后的元素依…

Generative AI 新世界 | 大语言模型(LLMs)在 Amazon SageMaker 上的动手实践

在上一篇《Generative AI 新世界:大型语言模型(LLMs)概述》中,我们一起探讨了大型语言模型的发展历史、语料来源、数据预处理流程策略、训练使用的网络架构、最新研究方向分析(Amazon Titan、LLaMA、PaLM-E 等&#xf…

QT超市管理系统

QT超市管理系统 前言QT介绍.pro文件主文件(main函数)窗口函数(mainwindow)用户登录(user_login)超市系统数据库(maketsql)超市商品的增删改查(dlg_addmak)收款码界面(picture)结语 前…

亚马逊云科技探路可持续,数智创未来

气候变化是全人类的共同挑战。应对气候变化,事关永续发展,关乎人类前途命运。2020年中国在联合国大会上亚马逊云科技作出庄严承诺,要在2030年实现碳达峰,2060年实现碳中和,这是个全球性的规划,也是个庄严的…

Yolov8轻量化:MobileNetV3,轻量级骨架首选

1.轻量化网络简介 轻量化网络是指在保持模型性能的前提下,尽可能减小模型参数量和计算量的神经网络。这种网络通常被用于在移动设备等资源受限的场景中部署,以提高模型的实时性和运行效率。 轻量化网络的设计思路可以包括以下几个方面: 去除冗余层和参数:通过剪枝、蒸馏等技…

MFC(五)菜单栏和工具栏

这篇文章我们来完成菜单设计和工具栏设计 菜单设计 1.点开资源视图>Menu>IDR_MAINFRAME 通过IDR_MAINFRAME我们可以编辑该资源定义,包括主菜单、其他菜单、工具栏等内容,IDR_MAINFRAME即为默认的主窗口的资源标识符 2.右键相应菜单>新插入&…