介绍
ChatGPT 的局限性之一是它不具备绝对的知识,这可能并不令人意外。它接受了有限数量的信息(仍然超过半太字节......)的训练,这些信息在训练时可用。这通常就是为什么 ChatGPT 可能会尝试自信地编造信息(例如产生幻觉),因为它只是经过优化来满足您的问题,无论它是否有信息。
如果您打算将 ChatGPT 部署为聊天机器人,特别是如果它必须处理只能使用在训练 ChatGPT 时不可用的资源知识库才能回答的问题,那么这并不理想。这可能是由于许多不同的原因造成的:
- 来源是机密的、私人的或存在于登录墙后面
- 来源新颖,未发表,尚未可访问
- 源位于本地或离线,无法通过互联网访问
最重要的是,您有一个知识库,我们希望增强 ChatGPT,以便它可以利用该知识库来回答问题。
我们并不真正关心这个知识库是否包含研究论文、公司内部文件、新闻页面或报告。然而,为了在本教程中创建聊天机器人,我们确实关心这些信息的存储位置以及形式(pdf、word、excel 等)。
教程
为什么选择 Azure 机器学习?
有十几种不同的工具可以帮助您构建矢量数据库并管理嵌入。了解它们之间的差异以及您应该选择哪一个可能会令人沮丧。在本博客中,我们将通过使用 Azure 机器学习轻松克服这场战斗。这种方法背后有很多动机。也就是说,Azure OpenAI 与 Azure 机器学习和其他底层 Azure 服务(存储、计算等)的无缝集成是运行我们的聊天机器人所必需的。此外,Azure 机器学习可以处理和自动化矢量数据库的低级操作(设置、索引、分块、缩放),以便我们可以专注于用例。
总之:我更愿意有像 ChatGPT 这样的大型语言模型(LLM)使用我的知识库作为参考来回答这些问题。
设置的高级概述
在 Azure 机器学习中构建聊天机器人解决方案将分为两个阶段。
预推理
在第一阶段,我们将把 PDF 知识库(手册、常见问题解答等)转换为矢量数据库。Azure 机器学习中有多种矢量数据库工具可供选择。在本教程中,我们选择已集成在 Azure 机器学习中的 FAISS(Facebook AI 相似性搜索)。这是由 Meta 开发的工具,并针对密集向量的高效相似性搜索进行了优化。总而言之,Azure 机器学习将为我们提供一个管道:
- 将所有源(在我们的示例中为 PDF)拆分为有意义的块。
- 使用嵌入模型将所有块嵌入到向量中
- 将所有嵌入存储在矢量数据库(FAISS)中并为每个嵌入生成索引
只需单击按钮,Azure 机器学习即可处理分块、嵌入和嵌入索引等所有低级操作。这是前面提到的好处之一。您可以在此处详细了解 FAISS 的幕后工作原理。
推理时间
一旦我们使用嵌入构建了向量数据库,我们就可以开始进行推理。本质上,我们将使用来自 vectorDB 的附加文档(上下文)来扩充所有传入的问题(最初将由 ChatGPT 回答)。这将帮助 ChatGPT 使用我们的知识库回答问题。
为此,我们将首先嵌入问题,并使用 vectorDB 检索相关信息块。相关性通常基于“相似性”,而“相似性”又是使用邻近函数(欧几里德距离)定义的。因此,我们要做的就是计算哪些向量与我们的问题向量最相似(“最接近”),并将关联的标记(文本)添加到我们的初始问题中。然后,我们让 ChatGPT 根据增强的问题生成答案。尽管我们仅限于 FAISS 提供的功能,但仍有许多不同的方法可以计算“相似性”(余弦、欧几里得……)和选择向量(最大化相似性、多样性……)。
当然,也有一些边缘情况。例如,如果没有相关块或超出令牌限制会发生什么?在这种情况下,我们可以编写解决方法,让 ChatGPT 生成默认响应,或者在后一种情况下,仅选择前 5 个相关文档。为了使本教程简短,我们不会过多关注这些边缘情况。
设置 Azure OpenAI
我们需要两种类型的模型来实现我们的聊天机器人解决方案。文本嵌入模型和聊天模型。在 Azure 门户中,继续创建 Azure OpenAI 服务。创建完成后,进入部署,部署两个模型,即文本嵌入模型和聊天模型。稍后我们将需要这些模型。
设置 Blob 存储
为了存储我们的设备手册,我们需要建立一个 blob 存储。您可以通过 Azure 市场创建存储帐户来执行此操作。在此示例中,我创建了一个名为“smallElectronicqna”的存储帐户。
我从互联网上随机挑选了一些设备手册并将它们上传到一个容器(名为“docs”)下。请确保仅上传以下任何扩展名的文件:.txt, .md, .html, .htm, .py, .pdf, .ppt, .pptx, .doc, .docx, .xls, .xlsx。
原因是 Azure 机器学习(当前)仅支持这些文件类型来构建 vectorDB。
设置 Azure 机器学习
转到 Azure 市场并创建 Azure 机器学习 (AML) 工作区。如果您对 AML 工作室不太熟悉,可以阅读文档。
Azure OpenAI 集成
创建 AML 工作室后,我们必须将 Azure OpenAI 实例链接到该工作室。为此,请打开 Azure OpenAI 概述页面,然后在“密钥和端点”下,复制密钥 1(或 2)并复制整个基本 URL(通常采用 https://<实例名称>.openai.azure.com 的形式) /)。
在 AML studio 中,创建一个新的“Azure OpenAI”连接。
选择一个名称,选择正确的提供商并填写之前复制的 KEY 和基本 URL。保存连接。
数据存储集成
现在我们需要链接之前创建的 Blob 存储。为此,请转到“数据存储”,然后创建一个新的数据存储。选择正确的存储帐户(在我的示例中为“smallElectronicqna”)并选择源所在的正确容器(“docs”)。要获取帐户密钥,请转到存储帐户的概述页面,然后在“访问密钥”下复制第一个密钥。创建数据存储。
数据资产创建
创建数据存储后,您必须创建数据资产(转到同一页面下的“数据资产”)。选择适当的名称并选择“文件夹”作为类型。
选择“Azure 存储”作为来源。
选择我们之前创建的数据存储。
我们选择容器的根文件夹作为存储路径(/)。这是(并将)上传所有 PDF 的文件夹。
创建向量数据库
现在知识库已注册为数据资产,是时候构建我们的 VectorDB 了。这可以通过创建一个作业来完成,该作业将完成所有低级步骤以将我们的数据资产转换为矢量存储。进入提示流程页面下的“矢量索引”。创建一个新的向量索引。选择适当的名称并选择 FAISS 作为矢量存储。
选择我们之前创建的 Azure OpenAI 连接。
您可以在“运行时”下创建一个计算实例来运行此作业,或者仅选择无服务器计算。我们选择后者。
创建“向量索引”作业后,它将由无服务器计算运行。在作业详情页面,您可以打开作业查看作业过程中执行了哪些步骤。您可以清楚地看到 blob 存储中的文件夹已使用 FAISS 进行分块、嵌入和索引。
创建聊天机器人(提示流程)
当“矢量索引”作业完成后,Azure 机器学习将在“流”下创建一个默认的“提示流”。此流程代表我们的聊天机器人,包括我们的聊天机器人 (ChatGPT3.5) 回答问题所需的所有步骤。您可以通过单击流程来检查各个步骤。这将打开一个编辑器和一个图表来可视化流程。
创建计算实例
我们可以在有一个计算实例来运行它的情况下测试这个提示流程。进入提示流程页面下的“运行时”选项卡。单击“创建 Azure ML 计算实例”创建新的计算实例。
选择合适的实例类型。DS11_v2 对于此流程来说绰绰有余。
创建并运行后,您可以返回提示流程并单击“聊天”。这将允许您测试聊天机器人。下面是一个示例对话。
将聊天机器人部署为托管在线端点
如果您对结果感到满意,则可以将此聊天机器人部署为托管在线端点。这将为您的流程创建一个 API,您可以将其与其他应用程序集成(例如自动回复传入电子邮件或围绕 API 构建前端应用程序)。
在提示流程编辑器页面中单击“部署”。选择一个合适的名称并选择我们之前创建的计算实例。此端点的创建和部署可能需要一段时间(>5 分钟)。
部署后,将流量设置为 100%(如果尚未自动设置)。这将允许端点接受传入流量。
在开始测试此端点之前,您必须分配“AzureML 数据科学家角色”。为此,请转到在资源组下创建的托管在线端点资源的设置。在“访问控制(IAM)”下,单击“添加”以添加角色分配。
选择“托管身份”并选择“机器学习在线端点”。确保选择正确的一个,以防万一您还有其他的。请注意,此操作最长可能需要 30 分钟才能生效!
测试聊天机器人
上一步中的最后更改生效后,您可以测试聊天机器人。对于我们的玩具问题,我们有多种集成此聊天机器人的选项。我们可以创建一个前端应用程序,最终用户(我们的客户)可以用它来提出问题并与聊天机器人交互。或者,我们可以设置一个自动流程,当新电子邮件到达我们的业务收件箱时,聊天机器人会自动回复它们。
更新向量索引
当新文件添加到我们的 blob 存储中时,我们可能需要更新矢量存储。只需在 Azure 机器学习中创建新版本的数据资产并重新创建“向量索引”作业即可完成此操作。然而,根据用例,此步骤可能需要自动化,这样我们就不必手动更新矢量存储。目前没有开箱即用的支持来在最新版本的数据资产上自动重新运行此作业。
结论
在本博客中,我们学习了如何基于一个小玩具示例使用 Azure 机器学习构建聊天机器人。尽管我们使用标准提示流程来部署聊天机器人,但您可以通过添加在边缘情况下触发的默认响应或根据您的特定业务/用途的要求向聊天流程添加其他逻辑来尝试此流程-案件。
如今,由于平台可以促进资源(存储、计算)和流程来操作聊天机器人,因此构建由 LLM 驱动的聊天机器人非常容易。不幸的是,您为这些平台提供的便利和资源付出了高昂的代价。如果您想以较低的价格换取便利,那么选择结合 OpenAI(或其他 LLM 提供商)、vectorDB 和 API(Flask、Django 等)的自定义设置是绝对正确的。您可以获得类似的结果。当然,没有Azure 机器学习的好处。