吴恩达Prompt Engineering学习笔记1 -- 提示原则

本篇文章为吴恩达的prompt工程学习笔记,包括部分个人心得。

编写prompt的原则

原则一:编写清晰、具体的指令

误区:清晰、具体的指令不意味着简短的指令,因为更长的指令能更完整、清晰的描述任务且提高充足的上下文。

策略1:对于某些需要着重强调或特别指明的部分,使用分隔符清晰地分隔出来

以下是一个例子,我们给出一段话并要求 GPT 进行总结,在该示例中我们使用 ``` 来作为分隔符。

text = f"""
你应该提供尽可能清晰、具体的指示,以表达你希望模型执行的任务。\
这将引导模型朝向所需的输出,并降低收到无关或不正确响应的可能性。\
不要将写清晰的提示与写简短的提示混淆。\
在许多情况下,更长的提示可以为模型提供更多的清晰度和上下文信息,从而导致更详细和相关的输出。
"""
# 需要总结的文本内容
prompt = f"""
把用三个反引号括起来的文本总结成一句话。
```{text}```
"""
# 指令内容,使用 ``` 来分隔指令和待总结的内容
response = get_completion(prompt)
print(response)

这里可以看到,text里是需要总结的内容,如果不跟prompt里的指令分隔,容易产生混淆。模型不易判断它是属于指令还是属于需要总结的内容。这种情况称之为“提示注入”。

策略2:要求一个结构化的输出

结构化输出可以是 JSON、HTML 等格式。

结构化的输出可以让模型的输出更容易被代码解析,如下一个text-to-sql回答润色的例子:

prompt = f"""给你一个用户的提问,已经基于问题生成了SQL语句并查询得到结果,现在需要基于这个SQL查询结果和用户提问来生成总结性的回答和对数据特点的分析:
用户提问: "{request.question}"
SQL查询结果: "{request.sql_result}"
请按照下面的JSON格式回复:                                             
"{{ "总结": "回复给用户的总结性的语句", "分析": "数据特点的分析结果" }}"
确保返回正确的json并且可以被Python json.loads方法解析,请以"```json"开头,以"```"结尾   
"""

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

输入:

# 有步骤的文本
text_1 = f"""
泡一杯茶很容易。首先,需要把水烧开。\
在等待期间,拿一个杯子并把茶包放进去。\
一旦水足够热,就把它倒在茶包上。\
等待一会儿,让茶叶浸泡。几分钟后,取出茶包。\
如果你愿意,可以加一些糖或牛奶调味。\
就这样,你可以享受一杯美味的茶了。
"""
prompt = f"""
您将获得由三个引号括起来的文本。\
如果它包含一系列的指令,则需要按照以下格式重新编写这些指令:

第一步 - ...
第二步 - …
…
第N步 - …

如果文本中不包含一系列的指令,则直接写“未提供步骤”。"
\"\"\"{text_1}\"\"\"
"""
response = get_completion(prompt)
print("Text 1 的总结:")
print(response)

##打印输出如下
'''
Text 1 的总结:
第一步 - 把水烧开。
第二步 - 拿一个杯子并把茶包放进去。
第三步 - 把热水倒在茶包上。
第四步 - 等待几分钟,让茶叶浸泡。
第五步 - 取出茶包。
第六步 - 如果你愿意,可以加一些糖或牛奶调味。
第七步 - 就这样,你可以享受一杯美味的茶了。
'''
# 无步骤的文本
text_2 = f"""
今天阳光明媚,鸟儿在歌唱。\
这是一个去公园散步的美好日子。\
鲜花盛开,树枝在微风中轻轻摇曳。\
人们外出享受着这美好的天气,有些人在野餐,有些人在玩游戏或者在草地上放松。\
这是一个完美的日子,可以在户外度过并欣赏大自然的美景。
"""
prompt = f"""
您将获得由三个引号括起来的文本。\
如果它包含一系列的指令,则需要按照以下格式重新编写这些指令:

第一步 - ...
第二步 - …
…
第N步 - …

如果文本中不包含一系列的指令,则直接写“未提供步骤”。"
\"\"\"{text_2}\"\"\"
"""
response = get_completion(prompt)
print("Text 2 的总结:")
print(response)

##打印输出如下
'''
Text 2 的总结:
未提供步骤。
'''

策略4:提高少量示例

又称作few-shot,是提示词工程中提高大模型效果的关键技术。即在要求模型执行实际任务之前,先给它少量成功执行任务的示例。

few-shot的尝试通常用在微调之前,因为微调需要更高的时间、人力和算力成本,我们优化落地一个具体任务时,通常的做法是先基于提示工程、few-shot技术来逼近原生大模型的效果上限,如果这一上限仍不能满足落地要求,我们才会考虑数据收集、标注、微调的一系列流程。

原则二:给模型时间思考

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

如果一个任务有多个步骤,可以按照如下示例的方式,以有序列表的形式给出指令,并给出返回的格式。

