提示词工程 ¶
约 1640 个字 166 行代码 预计阅读时间 10 分钟
Base LLM and Instruction Tuned LLM¶
对比项 | Base LLM(基础模型) | Instruction-Tuned LLM(指令微调模型) |
---|---|---|
训练目标 | 预测下一个单词,学习语言模式 | 理解并执行用户的指令 |
微调方式 | 仅基于大规模文本数据训练 | 额外使用人类指令数据集进行微调 |
交互方式 | 需要非常具体的 Prompt 设计 | 直接理解用户的任务并输出答案 |
适用场景 | 适用于自由文本生成(如文章写作、创意内容) | 适用于问答、代码、对话、任务执行 |
输出风格 | 可能会输出冗长、模糊的内容 | 直接回答问题,更符合人类期望 |
是否经过 RLHF | ❌ 通常没有 | ✅ 可能使用人类反馈强化学习优化 |
- 如果你问一个 Base LLM:
"What is the capital of France?"(法国的首都是哪里
? )
可能的回答:
"The capital of France is a city located in Europe. It is known for its culture and history. Many people visit it every year."
由于 Base LLM 仅基于模式匹配,它可能无法直接给出 "Paris" 这样精准的答案,而是会倾向于生成较一般性的文本。
- 如果你问一个 Instruction Tund LLM 同样的问题
可能的回答:
"Paris"
即使你输入:
"Give me the capital of France in one word."
也能正确理解并回答:
"Paris"
- Instruction Tuned LLM 在 Base LLM 上额外训练
- 现代 AI 助手基本都基于 Instruction Tuned LLM
- 一句话总结 : 如果 Base LLM 是语言模式生成器,那么 Instruction Tune LLM 就是能听懂人话的智能助手
编写 Prompt 的原则 ¶
PS: 下述所有代码适用于通过 API 进行文本交互的 AI,而不是基于 GUI 直接输入的 AI 界面。在与后者交互时使用自然语言即可
原则一:编写清晰具体的指令 ¶
I. 策略一:使用分隔符清晰地表示输入的不同部分,可以是 ```, "", <> 等
text = f"""
你应该提供尽可能清晰、具体的指示,以表达你希望模型执行的任务。\
这将引导模型朝向所需的输出,并降低收到无关或不正确响应的可能性。\
不要将写清晰的提示与写简短的提示混淆。\
在许多情况下,更长的提示可以为模型提供更多的清晰度和上下文信息,从而导致更详细和相关的输出。
"""
# 需要总结的文本内容
prompt = f"""
把用三个单引号括起来的文本总结成一句话。
'''{text}'''
"""
# 指令内容,使用 ``` 来分隔指令和待总结的内容
response = get_completion(prompt)
print(response)
response = get_completion(prompt)
:将prompt
作为输入,发送给某个 AI 模型(例如 GPT) ,然后获取它的回复,并存储在response
变量中。print(response)
: 打印回答
II. 策略二:要求一个结构化的输出,可以是 json、HTML 等格式
prompt = f"""
请生成包括书名、作者和类别的三本虚构书籍清单,\
并以 JSON 格式提供,其中包含以下键:book_id、title、author、genre。
"""
response = get_completion(prompt)
print(response)
III. 策略三:要求模型检查是否满足条件
# 有步骤的文本
text_1 = f"""
泡一杯茶很容易。首先,需要把水烧开。\
在等待期间,拿一个杯子并把茶包放进去。\
一旦水足够热,就把它倒在茶包上。\
等待一会儿,让茶叶浸泡。几分钟后,取出茶包。\
如果你愿意,可以加一些糖或牛奶调味。\
就这样,你可以享受一杯美味的茶了。
"""
prompt = f"""
您将获得由三个引号括起来的文本。\
如果它包含一系列的指令,则需要按照以下格式重新编写这些指令:
第一步 - ...
第二步 - …
…
第N步 - …
如果文本中不包含一系列的指令,则直接写“未提供步骤”。"
\"\"\"{text_1}\"\"\"
"""
response = get_completion(prompt)
print("Text 1 的总结:")
print(response)
IV. 策略四:提供少量示例
prompt = f"""
你的任务是以一致的风格回答问题。
<孩子>: 教我耐心。
<祖父母>: 挖出最深峡谷的河流源于一处不起眼的泉眼;最宏伟的交响乐从单一的音符开始;最复杂的挂毯以一根孤独的线开始编织。
<孩子>: 教我韧性。
"""
response = get_completion(prompt)
print(response)
原则二:给模型时间去思考 ¶
I. 策略一:指定完成任务所需的步骤
text = f"""
在一个迷人的村庄里,兄妹杰克和吉尔出发去一个山顶井里打水。\
他们一边唱着欢乐的歌,一边往上爬,\
然而不幸降临——杰克绊了一块石头,从山上滚了下来,吉尔紧随其后。\
虽然略有些摔伤,但他们还是回到了温馨的家中。\
尽管出了这样的意外,他们的冒险精神依然没有减弱,继续充满愉悦地探索。
"""
# example 1
prompt_1 = f"""
执行以下操作:
1-用一句话概括下面用三个单引号括起来的文本。
2-将摘要翻译成法语。
3-在法语摘要中列出每个人名。
4-输出一个 JSON 对象,其中包含以下键:French_summary,num_names。
请用换行符分隔您的答案。
Text:
'''{text}'''
"""
response = get_completion(prompt_1)
print("prompt 1:")
print(response)
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)
II. 策略二:指导模型在下结论前先找出一个自己的解法
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)
接下来要求 AI 给出自己的解决方案
prompt = 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)
局限性 ¶
python prompt = f""" 告诉我 Boie 公司生产的 AeroGlide UltraSlim Smart Toothbrush 的相关信息 """ response = get_completion(prompt) print(response)
```
response¶
Boie 公司生产的 AeroGlide UltraSlim Smart Toothbrush 是一款智能牙刷,具有以下特点:
-
超薄设计:刷头仅有 0.8 毫米的厚度,可以更容易地进入口腔深处,清洁更彻底。
-
智能感应:牙刷配备了智能感应技术,可以自动识别刷头的位置和方向,确保每个部位都得到充分的清洁。
-
高效清洁:牙刷采用了高速振动技术,每分钟可达到 40000 次,可以有效去除牙菌斑和污渍。
-
轻松携带:牙刷采用了便携式设计,可以轻松放入口袋或旅行包中,随时随地进行口腔清洁。
-
环保材料:牙刷采用了环保材料制造,不含有害物质,对环境友好。
总之,Boie 公司生产的 AeroGlide UltraSlim Smart Toothbrush 是一款高效、智能、环保的牙刷,可以帮助用户轻松保持口腔健康。
实际上 Boie 公司真实存在,而 AeroGlide UltraSlim Smart Toothbrush 这一产品并不存在,但 ChatGPT 还是一本正经地编造了答案
## 迭代式提示开发
### 任务——从产品说明书生成一份营销产品描述
- `fact_sheet_chair` 中包含的是产品说明书中的内容
- 鉴于回答太长就没放进来,只阐述了回答中的问题
prompt-1¶
你的任务是帮助营销团队基于技术说明书创建一个产品的营销描述。 根据标记的技术说明书中提供的信息,编写一个产品描述。 技术说明:
```
prompt-2¶
您的任务是帮助营销团队基于技术说明书创建一个产品的零售网站描述。 根据标记的技术说明书中提供的信息,编写一个产品描述。 使用最多50个词。 技术规格:
```
prompt-3¶
您的任务是帮助营销团队基于技术说明书创建一个产品的零售网站描述。 根据```标记的技术说明书中提供的信息,编写一个产品描述。 该描述面向家具零售商,因此应具有技术性质,并侧重于产品的材料构造。 使用最多50个单词。 技术规格:
prompt-4¶
您的任务是帮助营销团队基于技术说明书创建一个产品的零售网站描述。 根据标记的技术说明书中提供的信息,编写一个产品描述。 该描述面向家具零售商,因此应具有技术性质,并侧重于产品的材料构造。 在描述末尾,包括技术规格中每个7个字符的产品ID。 在描述之后,包括一个表格,提供产品的尺寸。表格应该有两列。第一列包括尺寸的名称。第二列只包括英寸的测量值。 给表格命名为“产品尺寸”。 将所有内容格式化为可用于网站的HTML格式。将描述放在<div>元素中。 技术规格:
Final response:
这款椅子是中世纪风格办公家具系列的一部分,适用于家庭或商业场所。它有多种外壳颜色和底座涂层可选,包括不锈钢、哑光黑色、光泽白色或铬。您可以选择带或不带扶手的椅子,以及软地板或硬地板滚轮选项。此外,您可以选择两种座椅泡沫密度:中等(1.8 磅 / 立方英尺)或高(2.8 磅 / 立方英尺
椅子的外壳底座滑动件是改性尼龙 PA6/PA66 涂层的铸铝,外壳厚度为 10 毫米。座椅采用 HD36 泡沫,底座是五个轮子的塑料涂层铝底座,可以进行气动椅子调节,方便升降。此外,椅子符合合同使用资格,是您理想的选择。
产品 ID:SWC-100
产品尺寸
宽度 | 20.87 英寸 |
深度 | 20.08 英寸 |
高度 | 31.50 英寸 |
座椅高度 | 17.32 英寸 |
座椅深度 | 16.14 英寸 |
本章的主要内容是 LLM 在开发应用程序中的迭代式提示开发过程。开发者需要先尝试编写提示,然后通过迭代逐步完善它,直至得到需要的结果。关键在于拥有一种有效的开发 Prompt 的过程,而不是知道完美的 Prompt。对于一些更复杂的应用程序,可以对多个样本进行迭代开发提示并进行评估。最后,可以在更成熟的应用程序中测试多个 Prompt 在多个样本上的平均或最差性能。在使用 Jupyter 代码笔记本示例时,请尝试不同的变化并查看结果。