解锁AI语言模型的秘密武器 - 提示工程

文章目录

  • 一、LLM概念
    • 1.1 什么是LLMs
    • 1.2 LLMs类别
    • 1.3 如何构建LLM
  • 二、提示工程简介
    • 2.1 基础提示
    • 2.2 使用提示词的必要性
  • 三、 提示
    • 3.1 如何写好提示词
      • 3.1.1 使用分隔符
      • 3.1.2 结构化输出
      • 3.1.3 风格信息
      • 3.1.4 给定条件
      • 3.1.5 给出示例
      • 3.1.6 步骤分解
      • 3.1.7 不断迭代
    • 3.2 提示工程
      • 3.2.1 使用角色
      • 3.2.2 使用示例
      • 3.2.3 思维链
      • 3.2.4 zero shot chain
    • 3.3 提示的组成部分
  • 四、 实际应用案例
    • 4.1 编程助手
    • 4.2 写邮件
    • 4.3 学习伙伴
  • 五、大模型的局限性
  • 六、 大模型参数设置

想让你的AI变成聊天高手?掌握提示工程,让你的AI不仅仅是个回答机器,而是你智能的生活小助手! ‍

首先,你得知道什么是LLMs(大型语言模型),它们是怎么构建的,以及为什么我们需要提示工程。然后,你会学到如何用分隔符来区分数据和提示,怎样要求结构化输出(比如JSON, XML, HTML等),以及如何通过包含风格信息来调整输出的语调。

不仅如此,你还会学到如何写出好的提示,比如角色提示、少量示例提示、思考链提示,甚至是零示例思考链和由少到多的提示。这些技巧就像是给AI的思维加上了翅膀,让它们飞得更高、更远。

最后,不要忘了调整那些神秘的LLM设置,比如温度和Top P,还有其他超参数。这就像是调整你的AI食谱,让它做出最美味的数据大餐。

一、LLM概念

LLM全称是“Large Language Model”,大语言模型。它通过大量的文本数据训练,理解输入,处理语言相关任务,如回答问题、进行对话、总结文本、翻译语言等。

1.1 什么是LLMs

LLM是为了理解生成人类语言而设计的人工智能模型。这些模型通常基于深度学习框架(如Transformer)训练。

LLM可以处理多种NLP任务。如机器翻译、情感分析、摘要等。可以根据给定的输入生成连贯文本,在聊天机器人、问答系统、内容生成领域应用广泛。

例如OpenAI的GPT就是一个LLM,可以通过最小的微调执行各种语言任务。

1.2 LLMs类别

LLMs可以分为两类,基础LLM(Base LLM),指令调整LLM(Instruciton tuned LLM)

  • 基础LLM

基础LLM是根据当前文本预测下一词,它不是用来回答问题、对话、解决问题的。

例如你输入

在这篇关于LLMs的文中,我们将讨论

LLM可能会完成这个句子

在这篇关于LLMs的文中,我们将讨论LLMs是什么,它们是如何工作的,以及如何在应用程序中使用他们…

基础LLM可以提供相关文本,但不会回答问题。

  • 指令调整LLM

与基础LLM相反,指令调整LLM不会尝试补全文本,而是根据训练数据尝试完成指令内容,例如回答问题。

例如输入

LLM是什么?

它将根据训练数据给出答案。

指令调整LLM建立在基础LLM之上。

指令调整LLM = 基础LLM + 微调 + RLHF(人类反馈强化学习)

构建指令调整LLM,首先需要基础LLM,然后使用数据微调,数据集中包含了指令以及指令对应的反馈结果。然后使用RLHF(Reinforcement Learning with Human Feedback)技术微调,这一技术可以从人类反馈中不断学习,随着时间推移不断优化其性能。

1.3 如何构建LLM

训练LLM包含三个步骤:数据收集、训练、评估

  • 数据收集

数据来源可以是网站、博客、书籍、新闻、百科等。

  • 训练

训练需要很长时间以及很大的算力。

  • 评估

看输出的模型在回答、摘要、翻译等任务上的表现。

二、提示工程简介

提示工程是为模型提供“提示”或指令,以执行你希望其执行的任务的过程。

例如将一段文本翻译成法语,可以这样写提示词:

Translate the text delimited by triple quotes from English to french: 

"""Hello, how are you?"""

(将三引号内的文本从英文翻译成法语。)

也可以以简洁的方式这样写:

