这样逐步优化Prompt,让ChatGPT输出你想要的结果!

2,631 阅读10分钟

帮朋友推广一下公众号,欢迎大家关注,谢谢!

公众号二维码.jpg

引言

上一篇文章《这样设置Prompt,让ChatGPT输出更优的结果!》聊到了写好 Prompt的几个原则和策略。

这篇文章继续聊一聊:如何通过持续迭代Prompt来获得更优质、更符合预期的ChatGPT结果

概述

在机器学习领域,通常的开发流程是这样的:

  • 有初步的想法
  • 实现它:编写代码、获取数据、训练模型、获得结果
  • 评估输出结果,进行错误分析
  • 修改实现细节,重新获得结果、评估结果
  • 按照上面方式反复迭代

在编写 Prompt 以使用 LLM 开发应用程序时,这个过程跟上述非常相似。

您有一个关于要完成的任务的想法,可以尝试编写第一个 Prompt,满足上一章说过的两个原则:①清晰明确;②给系统足够的时间思考。

然后您可以运行它并查看结果。

如果第一次效果不好,那么迭代的过程就是找出为什么指令不够清晰或为什么没有给算法足够的时间思考,以便改进想法、改进提示等等,循环多次,直到找到适合您的应用程序的Prompt。

下面,将以“从产品说明书中生成营销文案”这一示例,来展示一些框架,以提示您思考如何迭代地分析和完善你的 Prompt。

准备环境

import openai
from IPython.display import display, HTML
​
# 查看api-Key: https://beta.openai.com/account/api-keys
openai.api_key = "sk-XXXX"# 一个封装 OpenAI 接口的函数,参数为 Prompt,返回对应结果
def get_completion(prompt, model="gpt-3.5-turbo"):
    messages = [{"role": "user", "content": prompt}]
    response = openai.ChatCompletion.create(
        model=model,
        messages=messages,
        temperature=0,  # 模型输出的温度系数,控制输出的随机程度
    )
    return response.choices[0].message["content"]

任务描述

这里有一个椅子的产品说明书。

描述说它是一个中世纪灵感家族的一部分,讨论了构造、尺寸、椅子选项、材料等等,产地是意大利。

假设您想要使用这份说明书帮助营销团队为在线零售网站撰写营销式描述。

