简介

梅子留酸软齿牙,芭蕉分绿与窗纱。日长睡起无情思,闲看儿童捉柳花。小伙伴们好,我是微信公众号《小窗幽记机器学习》的小编:卖冰棍的小男孩。紧接前文LLM 系列 | 04:ChatGPT Prompt编写指南,今天这篇小作文主要介绍ChatGPT Prompt 编写过程中的一些迭代优化细节。 在机器学习里,先完成一个能跑通的模型,才能对它进行改进迭代;提示工程(prompt engineering)也一样,最初版本的 prompt 或许不够完美,需要学会如何一步步细化要求,进行迭代改进。本文会以将一份产品说明书转为产品营销文案为例展开说明如何根据自己的需求优化Prompt。

任务: 生成产品营销说明

这里有一个椅子的产品说明书,描述说它是一个中世纪灵感家族的一部分,讨论了构造、尺寸、椅子选项、材料等等,产地是意大利。现在想要使用这份说明书帮助营销团队为在线零售网站撰写营销说明书。

# 示例:产品说明书
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泡沫

原产国

    意大利
"
""

基于上述说明书生成一份产品营销说明:

# 提示:基于说明书创建营销描述
prompt = f"""
你的任务是帮助营销团队基于技术说明书创建一个产品的营销描述。

根据```标记的技术说明书中提供的信息,编写一个产品描述。

技术说明: ```{fact_sheet_chair}```
"
""
response = get_completion(prompt)
print(response)

输出结果如下:

产品描述:

我们自豪地推出美丽的中世纪风格办公家具系列,其中包括文件柜、办公桌、书柜、会议桌等。我们的产品有多种外壳颜色和底座涂层可选,以满足您的个性化需求。您可以选择塑料前后靠背装饰(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泡沫,原产国为意大利。

我们的产品不仅美观大方,而且质量可靠,是您家庭或商业场所的理想选择。

问题1:太长

从上面的结果看,似乎很好地将技术说明书转为一份产品营销说明,但太长了。我们可以在长度上进行限制,比如最多使用50个字。

因此,通过要求它限制生成文本长度来解决这一问题。优化后的 prompt:

# 优化后的 Prompt,要求生成描述不多于 50 词
prompt = f"""
您的任务是帮助营销团队基于技术说明书创建一个产品的零售网站描述。

根据```标记的技术说明书中提供的信息,编写一个产品描述。

最多使用50个词。

技术规格:```{fact_sheet_chair}```
"
""
response = get_completion(prompt)
print(response)

输出结果如下:

中世纪风格办公家具系列,包括文件柜、办公桌、书柜、会议桌等。多种颜色和涂层可选,可带或不带扶手。底座涂层选项为不锈钢、哑光黑色、光泽白色或铬。适用于家庭或商业场所。符合合同使用资格。意大利制造。

尝试看看结果的长度:

# 由于中文需要分词,此处直接计算整体长度
print(len(response))

输出结果是 97

如果限制改为最多使用50个字。 输出结果如下:

中世纪风格办公家具系列,包括文件柜、办公桌、书柜、会议桌等。多种颜色和涂层可选,可带或不带扶手。适用于家庭或商业场所。

print(len(response))这时候是59。还是能够比较精准控制长度!

问题2:如何关注指定方面的细节

如果这个网站并不是直接向消费者销售,而是旨在向家具零售商销售家具,他们会更关心椅子的技术细节和材料。在这种情况下,我们可以修改Prompt,让它更精确地描述椅子的技术细节。即,要求它专注于与目标受众相关的方面。

优化后的 prompt:

# 优化后的 Prompt,说明面向对象,应具有什么性质且侧重于什么方面
prompt = f"""
您的任务是帮助营销团队基于技术说明书创建一个产品的零售网站描述。

根据```标记的技术说明书中提供的信息,编写一个产品描述。

该描述面向家具零售商,因此应具有技术性质,并侧重于产品的材料构造。

使用最多50个单词。

技术规格: ```{fact_sheet_chair}```
"
""
response = get_completion(prompt)
print(response)

输出结果如下:

这款中世纪风格办公家具系列包括文件柜、办公桌、书柜和会议桌等,适用于家庭或商业场所。可选多种外壳颜色和底座涂层,底座涂层选项为不锈钢、哑光黑色、光泽白色或铬。椅子可带或不带扶手,可选软地板或硬地板滚轮,两种座椅泡沫密度可选。外壳底座滑动件采用改性尼龙PA6/PA66涂层的铸铝,座椅采用HD36泡沫。原产国为意大利。

如果想要进一步在描述的结尾加上产品ID。可以进一步改进这个提示,要求在描述的结尾,包括在技术说明中的每个7个字符产品ID。

