OpenAI官方提示词课(七)制作一个聊天机器人

大型语言模型的一个令人兴奋的方面是,你可以利用它来构建一个定制的聊天机器人,并且只需付出少量的努力。ChatGPT 的网页界面可以让你与一个大型语言模型进行对话。但其中一个很酷的功能是,你也可以利用大型语言模型构建你自己的定制聊天机器人,例如扮演一个人工智能客服代理或餐厅的人工智能点餐员的角色。本篇文章将揭晓如何做到这一点。

下面是两种调用OpenAI接口的函数。get_completion只支持单轮对话,意味着模型回答问题时不会考虑之前的对话信息。get_completion_from_messages支持多轮对话信息。这是因为它的参数message可以包含对话的上下文。下面我们看看它们在对话机器人中是怎么使用的。

# 支持单轮对话
def get_completion(prompt, model="gpt-3.5-turbo"):messages = [{"role": "user", "content": prompt}]response = openai.ChatCompletion.create(model=model,messages=messages,temperature=0, # this is the degree of randomness of the model's output)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, # this is the degree of randomness of the model's output)#print(str(response.choices[0].message))  #该打印可以打印完整的返回信息return response.choices[0].message["content"]

角色定义

下面是一个消息列表的例子,首先是一个系统消息,它提供了整体指示。在这条消息之后,我们有用户助手之间的多轮对话,这个对话会一直进行下去。如果你曾经使用过ChatGPT的网页界面,那么你的消息就是用户消息,ChatGPT的消息就是助手消息系统消息有助于设定助手的行为和个性,并且它在对话中充当高级指令。你可以将其视为在助手耳边私下交流并引导其回复,而用户并不知道系统消息的存在。作为用户,如果你曾经使用过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)

回答:

#response.choices[0].message 中的完整内容
{"content": "To get to the other side, my good sir!","role": "assistant"
}To get to the other side, my good sir!

OpenAI服务器不会记住对话的上下文信息

下面的示例展示了OpenAI服务器不会主动记住对话的上下文信息的现象。所以要在对话中让模型根据对话的上下文来回答问题,我们需要把之前的对话一并发给OpenAI服务器。

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)

回答:

Hello Isa! It's great to meet you. How can I assist you today?

再次单独询问时,模型并没有回答出我的名字是Isa。

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)

回答:

I apologize but I don't have access to your name as it is not provided to me. Can you please tell me what name I should refer you as?

当我们把前后文信息一起发送个模型,模型正确地回答了我的名字。

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)

回答:

Your name is Isa. :)

这里也引出了一个问题。当我们不断累积上下文对话,输入的文字会越来越多。一方面模型对输入的文字数量是有限制的,另一方面每个文字可都是算钱的。

所以,当文字多了会对上下文进行总结,或者遗忘最开始的一些对话,然后再输入给模型。当然总结的事也可以让ChatGPT干的。

不过,最近OpenAI放出了新的模型,最常用的gpt-3.5-turbo模型有了新版本,可支持的Token(近似文字数量)提升了4倍,价格还下降了25%。可喜可贺。

订披萨的对话机器人示例

订餐机器人(OrderBot)可以自动收集用户的订餐需求并作出回应。这个订餐机器人将会在一家比萨饼店接受用户订单。

def collect_messages(_):prompt = inp.value_inputinp.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 messagesinp = 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

上面的代码定义了system角色,并把披萨店的菜单,商品价格和回复客户的方式都定义好了。

下面的对话示例可以看到效果还是很棒的。

User:Assistant:Hello! Welcome to our pizza restaurant. What can I get for you today?User:Hi! I would lile to pick up a pizzaAssistant:Great! What kind of pizza would you like to order? We have pepperoni, cheese, and eggplant pizza.User:How much are they?Assistant:The pepperoni pizza is $12.95 for a large, $10.00 for a medium, and $7.00 for a small. The cheese pizza is $10.95 for a large, $9.25 for a medium, and $6.50 for a small. The eggplant pizza is $11.95 for a large, $9.75 for a medium, and $6.75 for a small.User:pepperoni pizza pleaseAssistant:Great choice! What size would you like for your pepperoni pizza?User:largeAssistant:Got it! Would you like any toppings on your pizza? We have extra cheese, mushrooms, sausage, Canadian bacon, AI sauce, and peppers.User:what is the total price?Assistant:The total price for a large pepperoni pizza without any toppings is $12.95. If you would like to add any toppings, I can let you know the additional cost.User:thank you. That’s all.Assistant:Alright, just to confirm, you would like to order a large pepperoni pizza without any toppings. Is that correct?User:yesAssistant:Great! Is this for pickup or delivery?User:pick upAssistant:Perfect! Your total for the large pepperoni pizza is $12.95. Is there anything else you would like to add to your order?User:No. Thanks.Assistant:You’re welcome! Please come to our restaurant for pickup in 20-25 minutes. Our address is 123 Main Street. Thank you for choosing our pizza restaurant!

