【笔记】提示工程

提示工程博客

参考资料

https://zhuanlan.zhihu.com/p/616934904#:~:text=提示工程 (Prompt Engineering ,也称为,In-Context Prompting)指在不更新模型参数的前提下、通过输入文本等方法来操控大型语言模型 (Large Language Model)以指导其行为、引导其生成我们需要的结果的方法。
https://lilianweng.github.io/posts/2023-03-15-prompt-engineering/#tips-for-example-selection

提示工程(Prompt Engineering或者In-Context Prompting)是指如何在不更新模型权重的情况下与LLM通信以引导其行为以获得所需结果的方法。这是一门实证科学,快速工程方法的效果在不同模型之间可能有很大差异,因此需要大量的实验和启发式。

基础

zero-shot和few-shot是两种基本的语言模型提示的方法。

zero-shot 与 few-shot,回到 NLP 场景。用 wikipedia、新闻等,训练一个 GPT 模型,直接拿来做对话任务,这个就是 zero-shot。然后,发现胡说八道有点多,找了一些人标注了少量优质数据喂进去,这就是 few-shot。
---- Few-Shot, Zero-Shot & One-shot 的通俗理解

提示的格式、选择哪些训练示例、训练示例的输入顺序都会极大地影响模型性能

  • 多数标签偏差(Majority bias)
  • 近频偏差(Recency bias):最新的知识、经验影响较大,而并没有那么客观
  • 常见词偏差(Common token bias)

提示技巧

一、提示示例选择技巧

  1. 与测试示例相似的示例。比如使用KNN在句嵌入空间上挑选接近测试用例者作为提示示例。
  2. 多样化且具有代表性的示例
  3. 用对比学习来训练句嵌入。
  4. 使用强化学习Q-learning。
  5. 在多次抽样中挑选出高熵或者高分歧示例,对这些分歧性示例做标注后用于小样本学习。

¥ 二、提示顺序技巧

  1. 一个普遍的建议是保持多样性、(与测试样本的)相关性和随机性,以避免多数标签偏差和近频偏差。
  2. 增加模型大小或用更多训练示例并不一定会减少模型性能的方差。

三、指令提示

  1. 在与指令模型交互时,我们应该详细描述任务要求,尽量具体和准确,避免说“不做某事”,而是具体说明要做什么。
  2. 有一个技巧是向语言模型介绍指令的受众:例如为孩子们讲解某个事情,
  3. 上下文指令学习结合了小样本学习与指令提示。它的每个示例都由指令、任务输入和输出三部分组成。

四、一致性采样

一个通用的解决方案是多数投票法(即选择多次采样结果中最常见者作为最终答案)。对于有确定答案的问题、比如机器编程,可以还可以运行生成的代码来检测生成的结果是否合理。

五、思维链

思维链本质就是生成一系列描述性的短句来作为提示、指导模型逐步推理。思维链对于复杂的推理任务+大语言模型(>50B参数)的组合有很大的提升效果。而简单推理或者不需要推理的任务从思维链的获益较少。

小样本思维链

与小样本学习结合,提供一些带有详细推导过程的提示示例来提升模型的推理能力

零样本思维链

不需要任何额外的示例,直接用宽泛的自然语言语句Let's think step by step 或者类似的说法作为提示。

思维链扩展

  1. 一致性采样+多数投票法也能提高思维链推理的准确性
  2. 集成学习引入随机性,来替代一致性采样,接着使用多数投票法。
  3. Self-Taught Reasoner方法,让大模型自动生成推理过程,同时只保留生成了正确答案(或多数投票法的答案)的过程,在第一步生成的伪数据上精调至模型收敛
  4. 维链的步骤越详尽、推理步骤越多时,模型的性能越好。分隔思维链的推理步骤时,用换行符\n 要比句号、分号和数字编号要更有效。
  5. 基于思维链复杂性的采样投票法。
  6. 复杂的思维链只能提升复杂推理任务的准确性,但对简单问题效果不好。
  7. 对于涉及文本推理的 NLP 任务(比如 问答 和 推断),思维链的效果因模型而异。
  8. 引入搜索引擎或者维基百科API来作为外部知识,辅助模型迭代构建思维链。

