第三章 迭代优化
当使用 LLM 构建应用程序时,实践层面上很难第一次尝试就成功获得适合最终应用的 Prompt。但这并不重要,只要您有一个好的迭代过程来不断改进您的 Prompt,那么您就能够得到一个适合任务的 Prompt。虽然相比训练机器学习模型,在 Prompt 方面一次成功的几率可能会高一些,但正如上所说, Prompt 是否一次完善并不重要。最重要的是层层迭代为您的应用程序找到有效 Prompt 的过程。
因此在本章中,我们将以产品说明书中生成营销文案为例,来展示一些流程框架,并提示您思考如何层层迭代地分析和完善您的 Prompt。
在吴恩达(Andrew Ng,原教程作者)的机器学习课程中展示过一张图表,说明了机器学习开发的流程。通常是先有一个想法,然后再用以下流程实现:编写代码,获取数据,训练模型,获得实验结果。然后您可以查看结果,分析误差与错误,找出适用领域,甚至可以更改您对具体问题的具体思路或解决方法。此后再次更改实现,并运行另一个实验等,反复迭代,最终获得有效的机器学习模型。在编写基于 LLM 的应用程序的 Prompt 时,流程可能非常相似。您产生了关于要完成的任务的想法后,可以尝试编写第一个 Prompt ,注意要满足上一章说过的两个原则:清晰明确,并且给系统足够的时间思考。然后您可以运行并查看结果。如果第一次效果不好,那么迭代的过程就是找出为什么指令不够清晰或为什么没有给算法足够的时间思考,以便改进想法、改进 Prompt 等等,循环多次,直到找到适合您的应用程序的 Prompt。
很难有适用于世间万物的所谓"最佳 Prompt ",更好的方法是找到有效的迭代过程,以便您可以快速地找到一个适合您的应用程序的 Prompt
环境配置
参考第二章的 环境配置小节内容即可。
任务--从产品说明书生成一份营销产品描述
给定一份椅子的资料页。描述说它属于中世纪灵感系列,产自意大利,并介绍了材料、构造、尺寸、可选配件等参数。假设您想要使用这份说明书帮助营销团队为电商平台撰写营销描述稿:
java
String sheet = "概述\n" +
"\n" +
" 美丽的中世纪风格办公家具系列的一部分,包括文件柜、办公桌、书柜、会议桌等。\n" +
" 多种外壳颜色和底座涂层可选。\n" +
" 可选塑料前后靠背装饰(SWC-100)或10种面料和6种皮革的全面装饰(SWC-110)。\n" +
" 底座涂层选项为:不锈钢、哑光黑色、光泽白色或铬。\n" +
" 椅子可带或不带扶手。\n" +
" 适用于家庭或商业场所。\n" +
" 符合合同使用资格。\n" +
"\n" +
"结构\n" +
"\n" +
" 五个轮子的塑料涂层铝底座。\n" +
" 气动椅子调节,方便升降。\n" +
"\n" +
"尺寸\n" +
"\n" +
" 宽度53厘米|20.87英寸\n" +
" 深度51厘米|20.08英寸\n" +
" 高度80厘米|31.50英寸\n" +
" 座椅高度44厘米|17.32英寸\n" +
" 座椅深度41厘米|16.14英寸\n" +
"\n" +
"选项\n" +
"\n" +
" 软地板或硬地板滚轮选项。\n" +
" 两种座椅泡沫密度可选:中等(1.8磅/立方英尺)或高(2.8磅/立方英尺)。\n" +
" 无扶手或8个位置PU扶手。\n" +
"\n" +
"材料\n" +
"外壳底座滑动件\n" +
"\n" +
" 改性尼龙PA6/PA66涂层的铸铝。\n" +
" 外壳厚度:10毫米。\n" +
" 座椅\n" +
" HD36泡沫\n" +
"\n" +
"原产国\n" +
"\n" +
" 意大利";
java
String prompt = "您的任务是帮助营销团队基于技术说明书创建一个产品的营销描述。\n" +
"\n" +
"根据```标记的技术说明书中提供的信息,编写一个产品描述。\n" +
"\n" +
"技术说明: ```" + this.sheet + "```";
String message = this.getCompletion(prompt);
log.info("iterative1:{}", message);
产品描述:
我们自豪地推出美丽的中世纪风格办公家具系列,其中包括文件柜、办公桌、书柜和会议桌等多种产品。这个系列提供了多种外壳颜色和底座涂层选择,以满足不同客户的需求和喜好。
我们的产品有两种装饰风格可供选择。一种是塑料前后靠背装饰(SWC-100),另一种是全面装饰,提供10种面料和6种皮革选项(SWC-110)。您可以根据个人喜好和场所需求来选择适合您的装饰风格。
底座涂层也有多种选择,包括不锈钢、哑光黑色、光泽白色或铬。您可以根据您的整体办公室风格和个人喜好来选择最适合的底座涂层。
我们的椅子设计考虑到了不同用户的需求。您可以选择带扶手或不带扶手的椅子,以满足您的个人偏好和使用习惯。
这款产品不仅适用于家庭使用,也非常适合商业场所。无论您是在家办公还是在办公室工作,我们的产品都能为您提供舒适和时尚的办公环境。
我们的产品符合合同使用资格,确保了产品的质量和可靠性。您可以放心购买和使用我们的产品。
产品的结构非常坚固和稳定。底座采用了五个轮子的塑料涂层铝底座,方便您在办公室中移动和调整位置。椅子还配备了气动调节功能,可以轻松调整椅子的高度,以适应不同的工作需求。
产品的尺寸为宽度53厘米,深度51厘米,高度80厘米,座椅高度44厘米,座椅深度41厘米。这个尺寸设计既符合人体工程学,又能提供舒适的使用体验。
我们还提供了一些选项供您选择。您可以根据地板类型选择软地板或硬地板滚轮。座椅泡沫密度也有两种选择:中等(1.8磅/立方英尺)或高(2.8磅/立方英尺)。此外,您还可以选择无扶手或8个位置PU扶手。
我们的产品采用高质量的材料制造而成。外壳底座滑动件采用改性尼龙PA6/PA66涂层的铸铝,确保了产品的耐用性和稳定性。座椅采用HD36泡沫,提供舒适的坐感和支撑。
我们的产品是意大利制造,以其精湛的工艺和高品质而闻名。我们致力于为客户提供优质的产品和满意的购物体验。
无论您是在家办公还是在商业场所工作,我们的产品都能为您提供舒适、时尚和高品质的办公家具解决方案。选择我们的产品,让您的办公环境更加美丽和舒适!
问题一:生成文本太长
它似乎很好地完成了要求,即从技术说明书开始编写产品描述,介绍了一个精致的中世纪风格办公椅。但是当我看到这个时,我会觉得这个太长了。
所以在上述过程中,我产生想法后写了一个 Prompt ,并得到了结果,但是我对它不是很满意,因为它太长了。所以我澄清我的 Prompt ,要求它限制生成文本长度,要求最多使用50个字。
java
String prompt = "您的任务是帮助营销团队基于技术说明书创建一个产品的营销描述。\n" +
"\n" +
"根据```标记的技术说明书中提供的信息,编写一个产品描述。\n" +
"使用最多50个词。\n" +
"技术说明: ```" + this.sheet + "```";
String message = this.getCompletion(prompt);
log.info("iterative2:\n{}", message);
我们的中世纪风格办公家具系列包括文件柜、办公桌、书柜和会议桌。多种颜色和涂层可选。可选择塑料或面料/皮革装饰。底座涂层选项有不锈钢、黑色、白色或铬。椅子可带或不带扶手。适用于家庭或商业场所。尺寸为53x51x80厘米,座椅高度44厘米,座椅深度41厘米。可选择软地板或硬地板滚轮,两种座椅泡沫密度可选,可选择无扶手或8个位置PU扶手。材料为改性尼龙PA6/PA66涂层的铸铝和HD36泡沫。原产国为意大利。
问题二:抓错文本细节
我们继续完善这段推广词,会发现的第二个问题是,这个网站并不是直接向消费者销售,它实际上面向的是家具零售商,他们会更关心椅子的技术细节和材料。在这种情况下,您可以继续修改这个 Prompt ,让它更精确地描述椅子的技术细节。
解决方法:要求它专注于与目标受众相关的方面。
java
String prompt = "您的任务是帮助营销团队基于技术说明书创建一个产品的零售网站描述。\n" +
"根据```标记的技术说明书中提供的信息,编写一个产品描述。\n" +
"该描述面向家具零售商,因此应具有技术性质,并侧重于产品的材料构造。\n" +
"使用最多50个单词。\n" +
"技术说明: ```" + this.sheet + "```";
String message = this.getCompletion(prompt);
log.info("iterative3:\n{}", message);
我们的中世纪风格办公家具系列是您家具零售店的理想选择。这个系列包括文件柜、办公桌、书柜和会议桌等多种产品。您可以选择多种外壳颜色和底座涂层。座椅有两种装饰选项:塑料前后靠背装饰或面料和皮革的全面装饰。底座涂层可选不锈钢、哑光黑色、光泽白色或铬。椅子可以选择带或不带扶手。这些产品适用于家庭或商业场所,并符合合同使用资格。结构稳固,底座采用五个轮子的塑料涂层铝底座,方便升降。尺寸为宽度53厘米、深度51厘米、高度80厘米、座椅高度44厘米和座椅深度41厘米。您可以选择软地板或硬地板滚轮,以及两种座椅泡沫密度:中等或高。此外,您还可以选择无扶手或8个位置PU扶手。产品的外壳底座滑动件采用改性尼龙PA6/PA66涂层的铸铝,外壳厚度为10毫米。座椅采用HD36泡沫。这些产品是意大利制造。
可见,通过修改 Prompt ,模型的关注点倾向了具体特征与技术细节。
我可能进一步想要在描述的结尾展示出产品ID。因此,我可以进一步改进这个 Prompt ,要求在描述的结尾,展示出说明书中的7位产品ID。
java
String prompt = "您的任务是帮助营销团队基于技术说明书创建一个产品的零售网站描述。\n" +
"根据```标记的技术说明书中提供的信息,编写一个产品描述。\n" +
"该描述面向家具零售商,因此应具有技术性质,并侧重于产品的材料构造。\n" +
"在描述末尾,包括技术规格中每个7个字符的产品ID。\n" +
"使用最多50个单词。\n" +
"技术说明: ```" + this.sheet + "```";
String message = this.getCompletion(prompt);
log.info("iterative4:\n{}", message);
我们很高兴向您介绍我们的美丽中世纪风格办公家具系列。该系列包括文件柜、办公桌、书柜和会议桌等多种产品。我们提供多种外壳颜色和底座涂层供您选择。您可以选择塑料前后靠背装饰(SWC-100)或全面装饰(SWC-110),后者提供10种面料和6种皮革可供选择。底座涂层选项包括不锈钢、哑光黑色、光泽白色或铬。椅子可选择带或不带扶手。这些产品适用于家庭或商业场所,并符合合同使用资格。
产品的结构非常坚固,底座采用五个轮子的塑料涂层铝底座。椅子采用气动调节,方便升降。
产品的尺寸为宽度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泡沫制成。
这些产品是意大利制造,以确保高品质和精细工艺。
产品ID:SWC-100
以上是许多开发人员通常会经历的 Prompt 开发的迭代过程简短示例。我的建议是,像上一章中所演示的那样,Prompt 应该保持清晰和明确,并在必要时给模型一些思考时间。
在这些要求的基础上,常见流程是首先尝试编写一版 Prompt ,看看会发生什么,然后继续迭代完善 Prompt,以逐渐接近所需的结果。许多成功的 Prompt 都是通过这种迭代过程得出的。我将向您展示一个更复杂的 Prompt 示例,可能会让您对 ChatGPT 的能力有更深入的了解。
问题三:添加表格描述
继续添加指引,要求提取产品尺寸信息并组织成表格,并指定表格的列、表名和格式;再将所有内容格式化为可以在网页使用的 HTML。
java
String prompt = "您的任务是帮助营销团队基于技术说明书创建一个产品的零售网站描述。\n" +
"根据```标记的技术说明书中提供的信息,编写一个产品描述。\n" +
"该描述面向家具零售商,因此应具有技术性质,并侧重于产品的材料构造。\n" +
"在描述末尾,包括技术规格中每个7个字符的产品ID。\n" +
"在描述之后,包括一个表格,提供产品的尺寸。表格应该有两列。第一列包括尺寸的名称。第二列只包括英寸的测量值。\n" +
"给表格命名为"产品尺寸"。\n" +
"将所有内容格式化为可用于网站的HTML格式。将描述放在<div>元素中。\n" +
"技术说明: ```" + this.sheet + "```";
String message = this.getCompletion(prompt);
log.info("iterative5:\n{}", message);
html的输出:
html
<div>
<h2>产品描述</h2>
<p>这款美丽的中世纪风格办公家具系列是家具零售商的理想选择。该系列包括文件柜、办公桌、书柜和会议桌等多种产品。您可以根据需求选择不同的外壳颜色和底座涂层。外观装饰方面,您可以选择塑料前后靠背装饰(SWC-100)或10种面料和6种皮革的全面装饰(SWC-110)。底座涂层选项包括不锈钢、哑光黑色、光泽白色或铬。椅子可以选择带或不带扶手。无论是家庭还是商业场所,这款产品都非常适用。此外,它还符合合同使用资格。</p>
<h3>产品尺寸</h3>
<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>
<h3>选项</h3>
<ul>
<li>软地板或硬地板滚轮选项</li>
<li>两种座椅泡沫密度可选:中等(1.8磅/立方英尺)或高(2.8磅/立方英尺)</li>
<li>无扶手或8个位置PU扶手</li>
</ul>
<h3>材料</h3>
<ul>
<li>外壳底座滑动件:改性尼龙PA6/PA66涂层的铸铝,外壳厚度为10毫米</li>
<li>座椅:HD36泡沫</li>
</ul>
<p>产品ID:SWC-100</p>
</div>
本章的主要内容是 LLM 在开发应用程序中的迭代式 Prompt 开发过程。开发者需要先尝试编写 Prompt ,然后通过迭代逐步完善它,直至得到需要的结果。
作为一名高效的提示词工程师(Prompt Engineer),关键在于掌握有效的开发Prompt的过程,而不是去寻求得到"完美的"Prompt。对于一些更复杂的应用程序,可以对多个样本(如数百张说明书)进行 Prompt 的迭代开发,并在样本集上进行评估。
最后,在更成熟的应用程序中,可以观察多个Prompt在多个样本集上的表现,测试平均或最差性能。但通常,仅当应用较成型之后,才推荐您通过这种评估方式,来精益求精。
Java快速转换到大模型开发:
配套课程的所有代码已经发布在:https://github.com/Starcloud-Cloud/java-langchain
课程合作请留言