1、概述
到目前为止,我们已经看到了许多提示/提示工程方法。现在,我们将讨论一些关于提示的高级应用程序,通过互联网或其他外部来源搜索信息来解决复杂的推理任务。
2、LLMs使用工具
MRKL系统(Modular Reasoning, Knowledge and Language, pronounced “miracle”) 是一种神经符号结构,结合了LLMs(神经计算)和像计算器(符号计算)这样的外部工具,用于解决复杂问题。
MRKL系统由一组模块(例如计算器、天气API、数据库等)和一个路由器组成,决定如何将自然语言查询“路由”到适当的模块。
一个简单的MRKL系统示例是一个可以使用计算器应用程序的LLM。这是一个单模块系统,其中LLM是路由器。当被问到100*100是多少?时,LLM可以选择从提示中提取数字,然后告诉MRKL系统使用计算器应用程序计算结果。这可能如下所示:
100*100是多少?
CALCULATOR [100*100]
MRKL系统将看到单词CALCULATOR,并将100*100插入计算器应用程序中。这个简单的想法可以很容易地扩展到各种符号计算工具。
考虑以下其他应用示例:
一个聊天机器人,能够从用户的文本中提取信息,形成SQL查询,回答有关金融数据库的问题。
苹果公司股票现在的价格是多少?
当前价格为DATABASE[SELECT pric
e FROM stock WHERE company = “Apple” AND time = “now”]。
一个聊天机器人,能够从提示中提取信息,使用天气API检索信息回答有关天气的问题。
纽约的天气怎么样?
天气是WEATHER_API[New York]。
或者更复杂的依赖多个数据源的任务,例如下面这个例子:
示例MRKL系统(AI21)
示例
我使用Dust.tt复现了原始论文中的一个示例MRKL系统,链接在这里。该系统可以读取数学问题(例如20乘以5^6等于多少?),提取数字和运算符号,并将其格式化为计算器应用(例如 20 * 5^6)。然后它将重新格式化的方程式发送给Google的计算器应用程序,并返回结果。请注意,原始论文对路由器(LLM)进行了提示调整,但是我在这个例子中没有进行提示调整。让我们来看看这是如何工作的:
首先,我在Dust的数据集选项卡中制作了一个简单的数据集。
然后,我切换到Specification选项卡,并使用data块加载了数据集。
接下来,我创建了一个llm块,用于提取数字和运算符号。请注意,在提示中,我告诉它我们将使用Google的计算器。我使用的模型(GPT-3)可能已经预先训练了一些关于Google计算器的知识。
然后,我创建了一个code块,其中运行一些简单的JavaScript代码来删除补全结果(completion)中的空格。
最后,我创建了一个search
块,将重新格式化的方程式发送给Google的计算器。
下面我们可以看到最终的结果,全部都是正确的!
请随意尝试并进行实验,这是演练场(playground)的链接.
备注
MRKL由AI21开发,最初使用了他们的J-1 (Jurassic 1)LLM。
3、具有推理和行动能力的LLMs
ReAct(reason, act)是一种使用自然语言推理解决复杂任务的语言模型范例。ReAct旨在用于允许LLM执行某些操作的任务。例如,在MRKL系统中,LLM可以与外部API交互以检索信息。当提出问题时,LLM可以选择执行操作以检索信息,然后根据检索到的信息回答问题。
ReAct系统可以被视为具有推理和行动能力的MRKL系统,。
请查看以下图像。顶部框中的问题来自HotPotQA,这是一个需要复杂推理的问答数据集。 ReAct能够首先通过推理问题(Thought 1),然后执行一个动作(Act 1)来向Google发送查询来回答问题。然后它收到了一个观察(Obs 1),并继续进行这个思想,行动,观察循环,直到达到结论(Act 3)。
ReAct System (Yao et al.)
具有强化学习知识的读者可能会认为,这个过程类似于经典的RL循环:状态,行动,奖励,状态,…。ReAct在其论文中对此进行了一些规范化。
结论
谷歌在ReAct的实验中使用了PaLM LLM。与标准提示(仅问题)、CoT和其他配置进行比较表明,ReAct在复杂推理任务方面的表现是有希望的。谷歌还对涵盖事实提取和验证的Fever数据集进行了研究。
ReAct Results (Yao et al.)
4、代码推理
程序辅助语言模型(Program-aided Language Models, PAL)是另一个MRKL系统的例子。给定一个问题,PAL能够编写代码解决这个问题。它将代码发送到编程运行时以获得结果。PAL的中间推理是代码,而CoT的是自然语言。
需要注意的是,PAL实际上交织了自然语言(NL)和代码。上面的图片中,蓝色的是PAL生成的自然语言推理。虽然图中没有显示,PAL实际上在每行自然语言推理前生成’#’,以便编程运行时将其解释为注释。
示例
让我们看一个PAL解决数学问题的例子。我使用了一个三样本的提示,这是这个提示的简化版本。
我将使用langchain,这是一个用于链接LLM功能的Python包。首先,需要安装一些程序:
!pip install langchain==0.0.26
!pip install openai
from langchain.llms import OpenAI
import os
os.environ[“OPENAI_API_KEY”] = “sk-YOUR_KEY_HERE”
然后,我们可以创建一个GPT-3 davinci-002实例(当使用此对象时会进行API调用):
llm = OpenAI(model_name=’text-davinci-002′, temperature=0)
这是提示:
MATH_PROMPT = ”’
Q: There were nine computers in the server room. Five more computers were installed each day, from monday to thursday. How many computers are now in the server room?
# solution in Python:
“””There were nine computers in the server room. Five more computers were installed each day, from monday to thursday. How many computers are now in the server room?”””
computers_initial = 9
computers_per_day = 5
num_days = 4 # 4 days between monday and thursday
computers_added = computers_per_day * num_days
computers_total = computers_initial + computers_added
result = computers_total
return result
Q: Shawn has five toys. For Christmas, he got two toys each from his mom and dad. How many toys does he have now?
# solution in Python:
“””Shawn has five toys. For Christmas, he got two toys each from his mom and dad. How many toys does he have now?”””
toys_initial = 5
mom_toys = 2
dad_toys = 2
total_received = mom_toys + dad_toys
total_toys = toys_initial + total_received
result = total_toys
Q: Jason had 20 lollipops. He gave Denny some lollipops. Now Jason has 12 lollipops. How many lollipops did Jason give to Denny?
# solution in Python:
“””Jason had 20 lollipops. He gave Denny some lollipops. Now Jason has 12 lollipops. How many lollipops did Jason give to Denny?”””
jason_lollipops_initial = 20
jason_lollipops_after = 12
denny_lollipops = jason_lollipops_initial – jason_lollipops_after
result = denny_lollipops
Q: {question}
# solution in Python:
”’
现在我们可以将组合好的提示传递给GPT-3。
llm_out = llm(MATH_PROMPT.format(question=question))
print(llm_out)
输出是:
“””Emma took a 60 minute plane ride to seattle. She then took a 2 hour train ride to portland, and then a 30 minute bus ride to vancouver. How long did it take her to get to vancouver?”””
plane_ride = 60
train_ride = 2 * 60 # 2 hours in minutes
bus_ride = 30
total_time = plane_ride + train_ride + bus_ride
result = total_time
最后,我们可以将这段代码传递给 Python 运行时以获得答案:
exec(llm_out)
print(result)
输出是 210,这是正确的答案。