Finish PE-123 end edit
This commit is contained in:
File diff suppressed because one or more lines are too long
@ -6,15 +6,13 @@
|
||||
"source": [
|
||||
"# 第三章 迭代优化\n",
|
||||
"\n",
|
||||
"在开发大语言模型应用时,很难通过第一次尝试就得到完美适用的Prompt。但关键是要有一个**良好的迭代优化过程**,以不断改进Prompt。相比训练机器学习模型,Prompt的一次成功率可能更高,但仍需要通过多次迭代找到最适合应用的形式。\n",
|
||||
"在开发大语言模型应用时,很难通过第一次尝试就得到完美适用的 Prompt。但关键是要有一个**良好的迭代优化过程**,以不断改进 Prompt。相比训练机器学习模型,Prompt 的一次成功率可能更高,但仍需要通过多次迭代找到最适合应用的形式。\n",
|
||||
"\n",
|
||||
"本章以产品说明书生成营销文案为例,展示Prompt迭代优化的思路。这与吴恩达在机器学习课程中演示的机器学习模型开发流程相似:有了想法后,编写代码、获取数据、训练模型、查看结果。通过分析错误找出适用领域,调整方案后再次训练。Prompt开发也采用类似循环迭代的方式,逐步逼近最优。\n",
|
||||
"\n",
|
||||
"具体来说,有了任务想法后,可以先编写初版Prompt,注意清晰明确并给模型充足思考时间。运行后检查结果,如果不理想,则分析Prompt不够清楚或思考时间不够等原因,做出改进,再次运行。如此循环多次,终将找到适合应用的Prompt。\n",
|
||||
"本章以产品说明书生成营销文案为例,展示 Prompt 迭代优化的思路。这与吴恩达在机器学习课程中演示的机器学习模型开发流程相似:有了想法后,编写代码、获取数据、训练模型、查看结果。通过分析错误找出适用领域,调整方案后再次训练。Prompt 开发也采用类似循环迭代的方式,逐步逼近最优。具体来说,有了任务想法后,可以先编写初版 Prompt,注意清晰明确并给模型充足思考时间。运行后检查结果,如果不理想,则分析 Prompt 不够清楚或思考时间不够等原因,做出改进,再次运行。如此循环多次,终将找到适合应用的 Prompt。\n",
|
||||
" \n",
|
||||
"\n",
|
||||
" \n",
|
||||
"总之,很难有适用于世间万物的所谓“最佳 Prompt ”,开发高效Prompt的关键在于找到一个好的迭代优化过程,而非一开始就要求完美。通过快速试错迭代,可有效确定符合特定应用的最佳Prompt形式。\n"
|
||||
"\n",
|
||||
"总之,很难有适用于世间万物的所谓“最佳 Prompt ”,开发高效 Prompt 的关键在于找到一个好的迭代优化过程,而非一开始就要求完美。通过快速试错迭代,可有效确定符合特定应用的最佳 Prompt 形式。\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
@ -135,7 +133,7 @@
|
||||
"\n",
|
||||
"它似乎很好地完成了要求,即从技术说明书开始编写产品描述,介绍了一个精致的中世纪风格办公椅。但是当我看到这个生成的内容时,我会觉得它**太长了**。\n",
|
||||
"\n",
|
||||
"在看到语言模型根据产品说明生成的第一个版本营销文案后,我们注意到文本长度过长,不太适合用作简明的电商广告语。所以这时候就需要对Prompt进行优化改进。具体来说,第一版结果满足了从技术说明转换为营销文案的要求,描写了中世纪风格办公椅的细节。但是过于冗长的文本不太适合电商场景。这时我们就可以**在Prompt中添加长度限制**,要求生成更简洁的文案。\n"
|
||||
"在看到语言模型根据产品说明生成的第一个版本营销文案后,我们注意到文本长度过长,不太适合用作简明的电商广告语。所以这时候就需要对 Prompt 进行优化改进。具体来说,第一版结果满足了从技术说明转换为营销文案的要求,描写了中世纪风格办公椅的细节。但是过于冗长的文本不太适合电商场景。这时我们就可以**在 Prompt 中添加长度限制**,要求生成更简洁的文案。\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
@ -173,6 +171,13 @@
|
||||
"print(response)\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"我们可以计算一下输出的长度。"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 11,
|
||||
@ -198,8 +203,7 @@
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n",
|
||||
"当在Prompt中设置长度限制要求时,语言模型生成的输出长度不总能精确符合要求,但基本能控制在可接受的误差范围内。比如要求生成50词的文本,语言模型有时会生成60词左右的输出,但总体接近预定长度。\n",
|
||||
"当在 Prompt 中设置长度限制要求时,语言模型生成的输出长度不总能精确符合要求,但基本能控制在可接受的误差范围内。比如要求生成50词的文本,语言模型有时会生成60词左右的输出,但总体接近预定长度。\n",
|
||||
"\n",
|
||||
"这是因为**语言模型在计算和判断文本长度时依赖于分词器**,而分词器在字符统计方面不具备完美精度。目前存在多种方法可以尝试控制语言模型生成输出的长度,比如指定语句数、词数、汉字数等。\n",
|
||||
"\n",
|
||||
@ -212,13 +216,11 @@
|
||||
"source": [
|
||||
"### 1.3 提示优化2: 处理抓错文本细节\n",
|
||||
"\n",
|
||||
"在迭代优化Prompt的过程中,我们还需要注意语言模型生成文本的细节是否符合预期。\n",
|
||||
"在迭代优化 Prompt 的过程中,我们还需要注意语言模型生成文本的细节是否符合预期。\n",
|
||||
"\n",
|
||||
"比如在这个案例中,进一步分析会发现,该椅子面向的其实是家具零售商,而不是终端消费者。所以生成的文案中过多强调风格、氛围等方面,而较少涉及产品技术细节,与目标受众的关注点不太吻合。这时候我们就可以继续调整Prompt,明确要求语言模型生成面向家具零售商的描述,更多关注材质、工艺、结构等技术方面的表述。\n",
|
||||
"比如在这个案例中,进一步分析会发现,该椅子面向的其实是家具零售商,而不是终端消费者。所以生成的文案中过多强调风格、氛围等方面,而较少涉及产品技术细节,与目标受众的关注点不太吻合。这时候我们就可以继续调整 Prompt,明确要求语言模型生成面向家具零售商的描述,更多关注材质、工艺、结构等技术方面的表述。\n",
|
||||
"\n",
|
||||
"通过迭代地分析结果,检查是否捕捉到正确的细节,我们可以逐步优化Prompt,使语言模型生成的文本更加符合预期的样式和内容要求。\n",
|
||||
"\n",
|
||||
"细节的精准控制是语言生成任务中非常重要的一点。我们需要训练语言模型**根据不同目标受众关注不同的方面,输出风格和内容上都适合的文本**。"
|
||||
"通过迭代地分析结果,检查是否捕捉到正确的细节,我们可以逐步优化 Prompt,使语言模型生成的文本更加符合预期的样式和内容要求。细节的精准控制是语言生成任务中非常重要的一点。我们需要训练语言模型**根据不同目标受众关注不同的方面,输出风格和内容上都适合的文本**。"
|
||||
]
|
||||
},
|
||||
{
|
||||
@ -257,7 +259,7 @@
|
||||
"source": [
|
||||
"可见,通过修改 Prompt ,模型的关注点倾向了具体特征与技术细节。\n",
|
||||
"\n",
|
||||
"我可能进一步想要在描述的结尾展示出产品ID。因此,我可以进一步改进这个 Prompt ,要求在描述的结尾,展示出说明书中的7位产品ID。"
|
||||
"我可能进一步想要在描述的结尾展示出产品 ID。因此,我可以进一步改进这个 Prompt ,要求在描述的结尾,展示出说明书中的7位产品 ID。"
|
||||
]
|
||||
},
|
||||
{
|
||||
@ -296,11 +298,11 @@
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"通过上面的示例,我们可以看到Prompt迭代优化的一般过程。与训练机器学习模型类似,设计高效Prompt也需要多个版本的试错调整。\n",
|
||||
"通过上面的示例,我们可以看到 Prompt 迭代优化的一般过程。与训练机器学习模型类似,设计高效 Prompt 也需要多个版本的试错调整。\n",
|
||||
"\n",
|
||||
"具体来说,第一版Prompt应该满足明确和给模型思考时间两个原则。在此基础上,一般的迭代流程是:首先尝试一个初版,分析结果,然后继续改进Prompt,逐步逼近最优。许多成功的Prompt都是通过这种多轮调整得出的。\n",
|
||||
"具体来说,第一版 Prompt 应该满足明确和给模型思考时间两个原则。在此基础上,一般的迭代流程是:首先尝试一个初版,分析结果,然后继续改进 Prompt,逐步逼近最优。许多成功的Prompt 都是通过这种多轮调整得出的。\n",
|
||||
"\n",
|
||||
"后面我会展示一个更复杂的Prompt案例,让大家更深入地了解语言模型的强大能力。但在此之前,我想强调Prompt设计是一个循序渐进的过程。开发者需要做好多次尝试和错误的心理准备,通过不断调整和优化,才能找到最符合具体场景需求的Prompt形式。这需要智慧和毅力,但结果往往是值得的。\n",
|
||||
"后面我会展示一个更复杂的 Prompt 案例,让大家更深入地了解语言模型的强大能力。但在此之前,我想强调 Prompt 设计是一个循序渐进的过程。开发者需要做好多次尝试和错误的心理准备,通过不断调整和优化,才能找到最符合具体场景需求的 Prompt 形式。这需要智慧和毅力,但结果往往是值得的。\n",
|
||||
"\n",
|
||||
"让我们继续探索提示工程的奥秘,开发出令人惊叹的大语言模型应用吧!"
|
||||
]
|
||||
@ -379,6 +381,13 @@
|
||||
"print(response)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"上述输出为 HTML 代码,我们可以使用 Python 的 IPython 库将 HTML 代码加载出来。"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 20,
|
||||
@ -445,15 +454,13 @@
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n",
|
||||
"本章重点讲解了在开发大语言模型应用时,采用迭代方式不断优化Prompt的过程。作为Prompt工程师,关键不是一开始就要求完美的Prompt,而是掌握有效的Prompt开发流程。\n",
|
||||
"本章重点讲解了在开发大语言模型应用时,采用迭代方式不断优化 Prompt 的过程。作为 Prompt 工程师,关键不是一开始就要求完美的 Prompt,而是掌握有效的 Prompt 开发流程。\n",
|
||||
"\n",
|
||||
"具体来说,首先编写初版Prompt,然后通过多轮调整逐步改进,直到生成了满意的结果。对于更复杂的应用,可以在多个样本上进行迭代训练,评估Prompt的平均表现。\n",
|
||||
"具体来说,首先编写初版 Prompt,然后通过多轮调整逐步改进,直到生成了满意的结果。对于更复杂的应用,可以在多个样本上进行迭代训练,评估 Prompt 的平均表现。在应用较为成熟后,才需要采用在多个样本集上评估 Prompt 性能的方式来进行细致优化。因为这需要较高的计算资源。\n",
|
||||
"\n",
|
||||
"在应用较为成熟后,才需要采用在多个样本集上评估Prompt性能的方式来进行细致优化。因为这需要较高的计算资源。\n",
|
||||
"总之,Prompt 工程师的核心是掌握 Prompt 的迭代开发和优化技巧,而非一开始就要求100%完美。通过不断调整试错,最终找到可靠适用的 Prompt 形式才是设计 Prompt 的正确方法。\n",
|
||||
"\n",
|
||||
"总之,Prompt工程师的核心是掌握Prompt的迭代开发和优化技巧,而非一开始就要求100%完美。通过不断调整试错,最终找到可靠适用的Prompt形式才是设计Prompt的正确方法。\n",
|
||||
"\n",
|
||||
"读者可以在Jupyter Notebook上,对本章给出的示例进行实践,修改Prompt并观察不同输出,以深入理解Prompt迭代优化的过程。这会对进一步开发复杂语言模型应用提供很好的实践准备。\n"
|
||||
"读者可以在 Jupyter Notebook 上,对本章给出的示例进行实践,修改 Prompt 并观察不同输出,以深入理解 Prompt 迭代优化的过程。这会对进一步开发复杂语言模型应用提供很好的实践准备。\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
@ -899,7 +906,7 @@
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.10.11"
|
||||
"version": "3.8.10"
|
||||
},
|
||||
"latex_envs": {
|
||||
"LaTeX_envs_menu_present": true,
|
||||
|
||||
@ -221,7 +221,7 @@
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "gpt_flask",
|
||||
"display_name": "Python 3 (ipykernel)",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
@ -235,10 +235,9 @@
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.9.16"
|
||||
},
|
||||
"orig_nbformat": 4
|
||||
"version": "3.10.11"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 2
|
||||
"nbformat_minor": 4
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user