Translate the following to French:

Hello, how are you?

(将下面的内容翻译成法语)

模型将生成对应的输出:

Bonjour, comment allez-vous?

但最好是明确使用分隔符将提示内容与说明分开。

2.1 基础提示

指示模型执行任务所需的只是提示。提示是你提供给模型以执行任务的一段文本。例如:

这里是文章内容..........
.......................

为我总结上面的文章内容。

或者只是一条生成新文本的指令

为我写一段关于提示工程的简介。

但是只使用纯文本作为指令并不能充分利用LLM的能力。为了充分挖掘LLM的能力,就涉及到了提示工程。

2.2 使用提示词的必要性

提示的需求源于其在引导AI模型行为、提高文本质量和相关性、引出特定输出、对齐AI和人类意图以及减少生成内容中的不准确性和模糊性方面的作用。通过理解和掌握提示的艺术,用户可以释放AI语言模型的真正潜力。

三、 提示

前面说明了什么时提示,以及提示的重要性。本节介绍常见的提示技巧。

3.1 如何写好提示词

3.1.1 使用分隔符

使用分隔符来标记提示和数据之间的边界。

  • 选择适当的分隔符

    可以使用三重大括号{{{ }}}或特殊标记(如 <|data|> )作为分隔符。

  • 正确放置分隔符

    将分隔符放置在数据部分的开头和结尾,同时确保与提示清晰分开。提示部分应位于分隔符之前,为模型提供必要的说明或上下文。

  • 始终使用一致的分隔符

示例

总结三花括号内的文本。

{{{这里是你的文本}}}

3.1.2 结构化输出

有时我们需要结构化输出结果,如JSON、XML、HTML等,这对于处理数据、网页抓取、内容生成很有帮助。

该如何请求结构化输出呢?

  • 指定输出格式

  • 定义结构和字段

    概述所需输出的结构并指定所需字段。这有助于指导模型生成符合所需结构的响应。可以提供示例或模板来说明预期的格式。

  • 提供输入上下文

示例

帮助我从标签中包含的文本中生成一个JSON对象,其中包含键' product '(产品名称),' isPositive '(布尔值),' summary '(评论的一句话摘要)。

令人遗憾的是,“XYZ ProTech 2000”产品甚至没有达到最基本的期望。从它平淡无奇的构建质量和令人困惑的用户界面到它糟糕的性能和令人失望的客户支持,这个产品让我非常不满意。如果您正在考虑购买“XYZ ProTech 2000”,我强烈建议您探索提供卓越质量和可靠性的替代选项。

输出结果:

{
  "product": "XYZ ProTech 2000",
  "isPositive": false,
  "summary": "Failed to meet expectations due to lackluster build quality, confusing user interface, abysmal performance, and disappointing customer support."
}

3.1.3 风格信息

通过提供有关所需语气的明确说明,可以影响语言模型的写作风格并确保其符合您的特定要求。

在提示中清楚地传达所需的语气、风格或情绪。无论是正式的、休闲的、幽默的、专业的还是任何其他特定的风格,明确提及它都有助于指导模特的写作。另外,请考虑合并反映所需风格的关键字或短语。例如,如果您想要正式的语气,请添加**“以专业方式”或“使用正式语言”**等短语。这为模型提供了有关您期望的语气的附加上下文。

示例

写一封正式的电子邮件来拒绝工作邀请。

3.1.4 给定条件

给出条件,然后要求模型遵循这些条件,有助于引导模型对特定行为或结果做出反应。

示例

您将获得由三引号分隔的文本。
如果它包含一个指令序列,则\
将这些说明改写为以下格式:

步骤1 -…
步骤2 -…
…
步骤N -…

如果文本不包含指令序列,则\
然后只需写上“没有提供步骤。


"""在这里插入你的食谱文本"""

3.1.5 给出示例

向模型提供示例,然后要求它继续该行为。

示例:

仔细阅读示例并将其作为回答的基础。

输入:香蕉
输出:水果

输入:苹果
输出:水果

输入:胡萝卜
输出:蔬菜

根据提供的示例,为以下输入生成适当的回答:

萝卜
橙子
梨
土豆
黄瓜
芹菜
西兰花
花椰菜

输出:

萝卜:蔬菜
橙子:水果
梨:水果
土豆:蔬菜
黄瓜:蔬菜
芹菜:蔬菜
西兰花:蔬菜
花椰菜:蔬菜

