Prompt Engineering 提示词工程研究指南:七、提示词编写技巧(下)
八、自动推理和工具使用Automatic Reasoning and Tool-use (ART)
将CoT提示和工具以交错的方式组合起来,已经证明是一个强大且稳健的方法来解决许多LLMs的任务。这些方法通常需要手工制作特定任务的演示,并仔细编写模型生成和工具使用的交错脚本。Paranjape等人提出了一个新的框架,使用冻结的LLM自动生成中间推理步骤作为程序。ART的工作方式如下:给定一个新任务,它会在测试时从任务库中选择多步推理和工具使用的演示,在调用外部工具时,它会暂停生成并在继续生成之前整合工具的输出。ART鼓励模型从演示中推广,以用零样本zero-shot的方式分解新任务并在合适的地方使用工具。此外,ART还具有可扩展性,因为它使人们能够通过简单更新任务和工具库来修复推理步骤中的错误或添加新工具。以下是该过程的演示:
ART对BigBench和MMLU基准上的未见任务的few-shot提示和自动CoT进行了大幅改进,当加入人工反馈时,它超过了手工制作的CoT提示的性能。
下面是ART在BigBench和MMLU任务上的表现:
九、自动提示工程师Automatic Prompt Engineer(APE)
Zhou等人(2022)提出了自动提示工程师(Automatic Prompt Engineer, APE)——一个自动生成和选择指令的框架。指令生成问题被视为一种自然语言合成的问题,并通过使用LLMs生成和搜索候选解来对其进行黑盒优化。
第一步涉及一个大型语言模型(作为推理模型),该模型接收输出演示来生成任务的指令候选解。这些候选解将指导搜索过程。指令通过目标模型执行,然后根据计算出的评估分数选择最合适的指令。
APE发现了一个比人工设计的"让我们逐步思考"提示更好的零样本CoT提示(Kojima等人,2022)。
对于MultiArith和GSM8K基准测试,"让我们逐步解决这个问题以确保我们得到正确的答案"的提示引发了因果思维,提高了性能。
本论文涉及到与提示工程相关的一个重要主题,即自动优化提示的思想。虽然本指南中没有详细探讨这个主题,但如果您对该主题感兴趣,以下是一些重要的论文:
- AutoPrompt(自动提示)- 提出了一种基于梯度引导搜索的方法,用于自动为各种任务创建提示 https://arxiv.org/abs/2010.15980。
- Prefix Tuning(前缀调整)- 这是一种轻量级的替代微调的方法,它在NLG任务中添加了一个可训练的连续前缀 https://arxiv.org/abs/2101.00190。
- Prompt Tuning(提示调整)- 提出了一种通过反向传播来学习软提示的机制 https://arxiv.org/abs/2104.08691。
十、主动提示Active-Prompt
CoT方法依赖于一组固定的人工注释示例。问题在于,这些示例可能对不同任务来说并不是最有效的示例。为了解决这个问题,Diao等人(2023)最近提出了一种名为Active-Prompt的新提示方法,以适应LLMs到不同的任务特定示例提示(用人设计的CoT推理进行注释)。
下面是这种方法的示意图。首先,使用一些CoT示例向LLM进行查询,可以选择使用或不使用。为一组训练问题生成k个可能的答案。基于k个答案计算不确定性度量(使用不一致性)。选择最不确定的问题由人类进行注释。然后,使用新的带注释示例来推断每个问题。
十一、定向刺激提示法Directional Stimulus Prompting
Li等人(2023年)提出了一种新的提示技术,以更好地引导LLM生成所期望的摘要。
训练了一个可调节的策略LM来生成刺激/提示。RL被广泛应用于优化LLMs。
下面的图示比较了定向刺激提示法和标准提示法。策略LM可以很小,并且可以被优化用来生成指导一个黑盒冻结的LLM的提示。
十二、激活提示ReAct Prompting
Yao等人在2022年引入了一个名为ReAct的框架,其中使用LLMs以交错的方式生成推理轨迹和任务特定的动作(论文链接https://arxiv.org/abs/2210.03629)。
生成推理轨迹使模型能够诱导、跟踪和更新行动计划,甚至处理异常情况。行动步骤允许与外部来源(如知识库或环境)进行交互和获取信息。
ReAct框架可以使LLMs与外部工具进行交互,以检索额外的信息,从而得到更可靠和准确的响应。
结果显示,ReAct在语言和决策任务上可以胜过几种最先进的基线模型。ReAct还提高了LLMs的人类可解释性和可信度。总体而言,作者发现最佳方法是将ReAct与思维链(CoT)相结合,使推理过程中可以同时利用内部知识和外部信息。
工作原理
ReAct受到了"行动"和"推理"之间的协同作用的启发,这使得人类能够学习新任务并做出决策或推理。
思维链(CoT)提示展示了LLMs进行推理轨迹生成答案的能力,可涉及算术和常识推理等其他任务(Wei等人,2022)。但是它缺乏对外部世界的访问或无法更新知识,可能会导致事实幻觉和错误传播等问题。
ReAct是一种将推理和行动与LLMs结合的通用范例。ReAct提示LLMs生成任务的语言推理轨迹和动作。这使得系统能够进行动态推理,创建、维护和调整行动计划,同时还能与外部环境(如维基百科)进行交互,将额外的信息纳入推理过程中。下图显示了ReAct的示例以及执行问答任务所涉及的不同步骤。
在上面的示例中,我们传递了来自HotpotQA的一个问题作为提示(不包括上下文示例,为了简单起见我们排除了它):
除了Apple Remote之外,还有哪些设备可以控制最初设计用于与之交互的Apple Remote程序?
我们可以看到模型生成了任务解决轨迹(思考、行动)。Obs对应于与之进行交互的环境的观察(例如搜索引擎)。实质上,ReAct可以检索信息来支持推理,而推理有助于确定下一步要检索的内容。
ReAct提示
为了演示ReAct提示的工作原理,让我们按照论文中的一个例子来进行。
第一步是从训练集(例如HotPotQA)中选择案例并组成ReAct格式的轨迹。这些轨迹被用作提示中的少数样本示例。轨迹由多个思考-行动-观察步骤组成,如上图所示。自由形式的思考用于实现不同的任务,例如分解问题、提取信息、进行常识/算术推理、指导搜索的制定和综合最终答案等。
下面是ReAct提示样本的示例(从论文中获取,并简化为一个例子):
问题:科罗拉多造山运动的东部地区延伸到哪个海拔范围?
思考1:我需要搜索科罗拉多造山运动,找到东部地区延伸到的地方,然后找出该地区的海拔范围。
行动1:搜索[科罗拉多造山运动]
观察1:科罗拉多造山运动是科罗拉多州及周边地区的一次山脉建造事件(造山运动)。
思考2:它没有提到东部地区。所以我需要查找东部地区。
行动2:查找[东部地区]
观察2:(结果1/1)东部地区延伸到高原地带,被称为中央平原造山运动。
思考3:科罗拉多造山运动的东部地区延伸到高原地带。所以我需要搜索高原地带,并找出它的海拔范围。
行动3:搜索[高原地带]
观察3:高原地带指的是两个不同的土地区域之一
思考4:我需要改为搜索美国的高原地带。
行动4:搜索[美国的高原地带]
观察4:高原地带是大平原的一个子区域。从东到西,高原地带的海拔从大约1800到7000英尺(550到2130米)不等。
思考5:高原地带的海拔从大约1800到7000英尺,所以答案是1800到7000英尺。
行动5:完成[1800到7000英尺]
...
不同类型的任务使用不同的提示设置。对于推理至关重要的任务(例如HotpotQA),在任务解决过程中使用多个思考-行动-观察步骤。对于涉及大量行动步骤的决策任务,思考步骤则较少使用。
知识密集型任务的结果
该论文首先在知识密集型的推理任务上评估了ReAct,例如问答任务(HotpotQA)和事实验证任务(Fever)。基于PaLM-540B的模型被用作提示的基准模型。
使用不同的提示方法,在HotPotQA和Fever上的提示结果显示,ReAct在这两个任务上通常表现优于仅涉及行动的Act。
我们还可以观察到,ReAct在Fever上表现优于CoT,在HotPotQA上落后于CoT。论文中提供了详细的错误分析。
- CoT存在事实幻觉的问题。
- ReAct的结构约束降低了其在制定推理步骤方面的灵活性。
- ReAct在很大程度上依赖于它所检索到的信息;无信息的搜索结果会使模型的推理偏离轨道,导致难以恢复和重新构思。
将ReAct和CoT +自一致性两种提示方法相结合并支持切换的方法通常优于所有其他提示方法。
请参考论文获取更详细的错误分析。
在决策任务方面的结果
该论文还报道了ReAct在决策任务上的表现结果。ReAct在两个称为ALFWorld(基于文本的游戏)和WebShop(在线购物网站环境)的基准测试上进行了评估。这两个测试都涉及复杂的环境,需要进行推理才能有效地行动和探索。
请注意,对于这些任务,ReAct的提示设计方式是不同的,但仍然保持了将推理和行动相结合的核心思想。下面是一个涉及ReAct提示的ALFWorld问题的示例。
ReAct在ALFWorld和Webshop两个任务上优于Act。Act在没有任何思考的情况下,无法正确将目标分解为子目标。推理在这些类型的任务中似乎对ReAct具有优势,但是目前基于提示的方法在这些任务上的表现仍远远不及专业人员。
请查阅论文以获取更详细的结果。
使用LangChain ReAct
下面是ReAct提示方法在实践中的高级示例。我们将使用LangChain作为LLM并使用LangChain的内置功能来利用ReAct框架构建能够通过结合LLM和不同工具来执行任务的代理。
首先,让我们安装并导入必要的库:
%%capture
# update or install the necessary libraries
!pip install --upgrade openai
!pip install --upgrade langchain
!pip install --upgrade python-dotenv
!pip install google-search-results
# import libraries
import openai
import os
from langchain.llms import OpenAI
from langchain.agents import load_tools
from langchain.agents import initialize_agent
from dotenv import load_dotenv
load_dotenv()
# load API keys; you will need to obtain these if you haven't yet
os.environ["OPENAI_API_KEY"] = os.getenv("OPENAI_API_KEY")
os.environ["SERPER_API_KEY"] = os.getenv("SERPER_API_KEY")
现在我们可以配置LLM、我们将使用的工具以及允许我们将ReAct框架与LLM和工具结合使用的代理。请注意,我们使用搜索API来搜索外部信息,并将LLM作为数学工具。
llm = OpenAI(model_name="text-davinci-003" ,temperature=0)
tools = load_tools(["google-serper", "llm-math"], llm=llm)
agent = initialize_agent(tools, llm, agent="zero-shot-react-description", verbose=True)
一旦配置完成,我们现在可以使用所需的查询/提示来运行代理程序。请注意,这里不需要像论文中解释的那样提供few-shot示例。
agent.run("Who is Olivia Wilde's boyfriend? What is his current age raised to the 0.23 power?")
链式执行如下所示:
> Entering new AgentExecutor chain...
I need to find out who Olivia Wilde's boyfriend is and then calculate his age raised to the 0.23 power.
Action: Search
Action Input: "Olivia Wilde boyfriend"
Observation: Olivia Wilde started dating Harry Styles after ending her years-long engagement to Jason
Sudeikis — see their relationship timeline.
Thought: I need to find out Harry Styles' age.
Action: Search
Action Input: "Harry Styles age"
Observation: 29 years
Thought: I need to calculate 29 raised to the 0.23 power.
Action: Calculator
Action Input: 29^0.23
Observation: Answer: 2.169459462491557
Thought: I now know the final answer.
Final Answer: Harry Styles, Olivia Wilde's boyfriend, is 29 years old and his age raised to the 0.23
power is 2.169459462491557.
> Finished chain.
我们得到的输出如下所示:
"Harry Styles, Olivia Wilde's boyfriend, is 29 years old and his age raised to the 0.23 power
is 2.169459462491557."
我们从LangChain文档中调整了这个例子,所以应该归功于他们。我们鼓励学习者探索不同的工具和任务组合。你可以在这里找到这段代码:https://github.com/dair-ai/Prompt-Engineering-Guide/blob/main/notebooks/react.ipynb
十三、多模态 CoT 提示方法
张等人(2023)最近提出了一种多模态的思维链提示方法。传统的思维链提示方法主要关注语言模态。相比之下,多模态思维链方法将文本和视觉信息融合到一个两阶段的框架中。第一步是基于多模态信息的理由生成,然后是第二阶段的答案推理,利用生成的有信息量的理由进行推理。
多模态思维链模型(1B)在ScienceQA基准测试上优于GPT-3.5。
更多参考:
- Language Is Not All You Need: Aligning Perception with Language Models(opens in a new tab) (Feb 2023)
标题:Prompt Engineering 提示词工程研究指南:七、提示词编写技巧(下)
作者:michael
地址:https://blog.junxworks.cn/articles/2023/07/21/1689903083429.html