Agent 在提示工程中的应用:从思维链到 ReAct
如果 Agent 能够模仿人类在现实世界中的操作方式,那么这种机制能否应用于提示工程(Prompt Engineering)领域呢?本文将深入探讨大型语言模型(LLM)的演进,以及 Agent 如何通过 ReAct 框架解决传统提示工程的局限性。
从 LLM 到 Prompt Engineering
大型语言模型(LLM)是基于 Transformer 架构的模型,已在海量语料库或文本数据集上进行了训练,涵盖了互联网上的大多数网页。在训练期间,需要消耗大量的时间、计算资源(如 GPU)、能量和水(用于冷却)。梯度下降法被用来优化模型的参数,使其能够很好地预测训练数据。
本质上,LLM 学习根据前面的词序预测最可能的下一个词。这可以用来执行推理(即查找模型生成某些文本的可能性),或者用来生成文本。像 ChatGPT 这样的 LLM 使用这些文本与人进行对话。一旦 LLM 完成了训练,意味着它的参数被保存,不会向训练数据或重新训练的数据中添加输入。值得注意的是,LLM 仍然会从训练数据中学到偏见,而背后的公司不得不增加安全措施,使用来自人类反馈的强化学习(RLHF)以防止该模型产生有问题的内容。此外,由于 LLM 默认情况下只是根据他们所看到的内容生成最有可能的下一个单词,而没有进行任何事实核查或推理,因此它们容易产生幻觉,或者编造事实,以及推理错误。
自从 ChatGPT 公开发布以来,LLM 风靡全球。这些模型的新兴智能以及它们在我们生活中的各个方面的应用,使它们成为一种非常受欢迎的工具。除了聊天机器人以及编码和写作助手,LLM 还被用来创建与包括互联网在内的模拟环境交互的 Agent。
如果尝试过 ChatGPT,有时会发现它的回答很糟糕,但是如果重新措辞这个问题,可能会得到更好的结果。这就是提示工程的艺术,通过修改输入使 LLM 以您希望的方式作出响应。提示语的背后只是尝试通过提出一些事实来'唤醒 LLM 的记忆',或者告诉它一个新的领域,然后从一个训练好的 LLM 那里得到适当的响应。这就是所谓的上下文学习(In-Context Learning),一般主要有两种类型:zero-shot 和 few-shot。
- Zero-shot:为 LLM 提供了一个提示,可以在问题/命令之前包含一些背景信息,以帮助 LLM 找到一个好的响应。
- Few-shot:给 LLM 提供了一些示例提示和可取的响应,然后提出一个新的提示,LLM 将以示例的格式响应这些提示。
提示工程可能是自然语言处理(NLP)的未来趋势之一。这个领域正在从定制模型转向定制提示,因为 LLM 比任何人在没有大量时间和精力的情况下自己制作的语言模型要好得多。当 LLM 与正确的提示工程技术配对时,通常情况下,它可以完成专用模型所能完成的任何工作。
从 CoT 到 Agent
思维链推理(Chain-of-Thought, CoT)是一种流行的提示工程技术,旨在对抗推理错误。它包括给 LLM 提供一个或多个例子,说明如何通过语言推理解决问题,然后给它一个不同的问题,以这种方式解决。这可以帮助克服推理的错误,但它仍然受到幻觉的影响。幻觉的'事实'可以通过推理传播,导致模型得出错误的结论。
只提出一个问题的标准提示语被比作思维链(CoT)提示的输入,需要多步推理才能解决问题。由于幻觉的问题,使用 CoT 提示的 LLM 有更令人信服的响应,但它仍然有可能是错误的。如果 LLM 要成为一个有用的工具,如果不能左右它胡编乱造,我们就永远不能相信它们,最好还是自己做研究。而 Agent 似乎可以解决这个问题,允许 LLM 采取行动,比如搜索维基百科,以便从中找到事实和理由。
Agent 的核心能力
Agent 不仅仅是生成文本,它具备感知环境和执行行动的能力。这使得 LLM 不再是一个封闭的黑盒,而是一个可以与外部世界交互的智能体。这种交互能力是解决幻觉问题的关键,因为它允许模型验证其生成的信息。
Agent 应用于提示工程示例——ReAct
与思维链推理一样,ReAct(Reasoning + Acting)也是一种提示工程方法,它使用少量学习(Few-Shot Learning)来教模型如何解决问题。CoT 被认为是模仿人类如何思考问题,ReAct 也包括了这个推理元素,但它更进一步,允许 Agent 操作文本,让它与环境互动。人类使用语言推理来帮助我们制定策略并记住事情,但也可以采取行动来获得更多的信息并实现目标。这就是 ReAct 的基础。
ReAct 提示包括行动的例子、通过行动获得的观察结果,以及人类在过程中各个步骤中转录的思想(推理策略)。LLM 学习模仿这种交叉思考和行动的方法,使其成为其环境中的 Agent。
一定要记住,观察结果不是由 LLM 生成的,而是由环境生成的,环境是一个单独的模块,LLM 只能通过特定的文本操作与之交互。因此,为了实现 ReAct,需要以下三个核心组件:
- 环境(Environment):它采取一个文本操作,从一组可以根据环境的内部状态改变的潜在操作中返回一个文本观察。
- 输出解析器框架(Output Parser):一旦 Agent 编写了一个有效的操作,它就停止生成文本,在环境中执行该操作,并返回观察结果。一般是将其追加到目前生成的文本中,并用该结果提示 LLM。
- :混合了思想、行动和观察,在环境中可以使用 few-shot。例子的数量和细节取决于目标和开发者的设计。


