为了账号安全,请及时绑定邮箱和手机立即绑定

提示工程入门:技术分类与调优技巧

作为一门新兴的研究领域,提示工程目前还没有明确的技术分类。当你浏览不同文章和网站时,你会发现它们讨论的技术各不相同且缺乏结构。在这种混乱中,从业者通常更倾向于采用最简单的方法。在这篇文章中,我将提供一个概述和清晰的提示工程技术分类,帮助你更好地理解和有效地运用这些技术到你的应用程序中。此外,我还将从数据科学的角度探讨提示工程,包括提示调整和评估的过程。

大规模语言模型需要注意的问题

尽管许多研究者的努力,大型语言模型仍然存在一些问题。主要问题包括:

  • 引用资源。 大型语言模型可以生成看起来非常可信的内容,并引用外部资源,但重要的是要记住,它们没有互联网访问权限,因此无法真正引用资源。
  • 偏见。 大型语言模型在响应中可能会表现出偏见,经常生成带有刻板印象或偏见的内容。
  • 幻觉。 大型语言模型有时会“产生幻觉”,即在无法回答问题时生成错误信息,比如编造答案。
  • 数学和常识问题。 尽管它们具有先进的能力,大型语言模型在解决简单的数学或常识问题时经常会遇到困难,比如无法正确计算。
  • 提示操控。 用户可以操控或“黑客攻击”大型语言模型,使其忽略开发者的指令并生成特定内容,比如绕过安全措施。

大多数提示工程技术解决了两个问题:生成错误信息和解决数学问题及常识任务。有一些特定的技术旨在减轻提示操纵,但这需要另作讨论。

常用规则

在讨论之前,让我们先谈谈一些通用规则,这些规则将帮助你编写更清晰具体的指令:

  1. 明确说明需要做什么,比如写、总结、提取信息。
  2. 避免说不要做什么,而是直接说明要做什么。
  3. 具体点说,不要说“用几句话”,而要说“用2-3句话”。
  4. 添加标签或分隔符,以便更好地结构化提示。
  5. 如果需要,要求以结构化的格式输出,如JSON或HTML。
  6. 要求模型验证是否满足条件,例如,如果不知道答案,请回复“没有相关信息”。
  7. 要求模型先解释再提供答案,否则模型可能会试图为错误答案辩护。
分类

我对提示技术分类的建议

大多数现有技术可以分为三大类:

  • 单个提示技术旨在优化对单个提示的响应,
  • 接下来是一些结合多个提示的技术。它们的共同概念是通过多次查询模型(或多个模型)来完成任务,
  • 最后是一些将大型语言模型与结合外部工具的方法。
单轮提示技巧

输入输出或单轮回复技巧

有哪些技术旨在通过一次提示解决您的问题?

  • 零样本学习,
  • 少样本学习,
  • 思维链推理,
  • 程序辅助语言.

我们一个个地看看吧。

零样本指令

这是使用自然语言指令最简单的方法。

一次学习。例如来自promptingguide.ai的示例。

少量样本提示

LLM在单次学习方面表现出色,但仍可能在复杂任务上出错。少样本学习的概念是通过向模型展示类似任务的正确答案示例来训练模型。(Brown et al. (2020))

少量样本学习法。示例取自promptingguide.ai网站。

在[Min et al. (2022)]的论文中提到,演示标签的不准确性几乎不会影响到一系列分类和多选任务的表现效果。相反,重要的是确保演示提供各种标签的例子、测试输入的分布和序列的整体格式。这比标签的准确性更为关键。

链式思考提示 CoT

Chain-of-Thought 推理法通过中间推理步骤使模型能够进行复杂的推理。这种方法旨在逐步迭代并推理每一步。

零样本学习、少样本学习和链式思维提示法。以下示例来自Kojima, et al.(2022)https://arxiv.org/abs/2205.11916

CoT 可用于零样本学习,也可以用于少量样本学习。零样本 CoT 的想法是让模型逐步思考来找到解决方案。这些研究人员(Kojima 等人(2022))证明,零样本 CoT 在算术、符号和其他逻辑推理任务领域明显优于零样本大语言模型的表现。

如果你选择Few-shot CoT(即少量样本链式推理),你必须确保拥有带有解释的多样化的例子(Wei等人,2022年)。这种方法在算术、常识推理和符号推理任务中的实证效果非常显著。

辅助程序的语言模型(PAL)