### 输入
prompt_2 = f"""
1-用一句话概括下面用<>括起来的文本。
2-将摘要翻译成英语。
3-在英语摘要中列出每个名称。
4-输出一个 JSON 对象,其中包含以下键:English_summary,num_names。

请使用以下格式:
文本:<要总结的文本>
摘要:<摘要>
翻译:<摘要的翻译>
名称:<英语摘要中的名称列表>
输出 JSON:<带有 English_summary 和 num_names 的 JSON>

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


### 输出
'''
摘要:兄妹杰克和吉尔在迷人的村庄里冒险,不幸摔伤后回到家中,但仍然充满冒险精神。
翻译:In a charming village, siblings Jack and Jill set out to fetch water from a mountaintop well. While climbing and singing, Jack trips on a stone and tumbles down the mountain, with Jill following closely behind. Despite some bruises, they make it back home safely. Their adventurous spirit remains undiminished as they continue to explore with joy.
名称:Jack,Jill
输出 JSON:{"English_summary": "In a charming village, siblings Jack and Jill set out to fetch water from a mountaintop well. While climbing and singing, Jack trips on a stone and tumbles down the mountain, with Jill following closely behind. Despite some bruises, they make it back home safely. Their adventurous spirit remains undiminished as they continue to explore with joy.", "num_names": 2}
'''

策略2:指导模型在下结论之前找出一个自己的解法

有时候,在明确指导模型在做决策之前要思考解决方案时,我们会得到更好的结果

当我们要求模型对prompt中提供的方案或解法直接判断时,其效果有时候不如让模型先自己生成一个方案,再通过对比来做判断。

##########
### 输入1
prompt1 = f"""
判断学生的解决方案是否正确。

问题:
我正在建造一个太阳能发电站,需要帮助计算财务。

    土地费用为 100美元/平方英尺
    我可以以 250美元/平方英尺的价格购买太阳能电池板
    我已经谈判好了维护合同,每年需要支付固定的10万美元,并额外支付每平方英尺10美元
    作为平方英尺数的函数,首年运营的总费用是多少。

学生的解决方案:
设x为发电站的大小,单位为平方英尺。
费用:

    土地费用:100x
    太阳能电池板费用:250x
    维护费用:100,000美元+100x
    总费用:100x+250x+100,000美元+100x=450x+100,000美元
"""
response = get_completion(prompt)
print(response)

##########
### 输出1
'''
学生的解决方案是正确的。
'''

##########
### 输入2
prompt2 = f"""
请判断学生的解决方案是否正确,请通过如下步骤解决这个问题:

步骤:

    首先,自己解决问题。
    然后将你的解决方案与学生的解决方案进行比较,并评估学生的解决方案是否正确。在自己完成问题之前,请勿决定学生的解决方案是否正确。

使用以下格式:

    问题:问题文本
    学生的解决方案:学生的解决方案文本
    实际解决方案和步骤:实际解决方案和步骤文本
    学生的解决方案和实际解决方案是否相同:是或否
    学生的成绩:正确或不正确

问题:

    我正在建造一个太阳能发电站,需要帮助计算财务。 
    - 土地费用为每平方英尺100美元
    - 我可以以每平方英尺250美元的价格购买太阳能电池板
    - 我已经谈判好了维护合同,每年需要支付固定的10万美元,并额外支付每平方英尺10美元
    作为平方英尺数的函数,首年运营的总费用是多少。

学生的解决方案:

    设x为发电站的大小,单位为平方英尺。
    费用:
    1. 土地费用:100x
    2. 太阳能电池板费用:250x
    3. 维护费用:100,000+100x
    总费用:100x+250x+100,000+100x=450x+100,000

实际解决方案和步骤:
"""
response = get_completion(prompt)
print(response)

##########
### 输出2
'''
正确的解决方案和步骤:
    1. 计算土地费用:100美元/平方英尺 * x平方英尺 = 100x美元
    2. 计算太阳能电池板费用:250美元/平方英尺 * x平方英尺 = 250x美元
    3. 计算维护费用:10万美元 + 10美元/平方英尺 * x平方英尺 = 10万美元 + 10x美元
    4. 计算总费用:100x美元 + 250x美元 + 10万美元 + 10x美元 = 360x + 10万美元

学生的解决方案和实际解决方案是否相同:否

学生的成绩:不正确
'''

原则三:编写结构化的指令

  • 当我们要给大模型输入上下文和指令时,输入的内容如果能结构化的展示给大模型,有助于大模型更好的理解上下文内容,例如:
prompt1 = f"""
常见的行业包括互联网、金融、农林牧渔、纺织业;请判断基金经理属于哪个行业?
"""

prompt2 = f"""
常见的行业包括:
- 互联网
- 金融
- 农林牧渔
- 纺织业
请判断基金经理属于以上哪个行业?
"""
  • 当一个任务比较复杂时,我们可以将其细分拆解,以方便我们分模块来优化prompt,也方便整个算法流程的迭代优化和管理。
  • 11
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值