8 大模型应用-聊天机器人
使用大型语言模型的其中一个令人兴奋的方面是,您只需投入适量的努力即可使用它来构建自定义聊天机器人。ChatGPT是一个Web界面,通过它你可以使用大型语言模型进行会话,从而拥有一个交互式的聊天界面。但是,其中的一个很酷的功能是,您也可以使用大型语言模型来构建自定义的聊天机器人,为餐厅扮演AI客户服务代理或AI点餐员等角色。
第一步我们将定义一个辅助函数。 get_completion_from_message。这个函数将接受一个用户消息,并生成一个 ChatGPT 模型生成的相应助手消息。
def get_completion_from_message(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 的 Web 界面,则您的消息是用户消息,而 ChatGPT 的消息是助手消息。系统消息有助于设置助手的行为和角色,并作为对话的高级指令。
messages = [
{'role':'system', 'content':'你是一个能够说话像莎士比亚的人工智能助理。'},
{'role':'user', 'content':'给我讲一个笑话。'},
{'role':'assistant', 'content':'为什么小鸡过马路?'},
{'role':'user', 'content':'我不知道。'}
]
response = get_completion_from_message(messages, temperature=1)
print(response)
# 因为它要去另一边!哈哈哈哈!
这是我们告诉助手它应该如何行事。然后,第一个用户消息是“告诉我一个笑话”。接下来的消息是“为什么小鸡过马路?”最后一个用户消息是“我不知道”。如果我们运行这个程序,响应是“为了到达另一边”。因此,角色是助手,内容是消息本身。这就是这个辅助函数中发生的事情。
messages = [
{'role':'system', 'content':'你是一个友好的聊天机器人。'},
{'role':'user', 'content':'嗨,我的名字是伊莎。'},
]
response = get_completion_from_message(messages, temperature=1)
print(response)
# 嗨,伊莎。很高兴认识你!有什么我可以为你服务的吗?
这里,我们的信息有两条,一条是助手的信息:你是一个友好的聊天机器人,另一条信息是用户的第一条反馈:嗨,我的名字是伊莎。我们想要获取用户的第一条信息。所以,让我们执行一下第一条助手信息。第一条反馈是:你好伊莎,很高兴见到你。你今天需要我的帮助吗?
messages = [
{'role':'system', 'content':'你是一个友好的聊天机器人。'},
{'role':'user', 'content':'你能想起来我的名字是什么吗?'},
]
response = get_completion_from_message(messages, temperature=1)
print(response)
# 抱歉,作为一个机器人,我的记忆力有限,我没有办法记住和识别个人姓名。
现在,让我们尝试另一个例子。这里我们的信息还是有两条,一条是系统信息:你是一个友好的聊天机器人,另一条信息是第一条用户反馈:你能想起来我的名字是什么吗?我们想要得到回应。然而,你会发现,这个模型实际上还不知道我的名字。所以,每一次与语言模型的交互都是独立的。这意味着,在当前的交互中,你必须提供所有相关的信息,供模型从中获取。如果你想让模型在交互中从先前的对话中获取信息,你必须将之前的对话作为输入提供给模型,我们称之为“上下文”。
messages = [
{'role':'system', 'content':'你是一个友好的聊天机器人。'},
{'role':'user', 'content':'嗨,我的名字是伊莎。'},
{'role':'assistant', 'content':'你好,伊莎!很高兴认识你。有什么我能帮助你的吗?'},
{'role':'user', 'content':'你能想起来我的名字是什么吗?'},
]
response = get_completion_from_message(messages, temperature=1)
print(response)
# 当然,你告诉我你的名字是“伊莎”啊!
我们已经提供了模型所需的上下文,也就是在之前的信息中提到了我的名字,接下来我们将问同样的问题,询问我的名字。由于模型已经获得了它所需要的所有上下文信息,因此它能够给出回答。
8.2 订餐机器人
现在,你将会建立自己的聊天机器人。这个聊天机器人将被称为“订餐机器人”,我们将使用自动化的方式来收集用户的提示和助手的反馈来构建这个聊天机器人。 订餐机器人将用于在一家比萨饼店中接收订单。首先,我们将定义这个“帮助函数”,它将会收集我们的用户消息,以便我们避免手动输入它们。与之前一样,这个函数将从用户界面中收集提示,并将它们附加到一个称为上下文的列表中,然后每次都会使用该上下文来调用模型。
我将说“嗨,我想要订一份比萨饼”。然后助手说:“很好,您想订哪种比萨饼?我们有意大利辣肠、奶酪和茄子比萨饼,它们的价格是多少?”好的,我们已经知道了价格。我想我会喜欢一份中号的茄子比萨饼。正如你所想象的那样,我们可以继续这个对话,让我们看一下我们放在系统信息中的内容。“你是订餐机器人,一个收集比萨饼店订单的自动服务。你首先问候顾客,然后收集订单,并询问是否要取货或送货。”
你等待收集整个订单,然后总结,并最后再次确认客户是否需要添加其他内容。如果是送货,你可以询问地址。最后,你收取支付款项。确保澄清所有选项、附加项和规格,以唯一地从菜单中识别出该项目。你以简短、非常口语化和友好的方式回应。菜单包括,然后这里我们有菜单。所以让我们回到我们的对话,看看助手是否遵循了指示。好的,助手问我们是否需要任何配料,这是我们在助手消息中指定的。所以我认为我们不需要额外的配料。其他东西……当然。我们还想再点点水吗?嗯,我们想要薯条。小的还是大的?
这很好,因为我们在系统消息中要求助手澄清了附加项和辅菜。所以你已经有了想法,请随意尝试运行。你可以暂停视频,然后在左侧的笔记本中运行。现在我们可以要求模型创建一个基于对话而创建的可发送到订单系统的JSON摘要。因此,我们现在附加了另一个系统消息,这是一个指示,我们说要为之前的食品订单创建一个JSON摘要,详述每个项目的价格,字段应该是一个比萨、包括辅菜、两个配料列表、三个饮料列表、四个辅菜列表,最后是总价。
你也可以在这里使用用户消息,这不一定是一个系统消息。所以让我们执行一下。请注意,在这种情况下,我们使用了一个较低的温度,因为对于这些任务,我们希望输出相当可预测。对于一个会话代理,你可能想要使用一个更高的温度,但在这种情况下,我也可能使用一个较低的温度,因为对于客户助手聊天机器人,你可能也希望输出看起来更可预测。所以在这里我们有我们订单的摘要,如果我们想的话,我们可以将它提交给订单系统。
9 提示工程总结
在本课程中,你学会了两个关键的提示原则。撰写清晰明确的指令,并在适当的情况下给模型时间思考。你还学会了迭代式提示开发的方法,以及如何找到适合你的应用程序的提示方法是至关重要的。 在许多应用程序中非常有用,特别是摘要、推理、转换和扩展。你还学会了如何构建自定义聊天机器人。