程序辅助的语言模型方法是一种方法,它通过以自然语言和代码相结合的方式来解释,从而扩展了链式思考提示(Gao et al., 2022)[(https://arxiv.org/abs/2211.10435)]。

程序辅助的语言提示。例子取自 Gao et al. (2022)

可以通过LangChain PALChain类来实现这项技术。

多种提示技巧

接下来的一组提示基于不同的策略将一个或几个模型的提示结合。

  1. 投票。 这个想法是通过投票来找到正确答案。技术:自我一致性。
  2. 分而治之。 这一组提示基于将复杂的任务分解为几个提示。技术:定向提示,生成知识,提示链,链表和从简单到复杂的提示。
  3. 自我检查。 这种方法建议在框架中加入一个步骤来检查输出是否符合要求。技术:反思,思维树图。

自我一致性(SC)

自洽性基于这样的直觉,即“复杂的推理问题通常可以通过多种不同的方式来解决,得出其正确的答案是唯一的”(Wang等人(2022))。

自洽性技术

它多次提出相同的链式思维问题,以生成一系列多样化的推理路径,然后通过投票来确定最一致的答案。

示例,来自王等 (2022) 的自我一致性提示方法,arXiv 源链接为: https://arxiv.org/abs/2203.11171

在王等(2022)的研究中,使用自一致性在常见基准测试上的增益为4%–18%(详情请参见:https://arxiv.org/abs/2203.11171)。

方向性提示(DSP,方向性提示)

接下来的概念是“Divide and Conquer”(分而治之)。在DSP中,我们分为两步:生成刺激(比如关键词),然后利用它们来提升回答的质量。

方向性刺激提示是在Li等(2023)中为摘要生成任务、对话回应生成任务和链式思考推理任务提出的。包括两个模型:

  • 训练一个小的可调节政策的语言模型来生成一个刺激(提示),
  • 使用一个冻结的大型黑盒模型根据问题和上一步生成的提示来生成摘要。

方向刺激引起的模式

可以通过使用带有标签的数据进行有监督的微调,以及根据大型语言模型的输出从离线或在线反馈中进行强化学习来优化该政策模型,例如,:

DSP模型李等(2023),我们通过学习一个小的可调策略模型来生成方向性的刺激(这里的关键词),为LLM提供针对输入的具体指导,引导LLM达到期望的目标。

基于生成的知识提示(GK)

在“分而治之”的概念下,下一个提示技术是生成的知识,该方法在Liu et al. (2022)中提出。其想法是先使用一个单独的提示词生成知识,然后再利用该知识来获得更好的回答。

生成知识的指引包括两个阶段:

  • 知识生成:使用少量演示来从语言模型中生成与问题相关的知识陈述,
  • 知识整合:使用第二个语言模型对每个知识陈述进行预测,然后选择置信度最高的预测结果。

知识生成指南

该方法不需要特定任务的指引来整合知识,也不需要访问结构化的知识库,却能够提高大规模先进模型在常识性推理任务上的表现。

来自 Liu et al. (2022) QASC 的 few-shot 知识生成示例

提示链

提示链是一种简单而强大的技术,即将任务拆分成子问题,然后逐个向模型提出。

提示链模式

提示链不仅有助于处理复杂任务,这些任务如果用非常详细的提示可能难以处理,还能提升透明度、可控性和可靠性。

提示链示例来自网站 txt.cohere.com

从最少到最多的提示方式

从最少到最多的提示更进一步,让模型来决定如何将任务拆分成子任务。

从最少到最多的引导流程图

实验结果表明,在Zhou et al. (2022)中,最少到最多的提示策略在涉及符号操作、组合泛化和数学推理的任务上表现优异。

周等人 (2022) 的从最少到最多的提示法示例(见 链接

链式提示

最近的一项研究(王等 (2024))提出了一种新方法,其中表格数据被明确地用作推理链中的中间思想的代理,来代表中间思维。

表格链提示

该算法包含两个步骤的循环过程。

  1. 动态操作选取,其中大模型根据输入查询和之前操作的历史(操作链)从操作集合中采样下一个操作。
  2. 生成操作所需参数,包括使用大模型生成上一步选择的操作所需参数(例如生成新的列名),并通过编程语言来执行该操作,生成相应的中间结果表。

来自Wang et al. (2024)的Chain-of-Thought提示的示例和对比

接下来的两种方法实现了自我验证的概念——框架中包含一个步骤来验证解决方案。Chain-of-Table (链表实现)的示例可以在这里找到:链接

想法之树(ToT)

思维树扩展了链式思维方法,让模型能够探索多个逻辑步骤并自我评估选项。

要应用ToT技术,我们必须确定四个关键点。

  1. 如何将中间过程分解为思维步骤的方法。
  2. 如何从每个状态生成潜在的想法
  3. 如何使用状态评估提示来评估状态
  4. 使用哪种搜索算法(Yao et al. (2023)

想法树提示法

输入提示必须包括描述解决该问题的中间步骤,以及示例思维过程或生成这些思维过程的指示。状态评估提示必须提供指示选择用于下一步的提示。

例如,来自Yao等(2023)的24点游戏的思维树示例,出自[Yao等(2023)](https://arxiv.org/abs/2305.10601)

实验表明,Yao et al. (2023) 中的 ToT 方法在需要较为复杂规划或搜索的任务中表现良好。LangChain 在 langchain_experimental.tot.base.ToTChain 类 中实现了树形思维技术。详情请参阅相关链接。

反思

Reflexion 是一个通过语言反馈来强化语言代理的框架。Reflexion 代理会口头反思任务反馈信号,然后将其反思内容保留在一个情景记忆缓存中,以帮助在后续试验中做出更好的决策(Shinn 等人 (2023))。

来自Shinn等(2023)的反射模型图(chema of reflexion)。

反射架构包含了三个不同的部分:

  • 演员:一个根据状态观察生成文本和动作的LLM模型(使用CoT和ReAct),
  • 评分者:一个对演员生成的输出进行评分的LLM模型,
  • 自我反思:一个生成强化提示来帮助演员自我改进的LLM模型。

以下是来自Shinn等人(2023年)[1]的不同任务的反思示例。

Reflexion在需要顺序决策制定、编程和语言理解的任务中,在这些任务中,表现优异。

查看实现 点击这里

带有外部工具的大型语言模型框架

在这部分,我将介绍两种方法:检索增强生成和ReAct。

基于检索的生成(RAG)

RAG将信息检索部分与文本生成器结合在一起:

  • 检索。在检索步骤中,系统利用向量搜索查找可能回答该问题的相关文档。
  • 生成。接下来,将相关文档作为上下文信息提供给LLM,并连同初始问题一起提供(Lewis et al. (2021))。

在大多数情况下,我们会使用RAG序列方法(即检索和生成),检索出_k_个文档,并利用这些文档来生成所有回答用户查询所需的输出令牌。

RAG架构

RAG中的语言模型可以微调,但实际上这种情况很少发生,因为预训练的大型语言模型已经足够好用,而且自己进行微调的成本太高。另外,RAG中的内部知识可以高效地更新,也无需重新训练整个模型。

来自deepset.ai的RAG管道示例

RAG 生成更加事实性、具体且多样的回应,从而提高了事实验证的准确性。

ReAct(注:此处为“ReAct”,读作“瑞安特”或“瑞克特”)

姚等人(2022)提出了一个名为ReAct的框架,其中大型语言模型(LLM)来生成推理记录和特定任务的操作:推理记录帮助模型推导、跟踪并更新行动方案以及处理异常,而操作则允许模型与外部来源(例如知识库或环境)交互并收集额外信息。

ReAct 架构

ReAct框架可以选择一个可用的工具(如搜索引擎、计算器、SQL工具),使用它并分析结果来决定下一步做什么。

ReAct 的例子来自 Yao 等人 (2022)[https://arxiv.org/abs/2210.03629]

ReAct 通过与维基百科 API 交互,克服了连贯思维推理中常见的错觉和错误传递问题,并生成了比没有推理过程的基线更易理解的人类样任务解决路径(Yao 等,2022)。

看看这个使用 Langchain 工具的 ReAct 实现示例(具体链接:[链接])。

提示调整与评价

选择提示工程的技术很大程度上取决于你的大型语言模型的应用场景和可用资源。如果你曾经试验过任何提示语,你就会知道大型语言模型对提示语中的微小变化非常敏感,这些提示语通常次优且主观的。

无论你选择什么样的提示技术,如果你正在构建一个应用,非常重要的一点是,将提示工程视作一个数据科学流程。这意味着你需要创建一个测试集并选择评估指标,调整提示并评估其对测试集的效果。

提示设计在数据科学领域作为一种过程

测试提示的指标在很大程度上取决于应用程序,但这里有一些指导原则(来自 Data Science Summit 2023):

测试提示的指标(数据科学峰会2023,DSS 2023)

  1. 忠实性和相关性
  • 答案在事实上的准确性如何,
  • 答案与问题的相关性如何。

2. 检索 — 主要用于这类管道(如 RAG 和 ReAct 管道),但也可应用于生成的知识内容和定向刺激提示词:

  • 精度——检索到的文档有多相关,
  • 召回率——是否成功找到了所有相关的文档。

3. 内心想法

  • 选择代理和工具的准确性 — 对于 ReAct,
  • 提取工具参数 — 如果从上下文中正确提取参数并适当地转换 — 对于 ReAct,
  • 在长时间对话中记住事实 — 对于 ReAct,
  • 正确的逻辑推理步骤 — 对于 ReAct 和 Chain-of-Thought 提示词。

4. 非功能性的

  • 回答的风格和语气方面,
  • 无偏见性,
  • 通过合规和安全检查,
  • 进行提示注入测试。

根据您的具体需求,选择相关指标并跟踪提示更改对测试集效果的影响,确保任何更改都不会影响响应质量。

摘要

我没有声称已涵盖所有现有的技术——这些技术实在太多了,很快就会有人出一本完整的教科书。但是如果你一直读到这里,你应该已经发现这些技术的概念其实都相当直观且常见。我可以把这些写好提示的规则总结成一个简短的列表:

  1. 表达要清晰准确,让模型无需猜测你的意图,
  2. 利用分隔符或标签来增加结构,
  3. 通过示例和解释来帮助模型,
  4. 让模型逐步思考并解释其解决方案,
  5. 对于复杂的指令,考虑将其拆分成小任务,
  6. 多次尝试相同的指令,
  7. 考虑加入模型自我检查,
  8. 将大语言模型与外部工具结合使用,
  9. 将提示调优视为一个迭代的数据科学流程,需要进行评估。

好了,就这样吧!谢谢你的陪伴,祝你创作顺利!

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消