【大模型应用实战】 Prompt Engineering【01 基本原则】

简介: > 本文主要观点来自 [ChatGPT Prompt Engineering 吴恩达 Prompt](https://learn.deeplearning.ai/)在学习本课程之前,我一直认为 prompt engineering 只不过是大模型发展不够完善而出现的过渡态,但随着学习的深入,我的观点发生了改变.prompt enginnering 之于大模型,就如同沟通技巧之于人类. 更好的
本文主要观点来自 ChatGPT Prompt Engineering 吴恩达 Prompt

在学习本课程之前,我一直认为 prompt engineering 只不过是大模型发展不够完善而出现的过渡态,但随着学习的深入,我的观点发生了改变.
prompt enginnering 之于大模型,就如同沟通技巧之于人类. 更好的交流技巧往往能更高效精确的传达信息,而 prompt enginnering 则能让大模型更好的理解我们的意图.

本文分为三篇:
【大模型】 Prompt Engineering 01
【大模型】 Prompt Engineering 02
【大模型】 Prompt Engineering 03

1. 什么是 Prompt Engineering

大语言模型(LLM)在语料库上训练之后,并不能达到如 ChatGPT 那般令人惊艳的效果。因为本质上 LLM 的能力就是给定一段文字,进行续写。

  • Base LLM: 基于大量数据训练的模型.
    当我们提问: "如何画一个圆?"
    模型会回答:
    如何画一个圆

但是在实际应用中,我们需要的是给定一个问题,生成一个答案。这就需要我们对 LLM 进行 Prompt Tuneing,即通过一些技巧,让 LLM 在给定 prompt 的情况下,生成我们想要的答案。

  • Instruction Tuned LLM: 通过 Prompt Engineering 之后的模型.

举个例子:
在我们提问前,我们可以通过 prompt 来指导模型生成特定的文本.如:
提示

这时当我们提问: "如何画一个圆?"
模型就会在我们圈定的范围内给出合乎我们预期的答案.
如何画一个圆

ChatGPT 用到了 RLHF (Reinforcement learning with human feedback) 的技术。

注 1:最早把强化学习引入语言模型中的,是 OpenAI 在 2019 年的一篇工作:Fine-Tuning Language Models from Human Preferences
注 2:RLHF 并不能有效提升模型的跑分,在小模型上性能甚至会有比较大的下降(随着参数增多,RLHF 微调会稍微增强性能),但是可以让它“显得”更智能

InstructGPT (arxiv.org) 中详细介绍了 RLHF:
RLHF

整个过程可以分成三步:

  1. 通过人工写回答,收集了一个 prompt-response 数据集,用它对 GPT3 作微调,教会它如何产生人类想要的回答,得到的模型记作 fine-tuned GPT3。
  2. 利用 fine-tuned GPT3 对某个 prompt 产生多个回答,并人工对它们按照好坏进行排序,可以称作 ranking 数据集。借助这些数据,训练一个 reward model,用来评估 response 的好坏,训练目标是尽量接近于人工排序。
  3. 利用强化学习 PPO 算法,对 fine-tuned GPT3 进行优化。用强化学习中的术语来说, fine-tuned GPT3 就是 agent;Reward model 就是 environment,为 agent 的回答提供反馈。Agent 利用这个反馈优化自身参数,继续与环境交互,从而迭代优化。
Note:相比于第二步中的 ranking 数据集,第一步中 prompt-response 数据集的收集代价更为昂贵(排序比自己写答案要简单太多了)。其实如果 prompt-response 数据集足够大,可以只用它在 GPT3 上做微调,而不需要强化学习。
Note:1.3B(13 亿)参数量的 InstructGPT 产生的回答,效果要好于 175B 的 GPT-3

2.Prompt 的编写原则

2.1 环境安装

本课程为实践课程,当然需要配置环境啦.
既然是学习,咱们就一切从简,直接在在本地搭建环境

但是你也可以使用 Google Colab,它不需要配置环境,直接上手.

注:因为在访问 openai API 本来就需要科学上网,所这里我默认你已经具备了对应的网络条件.
  1. 安装 python (推荐使用 anaconda )
  2. 安装依赖
pip install openai
pip install python-dotenv
  1. 新建一个文件夹,在文件夹里创建 .env 文件,并在其中添加你的 openai API key
OPENAI_API_KEY='sk-XXXXX'
  1. 创建一个 python 文件,并在其中添加如下代码
import openai
import os
from dotenv import load_dotenv,find_dotenv

_ = load_dotenv(find_dotenv()) # read local .env file

openai.api_key = os.getenv("OPENAI_API_KEY")

def get_completion(prompt, model = "gpt-3.5-turbo"):
  messages = [{"role":"user","content":prompt}]
  response = openai.ChatCompletion.create(
    model=model,
    messages=messages,
    temperature=0,
  )
  return response.choices[0].message["content"]

2.2 编写原则

我们先来介绍几个基本的编写 prompt 的原则

2.2.1 编写清晰、具体的指令

策略 1: 使用分隔符清晰地表示输入的不同部分
我们可以用任何明显的分隔符来将特定的文本与其余部分分开,分隔符可以是: `,"",<>,,<\tag> 等. 这么做可以有效避免提示注入.

提示注入: 提示注入是一种语言模型输入不符合预期的现象(也是一种用于劫持语言模型输出的技术)。当把用户输入文本作为提示的一部分使用时,就会发生这种情况。

举个例子: 我们使用 """ 作为分隔符
在上面的代码后面添加如下代码:

text = f"""
你应该提供尽可能清晰、具体的指示,以表达你希望模型执行的任务。
这将引导模型朝向所需的输出,并降低收到无关或不正确响应的可能性。
不要将写清晰的提示与写简短的提示混淆。  
在许多情况下,更长的提示可以为模型提供更多的清晰度和上下文信息,从而导致更详细和相关的输出。
"""
# 需要总结的文本内容
prompt = f"""
把用三个反引号括起来的文本总结成一句话。
```{text}```
"""
# 指令内容,使用 ``` 来分隔指令和待总结的内容
response = get_completion(prompt)
print(response)

策略 2 : 要求模型结构化输出
如要求模型使用 JSON 或 HTML,对象的形式输出,这样使模型结果更容易被解析
如下面例子

prompt = f"""
请生成包括书名、作者和类别的三本虚构书籍清单,
并以 JSON 格式提供,其中包含以下键:book_id、title、author、genre。
"""
response = get_completion(prompt)
print(response)

策略 3 要求模型检查是否满足条件
如果我们需要模型执行的任务可能无法满足,我们可以要求模型检查是否满足条件,如果不满足,则返回错误信息. 这样我们就可以提前将潜在的边界情况考虑进去.

text_1=f"""
泡一杯茶很容易。首先,需要把水烧开。
在等待期间,拿一个杯子并把茶包放进去。
一旦水足够热,就把它倒在茶包上。
等待一会儿,让茶叶浸泡。几分钟后,取出茶包。
如果你愿意,可以加一些糖或牛奶调味。
就这样,你可以享受一杯美味的茶了。
"""

prompt = f"""
您将获得由三个引号括起来的文本。
如果它包含一系列的指令,则需要按照以下格式重新编写这些指令:

第一步 - ... \n
第二步 - ...
...
第N步 - ...

如果文本中不包含一系列的指令,则直接写“未提供步骤”。"

\"\"\"{text_1}
\"\"\"
"""

# 指令内容,使用 ``` 来分隔指令和待总结的内容
response = get_completion(prompt)
print(response)



# >>>>>>> 输出 <<<<<<<
# Text 1 的总结:
# 第一步 - 把水烧开。
# 第二步 - 拿一个杯子并把茶包放进去。
# 第三步 - 把烧开的水倒在茶包上。
# 第四步 - 等待几分钟,让茶叶浸泡。
# 第五步 - 取出茶包。
# 第六步 - 如果你愿意,可以加一些糖或牛奶调味。
# 第七步 - 就这样,你可以享受一杯美味的茶了。

策略 4 : 提供少量的示例
即在要求模型执行任务时,提供一些示例,这样可以帮助模型更好的理解我们的意图.

prompt = f"""
你的任务是以一致的风格回答问题。

<孩子>: 教我耐心。

<祖父母>: 挖出最深峡谷的河流源于一处不起眼的泉眼;最宏伟的交响乐从单一的音符开始;最复杂的挂毯以一根孤独的线开始编织。

<孩子>: 教我韧性。
"""

# 最终输出的结果
# <祖父母>: 韧性就像是一棵树,它需要经历风吹雨打、寒冬酷暑,才能成长得更加坚强。所以,当你遇到挫折和困难时,不要轻易放弃,要像树一样坚定地扎根,不断成长,最终成为一棵高大的树。

2.2.2 给模型时间去思考

技巧一 : 技巧一:明确完成任务所需的步骤

下面的例子里,将任务分成了若干部分,让 LLM 分别完成

text = f"""
李白乘舟将欲行, 忽闻岸上踏歌声。
桃花潭水深千尺, 不及汪伦送我情。
"""

作者:周末程序猿
链接:https://juejin.cn/post/7231519213893533754
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


prompt_1 = f"""
你的工作是:
1 - 一句话总结下面被三个反引号包裹的文本.
2 - 将总结翻译为法语
3 - 列出法语摘要中的每个名字
4 - 输出包含以下键的JSON对象: 法语摘要和名字数量统计

请用换行符分隔您的答案。

文本:
```{text}```
"""

最终返回
结果

技巧二 : 指导模型在下结论前找到自己的解法

有时候,告诉模型在下结论前要思考解决方案时,模型会给我们更好的回答.


prompt = f"""
请判断学生的解决方案是否正确,请通过如下步骤解决这个问题:

步骤:

    首先,自己解决问题。
    然后将你的解决方案与学生的解决方案进行比较,并评估学生的解决方案是否正确。在自己完成问题之前,请勿决定学生的解决方案是否正确。

使用以下格式:

    问题:问题文本
    学生的解决方案:学生的解决方案文本
    实际解决方案和步骤:实际解决方案和步骤文本
    学生的解决方案和实际解决方案是否相同:是或否
    学生的成绩:正确或不正确

问题:
    我正在建造一个太阳能发电站,需要帮助计算财务。 
    - 土地费用为每平方英尺100美元
    - 我可以以每平方英尺250美元的价格购买太阳能电池板
    - 我已经谈判好了维护合同,每年需要支付固定的10万美元,并额外支付每平方英尺10美元
    作为平方英尺数的函数,首年运营的总费用是多少。

学生的解决方案:
    设x为发电站的大小,单位为平方英尺。
    费用:
    1. 土地费用:100x
    2. 太阳能电池板费用:250x
    3. 维护费用:100,000+100x
    总费用:100x+250x+100,000+100x=450x+100,000

实际解决方案和步骤:
"""

方案
在上面例子中如果不加上提示,模型会直接认为学生解决方案时对的.

技巧三 让模型思考,减少虚假知识

虚假知识: 模型会一本正经的生成一些离题千里的答案.举个例子

prompt = f"""
告诉我阿里云工业组态产品的特点和优势
"""

虚假知识

因为我参与了这个产品的研发,所以我很容易判断模型给出的答案是错误的.

这时候我们可以结合上面的技巧,让模型在下结论前思考,这样可以减少虚假知识的产生.一个有效的解决方案:

  1. 找到相关的文献引用
  2. 要求模型使用这些引用回答问题
prompt = f"""
你的工作是:
1 - 查找关于阿里云组态产品的介绍文档,将他们列出来.
2 - 将列出来的文档总结成一句话.
3 - 结合总结,告诉我阿里云组态产品的特点
"""

结果

3.Prompt 的优化迭代(Iterative)

使用 LLM 创建应用时很难一蹴而就,需要多次迭代. 那么一个好的迭代流程对于改进 Prompt 是非常重要的.

提出想法 → 编写代码 → 分析结果 → 重复

任务目标: 根据说明书生产营销文案

我们的任务是根据说明书生产营销文案,首先简单写一个 prompt 看看效果


# 产品说明书
doc = """
概述

美丽的中世纪风格办公家具系列的一部分,包括文件柜、办公桌、书柜、会议桌等。
     多种外壳颜色和底座涂层可选。
     可选塑料前后靠背装饰(SWC-100)或 10 种面料和 6 种皮革的全面装饰(SWC-110)。
     底座涂层选项为:不锈钢、哑光黑色、光泽白色或铬。
     椅子可带或不带扶手。
     适用于家庭或商业场所。
     符合合同使用资格。

结构

五个轮子的塑料涂层铝底座。
     气动椅子调节,方便升降。

尺寸

宽度 53 厘米|20.87 英寸
     深度 51 厘米|20.08 英寸
     高度 80 厘米|31.50 英寸
     座椅高度 44 厘米|17.32 英寸
     座椅深度 41 厘米|16.14 英寸

选项

软地板或硬地板滚轮选项。
     两种座椅泡沫密度可选:中等(1.8 磅/立方英尺)或高(2.8 磅/立方英尺)。
     无扶手或 8 个位置 PU 扶手。

材料
外壳底座滑动件

改性尼龙 PA6/PA66 涂层的铸铝。
     外壳厚度:10 毫米。
     座椅
    HD36 泡沫

原产国

意大利
"""

# 生成营销文案
prompt = f"""
你的任务是帮助营销团队基于技术说明书创建一个产品的营销描述。

根据```标记的技术说明书中提供的信息,编写一个产品描述。

技术说明: ```{doc}```
"""

response = get_completion(prompt)
print(response)

最后结果:
结果

看起来还不错,接下来我们对 prompt 做一些优化

3.1 优化 1: 文本太长

解决方法: 对他返回的文本长度进行限制

# 优化后的 Prompt,要求生成描述不多于 50 词
prompt = f"""
您的任务是帮助营销团队基于技术说明书创建一个产品的零售网站描述。

根据```标记的技术说明书中提供的信息,编写一个产品描述。

使用最多50个词。

技术规格:```{doc}```
"""


# >>>>>>>>>>>>>>>>>>>结果<<<<<<<<<<<<<<<<<<<<<<
# 这款美丽的中世纪风格办公家具系列包括文件柜、办公桌、书柜、会议桌等。可选多种外壳颜色和底座涂层,底座涂层选项为不锈钢、哑光黑色、光泽白色或铬。椅子可带或不带扶手,适用于家庭或商业场所。

LLM 在遵循非常精确的字数限制方面表现得还可以,但并不那么出色,有时它会输出 60 或 65 个单词的内容,但这还算是合理的,这原因是 LLM 解释文本使用一种叫做分词器的技术.

3.2 优化 2: 关注点不对

我们的目标用户是家具零售商,他们更加关心产品的技术细节和材料.
解决方法: 要求它专注于与目标受众相关的方面。

prompt = f"""
您的任务是帮助营销团队基于技术说明书创建一个产品的零售网站描述。

根据```标记的技术说明书中提供的信息,编写一个产品描述。

该描述面向家具零售商,因此应具有技术性质,并侧重于产品的材料构造。

在描述末尾,包括技术规格中每个7个字符的产品ID。

使用最多50个词。

技术规格:```{doc}```
"""

# >>>>>>>>>>>>>>>>>>>结果<<<<<<<<<<<<<<<<<<<<<<
# 这款中世纪风格的办公家具系列包括文件柜、办公桌、书柜和会议桌等。可选多种外壳颜色和底座涂层,底座涂层选项为不锈钢、哑光黑色、光泽白色或铬。椅子可带或不带扶手,适用于家庭或商业场所。座椅高度44厘米,座椅深度41厘米。产品ID:SWC-100/SWC-110。

3.3 优化 3: 结构化的输出

上面就是一个简单的 prompt 迭代优化案例,但我们还可以要求模型输出结构化的文本,比如我们可以要求模型输出成 html 格式,这样就可以直接在网页中显示.

prompt = f"""
您的任务是帮助营销团队基于技术说明书创建一个产品的零售网站描述。

根据```标记的技术说明书中提供的信息,编写一个产品描述。

该描述面向家具零售商,因此应具有技术性质,并侧重于产品的材料构造。

在描述末尾,包括技术规格中每个7个字符的产品ID。

在描述之后,包括一个表格,提供产品的尺寸。表格应该有两列。第一列包括尺寸的名称。第二列只包括英寸的测量值。

给表格命名为“产品尺寸”。

将所有内容格式化为可用于网站的HTML格式。将描述放在<div>元素中。

技术规格:```{doc}```
"""

结果:
{% codepen url="https://codepen.io/wuriqilang/pen/qBQZxgR" slug="qBQZxgR" title="大模型结构化输出" /%}

相关文章
|
3月前
|
机器学习/深度学习 移动开发 自然语言处理
大模型Prompt-Tuning技术入门(二)
Prompt-Tuning是一种在大型语言模型中进行下游任务适配的技术,起源于GPT-3的In-context Learning和Demonstration Learning。它通过构建Prompt(提示)和Verbalizer(标签映射)来转换任务,比如将分类任务转化为填空问题。PET模型是Prompt-Tuning的早期实践,通过固定模板(Pattern)和标签词(Verbalizer)来实现。Prompt-Oriented Fine-Tuning是Prompt-Tuning的一种形式,将任务转换为与预训练任务相似的形式,如BERT的MLM任务。
|
10天前
|
机器学习/深度学习 人工智能 自然语言处理
【Prompt Engineering提示工程技术:思维树 (ToT)、检索增强生成 (RAG)、自动推理并使用工具 (ART)】
思维树(ToT)框架,旨在解决复杂任务,通过构建一棵思维树,利用语言模型生成并评估中间步骤,结合搜索算法(如广度优先搜索)进行系统探索。ToT在不同任务中需定义思维步骤及候选数量,如“算24游戏”需三分步骤,每步评估可行性。实验表明,ToT显著优于其他提示方法。此外,ToT框架可结合强化学习不断进化,提升解决复杂问题的能力。
【Prompt Engineering提示工程技术:思维树 (ToT)、检索增强生成 (RAG)、自动推理并使用工具 (ART)】
|
12天前
|
人工智能 自然语言处理 机器人
【Prompt Engineering 提示词工程指南】​文本概括、信息提取、问答、文本分类、对话、代码生成、推理​
本文介绍了使用提示词与大语言模型(LLM)交互的基础知识。通过调整参数如温度(Temperature)、最高概率词元(Top_p)、最大长度(Max Length)及停止序列(Stop Sequences),可以优化模型输出。温度参数影响结果的随机性;Top_p 控制结果的多样性;最大长度限制输出长度;停止序列确保输出符合预期结构。此外,频率惩罚(Frequency Penalty)和存在惩罚(Presence Penalty)可减少重复词汇,提升输出质量。提示词需包含明确指令、上下文信息、输入数据及输出指示,以引导模型生成理想的文本。设计提示词时应注重具体性、避免歧义,并关注模型的具体行为
【Prompt Engineering 提示词工程指南】​文本概括、信息提取、问答、文本分类、对话、代码生成、推理​
|
4月前
|
机器学习/深度学习 人工智能 JSON
LLM 大模型学习必知必会系列(二):提示词工程-Prompt Engineering 以及实战闯关
LLM 大模型学习必知必会系列(二):提示词工程-Prompt Engineering 以及实战闯关
LLM 大模型学习必知必会系列(二):提示词工程-Prompt Engineering 以及实战闯关
|
3月前
|
存储 机器学习/深度学习 自然语言处理
大模型Prompt-Tuning技术进阶
近年来,随着Prompt-Tuning技术的崛起,研究者们发现,在拥有超过10亿参数的大规模模型上,采用Prompt-Tuning相较于传统的Fine-tuning方法能带来显著的性能提升。特别是在小样本甚至零样本学习场景下,Prompt-Tuning能够极大地激发模型的潜力。这一成就的取得主要归功于三个关键因素:模型庞大的参数量、训练过程中使用的海量语料,以及精心设计的预训练任务。
|
3月前
|
机器学习/深度学习 自然语言处理 算法
大模型Prompt-Tuning技术入门(一)
Prompt-Tuning是NLP领域的新兴技术,旨在减少预训练模型Fine-Tuning的需要。它通过构造提示(Prompt)使预训练模型能适应各种任务,降低了语义偏差和过拟合风险。Prompt作为任务的“提示词”,可以是人工定义、自动搜索或生成的模板,与预训练的MLM头结合使用,只需少量甚至无标注数据,通过标签词映射进行预测。此方法从GPT-3的In-Context Learning发展至今,包括了连续Prompt、大规模模型的Instruction-tuning和Chain-of-Thought等进展。 Prompt-Tuning是向少监督、无监督学习迈进的关键研究。
|
4月前
|
人工智能 程序员 API
【AI大模型应用开发】1.0 Prompt Engineering(提示词工程)- 典型构成、原则与技巧,代码中加入Prompt
【AI大模型应用开发】1.0 Prompt Engineering(提示词工程)- 典型构成、原则与技巧,代码中加入Prompt
201 0
|
人工智能 自然语言处理 机器人
Prompt learning 教学[进阶篇]:简介Prompt框架并给出自然语言处理技术:Few-Shot Prompting、Self-Consistency等;项目实战搭建知识库内容机器人
Prompt learning 教学[进阶篇]:简介Prompt框架并给出自然语言处理技术:Few-Shot Prompting、Self-Consistency等;项目实战搭建知识库内容机器人
Prompt learning 教学[进阶篇]:简介Prompt框架并给出自然语言处理技术:Few-Shot Prompting、Self-Consistency等;项目实战搭建知识库内容机器人
|
数据采集 机器学习/深度学习 数据挖掘
提升ChatGPT性能的实用指南:Prompt Engineering的艺术
一起探索 Prompt Engineering 的奥秘,并学习如何用它来让 ChatGPT 发挥出最大的潜力。 什么是提示工程? 提示工程是一门新兴学科,就像是为大语言模型(LLM)设计的"语言游戏"。通过这个"游戏",我们可以更有效地引导 LLM 来处理问题。只有熟悉了这个游戏的规则,我们才能更清楚地认识到 LLM 的能力和局限。 这个"游戏"不仅帮助我们理解 LLM,它也是提升 LLM 能力的途径。有效的提示工程可以提高大语言模型处理复杂问题的能力(比如一些数学推理问题),也可以提高大语言模型的扩展性(比如可以结合专业领域的知识和外部工具,来提升 LLM 的能力)。
306 0
提升ChatGPT性能的实用指南:Prompt Engineering的艺术
|
智能硬件
Prompt基础 | 3-Prompt的基本框架
Prompt基础 | 3-Prompt的基本框架
468 0
Prompt基础 | 3-Prompt的基本框架