3.1.6 步骤分解

有时直接向模型询问某些内容可能不会产生最佳输出。这时可以分解这些步骤。
下面展示一个示例,提取故事中出现的名词和数量。有两种方式,一种是直接问,还有一种是步骤分解。

示例:

# 直接法

给我一个JSON对象,带有以下键:`nouns_count`(出现在故事中的名词数量)和`nouns_french`(法语名词数组)。故事以"""隔开。

"""In a charming village, siblings Jack and Jill set out on a quest to fetch water from a hilltop well. As they climbed, singing joyfully, misfortune struck—Jack tripped on a stone and tumbled down the hill, with Jill following suit. Though slightly battered, the pair returned home to comforting embraces. Despite the mishap, their adventurous spirits remained undimmed, and they continued exploring with delight."""

输出

{
  "nouns_count": 10,
  "nouns_french": [
    "village",
    "siblings",
    "Jack",
    "Jill",
    "quest",
    "water",
    "hilltop",
    "well",
    "stone",
    "hill"
  ]
}

可以看到输出不是法语。

#步骤分解法

对以"""分隔的故事执行以下步骤。

步骤1 翻译成法语
步骤2 列出译文中的每个名词。
步骤3 输出JSON对象,包含'nouns_count'法语故事中的名词数量和'nouns_french',即翻译中出现的名词数组。

只输出JSON,我对其余步骤不感兴趣。

"""In a charming village, siblings Jack and Jill set out on a quest to fetch water from a hilltop well. As they climbed, singing joyfully, misfortune struck—Jack tripped on a stone and tumbled down the hill, with Jill following suit. Though slightly battered, the pair returned home to comforting embraces. Despite the mishap, their adventurous spirits remained undimmed, and they continued exploring with delight."""

输出

{
  "nouns_count": 10,
  "nouns_french": [
    "village",
    "frères",
    "Jack",
    "Jill",
    "quête",
    "eau",
    "sommet de la colline",
    "bien",
    "pierre",
    "colline"
  ]
}

3.1.7 不断迭代

不要将写提示词视为一个一劳永逸的过程。应该不断的迭代,直到达到准确、一致结果。

3.2 提示工程

3.2.1 使用角色

角色提示是提示工程中使用的一种技术,旨在鼓励人工智能通过假设特定的角色、角色或观点来处理问题。根据给定的角色,这种策略可以带来更加专注、创造性或同理心的反应。

  • 确定处理任务的角色
  • 提供上下文,描述场景,介绍角色。
  • 提出问题或任务。

示例:

作为一名气候科学家,您将如何解决森林砍伐问题以尽量减少其对环境的影响?

3.2.2 使用示例

新的相关输入之前,可以先用少量的示例演示输入、输出。

  • 示例数量:2-10 个示例(但可能会有所不同),具体取决于任务的清晰度和复杂性。
  • 上下文和相关性:示例应与所需任务相关,并为塑造模型的输出提供充分的基础。
  • 平衡:力求在示例太少(规格不足)和示例过多(重复和规格过高)之间取得平衡。

3.2.3 思维链

这种方法将复杂的主题或问题分解为更小的、可管理的部分。假设我们希望模型分析在家工作的优点和缺点。我们可以通过一系列相互关联的提示来探讨这个主题。

“列出人们可能更喜欢在家工作的三个原因。”
“对于您提到的每个原因,请解释对个人和/或组织的好处和积极影响。”
“现在,考虑一下在家工作的挑战。确定三个潜在的缺点或负面影响。”
“对于每一个挑战,讨论个人和组织如何减轻或解决这些挑战。”

3.2.4 zero shot chain

  • 首先定义一个明确的初始问题或问题,将其作为链的起点。
  • 设计一个提示,不仅要求模型提供最初问题的答案,还要求模型逐步解释其推理。
  • 鼓励模型在其响应中明确考虑中间步骤、可能的替代方案或想法之间的联系。

示例:

请解释一下太阳能电池板的工作过程,从阳光照射到电池板表面开始,到产生电能结束。将你的回答组织成一个循序渐进的思维链,注意清楚每一步是如何通向下一步的。

3.3 提示的组成部分

  • 上下文
  • 说明/指令
  • 示例

四、 实际应用案例

LLM可以应用在

  • 自然语言处理
  • 信息检索
  • 问答
  • 文本生成
  • 文本摘要
  • 学习工具
  • 聊天机器人