六、自动提示工程

  1. 让模型生成自动指令
  2. 给定一个训练集,去第一步生成的候选指令中挑选能让训练集中样本分数最高的指令
  3. 使用蒙特卡洛法迭代搜索:通过提示让模型生成第二步指令的变体,进一步搜索更优的指令。

增强语言模型

增强语言模型旨在用推理技能或外部工具等方法提升语言模型的能力

检索

在语言模型训练完成后,我们经常需要给模型添加最新的知识、或者是补充私有数据库等。在这种情况下,如果不给模型充足的提示信息、那模型是无法正确应对训练时没有见过的知识。开放领域问答中许多方法是需要先对数据库做检索、然后把检索的内容作为提示工程的一部分。这类方法的准确性依赖于检索质量和语言模型的生成能力。

编程语言辅助

让大语言模型生成编程语言语句来解决自然语言推理问题的工作。引入了Python解释器等外部工具来把复杂的计算和推理从语言生成中解耦出来。

外部 API

在模型使用时调用一些外部api来增强准确性,目前来看,这些api需要一定的输入格式或者特定api

提示工程指南

https://www.promptingguide.ai/zh/introduction/basics

研究人员可利用提示工程来提高大语言模型处理复杂任务场景的能力,如问答和算术推理能力。开发人员可通过提示工程设计和研发出强大的技术,实现和大语言模型或其他生态工具的高效接轨。
除非特别说明,本指南默认所有示例都是基于 OpenAI 的大语言模型 text-davinci-003 进行测试,并且使用该模型的默认配置,如 temperature=0.7 和 top-p=1 等。

参数

Temperature:参数值越小,模型就会返回越确定的一个结果。
Top_p:与 temperature 一起称为核采样的技术),可以用来控制模型返回结果的真实性。一般两个调一个即可

基本概念

一个提示词可以包含您传递到模型的_指令_或_问题_等信息,也可以包含其他详细信息,如_上下文_、_输入_或_示例_等。您可以通过这些元素来更好地指导模型,并因此获得更好的结果。

提问格式