fact_sheet_chair = f"""
    概述
        美丽的中世纪风格办公家具系列的一部分,包括文件柜、办公桌、书柜、会议桌等。
        多种外壳颜色和底座涂层可选。
        可选塑料前后靠背装饰(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
# 原始的Prompt
prompt = f"""
    你的任务是帮助营销团队创建一个产品的营销说明。
    产品的技术说明书在三个引号包括的内容里。
    
    ```{fact_sheet_chair}```
    """response = get_completion(prompt)
print(response)

以下是第一版输出结果

营销说明:
​
欢迎来到我们的美丽中世纪风格办公家具系列!我们很自豪地向您介绍我们的SWC系列办公椅。这款椅子是我们系列中的一部分,包括文件柜、办公桌、书柜、会议桌等。我们提供多种外壳颜色和底座涂层可选,以及可选塑料前后靠背装饰(SWC-100)或10种面料和6种皮革的全面装饰(SWC-110)。底座涂层选项为:不锈钢、哑光黑色、光泽白色或铬。椅子可带或不带扶手,适用于家庭或商业场所。我们的SWC系列符合合同使用资格,为您提供高品质的办公家具。
​
SWC系列办公椅的结构非常坚固,采用五个轮子的塑料涂层铝底座,气动椅子调节,方便升降。尺寸为宽度53厘米|20.87英寸,深度51厘米|20.08英寸,高度80厘米|31.50英寸,座椅高度44厘米|17.32英寸,座椅深度41厘米|16.14英寸。我们提供软地板或硬地板滚轮选项,以及两种座椅泡沫密度可选:中等(1.8磅/立方英尺)或高(2.8磅/立方英尺)。您可以选择无扶手或8个位置PU扶手。
​
我们的SWC系列办公椅采用高品质的材料制成。外壳底座滑动件采用改性尼龙PA6/PA66涂层的铸铝,外壳厚度为10毫米。座椅采用HD36泡沫,为您提供舒适的坐感。
​
我们的SWC系列办公椅是意大利制造,为您提供高品质的办公家具。我们相信,您会喜欢我们的SWC系列办公椅,它将为您的办公室带来美丽和舒适。

这个结果似乎很好地写了一个描述,介绍了一个中世纪灵感办公椅,很好地完成了任务,即从技术说明书开始编写产品描述。

但是对于营销方案来说,太长了。

如果希望能更精简,则可以在Prompt中增加指示:最多使用50个字

第二版Prompt

# 增加了字数限定
prompt = f"""
    你的任务是帮助营销团队创建一个产品的营销说明。
    产品的技术说明书在三个引号包括的内容里。
    使用中文,最多使用50个词。
    
    ```{fact_sheet_chair}```
    """
response = get_completion(prompt)
print(response)

以下是第二版输出结果:

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

可以看到第二版结果精简了很多。

LLM在遵循非常精确的字数限制方面表现尚可,但并不十分出色。有时它会输出60或65个单词的内容,但这仍然是可以接受的。

这是因为LLM解释文本时使用了一种叫做分词器的工具,但在计算字符方面表现一般。有许多不同的方法可以尝试控制您获得的输出长度。

但是,这一版的问题是:如果我们的内容不是直接针对消费者,而是针对零售商(更关心椅子的技术细节和材料),那么这个结果对我们来说仍然不是最优的。

在这种情况下,你可以修改这个提示,让它更精确地描述椅子的技术细节。

第三版Prompt
# 增加了侧重技术细节的要求
prompt = f"""
    你的任务是帮助营销团队创建一个产品的营销说明。
    产品的技术说明书在三个引号包括的内容里。
    使用中文,最多使用50个词。
    该描述面向家具零售商,因此应具有技术性质,并侧重于产品的材料构造。
    
    ```{fact_sheet_chair}```
    """
response = get_completion(prompt)
print(response)

第三版的输出结果:

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

这个版本的结果,带了更多的技术细节。

如果想要在结果的末尾带上更明显的产品ID信息,可以这样修改Prompt。

# 末尾增加了产品ID信息
prompt = f"""
    你的任务是帮助营销团队创建一个产品的营销说明。
    产品的技术说明书在三个引号包括的内容里。
    使用中文,最多使用50个词。
    该描述面向家具零售商,因此应具有技术性质,并侧重于产品的材料构造。
    在描述的末尾,带上产品的ID信息。
    
    ```{fact_sheet_chair}```
    """
response = get_completion(prompt)
print(response)

新的输出结果如下:

这款中世纪风格办公家具系列包括文件柜、办公桌、书柜、会议桌等,可选多种外壳颜色和底座涂层。底座涂层选项为不锈钢、哑光黑色、光泽白色或铬。椅子可带或不带扶手,适用于家庭或商业场所。座椅采用HD36泡沫,外壳底座滑动件采用改性尼龙PA6/PA66涂层的铸铝。产品ID:SWC-100/SWC-110。
第四版Prompt

以上几个版本的Prompt,演示了这么一种原则:Prompt 应该保持清晰和明确,并在必要时给模型一些思考时间。

并展示了这么一种迭代过程:首先尝试编写 Prompt ,看看会发生什么,然后从那里开始迭代地完善 Prompt,以逐渐接近所需的结果。许多成功的Prompt都是通过这种迭代过程得出的。

下面,通过额外的说明,要求它抽取信息并组织成表格,并指定表格的列、表名和格式,还要求它将所有内容格式化为可以在网页使用的 HTML。

这有助于我们对ChatGPT的能力有更深入的了解。

# 要求它抽取信息并组织成表格,并指定表格的列、表名和格式
# 表格是以 HTML 格式呈现的,加载出来
from IPython.display import display, HTML
​
prompt = f"""
    你的任务是帮助营销团队创建一个产品的营销说明。
    产品的技术说明书在三个引号包括的内容里。
    使用中文,最多使用50个词。
    该描述面向家具零售商,因此应具有技术性质,并侧重于产品的材料构造。
    在描述的末尾,带上产品的ID信息。
    
    在描述之后,包括一个表格,提供产品的尺寸。
    表格应该有两列,第一列包括尺寸的名称,第二列只包括英寸的测量值。
    将所有内容格式化为可用于网站的HTML格式。
    
    ```{fact_sheet_chair}```
    """
response = get_completion(prompt)
# 表格是以 HTML 格式呈现出来
display(HTML(response))

输出内容如下:(可以保存到一个HTML文件中,用浏览器打开网页)

<h2>产品营销说明</h2>
<p>我们的中世纪风格办公家具系列包括文件柜、办公桌、书柜、会议桌等,适用于家庭或商业场所。可选多种外壳颜色和底座涂层,底座涂层选项为不锈钢、哑光黑色、光泽白色或铬。椅子可带或不带扶手,可选塑料前后靠背装饰或10种面料和6种皮革的全面装饰。符合合同使用资格。</p>
<h3>结构</h3>
<p>五个轮子的塑料涂层铝底座,气动椅子调节,方便升降。</p>
<h3>材料</h3>
<ul>
  <li>外壳底座滑动件:改性尼龙PA6/PA66涂层的铸铝,外壳厚度为10毫米。</li>
  <li>座椅:HD36泡沫。</li>
</ul>
<h3>选项</h3>
<ul>
  <li>软地板或硬地板滚轮选项。</li>
  <li>两种座椅泡沫密度可选:中等(1.8磅/立方英尺)或高(2.8磅/立方英尺)。</li>
  <li>无扶手或8个位置PU扶手。</li>
</ul>
<p>原产国:意大利。 产品ID:SWC-100</p>
​
<table>
  <tr>
    <th>尺寸名称</th>
    <th>英寸测量值</th>
  </tr>
  <tr>
    <td>宽度</td>
    <td>20.87</td>
  </tr>
  <tr>
    <td>深度</td>
    <td>20.08</td>
  </tr>
  <tr>
    <td>高度</td>
    <td>31.50</td>
  </tr>
  <tr>
    <td>座椅高度</td>
    <td>17.32</td>
  </tr>
  <tr>
    <td>座椅深度</td>
    <td>16.14</td>
  </tr>
</table>

参考资料:

www.deeplearning.ai/short-cours…