Mleon的头像

聊天机器人

Chatbot
4
Chatbot
引入
引入
莎士比亚
莎士比亚
友好机器人
友好机器人
订单机器人
订单机器人
出处
出处
容易实现
容易实现
教授实现
教授实现
准备工作
准备工作
多轮对话原理
多轮对话原理
多轮对话实现
多轮对话实现
系统消息和对话
系统消息和对话
ChatGPT
ChatGPT
系统消息作用
系统消息作用
莎士比亚对话
莎士比亚对话
助手消息
助手消息
独立对话示例
独立对话示例
独立对话
独立对话
完整上下文
完整上下文
完整上下文示例
完整上下文示例
订单机器人任务
订单机器人任务
订单机器人实现
订单机器人实现
订单机器人检验
订单机器人检验
订单机器人指令
订单机器人指令
订单机器人检验2
订单机器人检验2
自行调整
自行调整
JSON汇总
JSON汇总
选用较低温度
选用较低温度
自定义聊天机器人
自定义聊天机器人

聊天机器人

2023-06-06
248 次观看
Mleon的头像
Mleon
粉丝:113
主题:5
描述:6
例子:10
其他:8
字数:8681
Mleon的头像
Mleon
粉丝:113

Chatbot

出处 出处

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

引入

引入 容易实现

大预言模型有个很厉害的地方是,而只要花很少的力气就能用它建立自定义聊天机器人,Chat GPT 是一个 Web 界面,它提供了一种通过大型语言模型进行 对话的方式。

但是,一个很酷的事情是,你也可以使用大型语言模型来构建你自己的聊天机器人,比如一个 AI客服代理或一个餐厅的 AI 点餐机。

引入 教授实现

在本视频中,你将学习如何为自己构建这样的机器人,我将更详细地描述 OpenAl Chat Completions 格式的组成部分,然后你将亲自构建一个聊天机器,开始吧。

准备 准备工作

首先,我们将像往常一样设置Open AI Python包。

import os
import openai
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv()) # read local .env file

openai.api_key  = os.getenv('OPENAI_API_KEY')
多轮对话原理

像 Chat GPT 这样的聊天模型实际上是经过训练的,可以将一系列的消息作为输入,将一个由模型生成的消息作为输出,虽然聊天格式的设计使得这样的多轮对话非常容易,但我们通过以前的视频已经看到,它也可以用于单轮任务,不需要任何对话。

多轮对话实现

因此,接下来我们将定义两个辅助函数,这是我们在所有视频中一直在使用的 函数,它是get Completion 函数,但是,如果你看一下它,我们给出了提示,但实际上在函数内部,我们正在将这个提示放入类似于某种用户消息的东西中。

这是因为 Chat GPT 模型是一个聊天模型,它的训练是将一系列的消息作为输入,然后返回一个由模型生成的消息作为输出,因此,用户消息是输入,而助手消息是输出。

因此,在本视频中,我们将使用另一个铺助函数,而不是将单个提示作为输入并得到单个完成,我们将传入消息列表,这些消息可以来自不同的角色,我将描述这些角色。

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 系统消息和对话

如果你曾经使用过 Chat GPT 的 Web 界面,那么你的消息就是用户消息,而 Chat GPT 的消息就是助手消息。

系统消息作用

因此,系统消息有助于设置助手的行为和人设,并作为高层指命用于对话,你可以将它视为在助手的耳边低语,引导它的回应,而用户不会意识到系统消息,因此,作为用户,如果你曾经使用过 Chat GPT,你可能不知道 Chat GPT 的系统消息中有什么。

系统消息的好处在于,它为开发者提供了一种,在不将请求本身作为对话的一部分的情况下,引导助手并指导其回复的方式。因此,您可以在不让用户意识到的情况下引导助手并在其耳边耳语和指导其回复。

莎士比亚对话

因此,现在让我们尝试在对话中使用这些消息,我们将使用新的辅助函数来获取消息的完成状态,我们还使用更高的温度。

  • 因此,系统消息说,您是一位说话像莎士比亚的助手,

因此,这是我们向助手描述其应该如何表现的方式,

  • 然后第一个用户消息是,“告诉我一个笑话,

  • 接下来是,“为什么小鸡过马路?”,

  • 然后最后一个用户消息是,“我不知道。”

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)