4.1 编程助手

  • 代码生成
扮演一个初级python程序员。请编写代码,从3个数组生成madlib,每个数组6个项:介词,动词和名词,其中名词也用作直接对象。写完之后,执行代码。
  • 注释和重新格式化代码
请在Python代码中添加行注释并重新格式化以提高可读性:

import math
amplitude = 30
frequency = 2
num_points = 50
for i in range(num_points):
    y = int(round(amplitude * math.sin(2 * math.pi * frequency * i / num_points)))
    print(' ' * (amplitude + y) + '*')

  • 调试
请调试下面的python代码:  

pizza_cost = 100
partygoers = 10
while partygoers = 0:
    cost_per_person = pizza_cost / partygoers
    print("the cost per person is $", "{:.2f}".format(cost_per_person))
    partygoers -= 2
  • 优化代码
扮演非常资深的python开发人员。请优化这个脚本:

for num in range(1, 101):
    if num  1:
        for i in range(2, num):
            if (num % i) == 0:
                break
        else:
            print(num)
  • 编程语言之间的翻译
扮演一个既懂COBOL又懂Python的有经验的开发人员。请将这个COBOL程序转换为Python:

IDENTIFICATION DIVISION.
PROGRAM-ID.  CALCULATE-SS-TAX.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 SALARY PIC 9(7)V99.
01 SS-TAX PIC 9(7)V99.

PROCEDURE DIVISION.
DISPLAY "Enter employee's salary: ".
ACCEPT SALARY.

COMPUTE SS-TAX = SALARY * 0.062.

DISPLAY "Social Security tax is: $", SS-TAX.
STOP RUN.

4.2 写邮件

写一封电子邮件,通知客户他们的询价已经收到,并将很快得到答复。在电子邮件中包括订单号和客户姓名。

4.3 学习伙伴

  • 术语解释

    可以让LLM解释论文阅读中的术语。

  • 自测

    如,让LLM生成5个计算题。

其他的还有推理、聊天机器人等。这里不再举例说明。

五、大模型的局限性

  1. 无法完全理解提示的意图,生成通用响应。为了缓解这种情况,需要使提示更加明确或要求模型在提供最终答案之前逐步思考。
  2. 对提示措辞的敏感性,这可能会导致完全不同或不一致的回答。确保提示措辞恰当且清晰,以最大程度地减少混乱。
  3. 模型生成看似合理但不正确的答案。解决这个问题的一种方法是为模型添加一个步骤来验证其响应的准确性,或者提示模型提供给定信息的证据或来源。
  4. 冗长或过于技术性的回复。为了避免这种情况,请通过使提示更具体、要求更简单的响应或请求特定格式来明确指导模型。
  5. 当面临模棱两可的提示时,LLMs可能会尝试回答而不要求澄清。为了鼓励模型寻求澄清,可以在提示前面加上“如果问题不清楚,请要求澄清”。
  6. 模型无法执行多部分任务。为了避免这种情况,请考虑将任务分解为更小、更易于管理的子任务,或者确保在提示中清楚地标识任务的每个部分。
  7. LLMs大多数情况无法正确引用来源,因为他们无法访问网络。使用搜索增强LLMs
  8. 数学能力不及格
  9. 用户输入不规范。构建内容过滤器和精心设计的提示模板等安全机制,以防止模型生成有害或不需要的输出。

六、 大模型参数设置

LLM参数设置在提示工程中起着至关重要的作用,因为它们直接影响语言模型的行为和输出。在本节中,我们将讨论设计提示时需要考虑的一些重要的 LLM 设置。

  1. temperature

温度是一个超参数,控制语言模型生成的输出的随机性。较高的温度会产生更加多样化和创造性的反应,而较低的温度会产生更加集中和确定性的反应。

  1. Max Tokens

最大标记决定模型生成的输出的长度。通过控制响应中标记的数量,可以影响语言模型的详细程度。

  1. Top-K

Top-K 采样是一种限制语言模型可以考虑的预测单词数量的方法。通过指定较小的K值,可以限制输出的重点,防止模型生成不相关的信息。一般top-k和temperature设置一个就行了。


【参考】

  • https://roadmap.sh/prompt-engineering
  • Chat-GPT4

你可能感兴趣的:(AIGC,人工智能,语言模型,自然语言处理)