前面关于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:
- Land cost: 100x
- Solar panel cost: 250x
- 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提示有了更多的了解吧?
第一个原则,即写清晰具体的说明。你应该通过提供尽可能清晰和具体的说明来表达你想让模型做什么。这将引导模型朝着期望的输出方向,并减少得到无关或不正确响应的可能性。不要将写清晰的提示与写简短的提示混淆,因为在许多情况下,更长的提示实际上为模型提供了更多的清晰度和上下文,这可能会导致更详细和相关的输出。
第二个原则是给模型时间思考。如果模型在急于得出错误的结论,导致了推理错误,那么你应该尝试重新构造查询,以请求一系列相关推理的链或序列,在模型提供最终答案之前。另一种思考方式是,如果你给模型一个在短时间内或用少的单词数量内完成的任务过于复杂,它可能会猜测一个不正确的答案。这也会发生在人类身上。如果你让一个人在没有时间先算出答案的情况下完成一个复杂的数学问题,他们也可能犯错误。在这种情况下,你可以指示模型在一个问题上思考更长的时间,这意味着它会在任务上花费更多的计算努力。
接下来将学习迭代提示开发过程。