提示原则
- 原则1:编写清晰明确的说明
- 原则2:给模型留出“思考”的时间
编写清晰明确的说明
策略
- 策略1:使用分隔符清晰地表示输入的不同部分
分隔符可以是任何东西,比如:
""", < >, <tag> </tag>, :
import openai
import os
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv())
openai.api_key = os.getenv('OPENAI_API_KEY')
def get_completion(prompt, model="gpt-3.5-turbo"):
messages = [{"role": "user", "content": prompt}]
response = openai.ChatCompletion.create(
model=model,
messages=messages,
temperature=0.1,
# this is the degree of randomness of the model's output
)
return response.choices[0].message["content"]
例子:
代码语言:javascript复制text = f"""
你应该通过提供尽可能清晰和具体的指令来表达你希望模型完成的任务。
这将引导模型朝着期望的输出方向发展,并减少接收到无关或不正确响应的机会。
不要混淆编写清晰提示与编写简短提示。
在许多情况下,更长的提示提供更多的清晰度和上下文信息,
这可能导致更详细和相关的输出。
"""
prompt = f"""
将由三个反引号分隔的文本总结成一句话。
```{text}```
"""
response = get_completion(prompt)
print(response)
输出: 编写清晰、具体的指令可引导模型朝期望输出方向发展,不要混淆简短和清晰,更长的提示提供更多上下文信息,有助于更详细、相关的输出。
- 策略2:使用结构化输出 json、html 等
例子
代码语言:javascript复制prompt = f"""
生成三本虚构书籍的书名、作者和类型,并以JSON格式提供,
包括以下键:book_id、title、author和genre。
"""
response = get_completion(prompt)
print(response)
输出
代码语言:javascript复制{
"book1": {
"book_id": "001",
"title": "The Lost City",
"author": "Emily Brown",
"genre": "Adventure"
},
"book2": {
"book_id": "002",
"title": "The Secret Garden",
"author": "Lucy Smith",
"genre": "Fantasy"
},
"book3": {
"book_id": "003",
"title": "The Time Traveler's Wife",
"author": "Olivia Green",
"genre": "Romance"
}
}
- 策略3:要求模型检查是否满足条件
text_1 = f"""
泡一杯茶很简单!首先,你需要把一些水烧开。
在水烧开的过程中,拿一个杯子并放入一个茶包。
一旦水够热,只需把水倒在茶包上。
让茶包浸泡一会儿,以便茶叶充分沉淀。
几分钟后,拿出茶包。如果你喜欢,可以加一些糖或牛奶调味。
然后就完成了!你可以享受美味的一杯茶。
"""
prompt = f"""
你将会得到用三个引号括起来的文本。如果它包含一系列的指令,则按以下格式重新编写这些指令:
步骤1 - ...
步骤2 - ...
...
步骤N - ...
如果文本不包含一系列的指令,则只需写"未提供步骤"。
"""{text_1}"""
"""
response = get_completion(prompt)
print("完成 Text 1:")
print(response)
输出
代码语言:javascript复制完成 Text 1:
步骤1 - 把一些水烧开。
步骤2 - 在水烧开的过程中,拿一个杯子并放入一个茶包。
步骤3 - 一旦水够热,只需把水倒在茶包上。
步骤4 - 让茶包浸泡一会儿,以便茶叶充分沉淀。
步骤5 - 几分钟后,拿出茶包。
步骤6 - 如果你喜欢,可以加一些糖或牛奶调味。
步骤7 - 然后就完成了!你可以享受美味的一杯茶。
代码语言:javascript复制text_2 = f"""
今天阳光明媚,鸟儿在欢唱。这是去公园散步的好天气。
鲜花盛开,树木在微风中轻轻摇晃。
人们在外面尽情享受美好的天气,有些人在野餐,
有些人在玩游戏,还有些人在草地上放松身心。
这是一个在户外度过时光,欣赏大自然之美的完美日子。
"""
prompt = f"""
你将会得到用三个引号括起来的文本。
如果它包含一系列的指令,则按以下格式重新编写这些指令:
步骤1 - ...
步骤2 - ...
...
步骤N - ...
如果文本不包含一系列的指令,则只需写"未提供步骤"。
"""{text_2}"""
"""
response = get_completion(prompt)
print("完成 Text 2:")
print(response)
输出
代码语言:javascript复制完成 Text 2:
未提供步骤
- 策略4:少样本提示
prompt = f"""
你的任务是以一致的风格回答。
<孩子>: 教我耐心的道理。
<祖父母>: 挖掘最深谷的河流源于一处不起眼的泉眼;
最壮丽的交响乐从一个音符开始演奏;
最复杂的挂毯则始于一根孤单的线头。
<孩子>: 教我关于韧性的道理。
"""
response = get_completion(prompt)
print(response)
输出
代码语言:javascript复制<祖父母>: 韧性不是一时的勇气,而是在困难面前坚持不懈的毅力。
就像一棵树在风雨中弯曲,但不会折断,最终成为一棵高大的树。
所以,无论遇到什么困难,都要坚持下去,相信自己能够克服它们。
给模型留出“思考”的时间
- 策略1:指定完成任务所需的步骤
text = f"""
在一个迷人的村庄里,兄妹杰克和吉尔踏上了从山顶井口取水的任务。
他们边唱着欢快的歌,边攀爬着,
但不幸降临了——杰克绊倒在一块石头上,
滚下了山坡,吉尔也紧随其后。
尽管略有些摔伤,他们依然回到家里,获得了温暖的拥抱。
尽管发生了这样的不幸,他们的冒险精神仍然没有消退,他们继续欢快地探索着。
"""
prompt_1 = f"""
执行以下操作:
1 - 用一句话总结由三个反引号包围的文本。
2 - 将总结翻译成法语。
3 - 在法语总结中列出每个名字。
4 - 输出一个JSON对象,其中包含以下键:french_summary,num_names。
请用换行分隔您的答案。
文本:
```{text}```
"""
response = get_completion(prompt_1)
print("Completion for prompt 1:")
print(response)
输出
代码语言:javascript复制Completion for prompt 1:
1 - 兄妹在山顶井口取水时发生了意外,但最终平安回家并继续探索。
2 - Les frères et sœurs ont eu un accident en allant chercher de l'eau à la source de la montagne, mais sont finalement rentrés chez eux en sécurité et ont continué à explorer joyeusement.
3 - Jack, Jill
4 - {"french_summary": "Les frères et sœurs ont eu un accident en allant chercher de l'eau à la source de la montagne, mais sont finalement rentrés chez eux en sécurité et ont continué à explorer joyeusement.", "num_names": 2}
特定格式输出
代码语言:javascript复制prompt_2 = f"""
你的任务是执行以下操作:
1 - 用一句话总结由<>括起来的文本。
2 - 将总结翻译成法语。
3 - 在法语总结中列出每个名字。
4 - 输出一个JSON对象,其中包含以下键:french_summary,num_names。
请使用以下格式:
文本:<要总结的文本>
总结:<总结>
翻译:<总结的翻译>
名称:<意大利语总结中的名称列表>
输出JSON:<包含总结和num_names的JSON对象>
文本: <{text}>
"""
response = get_completion(prompt_2)
print("nCompletion for prompt 2:")
print(response)
输出
代码语言:javascript复制Completion for prompt 2:
总结:兄妹在山上取水时发生意外,但最终平安回家并继续探险。
翻译:Les frères et sœurs ont eu un accident en prenant de l'eau sur la montagne, mais sont rentrés chez eux en sécurité et ont continué à explorer joyeusement.
名称:杰克,吉尔
输出JSON:{"french_summary": "Les frères et sœurs ont eu un accident en prenant de l'eau sur la montagne, mais sont rentrés chez eux en sécurité et ont continué à explorer joyeusement.", "num_names": 2}
- 策略2:指导模型在匆忙得出结论之前先自己解决问题
prompt = 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)
输出
代码语言:javascript复制这个学生的答案是正确的。(实际是错误的,模型答错了)
代码语言:javascript复制prompt = 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)
输出
代码语言:javascript复制---
成本:
土地成本:100x
太阳能电池板成本:250x
维护成本:100,000 10x(每平方英尺额外的费用) x(安装面积)
总成本:100x 250x 100,000 10x x = 361x 100,000
第一年的运营总成本是361倍安装面积加上10万美元。
---
学生的求解和你的是否一样:
---
是
---
学生答案是否正确:
---
正确
模型幻觉
代码语言:javascript复制prompt = f"""
火花思维这家公司的口碑怎么样?
"""
response = get_completion(prompt)
print(response)
输出:
代码语言:javascript复制作为AI语音交互领域的领先企业,火花思维在行业内口碑较好。
其产品和技术得到了广泛的认可和好评,
尤其是在智能客服、智能语音交互、智能语音识别等领域,
火花思维的技术和产品表现出色,得到了客户和用户的高度评价。
同时,火花思维也积极参与行业标准制定和技术创新,
为行业发展做出了积极贡献,因此在行业内具有较高的声誉和影响力。
这个回答好像是自己胡编乱造的吧