正如您在本课程早期看到的,LLM执行算术和其他数学运算的能力是有限的。虽然您可以尝试使用链式思维提示来克服这一问题,但它只能帮助您走得更远。即使模型正确地通过了问题的推理,对于较大的数字或复杂的运算,它仍可能在个别数学操作上出错。这是您早些时候看到的一个示例,其中LLM试图像计算器一样工作,但得到了错误的答案。
请记住,这个模型实际上没有进行任何真正的数学运算。它只是尝试预测完成提示的最有可能的标记。模型在数学上出错可能会对您的用例产生许多负面影响,具体取决于您的用例,例如向客户收取错误的总额或获取食谱中的测量值不正确。
您可以通过允许您的模型与擅长数学的外部应用程序(例如Python解释器)进行交互来克服这一限制。一种有趣的增强LLM的框架是称为“辅助编程语言模型Program-aided language models ”(PAL)的程序。这项工作首次由卡内基梅隆大学的Luyu Gao和合作者于2022年提出,将LLM与外部代码解释器配对以执行计算。该方法利用链式思维提示来生成可执行的Python脚本。模型生成的脚本将传递给解释器以执行。右侧的图像来自论文,显示了一些示例提示和完成。
您稍后将在示例中了解这些示例,所以现在不必担心阅读所有细节。
PAL背后的策略是使LLM生成包含计算机代码的推理步骤的完成。然后将此代码传递给解释器以执行解决问题所需的计算。您可以通过在提示中包含一些单个或少量推理的示例来指定模型的输出格式。
让我们更详细地看一下这些示例提示的结构。
您将继续使用Roger购买网球的故事作为单次示例。此设置现在应该看起来很熟悉。这是一个链式思维示例。
您可以在突出显示为蓝色的行上以文字形式看到推理步骤。
与您之前看到的提示不同之处在于,粉红色显示的Python代码行包含了将涉及计算的推理步骤转化为代码的行。
基于每个推理步骤中的文本声明变量。它们的值可以直接分配,就像这里的第一行代码一样,
或者使用推理文本中的数字进行计算,正如您在第二行Python代码中看到的那样。
模型还可以使用它在其他步骤中创建的变量,就像您在第三行中看到的那样。
请注意,每个推理步骤的文本以井号(#)开始,以便Python解释器可以将其跳过作为注释。
这个提示以要解决的新问题结束。在这种情况下,目标是确定一个面包店在一天的销售后和从一家杂货店合作伙伴那里退回一些面包后剩下多少面包。
在右侧,您可以看到LLM生成的完成。再次,链式思维的推理步骤显示为蓝色,Python代码显示为粉红色。正如您所看到的,模型创建了多个变量来跟踪烘焙的面包、一天中各个时间段销售的面包
以及杂货店退回的面包。
然后通过在这些变量上执行算术运算来计算答案。
模型正确地确定了应该添加或减去哪些术语以获得正确的总数。
现在您知道如何构建示例,以告诉LLM根据其推理步骤编写Python脚本,让我们来看看PAL框架如何使LLM能够与外部解释器进行交互。
对于前一幻灯片上看到的面包店示例脚本,答案是74。您现在将附加包含答案的文本,因为您知道答案是正确的,因为计算是在PAL格式的提示中进行的。到此为止,您的提示包含了上下文中的正确答案。
现在,当您将更新后的提示传递给LLM时,它将生成包含正确答案的完成。鉴于面包店面包问题中的数学相对简单,模型可能已经使用链式思维提示正确地得出了答案。
但是对于更复杂的数学问题,包括大数的算术、三角学或微积分,PAL是一种强大的技术,允许您确保您的应用程序执行的任何计算都是准确可靠的。
您可能想知道如何自动化此过程,以便不必手动在LLM和解释器之间传递信息。这就是您之前看到的编排器的用处。
所示的编排器作为黄色框是一个技术组件,可以管理信息流和对外部数据源或应用程序的调用的启动。它还可以根据LLM输出中包含的信息来决定采取什么行动。
请记住,LLM是您的应用程序的推理引擎。最终,它会创建编排器将解释和执行的计划。
在PAL中,只有一个要执行的操作,即执行Python代码。LLM实际上不必决定运行代码,它只需要编写脚本,然后编排器将其传递给外部解释器以运行。
但是,大多数现实世界的应用程序可能会比简单的PAL架构复杂得多。
您的用例可能需要与多个外部数据源进行交互。正如您在商店示例中看到的,您可能需要处理多个决策点、验证操作和对外部应用程序的调用。您如何使用LLM来支持更复杂的应用程序?让我们在下一个视频中探讨一种策略。
https://www.coursera.org/learn/generative-ai-with-llms/lecture/6jh5Z/program-aided-language-models-pal