零样本提示(zero-shot prompting

Q: <问题>?
A: 

小样本提示(Few-shot Prompting

<问题>?
<答案>
<问题>?
<答案>
<问题>?
<答案>
<问题>?

提示词要素

指令:想要模型执行的特定任务或指令。

上下文:包含外部信息或额外的上下文信息,引导语言模型更好地响应。

输入数据:用户输入的内容或问题。

输出指示:指定输出的类型或格式。

设计提示的通用技巧

从简单开始
这是一个迭代的过程,需要大量的实验来获得最佳结果。使用像OpenAI或Cohere这样的简单平台是一个很好的起点。
在此过程中对您的提示进行版本控制是至关重要的。
具体性、简洁性和简明性通常会给您带来更好的结果。
当您有一个涉及许多不同子任务的大任务时,您可以尝试将任务分解为更简单的子任务,并随着获得更好的结果而不断构建。这避免了在提示设计过程中一开始就添加过多的复杂性。

指令

例如“写入”、“分类”、“总结”、“翻译”、“排序”等,从而为各种简单任务设计有效的提示。
请记住,您还需要进行大量的实验,以查看哪种方法最有效。尝试使用不同的关键字、上下文和数据尝试不同的指令,
其他人建议将指令放在提示的开头。建议使用一些清晰的分隔符,如“###”,来分隔指令和上下文。

具体性

对您希望模型执行的指令和任务非常具体。提示越具体和详细,结果就越好。
更重要的是具有良好的格式和描述性提示。实际上,在提示中提供示例非常有效,可以以特定格式获得所需的输出。
在设计提示时,您还应考虑提示的长度,因为提示的长度有限制。

避免不精确

越直接,信息传递就越有效。

做还是不做?

避免说不要做什么,而是说要做什么。

提示词示例

  • 文本概括
    • Explain the above in one sentence:
  • 信息提取
    • Mention the large language model based product mentioned in the paragraph above:
  • 问答
    • Answer the question based on the context below. Keep the answer short and concise. Respond "Unsure about answer" if not sure about the answer.
  • 文本分类
    • Classify the text into neutral, negative or positive. // 将文本按中立、负面或正面进行分类
  • 对话 The following is a conversation with an AI research assistant. The assistant tone is technical and scientific. // 以下是与 AI 助理的对话,语气应该专业、技术性强。
    The following is a conversation with an AI research assistant. The assistant answers should be easy to understand even by primary school students. // 以下是与 AI 助理的对话。请给出易于理解的答案,最好是小学生都能看懂的那种。
  • 代码生成 --直接用注释
    /*
    询问用户的姓名并说“ Hello”
    */
    """
    Table departments, columns = [DepartmentId, DepartmentName]
    Table students, columns = [DepartmentId, StudentId, StudentName]
    Create a MySQL query for all students in the Computer Science Department
    """
  • 推理
    目前对于大语言模型来说,推理任务算是最具有挑战性的了。
    本文一个简单的例子是提示推理链。

提示技术

零样本提示

没有向模型提供任何示例
指令调整已被证明可以改善零样本学习Wei等人(2022)(opens in a new tab)。指令调整本质上是在通过指令描述的数据集上微调模型的概念。此外,RLHF(opens in a new tab)(来自人类反馈的强化学习)已被采用以扩展指令调整,其中模型被调整以更好地适应人类偏好。这一最新发展推动了像ChatGPT这样的模型。

少样本提示

模型通过提供一个示例(即1-shot)已经学会了如何执行任务。对于更困难的任务,我们可以尝试增加演示(例如3-shot、5-shot、10-shot等)
一些额外提示:

  • “标签空间和演示指定的输入文本的分布都很重要(无论标签是否对单个输入正确)”
  • 使用的格式也对性能起着关键作用,即使只是使用随机标签,这也比没有标签好得多。
  • 其他结果表明,从真实标签分布(而不是均匀分布)中选择随机标签也有帮助。

少样本提示的限制

似乎少样本提示不足以获得这种类型的推理问题的可靠响应。

链式思考

链式思考(CoT)提示通过中间推理步骤实现了复杂的推理能力。
您可以将其与少样本提示相结合,以获得更好的结果,以便在回答之前进行推理的更复杂的任务。
作者声称这是足够大的语言模型才会出现的新兴能力。
零样本cot:Let's think step by step.

自我一致性

自我一致性旨在“替换链式思维提示中使用的天真贪婪解码方法”。其想法是通过少样本CoT采样多个不同的推理路径,并使用生成结果选择最一致的答案。(如大多数答案)

生成知识提示

模型会依据例子提前生成一组与问题相关的知识,然后把知识作为上下文,提问

检索增强生成 (RAG)

要完成更复杂和知识密集型的任务,可以基于语言模型构建一个系统,访问外部知识源来做到。这样的实现与事实更加一性,生成的答案更可靠,还有助于缓解“幻觉”问题。
RAG 把一个信息检索组件和文本生成模型结合在一起。RAG 可以微调,其内部知识的修改方式很高效,不需要对整个模型进行重新训练。
最近,基于检索器的方法越来越流行,经常与 ChatGPT 等流行 LLM 结合使用来提高其能力和事实一致性。

ToT思想树

一个简单的树如下
Imagine three different experts are answering this question.
All experts will write down 1 step of their thinking,
then share it with the group.
Then all experts will go on to the next step, etc.
If any expert realises they're wrong at any point then they leave.
The question is...

自动提示工程师(APE)

自动提示工程师(APE),这是一个用于自动指令生成和选择的框架。指令生成问题被构建为自然语言合成问题,使用LLMs作为黑盒优化问题的解决方案来生成和搜索候选解。
首先根据示例生成问题列表
再用这些问题跑模型,打分
或者从问题的变体列表跑分选择

ART自动推理和工具使用

ART 鼓励模型从演示中归纳出分解新任务的方法,并在适当的地方使用工具。

Active-Prompt

思维链(CoT)方法依赖于一组固定的人工注释范例。问题在于,这些范例可能不是不同任务的最有效示例。为了解决这个问题,Diao等人(2023)(opens in a new tab)最近提出了一种新的提示方法,称为Active-Prompt,以适应LLMs到不同的任务特定示例提示(用人类设计的CoT推理进行注释)。
下面是该方法的说明。第一步是使用或不使用少量CoT示例查询LLM。对一组训练问题生成k个可能的答案。基于k个答案计算不确定度度量(使用不一致性)。选择最不确定的问题由人类进行注释。然后使用新的注释范例来推断每个问题

方向性刺激提示

Li等人,(2023)(opens in a new tab)提出了一种新的提示技术,以更好地指导LLM生成所需的摘要。
训练了一个可调节的策略LM来生成刺激/提示。越来越多地使用RL来优化LLM。
:说人话,一个示例是先提取文章的关键词或者实体名,在总结的时候需要base on the hint
策略LM可以很小,并且可以优化以生成指导黑盒冻结LLM的提示。

ReAct 框架

其中 LLMs 以交错的方式生成 推理轨迹 和 任务特定操作 。
生成推理轨迹使模型能够诱导、跟踪和更新操作计划,甚至处理异常情况。操作步骤允许与外部源(如知识库或环境)进行交互并且收集信息。

ReAct 框架允许 LLMs 与外部工具交互来获取额外信息,从而给出更可靠和实际的回应。
轨迹由多思考-操作-观察步骤组成
不同的提示设置用于不同类型的任务。对那些以推理为主要目标的任务 (例如 HotpotQA),多思考-操作-观察步骤用于任务-解决轨迹。对于涉及许多操作步骤的决策任务来说,则较少使用思考。

多模态思维链提示方法

传统的思维链提示方法侧重于语言模态。相比之下,多模态思维链提示将文本和视觉融入到一个两阶段框架中。第一步涉及基于多模态信息的理性生成。接下来是第二阶段的答案推断,它利用生成的理性信息。
第一阶段描述图片
第二阶段根据第一阶段的描述判断问题答案

提示的应用

PAL(程序辅助语言模型)

Gao等人(2022)(opens in a new tab)提出了一种使用LLMs读取自然语言问题并生成程序作为中间推理步骤的方法。被称为程序辅助语言模型(PAL),它与思维链提示不同,因为它不是使用自由形式文本来获得解决方案,而是将解决步骤卸载到类似Python解释器的编程运行时中。

生成数据

LLMs具有生成连贯文本的强大能力。使用有效的提示策略可以引导模型产生更好、更一致和更真实的响应。LLMs还可以特别有用地生成数据,这对于运行各种实验和评估非常有用。例如,我们可以使用它来为情感分类器生成快速样本。
ps:这个会加重幻觉吧?

Generating Code

毕业生职位分类案例研究

对于像这样不需要专业知识的任务,Few-shot CoT提示在所有实验中的表现都不如Zero-shot提示。
提示对于引导正确推理的影响非常巨大。简单地要求模型对给定的工作进行分类会得到65.6的F1分数,而后提示工程模型的F1分数为91.7。
试图强制模型遵循模板会降低所有情况下的性能(这种行为在GPT-4的早期测试中消失,这项测试在该论文之后进行)。
许多小的修改对性能产生了巨大的影响。
image

风险和误用

提示注入
提示泄漏
越狱 一些模型会避免响应不道德的指令,但如果请求以巧妙的方式进行上下文化,就可以绕过这些限制。
DAN越狱技术
Waluigi效应 Waluigi效应:在您训练LLM满足期望属性P之后,更容易引导聊天机器人满足属性P的完全相反的行为。

防御措施

在指令中添加防御
参数化提示组件:将提示的不同组件参数化,例如将指令与输入分开并以不同方式处理它们。
引用和其他格式:Riley还跟进了一个解决方法(opens in a new tab),最终被另一个用户利用。它涉及到对输入字符串进行转义/引用。;Riley提出的另一种防御方法(opens in a new tab)是使用JSON编码加上Markdown标题来处理指令/示例。

对抗提示检测器

真实性

LLM模型有时会生成听起来连贯且令人信服但有时是虚构的回答。改进提示可以帮助提高模型生成更准确/真实的回答,并降低生成不一致和虚构回答的可能性。
一些解决方案可能包括:

在上下文中提供基本事实(例如相关文章段落或维基百科条目),以减少模型生成虚构文本的可能性。
通过降低概率参数并指示模型在不知道答案时承认(例如,“我不知道”)来配置模型以生成更少样式的响应。
在提示中提供问题和答案的组合示例,其中可能知道和不知道的问题和答案。

偏见

LLMs可能会产生问题的生成结果,这些结果可能会对模型在下游任务上的性能产生负面影响,并显示可能会恶化模型性能的偏见。其中一些可以通过有效的提示策略来缓解,但可能需要更高级的解决方案,如调节和过滤。

codex

image
image

posted @ 2023-06-26 21:30  WordDealer  阅读(207)  评论(0编辑  收藏  举报