所以如果我们运行它,

  • 回应是“为了到达另一边”

让我们再试一次,

  • “为了到达另一边,美女,这是一个永恒的经典,从不会失败”

这就是我们的沙士比亚回答。

强调 助手消息

让我们实际尝试另一件事,因为我希望更清楚地表明这是助手消息,所以,在这里,让我们print 整个消息响应,因此,只是为了更清楚,这个响应是助手消息,因此,角色是助手,内容本身是消息,因此,这就是辅助函数中正在发生的事情,我们只是在传递消息的内容。

友好机器人

独立对话示例 独立对话

现在让我们再做一个例子,

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)

我们现在已经提供了模型需要的上下文,也就是之前的信息,我的名字,我们将问同样的问题,也就是我的名字是什么,因为模型在这个输入的信息列表中已经拥有了它所需要的所有上下文,所以它能够做出回应.

订单机器人

订单机器人任务

现在,您将要构建自己的聊天机器人,这个聊天机器人将被称为order bot,并且我们将自动化收集用户提示和助手响应,以构建这个order bot,它将在一家披萨餐厅接收订单。

订单机器人实现

因此首先我们将定义这个辅助函数,

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)

它将收集用户信息,这样我们就可以避免手动输入它们,就像我们上面所做的那样,这将从下面构建的用户界面中收集提示,然后将其追加到一个名为上下文的列表中,并每次使用该上下文调用模型,模型的响应也会添加到上下文中,所以模型消息被添加到上下文中,用户消息也被添加到上下文中,以此类推,这样它就会不断增长。

这样 模型就拥有了它需要的信息以确定下一步要做什么,现在,我们将设置并运行这种 UI 以显示order bot,

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

所以这里有上文并包含包含菜单的系统消息,请注意每次调用语言模型时,我们将使用想同的上下文,并且上下文会随看时间的推移而不断增长。

订单机器人检验

然后让我们执行这个程序,

  • 好的,我要说,你好,我想点一份披萨,

  • 助手说,太棒了,你想点什么比萨,我们有意大利辣香肠、芝士和茄子比萨,

  • hmm,它们多少钱,

好的,我们有价格了,

  • 我想我会点一份中等的茄子比萨。

因此,您可以想象,我们可以继续这个对话。

订单机器人指令

让我们看看助手是否一直遵循指示,

  • 你是一个点单机器人,自动为披萨餐厅手机订单,你先要和顾客打招呼,然后收集订单,然同问是自提还是外卖,你需要收集完整个计单信息,然后总结并确认顾客是否有新的需求,如果是外卖, 你需要收集地址信息,然后收集计单信息,确保所有的选项,加料、配料,都和菜单上的食品对应,你的回答要简短,且要亲和,菜单包含,这是菜单。

订单机器人检验2

回到对话,看看助手是否一直遵循指示,

  • 好的,助手问我们是否需要任何配料,

我们已经在助手消息中指定了这个,

  • 因此,我想我们不需要任何额外的配料,

  • 当然可以,还有其他需要点的吗?

  • 嗯,让我们来点一些水,实际上,薯条,

  • 小号还是大号?

这很好,因为我们在系统消息中要求助手澄清额外的东西和配菜,

建议 自行调整

所以,这样您就明白了,请随意自行调整,您可以暂停视频并在左侧的笔记本电脑上运行它。

扩展 JSON汇总

现在我们可以让模型根据对话创建一 个 JSON 汇总,以便将其发送到订单系统。

因此,我们正在附加另一个系统消息,其中包含一个指命,指示创建一个 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 '},    
)
 #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)
选用较低温度

请注意,在这种情况下, 我们使用较低的温度。因为对于这些任务,我们希望输出是相当可预测的,对于会话代理,您可能希望使用更高的温度,但在这种情况下,我也可能会使用较低的温度,因为对于客户助手聊天机器人,您可能希望输出也更具可预测性,因此,我们得到了我们订单的汇总,如果需要,我们可以将其提交给订单系统。

建议 自定义聊天机器人

所以现在你已经构建了自己的订单聊天机器人。请随意自定义并尝试修改系统消息,以更改聊天机器人的行为并让其扮演不同的角色,具有不同的知识。

讨论
随记