【Prompting】ChatGPT Prompt Engineering开发指南(1)

Prompting指南

在本课程中,您将练习两个提示原则及其相关策略,以便为大型语言模型编写有效的提示。本代码的编写基于Google colab notebook。

!pip install openai
!pip install -U python-dotenv

注:python-dotenv 可以用来修改 POSIX系统的环境变量.

设置

加载API密钥和相关的Python Libaries。

import openai
import os

from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv())

openai.api_key = os.getenv('sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxx')

注意:上面是Deeplearning.AI给定的参考代码样例,这里不太适用,会报错,我们对其进行修改,如下:

import os
import openai

# 注意,我们设置了本地代理
os.environ["http_proxy"] = "http://127.0.0.1:7890"
os.environ["https_proxy"] = "http://127.0.0.1:7890"

# Set the OpenAI API key
os.environ['OPENAI_API_KEY'] = "sk-your open.api_key" # get api_key from openai official website
# openai.api_key = os.getenv("OPENAI_API_KEY")

辅助函数
在整个课程中使用OpenAI的GPT-3.5-Turbo模型Chat completions

curl https://api.openai.com/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
    "model": "gpt-3.5-turbo",
    "messages": [{"role": "user", "content": "Hello!"}]
  }'

由于gpt-3.5-turbo的性能与text-davinci-003类似,但每个token的价格为10%,因此我们建议在大多数用例中使用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,
        max_tokens=1024,
        n=1,
        temperature=0,  # this is the degree of randomness of the model's output
        # stop=None,
        # top_p=1,
        # frequency_penalty=0.0,
        # presence_penalty=0.6,
    )
    return response['choices'][0]['message']['content']

注意:使用什么样的temperature,介于0和2之间。值越高(如0.8),输出越随机,而值越低(如0.2),输出就越集中,确定性更强。其他参数详细解释见openai官方文档:https://platform.openai.com/docs/api-reference/completions/create

提示原则

  • 原则1:写清晰而具体的说明
  • 原则2:给模型时间“思考”

策略1:使用分隔符清楚地指示输入的不同部分

分隔符可以是:``、“”、<>、、:

text = f"""
You should express what you want a model to do by \ 
providing instructions that are as clear and \ 
specific as you can possibly make them. \ 
This will guide the model towards the desired output, \ 
and reduce the chances of receiving irrelevant \ 
or incorrect responses. Don't confuse writing a \ 
clear prompt with writing a short prompt. \ 
In many cases, longer prompts provide more clarity \ 
and context for the model, which can lead to \ 
more detailed and relevant outputs.
"""
prompt = f"""
Summarize the text delimited by triple backticks \ 
into a single sentence.
```{
      
      text}```
"""
response = get_completion(prompt)
print(response)

策略1输出结果

策略2:要求结构化输出

  • JSON, HTML
prompt = f"""
Generate a list of three made-up book titles along \
with their authors and genres.
Provide them in JSON format with the following keys:
book_id, title, author, genre.
"""
response = get_completion(prompt)
print(response)

执行结果:

[
  {
    
    
    "book_id": 1,
    "title": "The Lost City of Zorath",
    "author": "Aria Blackwood",
    "genre": "Fantasy"
  },
  {
    
    
    "book_id": 2,
    "title": "The Last Survivors",
    "author": "Ethan Stone",
    "genre": "Science Fiction"
  },
  {
    
    
    "book_id": 3,
    "title": "The Secret Life of Bees",
    "author": "Lila Rose",
    "genre": "Romance"
  }
]

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

text_1 = f"""
Making a cup of tea is easy! First, you need to get some \
water boiling. While that's happening, \
grab a cup and put a tea bag in it. Once the water is \
hot enough, just pour it over the tea bag. \
Let it sit for a bit so the tea can steep. After a \
few minutes, take out the tea bag. If you \
like, you can add some sugar or milk to taste. \
And that's it! You've got yourself a delicious \
cup of tea to enjoy.
"""
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_1}\"\"\"
"""
response = get_completion(prompt)
print("Completion for Text 1:")
print(response)

执行结果:

Completion for Text 1:
Step 1 - Get some water boiling.
Step 2 - Grab a cup and put a tea bag in it.
Step 3 - Once the water is hot enough, pour it over the tea bag.
Step 4 - Let it sit for a bit so the tea can steep.
Step 5 - After a few minutes, take out the tea bag.
Step 6 - Add some sugar or milk to taste.
Step 7 - Enjoy your delicious cup of tea!
text_2 = f"""
The sun is shining brightly today, and the birds are \
singing. It's a beautiful day to go for a \
walk in the park. The flowers are blooming, and the \
trees are swaying gently in the breeze. People \
are out and about, enjoying the lovely weather. \
Some are having picnics, while others are playing \
games or simply relaxing on the grass. It's a \
perfect day to spend time outdoors and appreciate the \
beauty of nature.
"""
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)

执行结果:

Completion for Text 2:
No steps provided.

策略4: “Few-shot”提示

prompt = f"""
Your task is to answer in a consistent style.