最后将客户的订单进行总结,并按JOSN格式输出。

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 '},    
)#The fields should be 1) pizza, price 2) list of toppings 3) list of drinks, include size include price  4) list of sides include size include price, 5)total price '},    response = get_completion_from_messages(messages, temperature=0)
print(response)

回答:

Here's a JSON summary of the previous food order:​```
{"pizza": {"type": "pepperoni","size": "large","price": 12.95},"toppings": [],"drinks": [],"sides": [],"total_price": 12.95
}
​```Since the customer did not order any toppings, drinks, or sides, those fields are empty. The total price is $12.95, which is the price of the large pepperoni pizza.

上面定义了system角色来回答,其实这里用user效果是一样的。

messages =  context.copy()
messages.append(
{'role':'user', '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 '},    
)#The fields should be 1) pizza, price 2) list of toppings 3) list of drinks, include size include price  4) list of sides include size include price, 5)total price '},    response = get_completion_from_messages(messages, temperature=0)
print(response)

回答:

Sure, here's a JSON summary of your order:​```
{"pizza": {"type": "pepperoni","size": "large","price": 12.95},"toppings": [],"drinks": [],"sides": [],"total_price": 12.95
}
​```Please note that the "toppings", "drinks", and "sides" fields are empty since you did not order any. If you had ordered any toppings, drinks, or sides, they would be listed under their respective fields with their corresponding prices.

参考:

https://learn.deeplearning.ai/chatgpt-prompt-eng/lesson/8/chatbot


觉得有用就点个赞吧!

我是首飞,一个帮大家填坑的工程师。

我也准备了一份提示词的文档。有涉及到各个领域的提示词模板。
在这里插入图片描述
您可以在《首飞》公众号中回复“ 提示词 ” 获取该文档。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Auto-GPT增强您的ChatGPT提示,成为你的虚拟助手

这个新工具基本上将ChatGPT转化为一个虚拟助手,帮助您管理项目,运营营销活动等。 背景介绍 人工智能工具的能力正在迅速进步,谷歌、微软、OpenAI等公司正在竞相保持领先优势。似乎每周都在推出新的进展和应用程序,AI能为我们带来…

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

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

大二学生--腾讯CSIG测开面经

大二学生一个偶然的机会,腾讯某个岗位比较急,有点像内推吧,就想着试试看,积累积累经验(深技大大三下就开始实习)就把简历发过去了。 一面(30min) 首先面试官Kinda人很好&#xff0…

2021 腾讯校招 + 后台开发面经(已 offer)

综合总结: 面试效率极高面试官全程引导性面试,尽显大佬风范。有不会的题目可以和面试官讨论探索,体验极好。 知识总结: 常见网络协议及性质基础数据结构和算法实际问题的解决经验 腾讯一面 时长 70 分钟 自我介绍 常见数据结…

ChatGPT助力校招----面试问题分享(九)

1 ChatGPT每日一题:单片机上电未正常工作,如何检查 问题:单片机上电没有正常工作,如何检查 ChatGPT:如果单片机上电后没有正常工作,以下是一些可能的检查步骤: 检查电源:确保单片…

腾讯CSIG事业群后台开发 3+1hr面经【已offer】

时间线 这是腾讯面试的第二个事业群,总体难度比第一个大,尤其是喜欢深挖底层。可能是我最近太欧了,流程走的贼快,面试也很顺利,尽管总监喜欢dfs到候选人自闭,还是挺过来了,目前offer正在报批in…

内推学弟进了腾讯,看看他的标杆简历!

直系学弟的简历分享,凡人也可以成仙?! 大家好,我是鱼皮,求职季快到了,很多小伙伴问我:简历应该怎么写才能吸引面试官呢? 其实之前给大家分享过鱼皮自己的求职简历和简历模板&#x…

工具推荐_mathcha、Mathpix 快速编写数学公式

目录 LaTeX 简介:一、Mathcha 在线编辑器Mathcha 使用教程: (一)通过输入名字、分类、画板快速查找和输入数学符号(二)可支持LaTeX导入、导出 LaTeX 格式(三)使用操作视频二、Mathpi…

【计算方法】python求解数值积分|梯形公式|辛普森公式|高斯求积公式

梯形公式 import numpy as npdef ff(x):return np.sqrt(x)*np.log(x)def tixing_quad(ff,a,b,n):x_p np.linspace(a,b,n1) #linspace去得到右端点,arrange去不到h (b-a)/nf np.zeros(n1)f[1:n1] ff(x_p[1:n1])value 0for i in range(n):value (f[i]f[i1])*h/…

超强大的数学计算器——WolframAlpha(含安卓下载连接)

文章目录 一 软件界面二 常用的功能展示(输入样例)2.1 计算不定积分2.2 定积分2.3 级数求和2.4 无穷乘积2.5 求导2.6 求高阶导2.7 偏导数2.8 解微分方程2.9 绘制函数图像2.10 泰勒展开2.11 联立方程组2.12 极限2.13 矩阵2.14 波特图2.15 根轨迹 大概介绍这些,画图用…

全网最详细中英文ChatGPT-GPT-4示例文档-最强JS助手聊天机器人应用从0到1快速入门——官网推荐的48种最佳应用场景(附python/node.js/curl命令源代码,小白也能学)

从0到1快速入门最强JS助手聊天机器人应用场景 Introduce 简介setting 设置Prompt 提示Sample response 回复样本API request 接口请求python接口请求示例node.js接口请求示例curl命令示例json格式示例 其它资料下载 ChatGPT是目前最先进的AI聊天机器人,它能够理解图…

【杂谈】有三AI课程兼职讲师,打造自己的影响力,我从这里开始!

各位有三AI的读者朋友们大家好,我是Leo,是一名“有三AI”团队的讲师,同时也是一名大学老师,目前在有三AI兼职讲师两年了,给大家简单分享下自己的经历,也供更多有兴趣来平台做兼职讲师的朋友了解。 与有三AI…

黑群晖数据同步备份

1、很多新人朋友,有NAS以后,都采用手动复制文件到NAS这种低效率的备份方式。 有时候忘记备份,导致数据丢失! 有时候某些数据做错了一些操作,但是找不到旧版本的文件了,而有了NAS以后,这些问题都可以完美的解决! 现在大部分NAS,拷贝文件都有100MB/s以上的速度,这个速…

群晖网页服务器,群晖web服务器

群晖web服务器 内容精选 换一换 简要介绍Keepalived的作用是检测服务器的状态。假设有一台服务器出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作。当服务器工作正常后,Keepalived自动将服务器加入到服务器群中。这些工…

群晖通过WebDAV挂载阿里云盘

什么是群晖? 群晖是Nas品牌。纵观NAS市场,系统层面几乎是被群晖和威联通所垄断的,只要你使用NAS基本都逃不过这两个系统。所以只要能够玩转这两个系统就基本上通吃市面所有的NAS了。 它能做到的事情有很多,许多刚接触到 NAS 的玩家…

群晖DDNS解析

网上关于DDNS解析的介绍已经很多了,我这里主要列举通过阿里云和Cloudflare进行解析。使用两个解析的原因是阿里云的域名必须要备案,不然会被阿里云封掉(阿里云解析的域名如果解析的IP不是阿里云服务器的,还会提示要求使用阿里云服…

群晖可以修改服务器名字吗,群晖主机改服务器

群晖主机改服务器 内容精选 换一换 DCC是物理隔离的专属计算资源集群,集群中主机可能会因为故障而自动停机。为降低物理机故障的影响,在用户购买的专属集群内资源有冗余的情况下,在集群内的云服务器支持自动迁移能力。带有本地盘的主机不支持宕机自动迁移能力。计算资源没有…

群晖java安装失败_群晖NAS安装Jenkins

Jenkins大家都不陌生,Java开发的持续集成工具,今天简单记录一下在群晖NAS上安装Jenkins的整个过程。 首先在群晖中打开Docker,点击注册表,注册表里有很多已上传的镜像下载: 下载上图标红的镜像到本地,大家可…

TinyML:使用 ChatGPT 和合成数据进行婴儿哭声检测

故事 TinyML 是机器学习的一个领域,专注于将人工智能的力量带给低功耗设备。该技术对于需要实时处理的应用程序特别有用。在机器学习领域,目前在定位和收集数据集方面存在挑战。然而,使用合成数据可以以一种既具有成本效益又具有适应性的方式训练 ML 模型,从而消除了对大量…