当使用 LLM 构建应用程序时,实践层面上很难*第一次尝试*就成功获得适合最终应用的 Prompt。但这并不重要,只要您有一个好的迭代过程来不断改进您的 Prompt,那么您就能够得到一个适合任务的 Prompt。
本次学习中将以产品说明书中生成营销文案为例,来展示一些Prompt的迭代优化流程框架,并提示您思考如何层层迭代地分析和完善您的 Prompt。
【学习课程来源于吴恩达的Prompt Engineering For Developers】
一、环境配置
先申请千问的API key,并配置系统环境变量,然后再自定义get_completion函数备用。
import os
import openai
from openai import OpenAI
OPENAI_API_KEY = os.environ.get("DASHSCOPE_API_KEY")
openai.api_key = OPENAI_API_KEY
def get_completion(prompt, model="qwen2.5-72b-instruct"):
"""
prompt: 对应的提示词
model: 调用的模型
"""
client = OpenAI(
api_key=os.getenv("DASHSCOPE_API_KEY"), # 如果您没有配置环境变量,请用百炼 API Key 将本行替换为:api_key="sk-xxx"
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1", # 填写 DashScope SDK 的 base_url
)
messages = [{"role": "user", "content": prompt}]
response = client.chat.completions.create(
model=model,
messages=messages,
temperature=0, # 模型输出的温度系数,控制输出的随机程度
)
return response.choices[0].message.content
# def get_response():
# completion = get_completion(prompt="你是谁?")
# print(completion)
# if __name__ == "__main__":
# get_response()
二、开始Prompt迭代优化实验
给定一份椅子的资料页。描述说它属于*中世纪灵感*系列,产自意大利,并介绍了材料、构造、尺寸、可选配件等参数。假设您想要使用这份说明书帮助营销团队为电商平台撰写营销描述稿。
1.定义产品说明书文本。
# 示例:产品说明书
fact_sheet_chair = """
概述
美丽的中世纪风格办公家具系列的一部分,包括文件柜、办公桌、书柜、会议桌等。
多种外壳颜色和底座涂层可选。
可选塑料前后靠背装饰(SWC-100)或10种面料和6种皮革的全面装饰(SWC-110)。
底座涂层选项为:不锈钢、哑光黑色、光泽白色或铬。
椅子可带或不带扶手。
适用于家庭或商业场所。
符合合同使用资格。
结构
五个轮子的塑料涂层铝底座。
气动椅子调节,方便升降。
尺寸
宽度53厘米|20.87英寸
深度51厘米|20.08英寸
高度80厘米|31.50英寸
座椅高度44厘米|17.32英寸
座椅深度41厘米|16.14英寸
选项
软地板或硬地板滚轮选项。
两种座椅泡沫密度可选:中等(1.8磅/立方英尺)或高(2.8磅/立方英尺)。
无扶手或8个位置PU扶手。
材料
外壳底座滑动件
改性尼龙PA6/PA66涂层的铸铝。
外壳厚度:10毫米。
座椅
HD36泡沫
原产国
意大利
"""
2.编写Prompt初稿:要求大模型根据产品说明书文本内容给生成一个产品描述信息。
# Prompt :基于说明书创建营销描述
prompt = f"""
您的任务是帮助营销团队基于技术说明书创建一个产品的营销描述。
根据```标记的技术说明书中提供的信息,编写一个产品描述。
技术说明: ```{fact_sheet_chair}```
"""
response = get_completion(prompt)
print(response)
执行结果:
### 中世纪风格办公家具系列 - SWC系列办公椅
**沉浸于古典与现代的完美融合**
将中世纪的魅力融入现代办公空间,我们的SWC系列办公椅不仅是一款家具,更是一件艺术品。每一件作品都精心设计,旨在提供极致的舒适体验,同时增添办公室的独特风格。
**多样化选择,满足个性化需求**
- **外观选择**:提供多种外壳颜色和底座涂层选项,确保您能找到与办公室装修风格相匹配的理想选择。
- **座位装饰**:可选配SWC-100塑料前后靠背装饰,或选择SWC-110系列,享受10种面料和6种皮革的全面装饰,让每一刻都感受到奢华。
- **底座涂层**:不锈钢、哑光黑色、光泽白色或铬,多样的底座涂层选项,为您的办公环境增添一抹亮色。
- **功能性设计**:椅子可配备或不配备扶手,适应不同用户的偏好。气动调节功能允许轻松调整座椅高度,确保最佳坐姿。
**精湛工艺,确保长久耐用**
- **结构稳固**:采用五个轮子的塑料涂层铝底座,确保稳定性与移动便利性。
- **高质量材料**:改性尼龙PA6/PA66涂层的铸铝底座滑动件,外壳厚度达10毫米,坚固耐用。
- **舒适体验**:HD36泡沫座椅,提供两种密度选择——中等(1.8磅/立方英尺)或高(2.8磅/立方英尺),确保长时间坐姿的舒适性。
- **灵活适配**:软地板或硬地板滚轮选项,适应各种地面条件;8个位置PU扶手,可根据个人喜好调整至最舒适的位置。
**适用广泛,品质保证**
无论是家庭办公室还是商业环境,SWC系列办公椅都能完美融入,提供优雅而实用的解决方案。符合合同使用资格,确保在任何专业环境中都能展现出色的性能。
**意大利制造,品质典范**
SWC系列办公椅由意大利制造,每一细节都体现了对品质的不懈追求。选择SWC,就是选择了经典与现代的完美结合,以及无与伦比的舒适体验。
立即体验SWC系列办公椅,开启您的中世纪办公之旅!
千问自由发挥的还不错,给出的描述信息量很大。
3.第一次优化:产品描述信息文本太长了,很难直接用在电商网站上,希望总结的文字能够精炼、短一些。
# 优化后的 Prompt,要求生成描述不多于 50 词
prompt = f"""
您的任务是帮助营销团队基于技术说明书创建一个产品的零售网站描述。
根据```标记的技术说明书中提供的信息,编写一个产品描述。
使用最多50个词。
技术规格:```{fact_sheet_chair}```
"""
response = get_completion(prompt)
print(response)
执行结果
源自意大利的中世纪风格办公椅,提供多种颜色与材质选择,配备气动调节功能,适合家庭与商务环境。尺寸适中,确保舒适与美观并存。
4.第二次优化:希望这个产品描述的受众是家具零售商,他们会更关心椅子的技术细节和材料,继续修改这个 Prompt ,让它更精确地描述椅子的技术细节。
# 优化后的 Prompt,说明面向对象,应具有什么性质且侧重于什么方面
prompt = f"""
您的任务是帮助营销团队基于技术说明书创建一个产品的零售网站描述。
根据```标记的技术说明书中提供的信息,编写一个产品描述。
该描述面向家具零售商,因此应具有技术性质,并侧重于产品的材料构造。
使用最多50个单词。
技术规格: ```{fact_sheet_chair}```
"""
response = get_completion(prompt)
print(response)
执行结果:
源自意大利的中世纪风格办公椅,采用改性尼龙PA6/PA66涂层铸铝底座,配备HD36泡沫座椅,提供多种颜色和材质选择,包括不锈钢、哑光黑、光泽白或铬底座涂层,适合家庭和商业环境。
5.第三次优化:想要在描述的结尾展示出产品ID,可以进一步改进这个 Prompt ,要求在描述的结尾,展示出说明书中的7位产品ID。
# 更进一步
prompt = f"""
您的任务是帮助营销团队基于技术说明书创建一个产品的零售网站描述。
根据```标记的技术说明书中提供的信息,编写一个产品描述。
该描述面向家具零售商,因此应具有技术性质,并侧重于产品的材料构造。
在描述末尾,包括技术规格中每个7个字符的产品ID。
使用最多50个单词。
技术规格: ```{fact_sheet_chair}```
"""
response = get_completion(prompt)
print(response)
执行结果:
源自意大利的中世纪风格办公椅,采用改性尼龙PA6/PA66涂层铸铝底座,配备HD36泡沫座椅,提供多种颜色与材质选择,适合各种环境。SWC-100/SWC-110
6.第四次优化:为产品描述信息中添加表格来描述产品尺寸内容,并将所有输出的内容格式化为可以在网页中使用的html格式。
# 要求它抽取信息并组织成表格,并指定表格的列、表名和格式
prompt = f"""
您的任务是帮助营销团队基于技术说明书创建一个产品的零售网站描述。
根据```标记的技术说明书中提供的信息,编写一个产品描述。
该描述面向家具零售商,因此应具有技术性质,并侧重于产品的材料构造。
在描述末尾,包括技术规格中每个7个字符的产品ID。
在描述之后,包括一个表格,提供产品的尺寸。表格应该有两列。第一列包括尺寸的名称。第二列只包括英寸的测量值。
给表格命名为“产品尺寸”。
将所有内容格式化为可用于网站的HTML格式。将描述放在元素中。
技术规格:```{fact_sheet_chair}```
"""
response = get_completion(prompt)
print(response)# 表格是以 HTML 格式呈现的,加载出来
from IPython.display import display, HTML
display(HTML(response))
执行结果:
三、总结
作为一名高效的提示词工程师(Prompt Engineer),关键在于掌握有效的开发Prompt的过程,而不是去寻求得到“完美的”Prompt。对于一些更复杂的应用程序,可以对多个样本(如数百张说明书)进行 Prompt 的迭代开发,并在样本集上进行评估。
最后,在更成熟的应用程序中,可以观察多个Prompt在多个样本集上的表现,测试平均或最差性能。但通常,**仅当**应用较成型之后,才推荐您通过这种评估方式,来精益求精。