diff --git a/content/Prompt Engineering/2. 提示原则 Guidelines.ipynb b/content/Prompt Engineering/2. 提示原则 Guidelines.ipynb
index b0941c6..791da98 100644
--- a/content/Prompt Engineering/2. 提示原则 Guidelines.ipynb
+++ b/content/Prompt Engineering/2. 提示原则 Guidelines.ipynb
@@ -7,7 +7,7 @@
"source": [
"# 第二章 编写 Prompt 的原则\n",
"\n",
- " 本章的主要内容为编写 Prompt 的原则,在本章中,我们将给出两个编写 Prompt 的原则与一些相关的策略,你可以练习编写高效的 Prompt,从而便捷而有效地使用 LLM。"
+ " 本章的主要内容为编写 Prompt 的原则,在本章中,我们将给出两个编写 Prompt 的原则与一些相关的策略,您可以练习编写高效的 Prompt,从而便捷而有效地使用 LLM。"
]
},
{
@@ -16,15 +16,15 @@
"source": [
"
\n",
"
\n",
@@ -48,7 +37,6 @@
},
{
"attachments": {},
->>>>>>> Stashed changes
"cell_type": "markdown",
"metadata": {},
"source": [
@@ -84,7 +72,7 @@
"# 一个封装 OpenAI 接口的函数,参数为 Prompt,返回对应结果\n",
"def get_completion(prompt, model=\"gpt-3.5-turbo\"):\n",
" '''\n",
- " prompt: 对应的提示\n",
+ " prompt: 对应的提示词\n",
" model: 调用的模型,默认为 gpt-3.5-turbo(ChatGPT),有内测资格的用户可以选择 gpt-4\n",
" '''\n",
" messages = [{\"role\": \"user\", \"content\": prompt}]\n",
@@ -98,6 +86,7 @@
]
},
{
+ "attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
@@ -105,14 +94,11 @@
]
},
{
+ "attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
-<<<<<<< Updated upstream
- "这里有一个椅子的产品说明书,描述说它是一个中世纪灵感家族的一部分,讨论了构造、尺寸、椅子选项、材料等等,产地是意大利。假设您想要使用这份说明书帮助营销团队为在线零售网站撰写营销式描述"
-=======
"给定一份椅子的资料页。描述说它属于*中世纪灵感*系列,产自意大利,并介绍了材料、构造、尺寸、可选配件等参数。假设您想要使用这份说明书帮助营销团队为电商平台撰写营销描述稿:"
->>>>>>> Stashed changes
]
},
{
@@ -186,7 +172,7 @@
}
],
"source": [
- "# 提示:基于说明书生成营销描述\n",
+ "# Prompt :基于说明书生成营销描述\n",
"prompt = f\"\"\"\n",
"Your task is to help a marketing team create a \n",
"description for a retail website of a product based \n",
@@ -277,7 +263,7 @@
}
],
"source": [
- "# 提示:基于说明书创建营销描述\n",
+ "# Prompt :基于说明书创建营销描述\n",
"prompt = f\"\"\"\n",
"您的任务是帮助营销团队基于技术说明书创建一个产品的营销描述。\n",
"\n",
@@ -290,16 +276,15 @@
]
},
{
+ "attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## 2.1 问题一:生成文本太长\n",
"\n",
- "它似乎很好地写了一个描述,介绍了一个惊人的中世纪灵感办公椅,很好地完成了要求,即从技术说明书开始编写产品描述。但是当我看到这个时,我会觉得这个太长了。\n",
+ "它似乎很好地完成了要求,即从技术说明书开始编写产品描述,介绍了一个精致的中世纪风格办公椅。但是当我看到这个时,我会觉得这个太长了。\n",
"\n",
- "所以我有了一个想法。我写了一个提示,得到了结果。但是我对它不是很满意,因为它太长了,所以我会澄清我的提示,并说最多使用50个字。\n",
- "\n",
- "因此,我通过要求它限制生成文本长度来解决这一问题"
+ "所以在上述过程中,我产生想法后写了一个 Prompt ,并得到了结果,但是我对它不是很满意,因为它太长了。所以我澄清我的 Prompt ,要求它限制生成文本长度,要求最多使用50个字。\n"
]
},
{
@@ -335,10 +320,11 @@
]
},
{
+ "attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
- "取出回答并根据空格拆分,答案为54个字,较好地完成了我的要求"
+ "提取回答并根据空格拆分,答案为54个字,较好地完成了设计要求。"
]
},
{
@@ -411,27 +397,24 @@
{
"cell_type": "markdown",
"metadata": {},
- "source": [
-<<<<<<< Updated upstream
- "LLM在遵循非常精确的字数限制方面表现得还可以,但并不那么出色。有时它会输出60或65个单词的内容,但这还算是合理的。这原因是 LLM 解释文本使用一种叫做分词器的东西,但它们往往在计算字符方面表现一般般。有很多不同的方法来尝试控制你得到的输出的长度。"
-=======
- "LLM在遵循非常精确的字数限制方面表现得还可以,但并不那么出色。有时它会输出60或65个单词的内容,但这也还算合理。这原因是 LLM 使用分词器(tokenizer)解释文本,但它们往往在计算字符方面表现一般般。有很多不同的方法来尝试控制您得到的输出的长度(如xx句话/词/个汉字/个字母 (characters) 等)。"
->>>>>>> Stashed changes
- ]
+ "source": []
},
{
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "LLM在能堪堪胜任严格的字数限制,但实现得并不精确。此例中,英文输出要求控制在50个词,但有时会输出60或65个单词的内容,但这也还算合理。原因是 LLM 使用分词器(tokenizer)解释文本,但它们往往在计算字符方面表现一般般。有很多不同的方法来尝试控制您得到的输出的长度(如若干句话/词/个汉字/个字母 (characters) 等)。"
+ ]
+ },
+ {
+ "attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
-<<<<<<< Updated upstream
- "## 问题二:文本关注在错误的细节上\n",
- "\n",
- "我们会发现的第二个问题是,这个网站并不是直接向消费者销售,它实际上旨在向家具零售商销售家具,他们会更关心椅子的技术细节和材料。在这种情况下,你可以修改这个提示,让它更精确地描述椅子的技术细节。\n",
-=======
"## 2.2 问题二:抓错文本细节\n",
"\n",
- "我们继续完善这段推广词,会发现的第二个问题是,这个网站并不是直接向消费者销售,它实际上面向的是家具零售商,他们会更关心椅子的技术细节和材料。在这种情况下,您可以继续修改这个提示词,让它更精确地描述椅子的技术细节。\n",
->>>>>>> Stashed changes
+ "我们继续完善这段推广词,会发现的第二个问题是,这个网站并不是直接向消费者销售,它实际上面向的是家具零售商,他们会更关心椅子的技术细节和材料。在这种情况下,您可以继续修改这个 Prompt ,让它更精确地描述椅子的技术细节。\n",
"\n",
"解决方法:要求它专注于与目标受众相关的方面。"
]
@@ -503,10 +486,18 @@
]
},
{
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": []
+ },
+ {
+ "attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
- "我可能进一步想要在描述的结尾包括产品ID。因此,我可以进一步改进这个提示,要求在描述的结尾,包括在技术说明中的每个7个字符产品ID。"
+ "可见,通过修改 Prompt ,模型的关注点倾向了具体特征与技术细节。\n",
+ "\n",
+ "我可能进一步想要在描述的结尾展示出产品ID。因此,我可以进一步改进这个 Prompt ,要求在描述的结尾,展示出说明书中的7位产品ID。"
]
},
{
@@ -583,16 +574,6 @@
]
},
{
-<<<<<<< Updated upstream
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## 问题三:需要一个表格形式的描述\n",
- "\n",
- "以上是许多开发人员通常会经历的迭代提示开发的简短示例。我的建议是,像上一章中所演示的那样,Prompt 应该保持清晰和明确,并在必要时给模型一些思考时间。在这些要求的基础上,通常值得首先尝试编写 Prompt ,看看会发生什么,然后从那里开始迭代地完善 Prompt,以逐渐接近所需的结果。因此,许多成功的Prompt都是通过这种迭代过程得出的。我将向您展示一个更复杂的提示示例,可能会让您对ChatGPT的能力有更深入的了解。\n",
- "\n",
- "这里我添加了一些额外的说明,要求它抽取信息并组织成表格,并指定表格的列、表名和格式,还要求它将所有内容格式化为可以在网页使用的 HTML。"
-=======
"cell_type": "markdown",
"metadata": {},
"source": []
@@ -601,7 +582,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "以上是许多开发人员通常会经历的提示词开发的迭代过程简短示例。我的建议是,像上一章中所演示的那样,Prompt 应该保持清晰和明确,并在必要时给模型一些思考时间。在这些要求的基础上,通常值得首先尝试编写一版 Prompt ,看看会发生什么,然后继续迭代完善 Prompt,以逐渐接近所需的结果。许多成功的 Prompt 都是通过这种迭代过程得出的。我将向您展示一个更复杂的提示词示例,可能会让您对 ChatGPT 的能力有更深入的了解。"
+ "以上是许多开发人员通常会经历的 Prompt 开发的迭代过程简短示例。我的建议是,像上一章中所演示的那样,Prompt 应该保持清晰和明确,并在必要时给模型一些思考时间。在这些要求的基础上,常见流程是首先尝试编写一版 Prompt ,看看会发生什么,然后继续迭代完善 Prompt,以逐渐接近所需的结果。许多成功的 Prompt 都是通过这种迭代过程得出的。我将向您展示一个更复杂的 Prompt 示例,可能会让您对 ChatGPT 的能力有更深入的了解。"
]
},
{
@@ -610,9 +591,7 @@
"metadata": {},
"source": [
"## 2.3 问题三:添加表格描述\n",
- "\n",
- "继续添加指引,要求提取产品尺寸信息,组织成表格,并指定表格的列、表名和格式;将所有内容格式化为可以在网页使用的 HTML。"
->>>>>>> Stashed changes
+ "继续添加指引,要求提取产品尺寸信息并组织成表格,并指定表格的列、表名和格式;再将所有内容格式化为可以在网页使用的 HTML。"
]
},
{
@@ -877,18 +856,20 @@
]
},
{
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": []
+ },
+ {
+ "attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
-<<<<<<< Updated upstream
- "本章的主要内容是 LLM 在开发应用程序中的迭代式提示开发过程。开发者需要先尝试编写提示,然后通过迭代逐步完善它,直至得到需要的结果。关键在于拥有一种有效的开发Prompt的过程,而不是知道完美的Prompt。对于一些更复杂的应用程序,可以对多个样本进行迭代开发提示并进行评估。最后,可以在更成熟的应用程序中测试多个Prompt在多个样本上的平均或最差性能。在使用 Jupyter 代码笔记本示例时,请尝试不同的变化并查看结果。"
-=======
- "本章的主要内容是在开发基于 LLM 的应用程序中的**迭代式**提示词开发过程。开发者需要先尝试编写提示词,然后通过迭代逐步完善它,直至得到需要的结果。作为一名高效的提示词工程师(Prompt Engineer),关键在于掌握有效的开发Prompt的过程,而不是去寻求得到“完美的” Prompt 。对于一些更复杂的应用程序,可以对多个样本(如数百张说明书)进行提示词的迭代开发,并在样本集上进行评估。\n",
+ "本章的主要内容是 LLM 在开发应用程序中的迭代式 Prompt 开发过程。开发者需要先尝试编写 Prompt ,然后通过迭代逐步完善它,直至得到需要的结果。作为一名高效的提示词工程师(Prompt Engineer),关键在于掌握有效的开发Prompt的过程,而不是去寻求得到“完美的”Prompt。对于一些更复杂的应用程序,可以对多个样本(如数百张说明书)进行 Prompt 的迭代开发,并在样本集上进行评估。\n",
"\n",
"最后,在更成熟的应用程序中,可以观察多个Prompt在多个样本集上的表现,测试平均或最差性能。但通常,**仅当**应用较成型之后,才推荐您通过这种评估方式,来精益求精。\n",
"\n",
"请使用 Jupyter Notebook,动手实践本节给出的示例,并尝试不同的变化,查看结果。"
->>>>>>> Stashed changes
]
}
],
diff --git a/content/Prompt Engineering/4. 文本概括 Summarizing.ipynb b/content/Prompt Engineering/4. 文本概括 Summarizing.ipynb
index 8c390e5..74f9173 100644
--- a/content/Prompt Engineering/4. 文本概括 Summarizing.ipynb
+++ b/content/Prompt Engineering/4. 文本概括 Summarizing.ipynb
@@ -1,6 +1,7 @@
{
"cells": [
{
+ "attachments": {},
"cell_type": "markdown",
"id": "b58204ea",
"metadata": {},
@@ -10,54 +11,52 @@
},
{
"cell_type": "markdown",
- "id": "c3182141",
+ "id": "a190d6a1",
"metadata": {},
"source": [
"
\n",
- "
\n",
+ "
\n",
+ " \n",
+ "
三、同时概括多条文本\n",
+ " \n",
"
"
]
},
{
+ "attachments": {},
"cell_type": "markdown",
"id": "b70ad003",
"metadata": {},
"source": [
-<<<<<<< Updated upstream
- "## 1 引言"
+ "## 一、引言"
]
},
{
+ "attachments": {},
"cell_type": "markdown",
"id": "12fa9ea4",
"metadata": {},
"source": [
- "当今世界上有太多的文本信息,几乎没有人能够拥有足够的时间去阅读所有我们想了解的东西。但令人感到欣喜的是,目前LLM在文本概括任务上展现了强大的水准,也已经有不少团队将这项功能插入了自己的软件应用中。\n",
-=======
- "## 一、引言\n",
"当今世界上文本信息浩如烟海,我们很难拥有足够的时间去阅读所有想了解的东西。但欣喜的是,目前LLM在文本概括任务上展现了强大的水准,也已经有不少团队将概括功能实现在多种应用中。\n",
->>>>>>> Stashed changes
"\n",
"本章节将介绍如何使用编程的方式,调用API接口来实现“文本概括”功能。"
]
},
{
+ "attachments": {},
"cell_type": "markdown",
"id": "1de4fd1e",
"metadata": {},
"source": [
- "首先,我们需要 OpenAI 包,加载 API 密钥,定义 getCompletion 函数。"
+ "首先,我们需要引入 OpenAI 包,加载 API 密钥,定义 getCompletion 函数。"
]
},
{
@@ -83,22 +82,25 @@
]
},
{
+ "attachments": {},
"cell_type": "markdown",
"id": "9cca835b",
"metadata": {},
"source": [
- "## 二、单一文本概括实验"
+ "## 二、单一文本概括"
]
},
{
+ "attachments": {},
"cell_type": "markdown",
"id": "0c1e1b92",
"metadata": {},
"source": [
- "这里我们举了个商品评论的例子。对于电商平台来说,网站上往往存在着海量的商品评论,这些评论反映了所有客户的想法。如果我们拥有一个工具去概括这些海量、冗长的评论,便能够快速地浏览更多评论,洞悉客户的偏好,从而指导平台与商家提供更优质的服务。"
+ "以商品评论的总结任务为例:对于电商平台来说,网站上往往存在着海量的商品评论,这些评论反映了所有客户的想法。如果我们拥有一个工具去概括这些海量、冗长的评论,便能够快速地浏览更多评论,洞悉客户的偏好,从而指导平台与商家提供更优质的服务。"
]
},
{
+ "attachments": {},
"cell_type": "markdown",
"id": "9dc2e2bc",
"metadata": {},
@@ -126,6 +128,7 @@
]
},
{
+ "attachments": {},
"cell_type": "markdown",
"id": "aad5bd2a",
"metadata": {},
@@ -149,6 +152,7 @@
]
},
{
+ "attachments": {},
"cell_type": "markdown",
"id": "662c9cd2",
"metadata": {},
@@ -157,6 +161,7 @@
]
},
{
+ "attachments": {},
"cell_type": "markdown",
"id": "a6d10814",
"metadata": {},
@@ -194,6 +199,7 @@
]
},
{
+ "attachments": {},
"cell_type": "markdown",
"id": "0df0eb90",
"metadata": {},
@@ -217,7 +223,7 @@
],
"source": [
"prompt = f\"\"\"\n",
- "你的任务是从电子商务网站上生成一个产品评论的简短摘要。\n",
+ "您的任务是从电子商务网站上生成一个产品评论的简短摘要。\n",
"\n",
"请对三个反引号之间的评论文本进行概括,最多30个词汇。\n",
"\n",
@@ -229,6 +235,7 @@
]
},
{
+ "attachments": {},
"cell_type": "markdown",
"id": "e9ab145e",
"metadata": {},
@@ -237,6 +244,7 @@
]
},
{
+ "attachments": {},
"cell_type": "markdown",
"id": "f84d0123",
"metadata": {},
@@ -247,11 +255,12 @@
]
},
{
+ "attachments": {},
"cell_type": "markdown",
"id": "d6f8509a",
"metadata": {},
"source": [
- "**侧重于运输**"
+ "**侧重于快递服务**"
]
},
{
@@ -286,6 +295,7 @@
]
},
{
+ "attachments": {},
"cell_type": "markdown",
"id": "0bd4243a",
"metadata": {},
@@ -309,7 +319,7 @@
],
"source": [
"prompt = f\"\"\"\n",
- "你的任务是从电子商务网站上生成一个产品评论的简短摘要。\n",
+ "您的任务是从电子商务网站上生成一个产品评论的简短摘要。\n",
"\n",
"请对三个反引号之间的评论文本进行概括,最多30个词汇,并且聚焦在产品运输上。\n",
"\n",
@@ -321,6 +331,7 @@
]
},
{
+ "attachments": {},
"cell_type": "markdown",
"id": "76c97fea",
"metadata": {},
@@ -329,6 +340,7 @@
]
},
{
+ "attachments": {},
"cell_type": "markdown",
"id": "83275907",
"metadata": {},
@@ -369,6 +381,7 @@
]
},
{
+ "attachments": {},
"cell_type": "markdown",
"id": "cf54fac4",
"metadata": {},
@@ -392,7 +405,7 @@
],
"source": [
"prompt = f\"\"\"\n",
- "你的任务是从电子商务网站上生成一个产品评论的简短摘要。\n",
+ "您的任务是从电子商务网站上生成一个产品评论的简短摘要。\n",
"\n",
"请对三个反引号之间的评论文本进行概括,最多30个词汇,并且聚焦在产品价格和质量上。\n",
"\n",
@@ -404,16 +417,7 @@
]
},
{
-<<<<<<< Updated upstream
-=======
- "cell_type": "markdown",
- "id": "6a5fe085",
- "metadata": {},
- "source": []
- },
- {
"attachments": {},
->>>>>>> Stashed changes
"cell_type": "markdown",
"id": "972dbb1b",
"metadata": {},
@@ -422,6 +426,7 @@
]
},
{
+ "attachments": {},
"cell_type": "markdown",
"id": "b3ed53d2",
"metadata": {},
@@ -430,11 +435,12 @@
]
},
{
+ "attachments": {},
"cell_type": "markdown",
"id": "ba6f5c25",
"metadata": {},
"source": [
- "在2.2节中,虽然我们通过添加关键角度侧重的Prompt,使得文本摘要更侧重于某一特定方面,但是可以发现,结果中也会保留一些其他信息,如价格与质量角度的概括中仍保留了“快递提前到货”的信息。如果我们只想要提取某一角度的信息,并过滤掉其他所有信息,则可以要求LLM进行“文本提取(Extract)”而非“概括(Summarize)”。"
+ "在2.2节中,虽然我们通过添加关键角度侧重的 Prompt ,使得文本摘要更侧重于某一特定方面,但是可以发现,结果中也会保留一些其他信息,如偏重价格与质量角度的概括中仍保留了“快递提前到货”的信息。如果我们只想要提取某一角度的信息,并过滤掉其他所有信息,则可以要求 LLM 进行“文本提取( Extract )”而非“概括( Summarize )”"
]
},
{
@@ -469,6 +475,7 @@
]
},
{
+ "attachments": {},
"cell_type": "markdown",
"id": "0339b877",
"metadata": {},
@@ -492,7 +499,7 @@
],
"source": [
"prompt = f\"\"\"\n",
- "你的任务是从电子商务网站上的产品评论中提取相关信息。\n",
+ "您的任务是从电子商务网站上的产品评论中提取相关信息。\n",
"\n",
"请从以下三个反引号之间的评论文本中提取产品运输相关的信息,最多30个词汇。\n",
"\n",
@@ -504,27 +511,21 @@
]
},
{
+ "attachments": {},
"cell_type": "markdown",
"id": "50498a2b",
"metadata": {},
"source": [
-<<<<<<< Updated upstream
- "## 3 多条文本概括Prompt实验"
-=======
"## 三、同时概括多条文本"
->>>>>>> Stashed changes
]
},
{
+ "attachments": {},
"cell_type": "markdown",
"id": "a291541a",
"metadata": {},
"source": [
-<<<<<<< Updated upstream
- "在实际的工作流中,我们往往有许许多多的评论文本,以下展示了一个基于for循环调用“文本概括”工具并依次打印的示例。当然,在实际生产中,对于上百万甚至上千万的评论文本,使用for循环也是不现实的,可能需要考虑整合评论、分布式等方法提升运算效率。"
-=======
- "在实际的工作流中,我们往往有许许多多的评论文本,以下示例将多条用户评价放进列表,并利用 for 循环,使用文本概括(Summarize)提示词,将评价概括至小于20词,并按顺序打印。当然,在实际生产中,对于不同规模的评论文本,除了使用 for 循环以外,还可能需要考虑整合评论、分布式等方法提升运算效率。您可以搭建主控面板,来总结大量用户评论,来方便您或他人快速浏览,还可以点击查看原评论。这样您能高效掌握顾客的所有想法。"
->>>>>>> Stashed changes
+ "在实际的工作流中,我们往往有许许多多的评论文本,以下示例将多条用户评价放进列表,并利用 ```for``` 循环,使用文本概括(Summarize)提示词,将评价概括至小于 20 词,并按顺序打印。当然,在实际生产中,对于不同规模的评论文本,除了使用 ```for``` 循环以外,还可能需要考虑整合评论、分布式等方法提升运算效率。您可以搭建主控面板,来总结大量用户评论,来方便您或他人快速浏览,还可以点击查看原评论。这样您能高效掌握顾客的所有想法。"
]
},
{
@@ -631,7 +632,7 @@
"source": [
"for i in range(len(reviews)):\n",
" prompt = f\"\"\"\n",
- " Your task is to generate a short summary of a product \\ \n",
+ " Your task is to generate a short summary of a product \\\n",
" review from an ecommerce site. \n",
"\n",
" Summarize the review below, delimited by triple \\\n",
@@ -646,7 +647,7 @@
{
"cell_type": "code",
"execution_count": null,
- "id": "ccf14427",
+ "id": "eb878522",
"metadata": {},
"outputs": [],
"source": [
@@ -656,7 +657,7 @@
"\n",
" 请对三个反引号之间的评论文本进行概括,最多20个词汇。\n",
"\n",
- " 评论: ```{reviews[i]}```\n",
+ " 评论文本: ```{reviews[i]}```\n",
" \"\"\"\n",
" response = get_completion(prompt)\n",
" print(i, response, \"\\n\")\n"
@@ -664,7 +665,7 @@
},
{
"cell_type": "markdown",
- "id": "c1616fdb",
+ "id": "d757b389",
"metadata": {},
"source": [
"**回答暂缺**"