Merge pull request #413 from RealTong/main

Update: Chinese translation
pull/436/head
Elvis Saravia 3 months ago committed by GitHub
commit 4fd162c6e6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -7,6 +7,6 @@ import ContentFileNames from 'components/ContentFileNames'
本指南介绍了提示词相关的基础知识,帮助用户了解如何通过提示词和大语言模型进行交互并提供指导建议。
除非特别说明,本指南默认所有示例都是基于 OpenAI 的大语言模型 `text-davinci-003` 进行测试,并且使用该模型的默认配置,如 `temperature=0.7` 和 `top-p=1` 等
除非另有说明,本指南默认所有示例都是在 OpenAI 的 Playground 上使用 `gpt-3.5-turbo` 进行测试。模型使用默认配置,即 temperature=1 和 top_p=1 。这些提示也应适用于具有类似功能的其他模型如gpt-3.5-turbo但模型响应可能会有所不同
<ContentFileNames section="introduction" lang="zh"/>

@ -1,5 +1,8 @@
# 基本概念
import {Screenshot} from 'components/screenshot'
import INTRO1 from '../../img/introduction/sky.png'
## 基础提示词
您可以通过简单的提示词Prompts获得大量结果但结果的质量与您提供的信息数量和完善度有关。一个提示词可以包含您传递到模型的_指令_或_问题_等信息也可以包含其他详细信息如_上下文_、_输入_或_示例_等。您可以通过这些元素来更好地指导模型并因此获得更好的结果。
@ -15,16 +18,18 @@ The sky is
_输出结果_
```
blue
The sky is blue on a clear day. On a cloudy day, the sky may be gray or white.
blue.
```
如以上示例,语言模型能够基于我们给出的上下文内容 `"The sky is" 完成续写。 而输出的结果可能是出人意料的,或远高于我们的任务要求。
如果使用的是 OpenAI Playground 或者其他任何 LLM Playground则可以提示模型如以下屏幕截图所示
<Screenshot src={INTRO1} alt="INTRO1" />
需要注意的是,当使用 OpenAI 的 `gpt-4` 或者 `gpt-3.5-turbo` 等聊天模型时,您可以使用三个不同的角色来构建 prompt `system`、`user` 和 `assistant`。其中 `system` 不是必需的,但有助于设定 `assistant` 的整体行为,帮助模型了解用户的需求,并根据这些需求提供相应的响应。上面的示例仅包含一条 `user` 消息,您可以使用 `user` 消息直接作为 prompt。为简单起见本指南所有示例除非明确提及将仅使用 `user` 消息来作为 `gpt-3.5-turbo` 模型的 prompt。上面示例中 `assistant` 的消息是模型的响应。您还可以定义 `assistant` 消息来传递模型所需行为的示例。您可以在[此处](https://www.promptingguide.ai/models/chatgpt)了解有关使用聊天模型的更多信息。
基于以上示例,如果想要实现更具体的目标,我们还必须提供更多的背景信息或说明信息。
从上面的提示示例中可以看出,语言模型能够基于我们给出的上下文内容 `"The sky is" 完成续写。而输出的结果可能是出人意料的,或远高于我们的任务要求。 但是,我们可以通过改进提示词来获得更好的结果
可以按如下示例试着完善一下:
让我们试着改进以下:
_提示词_
@ -37,7 +42,7 @@ The sky is
_输出结果_
```
so beautiful today.
blue during the day and dark at night.
```
结果是不是要好一些了?本例中,我们告知模型去完善句子,因此输出的结果和我们最初的输入是完全符合的。**提示工程**Prompt Engineering就是探讨如何设计出最佳提示词用于指导语言模型帮助我们高效完成某项任务。
@ -65,9 +70,24 @@ Q: <问题>?
A:
```
以上的提示方式也被称为_零样本提示zero-shot prompting_即用户不提供任务结果相关的示范直接提示语言模型给出任务相关的回答。某些大型语言模式有能力实现零样本提示但这也取决于任务的复杂度和已有的知识范围。
以上的提示方式,也被称为 _零样本提示zero-shot prompting_即用户不提供任务结果相关的示范直接提示语言模型给出任务相关的回答。某些大型语言模式有能力实现零样本提示但这也取决于任务的复杂度和已有的知识范围。
具体的零样本提示示例如下:
_提示词_
```
Q: What is prompt engineering?
```
对于一些较新的模型,你可以跳过 `Q:` 部分,直接输入问题。因为模型在训练过程中被暗示并理解问答任务,换言之,提示词可以简化为下面的形式:
_提示词_
```
What is prompt engineering?
```
基于以上标准范式目前业界普遍使用的还是更高效的_小样本提示Few-shot Prompting_范式即用户提供少量的提示范例如任务说明等。小样本提示一般遵循以下格式
基于以上标准范式,目前业界普遍使用的还是更高效的 _小样本提示Few-shot Prompting_范式即用户提供少量的提示范例如任务说明等。小样本提示一般遵循以下格式
```
<问题>?
@ -116,4 +136,4 @@ _输出结果_
Negative
```
语言模型可以基于一些说明了解和学习某些任务,而小样本提示正好可以赋能上下文学习能力。
语言模型可以基于一些说明了解和学习某些任务,而小样本提示正好可以赋能上下文学习能力。我们将在接下来的章节中更广泛的讨论如何使用零样本提示和小样本提示。

@ -12,4 +12,16 @@
**输出指示**:指定输出的类型或格式。
为了更好地演示提示词要素,下面是一个简单的提示,旨在完成文本分类任务:
_提示词_
```
请将文本分为中性、否定或肯定
文本:我觉得食物还可以。
情绪:
```
在上面的提示示例中,指令是“将文本分类为中性、否定或肯定”。输入数据是“我认为食物还可以”部分,使用的输出指示是“情绪:”。请注意,此基本示例不使用上下文,但也可以作为提示的一部分提供。例如,此文本分类提示的上下文可以是作为提示的一部分提供的其他示例,以帮助模型更好地理解任务并引导预期的输出类型。
注意,提示词所需的格式取决于您想要语言模型完成的任务类型,并非所有以上要素都是必须的。我们会在后续的指南中提供更多更具体的示例。

@ -1,5 +1,8 @@
# 提示词示例
import {Cards, Card} from 'nextra-theme-docs'
import {CodeIcon} from 'components/icons'
在上一节中,我们介绍并给出了如何赋能大语言模型的基本示例。
在本节中,我们会提供更多示例,介绍如何使用提示词来完成不同的任务,并介绍其中涉及的重要概念。通常,学习概念的最佳方法是通过示例进行学习。下面,我们将通过示例介绍说明如何使用精细的提示词来执行不同类型的任务。
@ -322,3 +325,14 @@ Sum: 41
我们后面还会在本章节中介绍更多常见应用示例。
在后面的章节,我们将介绍更高级的提示工程概念和技术,以完成更困难任务。
## Notebook
如果您想使用 Python 练习上述提示,我们准备了一个 Notebook 来测试使用 OpenAI 模型的一些提示。
<Cards>
<Card
icon={<CodeIcon />}
title="提示工程入门"
href="https://github.com/dair-ai/Prompt-Engineering-Guide/blob/main/notebooks/pe-lecture.ipynb"
/>
</Cards>

@ -1,11 +1,20 @@
# 模型设置
使用提示词时,您会通过 API 或直接与大语言模型进行交互。你可以通过配置一些参数以获得不同的提示结果。
使用提示词时,您会通过 API 或直接与大语言模型进行交互。你可以通过配置一些参数以获得不同的提示结果。调整这些设置对于提高响应的可靠性非常重要你可能需要进行一些实验才能找出适合您的用例的正确设置。以下是使用不同LLM提供程序时会遇到的常见设置
**Temperature**:简单来说,`temperature` 的参数值越小,模型就会返回越确定的一个结果。如果调高该参数值,大语言模型可能会返回更随机的结果,也就是说这可能会带来更多样化或更具创造性的产出。我们目前也在增加其他可能 token 的权重。在实际应用方面对于质量保障QA等任务我们可以设置更低的 `temperature` 值,以促使模型基于事实返回更真实和简洁的结果。 对于诗歌生成或其他创造性任务,你可以适当调高 `temperature` 参数值。
**Top_p**:同样,使用 `top_p`(与 `temperature` 一起称为核采样的技术),可以用来控制模型返回结果的真实性。如果你需要准确和事实的答案,就把参数值调低。如果你想要更多样化的答案,就把参数值调高一些。
一般建议是改变 Temperature 和 Top P 其中一个参数就行,不用两个都调整。
一般建议是改变其中一个参数就行,不用两个都调整。
**Max Length**:您可以通过调整 `max length` 来控制大模型生成的 token 数。指定 Max Length 有助于防止大模型生成冗长或不相关的响应并控制成本。
**Stop Sequences**`stop sequence` 是一个字符串,可以阻止模型生成 token指定 `stop sequences` 是控制大模型响应长度和结构的另一种方法。例如,您可以通过添加 “11” 作为 `stop sequence` 来告诉模型生成不超过 10 个项的列表。
**Frequency Penalty**`frequency penalty` 是对下一个生成的 token 进行惩罚,这个惩罚和 token 在响应和提示中出现的次数成比例, `frequency penalty` 越高,某个词再次出现的可能性就越小,这个设置通过给 重复数量多的 Token 设置更高的惩罚来减少响应中单词的重复。
**Presence Penalty**`presence penalty` 也是对重复的 token 施加惩罚,但与 `frequency penalty` 不同的是,惩罚对于所有重复 token 都是相同的。出现两次的 token 和出现 10 次的 token 会受到相同的惩罚。 此设置可防止模型在响应中过于频繁地生成重复的词。 如果您希望模型生成多样化或创造性的文本,您可以设置更高的 `presence penalty`,如果您希望模型生成更专注的内容,您可以设置更低的 `presence penalty`。
与 `temperature` 和 `top_p` 一样,一般建议是改变 `frequency penalty` 和 `presence penalty` 其中一个参数就行,不要同时调整两个。
在我们开始一些基础示例之前,请记住最终生成的结果可能会和使用的大语言模型的版本而异。

@ -3,7 +3,7 @@
以下是设计提示时需要记住的一些技巧:
### 从简单开始
在设计提示时需要记住这是一个迭代的过程需要大量的实验来获得最佳结果。使用像OpenAI或Cohere这样的简单平台是一个很好的起点。
在设计提示时,需要记住这是一个迭代的过程,需要大量的实验来获得最佳结果。使用像 OpenAI Cohere 这样的简单平台是一个很好的起点。
您可以从简单的提示开始,随着您的目标是获得更好的结果,不断添加更多的元素和上下文。在此过程中对您的提示进行版本控制是至关重要的。当您阅读本指南时,您会看到许多例子,其中具体性、简洁性和简明性通常会给您带来更好的结果。
@ -45,7 +45,7 @@
所需格式:
地点:<逗号分隔的公司名称列表>
输入“虽然这些发展对研究人员来说是令人鼓舞的但仍有许多谜团。里斯本未知的香帕利莫德中心的神经免疫学家Henrique Veiga-Fernandes说“我们经常在大脑和我们在周围看到的效果之间有一个黑匣子。”“如果我们想在治疗背景下使用它我们实际上需要了解机制。””
输入:“虽然这些发展对研究人员来说是令人鼓舞的,但仍有许多谜团。里斯本未知的香帕利莫德中心的神经免疫学家 Henrique Veiga-Fernandes 说:“我们经常在大脑和我们在周围看到的效果之间有一个黑匣子。”“如果我们想在治疗背景下使用它,我们实际上需要了解机制。””
```
*输出:*
@ -53,7 +53,7 @@
地点:里斯本,香帕利莫德中心
```
输入文本来自[这篇Nature文章](https://www.nature.com/articles/d41586-023-00509-z)。
输入文本来自[这篇 Nature 文章](https://www.nature.com/articles/d41586-023-00509-z)。
### 避免不精确
在上面关于详细和格式改进的提示中,很容易陷入想要过于聪明的提示陷阱,从而可能创建不精确的描述。通常最好是具体和直接。这里的类比非常类似于有效的沟通——越直接,信息传递就越有效。
@ -67,7 +67,7 @@
从上面的提示中不清楚要使用多少句话和什么样的风格。您可能仍然可以通过上面的提示获得良好的响应,但更好的提示是非常具体、简洁和直接的。例如:
```
使用2-3句话向高中学生解释提示工程的概念。
使用 2-3 句话向高中学生解释提示工程的概念。
```
### 做还是不做?
@ -102,4 +102,4 @@
抱歉,我没有关于您兴趣的任何信息。不过,这是目前全球热门的电影列表:[电影列表]。希望您能找到喜欢的电影!
```
上述示例中的一些内容摘自["Best practices for prompt engineering with OpenAI API" article.](https://help.openai.com/en/articles/6654000-best-practices-for-prompt-engineering-with-openai-api)
上述示例中的一些内容摘自 ["Best practices for prompt engineering with OpenAI API" article.](https://help.openai.com/en/articles/6654000-best-practices-for-prompt-engineering-with-openai-api)

@ -2,7 +2,7 @@
import ContentFileNames from 'components/ContentFileNames'
时至今日,改进提示显然有助于在不同任务上获得更好的结果。这就是提示工程背后的整个理念。
时至今日,改进提示显然有助于在不同任务上获得更好的结果。这就是提示工程背后的整个理念。
尽管基础示例很有趣,但在本节中,我们将介绍更高级的提示工程技术,使我们能够完成更复杂和有趣的任务。

@ -4,9 +4,9 @@ import { Callout, FileTree } from 'nextra-theme-docs'
import {Screenshot} from 'components/screenshot'
import ACTIVE from '../../img/active-prompt.png'
思维链CoT方法依赖于一组固定的人工注释范例。问题在于这些范例可能不是不同任务的最有效示例。为了解决这个问题[Diao等人2023](https://arxiv.org/pdf/2302.12246.pdf)最近提出了一种新的提示方法称为Active-Prompt以适应LLMs到不同的任务特定示例提示用人类设计的CoT推理进行注释
思维链CoT方法依赖于一组固定的人工注释范例。问题在于这些范例可能不是不同任务的最有效示例。为了解决这个问题[Diao 等人2023](https://arxiv.org/pdf/2302.12246.pdf)最近提出了一种新的提示方法,称为 Active-Prompt以适应 LLMs 到不同的任务特定示例提示(用人类设计的 CoT 推理进行注释)。
下面是该方法的说明。第一步是使用或不使用少量CoT示例查询LLM。对一组训练问题生成*k*个可能的答案。基于*k*个答案计算不确定度度量(使用不一致性)。选择最不确定的问题由人类进行注释。然后使用新的注释范例来推断每个问题。
下面是该方法的说明。第一步是使用或不使用少量 CoT 示例查询 LLM。对一组训练问题生成 *k* 个可能的答案。基于 *k* 个答案计算不确定度度量(使用不一致性)。选择最不确定的问题由人类进行注释。然后使用新的注释范例来推断每个问题。
<Screenshot src={ACTIVE} alt="ACTIVE" />
图片来源:[Diao等人2023](https://arxiv.org/pdf/2302.12246.pdf)

@ -8,19 +8,21 @@ import APECOT from '../../img/ape-zero-shot-cot.png'
<Screenshot src={APE} alt="APE" />
图片来源:[Zhou等人2022](https://arxiv.org/abs/2211.01910)
[Zhou等人2022](https://arxiv.org/abs/2211.01910) 提出了自动提示工程师APE这是一个用于自动指令生成和选择的框架。指令生成问题被构建为自然语言合成问题使用LLMs作为黑盒优化问题的解决方案来生成和搜索候选解。
[Zhou等人2022](https://arxiv.org/abs/2211.01910) 提出了自动提示工程师 APE这是一个用于自动指令生成和选择的框架。指令生成问题被构建为自然语言合成问题使用 LLMs 作为黑盒优化问题的解决方案来生成和搜索候选解。
第一步涉及一个大型语言模型(作为推理模型),该模型接收输出演示以生成任务的指令候选项。这些候选解将指导搜索过程。使用目标模型执行指令,然后根据计算的评估分数选择最合适的指令。
APE发现了一个比人工设计的“让我们一步一步地思考”提示更好的零样本CoT提示[Kojima等人2022](https://arxiv.org/abs/2205.11916))。
APE 发现了一个比人工设计的“让我们一步一步地思考”提示更好的零样本 CoT 提示 [Kojima 等人2022](https://arxiv.org/abs/2205.11916))。
提示“让我们一步一步地解决这个问题以确保我们有正确的答案。”引发了思维链的推理并提高了MultiArith和GSM8K基准测试的性能
提示“让我们一步一步地解决这个问题,以确保我们有正确的答案。”引发了思维链的推理,并提高了 MultiArith GSM8K 基准测试的性能:
<Screenshot src={APECOT} alt="APECOT" />
图片来源:[Zhou等人2022](https://arxiv.org/abs/2211.01910)
本文涉及与提示工程相关的重要主题,即自动优化提示的想法。虽然我们在本指南中没有深入探讨这个主题,但如果您对此主题感兴趣,以下是一些关键论文:
- [Prompt-OIRL](https://arxiv.org/abs/2309.06553) - 使用离线逆强化学习来生成与查询相关的提示。
- [OPRO](https://arxiv.org/abs/2309.03409) - 引入使用 LLMs 优化提示的思想:让 LLMs “深呼吸”提高数学问题的表现。
- [AutoPrompt](https://arxiv.org/abs/2010.15980) - 提出了一种基于梯度引导搜索的方法,用于自动创建各种任务的提示。
- [Prefix Tuning](https://arxiv.org/abs/2101.00190) - 是一种轻量级的fine-tuning替代方案为NLG任务添加可训练的连续前缀。
- [Prefix Tuning](https://arxiv.org/abs/2101.00190) - 是一种轻量级的 fine-tuning 替代方案,为 NLG 任务添加可训练的连续前缀。
- [Prompt Tuning](https://arxiv.org/abs/2104.08691) - 提出了一种通过反向传播学习软提示的机制。

@ -1,6 +1,6 @@
# 自我一致性
也许在提示工程中更高级的技术之一是自我一致性。由[Wang等人2022](https://arxiv.org/pdf/2203.11171.pdf)提出自我一致性旨在“替换链式思维提示中使用的天真贪婪解码方法”。其想法是通过少样本CoT采样多个不同的推理路径并使用生成结果选择最一致的答案。这有助于提高CoT提示在涉及算术和常识推理的任务中的性能。
也许在提示工程中更高级的技术之一是自我一致性。由 [Wang等人2022](https://arxiv.org/pdf/2203.11171.pdf) 提出,自我一致性旨在“替换链式思维提示中使用的天真贪婪解码方法”。其想法是通过少样本 CoT 采样多个不同的推理路径,并使用生成结果选择最一致的答案。这有助于提高 CoT 提示在涉及算术和常识推理的任务中的性能。
让我们尝试以下算术推理示例:
@ -14,7 +14,7 @@
35
```
输出是错误的我们如何通过自我一致性来改进这个问题让我们试试。我们将使用Wang等人2022年的少量样本范例表17
输出是错误的!我们如何通过自我一致性来改进这个问题?让我们试试。我们将使用 Wang 等人 2022 年的少量样本范例(表 17
*提示:*
```
@ -47,17 +47,17 @@ Q当我6岁时我的妹妹是我的一半年龄。现在我70岁了
A
```
*输出1*
*输出 1*
```
当我6岁时我的妹妹是我的一半年龄也就是3岁。现在我70岁了所以她是70-3 = 67岁。答案是67。
```
*输出2*
*输出 2*
```
当叙述者6岁时他的妹妹是他年龄的一半也就是3岁。现在叙述者70岁了他的妹妹应该是70-3 = 67岁。答案是67。
```
*输出3*
*输出 3*
```
当我6岁时我的妹妹是我的一半年龄也就是3岁。现在我70岁了所以她是70/2 = 35岁。答案是35。
```

@ -3,6 +3,7 @@
import {Screenshot} from 'components/screenshot'
import COT from '../../img/cot.png'
import ZEROCOT from '../../img/zero-cot.png'
import AUTOCOT from '../../img/auto-cot.png'
## 链式思考CoT提示
@ -11,7 +12,7 @@ import ZEROCOT from '../../img/zero-cot.png'
图片来源:[Wei等人2022](https://arxiv.org/abs/2201.11903)
在[Wei等人2022](https://arxiv.org/abs/2201.11903)中引入的链式思考CoT提示通过中间推理步骤实现了复杂的推理能力。您可以将其与少样本提示相结合以获得更好的结果以便在回答之前进行推理的更复杂的任务。
[Wei等人2022](https://arxiv.org/abs/2201.11903) 中引入的链式思考CoT提示通过中间推理步骤实现了复杂的推理能力。您可以将其与少样本提示相结合以获得更好的结果以便在回答之前进行推理的更复杂的任务。
*提示:*
```
@ -54,13 +55,13 @@ A
请记住,作者声称这是足够大的语言模型才会出现的新兴能力。
## 零样本COT提示
## 零样本 COT 提示
<Screenshot src={ZEROCOT} alt="Zero-shot COT" />
图片来源:[Kojima等人2022](https://arxiv.org/abs/2205.11916)
最近提出的一个新想法是[零样本CoT](https://arxiv.org/abs/2205.11916)Kojima等人2022年它基本上涉及将“让我们逐步思考”添加到原始提示中。让我们尝试一个简单的问题看看模型的表现如何
最近提出的一个新想法是 [零样本CoT](https://arxiv.org/abs/2205.11916) Kojima 等人2022年它基本上涉及将“让我们逐步思考”添加到原始提示中。让我们尝试一个简单的问题看看模型的表现如何
*提示:*
```
@ -89,4 +90,21 @@ A
最后您吃了1个苹果所以您还剩下10个苹果。
```
令人印象深刻的是,这个简单的提示在这个任务中非常有效。这在您没有太多示例可用于提示时特别有用。
令人印象深刻的是,这个简单的提示在这个任务中非常有效。这在您没有太多示例可用于提示时特别有用。
## 自动思维链Auto-CoT
当使用思维链提示时,这个过程需要手工制作有效且多样化的例子。这种手动工作可能会导致次优解决方案。[Zhang et al. 2022](https://arxiv.org/abs/2210.03493) 提出了一种消除人工的方法,即利用 LLMs “让我们一步一步地思考” 提示来生成一个接一个的推理链。这种自动过程仍然可能在生成的链中出现错误。为了减轻错误的影响演示的多样性很重要。这项工作提出了Auto-CoT它对具有多样性的问题进行采样并生成推理链来构建演示。
Auto-CoT 主要由两个阶段组成:
- 阶段1**问题聚类**:将给定问题划分为几个聚类
- 阶段2**演示抽样**:从每组数组中选择一个具有代表性的问题,并使用带有简单启发式的 Zero-Shot-CoT 生成其推理链
简单的启发式方法可以是问题的长度例如60 个 tokens和理由的步骤数例如5 个推理步骤)。这鼓励模型使用简单而准确的演示。
该过程如下图所示:
<Screenshot src={AUTOCOT} alt="AUTOCOT" />
图片来源:[Zhang等人2022](https://arxiv.org/abs/2210.03493)
Auto-CoT 的代码可在这里找到:[Github](https://github.com/amazon-science/auto-cot)。

@ -4,13 +4,13 @@ import { Callout, FileTree } from 'nextra-theme-docs'
import {Screenshot} from 'components/screenshot'
import DSP from '../../img/dsp.jpeg'
[Li等人2023](https://arxiv.org/abs/2302.11520)提出了一种新的提示技术以更好地指导LLM生成所需的摘要。
[Li 等人2023](https://arxiv.org/abs/2302.11520)提出了一种新的提示技术,以更好地指导 LLM 生成所需的摘要。
训练了一个可调节的策略LM来生成刺激/提示。越来越多地使用RL来优化LLM。
训练了一个可调节的策略 LM 来生成刺激/提示。越来越多地使用RL来优化 LLM。
下图显示了方向性刺激提示与标准提示的比较。策略LM可以很小并且可以优化以生成指导黑盒冻结LLM的提示。
下图显示了方向性刺激提示与标准提示的比较。策略 LM 可以很小,并且可以优化以生成指导黑盒冻结 LLM 的提示。
<Screenshot src={DSP} alt="DSP" />
图片来源:[Li等人2023](https://arxiv.org/abs/2302.11520)
图片来源:[Li 等人2023](https://arxiv.org/abs/2302.11520)
完整示例即将推出!

@ -2,6 +2,8 @@
虽然大型语言模型展示了惊人的零样本能力,但在使用零样本设置时,它们在更复杂的任务上仍然表现不佳。少样本提示可以作为一种技术,以启用上下文学习,我们在提示中提供演示以引导模型实现更好的性能。演示作为后续示例的条件,我们希望模型生成响应。
根据 [Touvron et al. 2023](https://arxiv.org/pdf/2302.13971.pdf) 等人的在 2023 年的论文,当模型规模足够大时,小样本提示特性开始出现 [(Kaplan et al., 2020)](https://arxiv.org/abs/2001.08361)。
让我们通过[Brown等人2020年](https://arxiv.org/abs/2005.14165)提出的一个例子来演示少样本提示。在这个例子中,任务是在句子中正确使用一个新词。
*提示:*

@ -5,11 +5,11 @@ import GENKNOW from '../../img/gen-knowledge.png'
<Screenshot src={GENKNOW} alt="GENKNOW" />
图片来源:[Liu等人2022](https://arxiv.org/pdf/2110.08387.pdf)
图片来源:[Liu 等人 2022](https://arxiv.org/pdf/2110.08387.pdf)
LLM继续得到改进其中一种流行的技术是能够融合知识或信息以帮助模型做出更准确的预测。
LLM 继续得到改进,其中一种流行的技术是能够融合知识或信息,以帮助模型做出更准确的预测。
使用类似的思路,模型是否也可以在做出预测之前用于生成知识呢?这就是[Liu等人2022](https://arxiv.org/pdf/2110.08387.pdf)的论文所尝试的——生成知识以作为提示的一部分。特别是,这对于常识推理等任务有多大帮助?
使用类似的思路,模型是否也可以在做出预测之前用于生成知识呢?这就是 [Liu 等人 2022](https://arxiv.org/pdf/2110.08387.pdf) 的论文所尝试的——生成知识以作为提示的一部分。特别是,这对于常识推理等任务有多大帮助?
让我们尝试一个简单的提示:
@ -23,7 +23,7 @@ LLM继续得到改进其中一种流行的技术是能够融合知识或信
是。
```
这种错误揭示了LLM在执行需要更多关于世界的知识的任务时的局限性。我们如何通过生成知识来改进呢
这种错误揭示了 LLM 在执行需要更多关于世界的知识的任务时的局限性。我们如何通过生成知识来改进呢?
首先,我们生成一些“知识”:
@ -58,9 +58,9 @@ LLM继续得到改进其中一种流行的技术是能够融合知识或信
高尔夫球是一项精密的球杆运动,竞争选手(或高尔夫球手)使用许多类型的球杆,用最少的杆数将球打入球场上一系列洞中。目标是以最低的分数完成比赛,该分数是通过将每个洞上所用的杆数相加计算出来的。得分最低的选手赢得比赛。
```
我们使用[Liu等人2022](https://arxiv.org/pdf/2110.08387.pdf)的论文中提供的提示。
我们使用 [Liu等人2022](https://arxiv.org/pdf/2110.08387.pdf) 的论文中提供的提示。
下一步是将知识整合并得出预测。我将问题重新格式化为QA格式以指导答案格式。
下一步是将知识整合并得出预测。我将问题重新格式化为 QA 格式,以指导答案格式。
*提示:*
```
@ -71,7 +71,7 @@ LLM继续得到改进其中一种流行的技术是能够融合知识或信
解释和答案:
```
*答案1置信度非常高*
*答案 1置信度非常高*
```
不是,高尔夫球的目标不是获得比其他人更高的得分。相反,目标是以最少的杆数打完一组洞。总杆数用于确定比赛的获胜者,而不是总得分。
```
@ -84,7 +84,7 @@ LLM继续得到改进其中一种流行的技术是能够融合知识或信
解释和答案:
```
*答案2置信度要低得多*
*答案 2置信度要低得多*
```
是的,高尔夫球的一部分是试图获得比其他人更高的得分。每个选手都试图以最少的杆数打完一组洞。总杆数用于确定比赛的获胜者,而不是总得分。得分最低的选手赢得比赛。
```

@ -4,14 +4,14 @@ import { Callout, FileTree } from 'nextra-theme-docs'
import {Screenshot} from 'components/screenshot'
import PAL from '../../img/pal.png'
[Gao等人2022](https://arxiv.org/abs/2211.10435)提出了一种使用LLMs读取自然语言问题并生成程序作为中间推理步骤的方法。被称为程序辅助语言模型PAL它与思维链提示不同因为它不是使用自由形式文本来获得解决方案而是将解决步骤卸载到类似Python解释器的编程运行时中。
[Gao 等人2022](https://arxiv.org/abs/2211.10435)提出了一种使用 LLMs 读取自然语言问题并生成程序作为中间推理步骤的方法。被称为程序辅助语言模型PAL它与思维链提示不同因为它不是使用自由形式文本来获得解决方案而是将解决步骤卸载到类似 Python 解释器的编程运行时中。
<Screenshot src={PAL} alt="PAL" />
图片来源:[Gao等人2022](https://arxiv.org/abs/2211.10435)
图片来源:[Gao 等人2022](https://arxiv.org/abs/2211.10435)
让我们以LangChain和OpenAI GPT-3为例。我们有兴趣开发一个简单的应用程序它能够解释所提出的问题并利用Python解释器提供答案。
让我们以 LangChain OpenAI GPT-3 为例。我们有兴趣开发一个简单的应用程序,它能够解释所提出的问题,并利用 Python 解释器提供答案。
具体来说我们有兴趣创建一个功能允许使用LLM回答需要日期理解的问题。我们将为LLM提供一个提示其中包括一些示例这些示例是从[这里](https://github.com/reasoning-machines/pal/blob/main/pal/prompt/date_understanding_prompt.py)采用的。
具体来说,我们有兴趣创建一个功能,允许使用 LLM 回答需要日期理解的问题。我们将为 LLM 提供一个提示,其中包括一些示例,这些示例是从[这里](https://github.com/reasoning-machines/pal/blob/main/pal/prompt/date_understanding_prompt.py)采用的。
这是我们需要导入的包:
@ -97,6 +97,18 @@ llm_out = llm(DATE_UNDERSTANDING_PROMPT.format(question=question))
print(llm_out)
```
这将输出以下内容:
```
# If today is 27 February 2023 and I was born exactly 25 years ago, then I was born 25 years before.
today = datetime(2023, 2, 27)
# I was born 25 years before,
born = today - relativedelta(years=25)
# The answer formatted with %m/%d/%Y is
born.strftime('%m/%d/%Y')
```
`llm_out` 是一段 `python` 代码,我们可以使用 `exec` 执行它:
```python
exec(llm_out)
print(born)

@ -7,21 +7,21 @@ import PC1 from '../../img/prompt_chaining/prompt-chaining-1.png'
为了提高大语言模型的性能使其更可靠,一个重要的提示工程技术是将任务分解为许多子任务。 确定子任务后,将子任务的提示词提供给语言模型,得到的结果作为新的提示词的一部分。 这就是所谓的链式提示prompt chaining一个任务被分解为多个子任务根据子任务创建一系列提示操作。
链式提示可以完成很复杂的任务。LLM可能无法仅用一个非常详细的提示完成这些任务。在链式提示中提示链对生成的回应执行转换或其他处理直到达到期望结果。
链式提示可以完成很复杂的任务。LLM 可能无法仅用一个非常详细的提示完成这些任务。在链式提示中,提示链对生成的回应执行转换或其他处理,直到达到期望结果。
除了提高性能链式提示还有助于提高LLM应用的透明度增加控制性和可靠性。这意味着您可以更容易地定位模型中的问题分析并改进需要提高的不同阶段的性能。
除了提高性能,链式提示还有助于提高 LLM 应用的透明度,增加控制性和可靠性。这意味着您可以更容易地定位模型中的问题,分析并改进需要提高的不同阶段的性能。
链式提示在构建LLM驱动的对话助手和提高应用程序的个性化用户体验方面非常有用。
链式提示在构建 LLM 驱动的对话助手和提高应用程序的个性化用户体验方面非常有用。
## 链式提示使用示例
### 文档问答中的链式提示
提示链可以用于不同的场景这些场景可能涉及多个操作或转换。例如LLM的一个常见用途是根据大型文本文档回答问题。想要更好阅读大文本文档可以设计两个不同的提示第一个提示负责提取相关引文以回答问题第二个提示则以引文和原始文档为输入来回答给定的问题。换句话说可以创建两个不同的提示来执行根据文档回答问题的任务。
提示链可以用于不同的场景这些场景可能涉及多个操作或转换。例如LLM 的一个常见用途是根据大型文本文档回答问题。想要更好阅读大文本文档,可以设计两个不同的提示,第一个提示负责提取相关引文以回答问题,第二个提示则以引文和原始文档为输入来回答给定的问题。换句话说,可以创建两个不同的提示来执行根据文档回答问题的任务。
下面的第一个提示根据问题从文档中提取相关引文。请注意,为了简化,我们为文档添加了一个占位符`{{文档}}`。要测试此提示,您可以从维基百科复制并粘贴一篇文章,例如这个关于[提示工程](https://zh.wikipedia.org/wiki/提示工程)的页面。由于此任务使用了较长的上下文我们使用了OpenAI的`gpt-4-1106-preview`模型。您也可以将此提示与其他长上下文LLM如Claude一起使用。
下面的第一个提示根据问题从文档中提取相关引文。请注意,为了简化,我们为文档添加了一个占位符`{{文档}}`。要测试此提示,您可以从维基百科复制并粘贴一篇文章,例如这个关于[提示工程](https://zh.wikipedia.org/wiki/提示工程)的页面。由于此任务使用了较长的上下文,我们使用了 OpenAI `gpt-4-1106-preview` 模型。您也可以将此提示与其他长上下文 LLM Claude一起使用。
提示1:
提示 1:
```
你是一个很有帮助的助手。你的任务是根据文档回答问题。第一步是从文档中提取与问题相关的引文,由####分隔。请使用<quotes></quotes>输出引文列表。如果没有找到相关引文,请回应“未找到相关引文!”。
@ -30,11 +30,11 @@ import PC1 from '../../img/prompt_chaining/prompt-chaining-1.png'
####
```
这是整个提示的截图,包括通过`user`角色传递的问题。
这是整个提示的截图,包括通过 `user` 角色传递的问题。
<Screenshot src={PC1} alt="Prompt Chaining Part 1" />
提示1的输出
提示 1 的输出:
```
<quotes>
- Chain-of-thought (CoT) prompting[27]
@ -54,7 +54,7 @@ import PC1 from '../../img/prompt_chaining/prompt-chaining-1.png'
在第一个提示中返回的引文现在可以用作下面第二个提示的输入。您可以对这些引文进行清理,比如移除引用标志。可以在提示链中新建另一个提示来移除或使用这些引用标志,但现在您可以忽略这些。然后,第二个提示接收由第一个提示提取的相关引文,并根据文档和这些提取的引文生成一个有帮助的回答。第二个提示可以是以下内容:
提示2
提示 2
```
根据从文档中提取的相关引文(由<quotes></quotes>分隔)和原始文档(由####分隔),请构建对问题的回答。请确保答案准确、语气友好且有帮助。
@ -78,7 +78,7 @@ import PC1 from '../../img/prompt_chaining/prompt-chaining-1.png'
</quotes>
```
提示2的输出
提示 2 的输出:
```
文档中提到的提示技术包括:
@ -100,4 +100,4 @@ import PC1 from '../../img/prompt_chaining/prompt-chaining-1.png'
如您所见,简化并创建提示链是一种有用的提示方法,其中响应需要经过多个操作或转换。作为练习,您可以自由设计一个提示,它会在将响应作为最终回应发送给应用程序用户之前,移除响应中的引用标志(例如,`[27]`)。
您还可以在这份[文档](https://docs.anthropic.com/claude/docs/prompt-chaining)中找到更多关于提示链的示例这些示例利用了Claude LLM。我们的示例灵感来源于他们并采用了他们的示例。
您还可以在这份[文档](https://docs.anthropic.com/claude/docs/prompt-chaining)中找到更多关于提示链的示例,这些示例利用了 Claude LLM。我们的示例灵感来源于他们并采用了他们的示例。

@ -6,7 +6,7 @@ import REACT from '../../img/react.png'
import REACT1 from '../../img/react/table1.png'
import REACT2 from '../../img/react/alfworld.png'
从 [Yao等人2022](https://arxiv.org/abs/2210.03629) 引入了一个框架,其中 LLMs 以交错的方式生成 *推理轨迹* 和 *任务特定操作* 。
从 [Yao 等人2022](https://arxiv.org/abs/2210.03629) 引入了一个框架,其中 LLMs 以交错的方式生成 *推理轨迹* 和 *任务特定操作* 。
生成推理轨迹使模型能够诱导、跟踪和更新操作计划,甚至处理异常情况。操作步骤允许与外部源(如知识库或环境)进行交互并且收集信息。
@ -18,7 +18,7 @@ ReAct 框架允许 LLMs 与外部工具交互来获取额外信息,从而给
ReAct 的灵感来自于 “行为” 和 “推理” 之间的协同作用,正是这种协同作用使得人类能够学习新任务并做出决策或推理。
链式思考 (CoT) 提示显示了 LLMs 执行推理轨迹以生成涉及算术和常识推理的问题的答案的能力,以及其他任务 [(Wei等人2022)](https://arxiv.org/abs/2201.11903)。但它因缺乏和外部世界的接触或无法更新自己的知识,而导致事实幻觉和错误传播等问题。
链式思考 (CoT) 提示显示了 LLMs 执行推理轨迹以生成涉及算术和常识推理的问题的答案的能力,以及其他任务 [(Wei 等人2022)](https://arxiv.org/abs/2201.11903)。但它因缺乏和外部世界的接触或无法更新自己的知识,而导致事实幻觉和错误传播等问题。
ReAct 是一个将推理和行为与 LLMs 相结合通用的范例。ReAct 提示 LLMs 为任务生成口头推理轨迹和操作。这使得系统执行动态推理来创建、维护和调整操作计划,同时还支持与外部环境(例如Wikipedia)的交互,以将额外信息合并到推理中。下图展示了 ReAct 的一个示例以及执行问题回答所涉及的不同步骤。

@ -1,36 +1,36 @@
# 自我反思Reflexion
自我反思是一个通过语言反馈来强化基于语言的智能体的框架。根据[Shinn et al. (2023)](https://arxiv.org/pdf/2303.11366.pdf)“自我反思是一种口头强化的新范例它将策略参数化为智能体的记忆编码与LLM的参数选择配对。”
自我反思是一个通过语言反馈来强化基于语言的智能体的框架。根据 [Shinn et al. (2023)](https://arxiv.org/pdf/2303.11366.pdf),“自我反思是一种‘口头’强化的新范例,它将策略参数化为智能体的记忆编码与 LLM 的参数选择配对。”
在高层次上,自我反思将来自环境的反馈(自由形式的语言或者标量)转换为语言反馈,也被称作**self-reflection**为下一轮中LLM智能体提供上下文。这有助于智能体快速有效地从之前的错误中学习进而提升许多高级任务的性能。
在高层次上,自我反思将来自环境的反馈(自由形式的语言或者标量)转换为语言反馈,也被称作 **self-reflection**,为下一轮中 LLM 智能体提供上下文。这有助于智能体快速有效地从之前的错误中学习,进而提升许多高级任务的性能。
!["自我反思框架"](../../img/research/reflexion.png)
如上图所示,自我反思由三个不同的模型组成:
- **参与者Actor**:根据状态观测量生成文本和动作。参与者在环境中采取行动并接受观察结果,从而形成轨迹。[链式思考CoT](https://www.promptingguide.ai/techniques/cot)和[ReAct](https://www.promptingguide.ai/techniques/react)被用作参与者模型。此外,还添加了记忆组件为智能体提供额外的上下文信息。
- **参与者Actor**:根据状态观测量生成文本和动作。参与者在环境中采取行动并接受观察结果,从而形成轨迹。[链式思考CoT](https://www.promptingguide.ai/techniques/cot) [ReAct](https://www.promptingguide.ai/techniques/react) 被用作参与者模型。此外,还添加了记忆组件为智能体提供额外的上下文信息。
- **评估者Evaluator**对参与者的输出进行评价。具体来说它将生成的轨迹也被称作短期记忆作为输入并输出奖励分数。根据人物的不同使用不同的奖励函数决策任务使用LLM和基于规则的启发式奖励
- **自我反思Self-Reflection**:生成语言强化线索来帮助参与者实现自我完善。这个角色由大语言模型承担,能够为未来的试验提供宝贵的反馈。自我反思模型利用奖励信号、当前轨迹和其持久记忆生成具体且相关的反馈,并存储在记忆组件中。智能体利用这些经验(存储在长期记忆中)来快速改进决策。
总的来说自我反思的关键步骤是a)定义任务b)生成轨迹c)评估d)执行自我反思e)生成下一条轨迹。下图展示了自我反思的智能体学习迭代优化其行为来解决决策、编程和推理等各种人物的例子。自我反思Refelxion通过引入自我评估、自我反思和记忆组件来拓展ReAct框架。
总的来说自我反思的关键步骤是a)定义任务b)生成轨迹c)评估d)执行自我反思e)生成下一条轨迹。下图展示了自我反思的智能体学习迭代优化其行为来解决决策、编程和推理等各种人物的例子。自我反思Refelxion通过引入自我评估、自我反思和记忆组件来拓展 ReAct 框架。
!["Reflexion示例"](../../img/research/reflexion-examples.png)
!["Reflexion 示例"](../../img/research/reflexion-examples.png)
## 结果
实验结果表明自我反思能够显著提高AlfWorld上的决策任务、HotPotQA中的问题推理以及在HumanEval上的Python编程任务性能。
实验结果表明,自我反思能够显著提高 AlfWorld 上的决策任务、HotPotQA 中的问题推理以及在 HumanEval 上的 Python 编程任务性能。
在序列决策(AlfWorld)任务上进行评估时ReAct + Reflexion用启发式和 GPT 的自我评估进行二元分类,完成了 130/134 项任务,显着优于 ReAct。
在序列决策 (AlfWorld) 任务上进行评估时ReAct + Reflexion 用启发式和 GPT 的自我评估进行二元分类,完成了 130/134 项任务,显着优于 ReAct。
!["Reflexion ALFWorld结果"](../../img/research/reflexion-alfworld.png)
!["Reflexion ALFWorld 结果"](../../img/research/reflexion-alfworld.png)
在仅仅几个学习步骤中自我反思显著优于所有基线方法。仅对于推理以及添加由最近轨迹组成的情景记忆时Reflexion + CoT的性能分别优于仅 CoT 和具有情景记忆的 CoT。
在仅仅几个学习步骤中自我反思显著优于所有基线方法。仅对于推理以及添加由最近轨迹组成的情景记忆时Reflexion + CoT 的性能分别优于仅 CoT 和具有情景记忆的 CoT。
!["Reflexion HotpotQA结果"](../../img/research/reflexion-hotpotqa.png)
!["Reflexion HotpotQA 结果"](../../img/research/reflexion-hotpotqa.png)
如下表所示在MBPP、HumanEval和 Leetcode Hard上编写Python和Rust代码时Reflexion通常优于之前的SOTA方法。
如下表所示,在 MBPP、HumanEval 和 Leetcode Hard 上编写 Python Rust 代码时Reflexion 通常优于之前的 SOTA 方法。
!["Reflexion编程结果"](../../img/research/reflexion-programming.png)
!["Reflexion 编程结果"](../../img/research/reflexion-programming.png)
## 何时自我反思?
@ -46,14 +46,14 @@
自我反思在以下任务中是有效的:
- **序列决策**自我反思提高了智能体在AlfWorld任务中的表现涉及在各种环境中导航并完成多步目标。
- **推理**自我反思提高了HotPotQA上智能体的性能HotPotQA是一个需要对多个文档进行推理的问答数据集。
- **编程**自我反思的智能体在HumanEval和MBPP等基准测试上编写出了更好的代码在某些情况下实现SOTA结果。
- **序列决策**:自我反思提高了智能体在 AlfWorld 任务中的表现,涉及在各种环境中导航并完成多步目标。
- **推理**:自我反思提高了 HotPotQA 上智能体的性能HotPotQA 是一个需要对多个文档进行推理的问答数据集。
- **编程**:自我反思的智能体在 HumanEval MBPP 等基准测试上编写出了更好的代码,在某些情况下实现 SOTA 结果。
以下是自我反思的一些限制:
- **依赖自我评估能力**:反思依赖于智能体准确评估其表现并产生有用反思的能力。这可能是具有挑战性的,尤其是对于复杂的任务,但随着模型功能的不断改进,预计自我反思会随着时间的推移而变得更好。
- **长期记忆限制**自我反思使用最大容量的滑动窗口但对于更复杂的任务使用向量嵌入或SQL数据库等高级结构可能会更有利。
- **长期记忆限制**:自我反思使用最大容量的滑动窗口,但对于更复杂的任务,使用向量嵌入或 SQL 数据库等高级结构可能会更有利。
- **代码生成限制**:测试驱动开发在指定准确的输入输出映射方面存在限制(例如,受硬件影响的非确定性生成器函数和函数输出)。
---

Loading…
Cancel
Save