4. Iterative
本节遵循上图所提到的 Prompt guideline 四个循环迭代的步骤来构建完善的 Prompt。
Iterative 小节 “Generate a marketing product description from a product fact sheet” 来演示,怎么逐步完善复杂的 Prompt 来获取 reponse。
- 直接要求生成的产品描述
prompt = f""" | |
Your task is to help a marketing team create a | |
description for a retail website of a product based | |
on a technical fact sheet. | |
Write a product description based on the information | |
provided in the technical specifications delimited by | |
triple backticks. | |
Technical specifications: ```{fact_sheet_chair}``` | |
""" | |
response = get_completion(prompt) | |
print(response) |
我们看到输出太长了,没什么重点。
- 添加字数或者句数限制,比如这里
Use at most 50 words.
, 如果你用len(response.split(" "))
看看输出长度的话应该在 50 左右。 - 但是这时可能还是聚焦于错误的细节,继续添加指令
The description is intended for furniture retailers, so should be technical in nature and focus on the materials the product is constructed from.
面向零售商,描述注重技术。 - 如果还有要求,比如要添加 Product ID,也可添加指令。
- 最后实现我们最初的复杂想法,输出产品描述给网站,格式是 HTML。Format everything as HTML that can be used in a website.Place the description in a element.
完整的流程代码 Prompt 和 text 如下:
fact_sheet_chair = """ | |
OVERVIEW | |
- Part of a beautiful family of mid-century inspired office furniture, | |
including filing cabinets, desks, bookcases, meeting tables, and more. | |
- Several options of shell color and base finishes. | |
- Available with plastic back and front upholstery (SWC-100) | |
or full upholstery (SWC-110) in 10 fabric and 6 leather options. | |
- Base finish options are: stainless steel, matte black, | |
gloss white, or chrome. | |
- Chair is available with or without armrests. | |
- Suitable for home or business settings. | |
- Qualified for contract use. | |
CONSTRUCTION | |
- 5-wheel plastic coated aluminum base. | |
- Pneumatic chair adjust for easy raise/lower action. | |
DIMENSIONS | |
- WIDTH 53 CM | 20.87”- DEPTH 51 CM | 20.08”- HEIGHT 80 CM | 31.50”- SEAT HEIGHT 44 CM | 17.32”- SEAT DEPTH 41 CM | 16.14”OPTIONS | |
- Soft or hard-floor caster options. | |
- Two choices of seat foam densities: | |
medium (1.8 lb/ft3) or high (2.8 lb/ft3) | |
- Armless or 8 position PU armrests | |
MATERIALS | |
SHELL BASE GLIDER | |
- Cast Aluminum with modified nylon PA6/PA66 coating. | |
- Shell thickness: 10 mm. | |
SEAT | |
- HD36 foam | |
COUNTRY OF ORIGIN | |
- Italy | |
"""prompt = f""" | |
Your task is to help a marketing team create a | |
description for a retail website of a product based | |
on a technical fact sheet. | |
Write a product description based on the information | |
provided in the technical specifications delimited by | |
triple backticks. | |
The description is intended for furniture retailers, | |
so should be technical in nature and focus on the | |
materials the product is constructed from. | |
At the end of the description, include every 7-character | |
Product ID in the technical specification. | |
After the description, include a table that gives the | |
product's dimensions. The table should have two columns. | |
In the first column include the name of the dimension. | |
In the second column include the measurements in inches only. | |
Give the table the title 'Product Dimensions'. | |
Format everything as HTML that can be used in a website. | |
Place the description in a <div> element. | |
Technical specifications: ```{fact_sheet_chair}``` | |
""" | |
response = get_completion(prompt) | |
print(response) |
5. Summarizing
这部分就是对文本和句子进行总结,当然你可以限定面对的对象,限制字数。另外 extract
和summarize
是有区别的。下面是多个评价进行总结的 prompt:
for i in range(len(reviews)): | |
prompt = f""" | |
Your task is to generate a short summary of a product \ | |
review from an ecommerce site. | |
Summarize the review below, delimited by triple \ | |
backticks in at most 20 words. | |
Review: ```{reviews[i]}``` | |
""" | |
response = get_completion(prompt) | |
print(i, response, "\n") |
6. Inferring
对于推理能力,比如对评价进行正负情感推理。既可以进行正负评价推理,又可以推理具体情感如,happy, satisfied, grateful, impressed, content。这些都是 LLM 的无限可能性。先看看正负情感推理。
lamp_review = """ | |
Needed a nice lamp for my bedroom, and this one had \ | |
additional storage and not too high of a price point. \ | |
Got it fast. The string to our lamp broke during the \ | |
transit and the company happily sent over a new one. \ | |
Came within a few days as well. It was easy to put \ | |
together. I had a missing part, so I contacted their \ | |
support and they very quickly got me the missing piece! \ | |
Lumina seems to me to be a great company that cares \ | |
about their customers and products!! | |
"""prompt = f""" | |
What is the sentiment of the following product review, | |
which is delimited with triple backticks? | |
Give your answer as a single word, either "positive" \ | |
or "negative". | |
Review text: '''{lamp_review}''' | |
""" | |
response = get_completion(prompt) | |
print(response) |
再看看具体情绪推理:
prompt = f""" | |
Identify a list of emotions that the writer of the \ | |
following review is expressing. Include no more than \ | |
five items in the list. Format your answer as a list of \ | |
lower-case words separated by commas. | |
Review text: '''{lamp_review}''' | |
""" | |
response = get_completion(prompt) | |
print(response) |
接下来还示范了如何进行产品和品牌抽取,多个任务混合的 Prompt 以及 topic 推断(限制主题字数)等。
7. Transforming
Transforming 包括,
- 翻译
- Tone Transformation
- Format Conversion(比如 json->html)
- Spellcheck/Grammar check,这个有点挤压 Grammarly 类似产品了。
简单的翻译 prompt 如下,在 user_messages
中添加你要翻译的文本,你就能获取到中文翻译了。
user_messages = [ | |
"An anonymous letter alerted police to the possibility of a terrorist attack at the airport.", | |
"Some NLP tasks can be solved in a fully unsupervised fashion by providing a pretrained languagemodel with“task descriptions”in naturallanguage", | |
] | |
for issue in user_messages: | |
prompt = f"""Translate the following text to Chinese \: ```{issue}```""" | |
response = get_completion(prompt) | |
print(response, "\n") |
8. Expanding
Expanding 是将短文本拓展成长文本,或者根据 topic 进行创作,就像平常公司的头脑风暴。
示例是对顾客的评价,进行自动回复,效果还挺好的。
这里注意下 openai model 中 temperature
参数意义。如下调用函数中(这也是 openai 包使用的基本模版),temperature
表示输出随机性。
import openai | |
import os | |
openai.api_key = 'sk-' | |
def get_completion(prompt, model="gpt-3.5-turbo",temperature=0): | |
messages = [{"role": "user", "content": prompt}] | |
response = openai.ChatCompletion.create( | |
model=model, | |
messages=messages, | |
temperature=temperature, # this is the degree of randomness of the model's output | |
) | |
return response.choices[0].message["content"] |
具体来说如下图所示,对于输入 my favorite food is
给 ChatGPT 模型,会输入下一个词和其概率,如果你设置temperature=0
, 就只会输出最大概率那个。而设置temperature=0.3
, 会有 pizza 和 sushi 两个输出,再从中随机选取一个作为 response。设置 0.7 就有 3 个输出了,可以总结为:
- 对于稳定性、要求可预测的任务选取
temperature=0
。 - 对于需要变化性任务选取
temperature=0.3
, 如果要求随机性高,有创造性的 response 选取 0.7。
9. Chatbot
ChatGPT 用对话数据训练过,所以可以设置 role 来定制 Chatbot, 使用的 help function 跟以前不一样,需要传入 role 信息。
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"] | |
def get_completion_from_messages(messages, model="gpt-3.5-turbo", temperature=0): | |
response = openai.ChatCompletion.create( | |
model=model, | |
messages=messages, | |
temperature=temperature, # this is the degree of randomness of the model's output | |
) | |
# print(str(response.choices[0].message)) | |
return response.choices[0].message["content"] | |
messages = [ | |
{'role':'system', 'content':'You are friendly chatbot.'}, | |
{'role':'user', 'content':'Yes, can you remind me, What is my name?'} ] | |
response = get_completion_from_messages(messages, temperature=1) | |
print(response) |
还可以创建订单助手 bot,示例就是使用 panel
构建了 GUI 的连续型对话助手。
10. 总结
Prompt Engineer 课程总结如下:
- 准则
- 写清晰明确的指令
- 给模型时间”思考“
- 迭代进行 prompt 开发
- 能力: 总结,推断,变形,拓展
- 构建 chatbot