跳转到内容

8.打造聊天机器人


使用大型语言模型的其中一个令人兴奋的方面是,您只需投入适量的努力即可使用它来构建自定义聊天机器人。ChatGPT是一个Web界面,通过它你可以使用大型语言模型进行会话,从而拥有一个交互式的聊天界面。但是,其中的一个很酷的功能是,您也可以使用大型语言模型来构建自定义的聊天机器人,为餐厅扮演AI客户服务代理或AI点餐员等角色。

在这个视频中,您将学习如何自己做到这一点。我将更详细地描述OpenAI ChatCompletions格式的组件,然后您将自己构建一个聊天机器人。那么让我们开始吧。首先,我们将像往常一样设置OpenAI Python包。聊天模型(如ChatGPT)实际上是被训练成将一系列消息作为输入,并返回由模型生成的消息作为输出。虽然聊天格式旨在使此类多轮对话变得容易,但我们已经通过以前的视频看到,它对于没有对话的单一任务同样有用。

下一步,我们将定义两个辅助函数。第一个是我们在所有视频中都使用的 getCompletion 函数。但是,如果你仔细看一下,我们给出了一个提示,但实际上在函数内部,我们是将这个提示放置到类似用户消息的消息中。这是因为 ChatGPT 模型是一个聊天模型,意味着它被训练成将一系列消息作为输入,然后返回一个由模型生成的消息作为输出。因此,用户消息是输入,而助手消息是输出。 第二个辅助函数是 generateResponse。这个函数将接受一个用户消息,并生成一个 ChatGPT 模型生成的相应助手消息。 通过这两个函数,我们能够与 AIGPT 模型进行交互并生成对话。

在这个视频中,我们将使用一个不同的辅助函数,而不是像以前一样输入一个单独的提示并获取一个完成结果。我们将传入一个消息列表,这些消息可以来自于不同的角色,我将为您描述一下。以下是一个消息列表的示例。第一条消息是系统消息,用于提供整体指示,然后在此消息之后,我们有用户和助手之间的对话。这个对话可以持续进行下去。如果您曾使用 ChatGPT 的 Web 界面,则您的消息是用户消息,而 ChatGPT 的消息是助手消息。系统消息有助于设置助手的行为和角色,并作为对话的高级指令。

您可以将其视为向助手耳语并引导其响应,而用户不会注意到系统消息。所以,作为用户,如果您曾经使用过 ChatGPT,您可能不知道 ChatGPT 的系统消息中包含什么,这也是有意的。系统消息的好处是,它为开发者提供了一种在不使请求本身成为对话一部分的情况下,为对话定框架的方式。因此,您可以在不让用户察觉的情况下引导助手并指导它的回复。现在,让我们尝试使用这些消息来进行对话。我们将使用新的辅助函数从这些消息中获取完成结果。同时,我们还使用了更高的温度。系统消息中说,您是一个像莎士比亚一样说话的助手。 因此,在交互中,我们可以使用这个系统消息来影响助手的回复,从而使对话更加自然流畅,同时又避免在对话中插入明显的提示信息。

8.1 对话助手

这是我们告诉助手它应该如何行事。然后,第一个用户消息是“告诉我一个笑话”。接下来的消息是“为什么小鸡过马路?”最后一个用户消息是“我不知道”。如果我们运行这个程序,响应是“为了到达另一边”。让我们再试一次。为了到达另一边,夫人,请原谅,这是一个永不过时的经典。这就是我们的莎士比亚式回应。让我们再尝试一件事,因为我想让它更清晰,这是助手的消息。因此,让我们将整个消息响应打印出来。为了使这更清晰,这个响应是一条助手消息。因此,角色是助手,内容是消息本身。这就是这个辅助函数中发生的事情。现在让我们做另一个例子。 在这个例子中,我们将使用 getCompletion 函数来发送一条系统消息和一个用户消息,然后获取助手的响应。