<child>: Teach me about patience.

<grandparent>: The river that carves the deepest \ 
valley flows from a modest spring; the \ 
grandest symphony originates from a single note; \ 
the most intricate tapestry begins with a solitary thread.

<child>: Teach me about resilience.
"""
response = get_completion(prompt)
print(response)

执行结果:

<grandparent>: Resilience is like a tree that bends with the wind but never breaks. It is the ability to bounce back from adversity and keep moving forward, even when things get tough. Just like a tree that grows stronger with each storm it weathers, resilience is a quality that can be developed and strengthened over time.

原则2:给模型时间“思考”

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

text = f"""
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.
"""
# example 1
prompt_1 = f"""
Perform the following actions: 
1 - Summarize the following text delimited by triple \
backticks with 1 sentence.
2 - Translate the summary into French.
3 - List each name in the French summary.
4 - Output a json object that contains the following \
keys: french_summary, num_names.

Separate your answers with line breaks.

Text:
```{
      
      text}```
"""
response = get_completion(prompt_1)
print("Completion for prompt 1:")
print(response)

执行结果:

Completion for prompt 1:
Two siblings, Jack and Jill, go on a quest to fetch water from a hilltop well, but misfortune strikes as they both fall down the hill, yet they return home slightly battered but with their adventurous spirits undimmed.

Deux frères et sœurs, Jack et Jill, partent en quête d'eau d'un puits au sommet d'une colline, mais ils tombent tous les deux et retournent chez eux légèrement meurtris mais avec leur esprit d'aventure intact. 
Noms: Jack, Jill.

{
    
    
"french_summary": "Deux frères et sœurs, Jack et Jill, partent en quête d'eau d'un puits au sommet d'une colline, mais ils tombent tous les deux et retournent chez eux légèrement meurtris mais avec leur esprit d'aventure intact.",
"num_names": 2
}

要求以指定格式输出:

prompt_2 = f"""
Your task is to perform the following actions: 
1 - Summarize the following text delimited by 
  <> with 1 sentence.
2 - Translate the summary into French.
3 - List each name in the French summary.
4 - Output a json object that contains the 
  following keys: french_summary, num_names.

Use the following format:
Text: <text to summarize>
Summary: <summary>
Translation: <summary translation>
Names: <list of names in Italian summary>
Output JSON: <json with summary and num_names>

Text: <{
      
      text}>
"""
response = get_completion(prompt_2)
print("\nCompletion for prompt 2:")
print(response)

执行结果:

Completion for prompt 2:
Summary: Jack and Jill go on a quest to fetch water, but misfortune strikes and they tumble down the hill, returning home slightly battered but with their adventurous spirits undimmed. 
Translation: Jack et Jill partent en quête d'eau, mais un malheur frappe et ils tombent de la colline, rentrant chez eux légèrement meurtris mais avec leurs esprits aventureux intacts.
Names: Jack, Jill
Output JSON: {"french_summary": "Jack et Jill partent en quête d'eau, mais un malheur frappe et ils tombent de la colline, rentrant chez eux légèrement meurtris mais avec leurs esprits aventureux intacts.", "num_names": 2}

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

prompt = f"""
Determine if the student's solution is correct or not.

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
"""
response = get_completion(prompt)
print(response)

执行结果:

The student's solution is correct.

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

我们可以通过指示模型首先制定自己的解决方案来解决这个问题。
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)

执行结果:
执行结果

模型限制:幻觉

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

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

执行结果

补充内容

错题小提示
关于反斜杠的注释:

  • 在本教程中,我们使用反斜杠使文本适合屏幕,而不插入换行符“\n”。
  • 无论是否插入换行符,GPT-3都不会真正受到影响。但是,在一般使用LLM时,您可能会考虑提示中的换行符是否会影响模型的性能。

参考资料

  1. DeepLearning.AI: ChatGPT Prompt Engineering for Developers
  2. python-dotenv的详细用法
  3. OpenAI调用API报错 time out:HTTPSConnectionPool(host=‘api.openai.com‘, port=443)

猜你喜欢

转载自blog.csdn.net/ARPOSPF/article/details/130571595
今日推荐