前面关于Prompt介绍了那么多理论的知识点,从本节内容开始进入代码实战,提供一些提示的指南,帮助你获得想要的结果。特别地,介绍了两个关键原则,即如何编写提示来有效地促使工程师,鼓励你随时运行代码自己查看输出是什么样子的,并改变确切的提示,尝试几种不同的变化,以获得有关提示的输入和输出的经验。

在开始实战之前,假设我们已经申请了ChatGPT的账号,并获取到了APIkey,如果没有账号的,建议先注册一个账号。

我们准备下开发工具:

  • 科学上网工具
  • Python 3.8以上版本
  • Python 开发工具,Jupyter Notebook 、PyCharm、VSCode等

使用 OpenAI Python 库来访问 OpenAI API。如果你还没有安装这个 Python 库,你可以使用 PIP 来安装,准备我们的开发环境:

安装OpenAI Python库:

pip3 install openai

这个库需要使用你在 OpenAI 网站上获得的 API 密钥进行配置。将openai.api_key设置为其值:

import openai​
openai.api_key = "sk-..."

你也可以在使用这个库之前,设置 OPENAI_API_KEY 环境变量来配置 API 密钥。

export OPENAI_API_KEY='sk-...'

Guidelines

在这个课程中,您将练习两个提示原则及其相关策略,以编写大型语言模型的有效提示。

全局配置信息

第一步:加载 API 密钥和相关的 Python 库。

import openai​
import os​
​
from dotenv import load_dotenv, find_dotenv​
_ = load_dotenv(find_dotenv())​
​
openai.api_key  = os.getenv('OPENAI_API_KEY')

第二步:编写辅助函数

使用 OpenAI 的 gpt-3.5-turbo 模型和聊天完成的端点。​这个辅助函数将使得使用提示和查看生成的输出更加容易:

def get_completion(prompt, model="gpt-3.5-turbo"):​messages = [{"role": "user", "content": prompt}]​response = openai.ChatCompletion.create(​model=model,​messages=messages,​temperature=0, # this is the degree of randomness of the model's output​)​return response.choices[0].message["content"]

原则1:清晰而具体地撰写说明​

Tactic 1:使用定界符清楚地标示输入的不同部分​,定界符可以是任何东西,例如:‘’', “”", < >, , :等。

text = f"""​
您应该通过提供尽可能清晰和具体的说明来表达您希望模型做什么。这将指导模型朝着所需的输出方向发展,并减少接收到无关或不正确的响应的机会。不要将清晰的提示与简短的提示混淆。在许多情况下,较长的提示为模型提供更多的清晰度和上下文,这可能会导致更详细和相关的输出。​
"""​
prompt = f"""
将三个反引号包围的文本摘要为一个句子。
```{text}```
"""
response = get_completion(prompt)
print(response)

Tactic 2:要求结构化输出 JSON、HTML

prompt = f"""
生成一个包含三个虚构书名的列表以及他们的作者和流派。以JSON格式提供以下keys:book_id,标题,作者,流派。
"""
response = get_completion(prompt)
print(response)

Tactic 3: 让模型检查条件是否满足

text_1 = f"""
泡一杯茶很容易!首先,你需要得到一些水沸腾了。在这种情况发生的同时抓起一个杯子,放一个茶包。水喝完后足够热,把它倒在茶包上就可以了让它静置一会儿,这样茶就可以变陡了。在之后几分钟后,拿出茶包。如果您比如,你可以加一些糖或牛奶调味就这样!你给自己准备了一份美味的享受一杯茶。
"""
prompt = f"""
您将获得由三个引号分隔的文本。如果它包含一系列指令,按照以下格式重新编写这些说明:
步骤1-...
步骤2-…
…
步骤N-…
如果文本不包含指令序列,
然后简单地写下“没有提供任何步骤。”
\"\"\"{text_1}\"\"\"
"""
response = get_completion(prompt)
print("Completion for Text 1:")
print(response)
text_2 = f"""
今天阳光明媚,鸟儿们唱歌这是美好的一天在公园里散步。花儿开了树木在微风中轻轻摆动。人员出去走走,享受着宜人的天气有些人在野餐,有些人在玩耍游戏或只是在草地上放松。这是一个在户外度过美好的一天,欣赏大自然之美。
"""
prompt = f"""
You will be provided with text delimited by triple quotes.
If it contains a sequence of instructions, \
re-write those instructions in the following format:Step 1 - ...
Step 2 - …
…
Step N - …If the text does not contain a sequence of instructions, \
then simply write \"No steps provided.\"\"\"\"{text_2}\"\"\"
"""
response = get_completion(prompt)
print("Completion for Text 2:")
print(response)

Tactic 4: “少量”提示

prompt = f"""
你的任务是以一致的风格回答。
<孩子>:教我耐心。
<爷爷奶奶>:雕刻最深的河流山谷来自一个温和的泉水;最宏大的交响乐源于一个音符最复杂的挂毯是从一根孤独的线开始的。
<孩子>:教我韧性。
"""
response = get_completion(prompt)
print(response)

原则2:给模型思考的时间

Tactic 1: 指定完成任务所需的步骤

text = f"""
在一个迷人的村庄里,兄弟姐妹杰克和吉尔出发了,当他们攀爬时,欢唱着不幸杰克被石头绊倒了,吉尔紧随其后尽管受到了轻微的打击,这对情侣还是回到了家舒适的拥抱。尽管遭遇了不幸,他们的冒险精神丝毫没有减弱继续愉快地探索。
"""prompt_1 = f"""
执行以下操作:
1-总结以下text内容,用三元组分隔的文本,用1句话。
2-将摘要翻译成法语。
3-在法语摘要中列出每个名字。
4-输出一个包含以下内容的json对象keys:french_summary,num_names。用换行符分隔你的答案。
Text:
```{text}```
"""
response = get_completion(prompt_1)
print("Completion for prompt 1:")
print(response)

要求以指定格式输出

prompt_2 = f"""
您的任务是执行以下操作:1-总结以下文本,以<>一句话。
2-将摘要翻译成法语。
3-在法语摘要中列出每个名字。
4-输出一个json对象,该对象包含以下keys:french_summary,num_names。使用以下格式:文本:<要总结的文本>
摘要:<摘要>
翻译:<摘要翻译>
姓名:<意大利语摘要中的姓名列表>输出JSON:<JSON带summary和num_names>Text: <{text}>
"""
response = get_completion(prompt_2)
print("\nCompletion for prompt 2:")
print(response)

Tactic 2: 指导模型在匆忙得出结论之前制定自己的解决方案

prompt = f"""
Determine if the student's solution is correct or not.Question:
我正在建造一个太阳能电站,我需要帮助计算财务情况。​
土地成本为每平方英尺100美元​
我可以购买每平方英尺250美元的太阳能电池板​
我谈判了一个维护合同,每年将花费10万美元的固定费用,以及每平方英尺10美元的额外费用。​
作为平方英尺数量的函数,第一年运营的总成本是多少?Student's Solution:
设安装的面积为x平方英尺。​
成本:​
1.土地成本:100x美元​
2.太阳能电池板成本:250x美元​
3.维护成本:100,000美元+每平方英尺10美元​
总成本:100x美元+250x美元+100,000美元+100x美元=450x美元+100,000美元
"""
response = get_completion(prompt)
print(response)

请注意,学生的解决方案实际上是不正确的。

我们可以通过指示模型首先制定自己的解决方案来解决这个问题。

prompt = f"""
Your task is to determine if the student's solution \
is correct or not.
To solve the problem do the following:
- First, work out your own solution to the problem.
- Then compare your solution to the student's solution \
and evaluate if the student's solution is correct or not.
Don't decide if the student's solution is correct until
you have done the problem yourself.Use the following format:
Question:

question here

Student's solution:

student’s solution here

Actual solution:

steps to work out the solution and your solution here

Is the student's solution the same as actual solution \
just calculated:

yes or no

Student grade:

correct or incorrect


Question:

I’m building a solar power installation and I need help
working out the financials.

  • Land costs $100 / square foot
  • I can buy solar panels for $250 / square foot
  • I negotiated a contract for maintenance that will cost
    me a flat $100k per year, and an additional $10 / square
    foot
    What is the total cost for the first year of operations
    as a function of the number of square feet.
Student's solution:

Let x be the size of the installation in square feet.
Costs:

  1. Land cost: 100x
  2. Solar panel cost: 250x
  3. Maintenance cost: 100,000 + 100x
    Total cost: 100x + 250x + 100,000 + 100x = 450x + 100,000
Actual solution:
"""
response = get_completion(prompt)
print(response)

模型限制:幻觉

这个话题是关于模型的限制,这在您开发使用大型语言模型的应用程序时非常重要。如果模型在训练过程中暴露于大量的知识,那么它并没有完全记忆所见的信息,因此它不太了解其知识的边界。

这意味着它可能尝试回答有关晦涩主题的问题,并且可能会编造听起来合理但实际上不正确的想法。我们称这些虚构的想法为幻觉。

我们将展示一个例子,其中模型会产生幻觉。这是一个例子,其中模型会捏造一个真实牙刷公司的虚构产品名称的描述。所以,我们的提示是,请告诉我有关 Boy 公司的 AeroGlide Ultra Slim 智能牙刷的信息。

如果我们运行此提示,模型将为我们提供一个相当逼真的虚构产品描述。这可能是危险的,因为这听起来相当真实。因此,确保使用我们在本笔记本中介绍的一些技术,在构建自己的应用程序时尝试避免这种情况。这是模型已知的弱点,我们正在积极努力解决这个问题。

另外一种减少幻觉的策略是,在您想让模型基于文本生成答案时,请先要求模型查找任何相关的引用,然后要求它使用这些引用来回答问题,并且要求模型提供答案的来源文档。这通常可以帮助减少这些幻觉。

Boie是一家真实的公司,产品名称不是真实的。

prompt = f"""
Tell me about AeroGlide UltraSlim Smart Toothbrush by Boie
"""
response = get_completion(prompt)
print(response)

总结

完成以上内容,对Prompt提示有了更多的了解吧?

第一个原则,即写清晰具体的说明。你应该通过提供尽可能清晰和具体的说明来表达你想让模型做什么。这将引导模型朝着期望的输出方向,并减少得到无关或不正确响应的可能性。不要将写清晰的提示与写简短的提示混淆,因为在许多情况下,更长的提示实际上为模型提供了更多的清晰度和上下文,这可能会导致更详细和相关的输出。

第二个原则是给模型时间思考。如果模型在急于得出错误的结论,导致了推理错误,那么你应该尝试重新构造查询,以请求一系列相关推理的链或序列,在模型提供最终答案之前。另一种思考方式是,如果你给模型一个在短时间内或用少的单词数量内完成的任务过于复杂,它可能会猜测一个不正确的答案。这也会发生在人类身上。如果你让一个人在没有时间先算出答案的情况下完成一个复杂的数学问题,他们也可能犯错误。在这种情况下,你可以指示模型在一个问题上思考更长的时间,这意味着它会在任务上花费更多的计算努力。

接下来将学习迭代提示开发过程。​

第10课:《ChatGPT提示工程》—— Guidelines(入门)相关推荐

  1. 不写代码、年薪百万,带你玩赚ChatGPT提示工程-高级提示

    文章目录 前言 一.Zero-Shot提示 二.Few-Shot 提示 Few-shot Prompting 的局限性 三.Chain-of-Thought Prompting 四.Zero-Shot ...

  2. 吴恩达与 OpenAI 强强联手,《ChatGPT 提示工程》中英教程,来了!(附脑图笔记)

    大家好,我是 Kevin. 不知道五一你去哪玩耍还是怎么安排了呢?吴恩达老师在五一前发布了新课程,于是我花了些时间来学习这个重磅大礼.课程虽然只有短短 90 分钟,但是干货十足!比起那些必备提示词什么 ...

  3. 不写代码、年薪百万,带你玩赚ChatGPT提示工程-基本提示

    文章目录 前言 一.文本摘要 二.信息抽取 三.问答 四.文本分类 五.对话 六.代码生成 七.推理 总结 前言 随着ChatGPT的大火,提示工程在大模型中的重要性不言而喻,本文参考国外Prompt ...

  4. 不写代码、年薪百万,带你玩赚ChatGPT提示工程-介绍

    文章目录 前言 一.引言 二.基本提示 三.LLM设置说明 四.标准提示 五.提示的组成要素 六.设计提示的通用技巧 从简单开始 指令 具体性 避免不准确性 做还是不做? 总结 前言 随着ChatGP ...

  5. 【简单入门】ChatGPT prompt engineering (中文版)笔记 |吴恩达ChatGPT 提示工程

    目录 思维导图 一.资料 二. 指南 环境配置 两个基本原则(最重要!!!!) 原则一:编写清晰.具体的指令 **策略一:使用分隔符清晰地表示输入的不同部分**,**分隔符可以是:```," ...

  6. 《 ChatGPT 中文调教指南 》—— 使用 ChatGPT 的正确姿势:提示工程基础入门 Prompt Engineering Quick Start

    文章目录 ChatGPT 中文调教指南

  7. 吴恩达联手OpenAI的免费课程笔记—面向开发人员的 ChatGPT 提示工程

    目录 前言 一.大语言模型介绍 二.提示指南 2-0.导入API key和相关的python库 2-1.写清楚的.具体的提示 2-1-1.使用分隔符清楚的指示输入的不同部分 2-1-2.要求结构化的输 ...

  8. ChatGPT提示词工程(六):Expanding扩展

    目录 一.说明 二.安装环境 三.扩展(Expanding) 1. 自定义自动回复客户电子邮件 2. 提醒模型使用客户电子邮件中的详细信息 3. 参数 temperature 一.说明 这是吴恩达 & ...

  9. 【ChatGPT】吴恩达『提示工程』课程完全笔记下载

    版权说明:『ChatGPT Prompt Engineering for Developers』是DeepLearning.AI出品的免费课程,版权属于DeepLearning.AI(https:// ...

最新文章

  1. 取景框图片 小程序_敲敲级简单的鉴别H图片的小程序
  2. 天翼云从业认证(3.2)天翼云存储产品
  3. The procedure WAL relies on the ability to hsync for proper operation during component failures
  4. linux python3运行,将Python3安装到Linux上并运行
  5. 论文浅尝 | 从具有数值边缘属性的知识图谱中学习嵌入
  6. 吴恩达斯坦福大学机器学习 CS229 课程学习笔记(一)
  7. (10)<label>标签的用途
  8. Ubuntu学习日记--Lesson2:创建、重命名、删除文件及文件夹,强制清空回收站方法
  9. C/C++编程语言中枚举类型(enum)介绍
  10. @PropertySource注解获取配置文件值
  11. tensorflow-训练(train)/测试(test)
  12. windows优化大师8周年纪念版_P5SPS4体验版上线|青之驱魔师10周年纪念新卷发售【搞趣日报】...
  13. 根据日期获取周数的计算
  14. Element 之loading颜色修改
  15. 【办公软件】Win10自带的邮件客户端配置腾讯企业邮箱账号详解
  16. 荒野乱斗1月14日维护服务器,荒野乱斗服务器转移方法介绍_荒野乱斗外服怎么转国服[图文]-游戏窝...
  17. java时间和电脑时间_Java语言程序设计(三)显示电脑系统当前时间
  18. 树莓派 MFRC522 读取
  19. 前端播放rtmp协议的视频流文件
  20. 互联网成数据宝库,网络数据采集技术推动人工智能发展

热门文章

  1. 1.文件字符流:什么是文件字符流???
  2. 红队攻击:轻松玩转邮件钓鱼
  3. 润乾报表CookBook与使用
  4. C语言实现定积分的计算
  5. 关闭WIN7交互式服务检测提示
  6. Linux服务之DHCP服务篇(scp)
  7. RecyclerView状态异常Cannot call this method while RecyclerView is computing a layout or scrolling
  8. gnuplot 两点画线
  9. 如何通过电脑cmd查看android设备日志
  10. Linux修改fstab引起系统无法启动问题的解决方法