这里,我们的信息有两条,一条是助手的信息:你是一个友好的聊天机器人,另一条信息是用户的第一条反馈:嗨,我的名字是伊莎。我们想要获取用户的第一条信息。所以,让我们执行一下第一条助手信息。第一条反馈是:你好伊莎,很高兴见到你。你今天需要我的帮助吗?现在,让我们尝试另一个例子。这里我们的信息还是有两条,一条是系统信息:你是一个友好的聊天机器人,另一条信息是第一条用户反馈:是的,你能提醒我我的名字是什么吗?我们想要得到回应。然而,你会发现,这个模型实际上还不知道我的名字。所以,每一次与语言模型的交互都是独立的。这意味着,在当前的交互中,你必须提供所有相关的信息,供模型从中获取。如果你想让模型在交互中从先前的对话中获取信息,你必须将之前的对话作为输入提供给模型,我们称之为“上下文”。

让我们尝试一下这个。我们已经提供了模型所需的上下文,也就是在之前的信息中提到了我的名字,接下来我们将问同样的问题,询问我的名字。由于模型已经获得了它所需要的所有上下文信息,因此它能够给出回答。

8.2 OrderBot

现在,你将会建立自己的聊天机器人。这个聊天机器人将被称为“订餐机器人”,我们将使用自动化的方式来收集用户的提示和助手的反馈来构建这个聊天机器人。订餐机器人将用于在一家比萨饼店中接收订单。首先,我们将定义这个“帮助函数”,它将会收集我们的用户消息,以便我们避免手动输入它们。与之前一样,这个函数将从用户界面中收集提示,并将它们附加到一个称为上下文的列表中,然后每次都会使用该上下文来调用模型。

模型的回应也会添加到上下文中,也就是说,模型的反馈信息也会添加到上下文中,用户的反馈信息也会添加到上下文中,类似这样,这个上下文会变得越来越长。这样一来,模型就拥有了它所需的信息,来决定下一步该怎么做。现在我们将设置并运行这个用户界面来展示订餐机器人,这里的上下文包含了系统信息,其中包含了菜单。需要注意的是,每次调用语言模型时,我们都将使用相同的上下文,并且上下文会随着时间越来越完整。现在,让我们来执行它。

好的,我将说“嗨,我想要订一份比萨饼”。然后助手说:“很好,您想订哪种比萨饼?我们有意大利辣肠、奶酪和茄子比萨饼,它们的价格是多少?”好的,我们已经知道了价格。我想我会喜欢一份中号的茄子比萨饼。正如你所想象的那样,我们可以继续这个对话,让我们看一下我们放在系统信息中的内容。“你是订餐机器人,一个收集比萨饼店订单的自动服务。你首先问候顾客,然后收集订单,并询问是否要取货或送货。”

你等待收集整个订单,然后总结,并最后再次确认客户是否需要添加其他内容。如果是送货,你可以询问地址。最后,你收取支付款项。确保澄清所有选项、附加项和规格,以唯一地从菜单中识别出该项目。你以简短、非常口语化和友好的方式回应。菜单包括,然后这里我们有菜单。所以让我们回到我们的对话,看看助手是否遵循了指示。好的,助手问我们是否需要任何配料,这是我们在助手消息中指定的。所以我认为我们不需要额外的配料。其他东西……当然。我们还想再点点水吗?嗯,我们想要薯条。小的还是大的?

这很好,因为我们在系统消息中要求助手澄清了附加项和辅菜。所以你已经有了想法,请随意尝试运行。你可以暂停视频,然后在左侧的笔记本中运行。现在我们可以要求模型创建一个基于对话而创建的可发送到订单系统的JSON摘要。因此,我们现在附加了另一个系统消息,这是一个指示,我们说要为之前的食品订单创建一个JSON摘要,详述每个项目的价格,字段应该是一个比萨、包括辅菜、两个配料列表、三个饮料列表、四个辅菜列表,最后是总价。

你也可以在这里使用用户消息,这不一定是一个系统消息。所以让我们执行一下。请注意,在这种情况下,我们使用了一个较低的温度,因为对于这些任务,我们希望输出相当可预测。对于一个会话代理,你可能想要使用一个更高的温度,但在这种情况下,我也可能使用一个较低的温度,因为对于客户助手聊天机器人,你可能也希望输出看起来更可预测。所以在这里我们有我们订单的摘要,如果我们想的话,我们可以将它提交给订单系统。

所以我们完成了,你已经建立起了自己的订单聊天机器人。你可以自由地对其进行定制,并玩弄系统消息,以改变聊天机器人的行为,并使其表现为具有不同知识的不同人物。