进一步优化 prompt:

# 更进一步
prompt = f"""
您的任务是帮助营销团队基于技术说明书创建一个产品的零售网站描述。

根据```标记的技术说明书中提供的信息,编写一个产品描述。

该描述面向家具零售商,因此应具有技术性质,并侧重于产品的材料构造。

在描述末尾,包括技术规格中每个7个字符的产品ID。

使用最多50个单词。

技术规格: ```{fact_sheet_chair}```
"
""
response = get_completion(prompt)
print(response)

输出结果如下:

这款中世纪风格的办公家具系列包括文件柜、办公桌、书柜和会议桌等,适用于家庭或商业场所。可选多种外壳颜色和底座涂层,底座涂层选项为不锈钢、哑光黑色、光泽白色或铬。椅子可带或不带扶手,可选塑料前后靠背装饰或10种面料和6种皮革的全面装饰。座椅采用HD36泡沫,可选中等或高密度,座椅高度44厘米,深度41厘米。外壳底座滑动件采用改性尼龙PA6/PA66涂层的铸铝,外壳厚度为10毫米。原产国为意大利。产品ID:SWC-100/SWC-110。

问题3:如何表格形式展示结果

以上是许多开发人员通常会经历的迭代prompt开发的简短示例。像上一章中所演示的那样,prompt的编写应该保持清晰和明确,并在必要时给模型一些思考时间。在这些要求的基础上,通常值得首先尝试编写 prompt ,看看会发生什么,然后从那里开始迭代地完善 prompt,以逐渐接近所需的结果。因此,许多成功的Prompt都是通过这种迭代过程得出的。下面展示一个更复杂的prompt示例,可能会让大家对ChatGPT的能力有更深入的了解。

这里添加了一些额外的说明,要求它抽取信息并组织成表格,并指定表格的列、表名和格式,还要求它将所有内容格式化为可以在网页使用的 HTML。

优化后的Prompt:

# 要求它抽取信息并组织成表格,并指定表格的列、表名和格式
prompt = f"""
您的任务是帮助营销团队基于技术说明书创建一个产品的零售网站描述。

根据```标记的技术说明书中提供的信息,编写一个产品描述。

该描述面向家具零售商,因此应具有技术性质,并侧重于产品的材料构造。

在描述末尾,包括技术规格中每个7个字符的产品ID。

在描述之后,包括一个表格,提供产品的尺寸。表格应该有两列。第一列包括尺寸的名称。第二列只包括英寸的测量值。

给表格命名为“产品尺寸”。

将所有内容格式化为可用于网站的HTML格式。将描述放在<div>元素中。

技术规格:```{fact_sheet_chair}```
"
""

response = get_completion(prompt)
print(response)

输出结果如下:

<div>
<h2>中世纪风格办公家具系列 - 椅子</h2>
<p>这款椅子是中世纪风格办公家具系列的一部分,适用于家庭或商业场所。它有多种外壳颜色和底座涂层可选,可选塑料前后靠背装饰或10种面料和6种皮革的全面装饰。椅子可带或不带扶手,底座涂层选项为不锈钢、哑光黑色、光泽白色或铬。它符合合同使用资格,是一款高品质的办公家具。</p>
<p>该椅子的结构是五个轮子的塑料涂层铝底座,气动椅子调节,方便升降。座椅采用HD36泡沫,可选两种座椅泡沫密度:中等(1.8磅/立方英尺)或高(2.8磅/立方英尺)。外壳底座滑动件采用改性尼龙PA6/PA66涂层的铸铝,外壳厚度为10毫米。该椅子的原产国是意大利。</p>
<p>产品ID:SWC-100</p>
</div>

<table>
  <caption>产品尺寸</caption>
  <tr>
    <th>宽度</th>
    <td>20.87英寸</td>
  </tr>
  <tr>
    <th>深度</th>
    <td>20.08英寸</td>
  </tr>
  <tr>
    <th>高度</th>
    <td>31.50英寸</td>
  </tr>
  <tr>
    <th>座椅高度</th>
    <td>17.32英寸</td>
  </tr>
  <tr>
    <th>座椅深度</th>
    <td>16.14英寸</td>
  </tr>
</table>

将内容以html方式存储和打开。如果是 notebook,可以如下直接IPython Notebook直接展示:

# 表格是以 HTML 格式呈现的,加载出来
from IPython.display import display, HTML

display(HTML(response))

结果如下:

小结

总之,编写 prompt 的思路就是先有一个简单的版本,然后在迭代中优化!后续会以文本摘要、文本推断、文本转换、文本拓写和聊天机器人为例具体说明如何编写对应的 prompt,敬请关注!