面向开发人员的 ChatGPT 提示词教程 - ChatGPT Prompt Engineering for Developers
- 1. 指南(原文: Guidelines)
- 2. 迭代式(原文: Iterative)
-
- 2-1. 迭代式提示语开发(原文: Iterative Prompt Develelopment)
- 2-2. 配置
- 2-3. 从产品概况表中生成营销产品描述(原文: Generate a marketing product description from a product fact sheet)
- 2-4. 问题 1: 文本太长(原文: The text is too long )
- 2-5. 问题 2: 文本集中在错误的细节上(原文: Text focuses on the wrong details)
- 2-6. 问题 3. 描述需要一个维度的表格(原文: Description needs a table of dimensions)
- 2-7. 加载 Python 库以查看 HTML(原文: Load Python libraries to view HTML)
- 3. 归纳总结(原文: Summarizing)
-
- 3-1. 归纳总结(原文: Summarizing)
- 3-2. 配置
- 3-3. 归纳的文本(原文: Text to summarize)
- 3-4. 用字/句/字数限制进行总结(原文: Summarize with a word/sentence/character limit)
- 3-5. 以运输和交付为重点进行总结(原文: Summarize with a focus on shipping and delivery)
- 3-6. 总结时注重价格和价值(原文: Summarize with a focus on price and value)
- 3-7. 尝试 "提取" 而不是 "总结"(原文: Try "extract" instead of "summarize")
- 3-8. 总结多个产品评论(原文: Summarize multiple product reviews)
- 4. 推断(原文: Inferring)
-
- 4-1. 推断(原文: Inferring)
- 4-2. 配置
- 4-3. 产品评论内容(原文: Product review text)
- 4-4. 情感(正面/负面)(原文: Sentiment (positive/negative))
- 4-5. 识别情感的类型(原文: Identify types of emotions)
- 4-6. 识别愤怒(原文: Identify anger)
- 4-7. 从客户评论中提取产品和公司名称(原文: Extract product and company name from customer reviews)
- 4-8: 一次性完成多项任务(原文: Doing multiple tasks at once)
- 4-9: 推断主题(原文: Inferring topics)
- 4-10. 推断出5个主题(原文: Infer 5 topics)
- 4-11. 为某些主题制作新闻提醒(原文: Make a news alert for certain topics)
- 5. 转化(原文: Transforming)
- 6. 展开(原文: Expanding)
- 7. Chatbot
1. 指南(原文: Guidelines)
1-1. 提示的指南(原文: Guidelines for Prompting)
在本课中,你将练习两个提示原则及其相关策略,以便为大型语言模型编写有效的提示语。
1-2. 配置
安装 openai 依赖,
!pip install openai
!export OPENAI_API_KEY='sk-...'
加载API密钥和相关的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')
在整个课程中,我们将使用 OpenAI 的 gpt-3.5-turbo 模型和聊天完成度端点(chat completions endpoint)。
这个辅助函数将使我们更容易使用提示语和查看生成的输出,
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-3. 提示语原则(原文: Prompting Principles)
-
原则 1: 写出清晰而具体的指示(Write clear and specific instructions)
-
原则 2: 给模型 "思考 "的时间(Give the model time to “think”)
原则 1: 写出清晰而具体的指示(原文: Write clear and specific instructions)
技巧 1: 使用分隔符来清楚地表明输入的不同部分(原文: Use delimiters to clearly indicate distinct parts of the input)
- 分隔符可以是任何东西,例如: ```,
"""
,< >
,<tag> <\tag>
,:
示例代码,
text = f"""
你应该通过提供尽可能清晰和具体的指令来表达你希望模型做什么。\
这将引导模型走向所需的输出,并减少收到不相关或不正确响应的机会。\
不要把写一个清晰的提示和写一个短的提示混为一谈。\
在许多情况下,较长的提示为模型提供了更多的清晰度和背景,\
这可以导致更详细和相关的输出。
"""
prompt = f"""
将由三个反斜线划定的文本总结为一句话。
```{text}```
"""
response = get_completion(prompt)
print(response)
输出结果如下,
提供清晰具体的指令可以引导模型输出所需结果,避免不相关或不正确响应,较长的提示可以提供更多清晰度和背景,导致更详细和相关的输出。
技巧 2: 要求提供结构化的输出(原文: Ask for a structured output)
- JSON, HTML
示例代码,
prompt = f"""
生成一个包含三个编造的书名及其作者和流派的列表。\
以JSON格式提供,键值如下:
book_id, title, author, genre。
"""
response = get_completion(prompt)
print(response)
输出结果如下,
[
{
"book_id": 1,
"title": "The Shadow of the Wind",
"author": "Carlos Ruiz Zafón",
"genre": "Gothic fiction"
},
{
"book_id": 2,
"title": "The Nightingale",
"author": "Kristin Hannah",
"genre": "Historical fiction"
},
{
"book_id": 3,
"title": "The Martian",
"author": "Andy Weir",
"genre": "Science fiction"
}
]
技巧 3: 要求模型检查条件是否得到满足(原文: Ask the model to check whether conditions are satisfied)
示例代码 1,
text_1 = f"""
泡一杯茶很容易!\
首先,你需要让一些水沸腾。\
在这过程中,拿起一个杯子,把茶包放进去。\
一旦水足够热,就把它倒在茶包上。\
让茶叶浸泡一会儿。\
几分钟后,取出茶包。\
如果你喜欢,你可以加入一些糖或牛奶来调味。\
就这样 你就可以享受到一杯美味的茶了。
"""
prompt = f"""
你将得到由三引号划定的文本。\
如果它包含一连串的指令,请按以下格式重写这些指令:
第1步 - ...
第2步 - ...
...
第N步 - ...
如果该文本不包含指令序列,那么只需写上 "未提供步骤"。
\"\"\"{text_1}\"\"\"
"""
response = get_completion(prompt)
print("Completion for Text 1:")
print(response)
输出结果如下,
Completion for Text 1:
第1步 - 让一些水沸腾。
第2步 - 拿起一个杯子,把茶包放进去。
第3步 - 一旦水足够热,就把它倒在茶包上。
第4步 - 让茶叶浸泡一会儿。
第5步 - 取出茶包。
第6步 - 如果你喜欢,你可以加入一些糖或牛奶来调味。
第7步 - 享受你的美味茶!
示例代码 2,
text_2 = f"""
今天阳光明媚,鸟儿在歌唱。
这是一个去公园散步的好日子。
鲜花盛开,树木在微风中轻轻摇曳。
人们都出来走动,享受这美好的天气。
一些人正在野餐,而另一些人正在玩游戏,或只是在草地上放松。
这是一个完美的日子,可以花时间在户外,欣赏大自然的美丽。
"""
prompt = f"""
你将得到由三引号划定的文本。\
如果它包含一连串的指令,请按以下格式重写这些指令:
第1步 - ...
第2步 - ...
...
第N步 - ...
如果该文本不包含指令序列,那么只需写上 "未提供步骤"。
\"\"\"{text_2}\"\"\"
"""
response = get_completion(prompt)
print("Completion for Text 2:")
print(response)
输出结果如下,
Completion for Text 2:
未提供步骤
技巧 4: "少许样本"提示(原文: “Few-shot” prompting)
举出完成任务的成功例子,然后要求模型执行任务。
示例代码,
prompt = f"""
你的任务是以一致的风格来回答。
<孩子>:教我耐心。
<祖父母>:雕琢最深山谷的河流从一个小小的泉眼流过;\
最宏伟的交响乐源于一个音符;最复杂的织锦从一根线开始。
<孩子>:教我如何坚韧不拔。
"""
response = get_completion(prompt)
print(response)
输出结果如下,
<祖父母>:坚韧不拔的力量来自于内心的信念和毅力。要有目标,有计划,有毅力,不断努力,不轻易放弃,才能走向成功的道路。
原则 2: 给模型 "思考 "的时间(原文: Give the model time to “think”)
技巧 1: 具体说明完成一项任务所需的步骤(原文: Specify the steps required to complete a task)
示例代码,
text = f"""
在一个迷人的村庄里,杰克和吉尔兄妹开始了从山顶水井取水的征程。
当他们欢快地唱着歌爬上山顶时,不幸发生了--杰克被一块石头绊倒,\
翻下山去,吉尔也跟着摔倒。
虽然受了点伤,但两人还是在安慰的怀抱中回到了家。
尽管发生了意外,他们的冒险精神仍然没有受到影响,他们继续愉快地探索。
"""
# example 1
prompt_1 = f"""
执行以下操作:
1 - 用1个句子总结以下由三个反斜线划定的文本。
2 - 将摘要翻译成日文。
3 - 在日文摘要中列出每个名字。
4 - 输出一个json对象,包含以下内容 \
keys: japanese_sum