diff --git a/docs/content/C1 Prompt Engineering for Developer/1. 简介 Introduction.md b/docs/content/C1 Prompt Engineering for Developer/1. 简介 Introduction.md
index 5df6977..b140b98 100644
--- a/docs/content/C1 Prompt Engineering for Developer/1. 简介 Introduction.md
+++ b/docs/content/C1 Prompt Engineering for Developer/1. 简介 Introduction.md
@@ -1,21 +1,15 @@
# 第一章 简介
-**作者 吴恩达教授**
+欢迎来到**面向开发者的 ChatGPT 提示词工程**部分,本部分内容基于**吴恩达老师的《Prompt Engineering for Developer》课程**进行编写。《Prompt Engineering for Developer》课程是由**吴恩达老师**与 OpenAI 技术团队成员 **Isa Fulford** 老师合作授课。曾开发过受欢迎的 ChatGPT 检索插件,并且在教授 LLM (Large Language Model, 大语言模型)技术在产品中的应用方面做出了很大贡献。她还参与编写了教授人们使用 Prompt 的 OpenAI cookbook。我们希望通过本模块的学习,与大家分享使用提示词开发 LLM 应用的最佳实践和技巧。
-欢迎来到本课程,我们将为开发人员介绍 ChatGPT 提示词工程(Prompt Engineering)。本课程由 Isa Fulford 教授和我一起授课。Isa 是 OpenAI 的技术团队成员,曾开发过受欢迎的 ChatGPT 检索插件,并且在教授 LLM (Large Language Model, 大语言模型)技术在产品中的应用方面做出了很大贡献。她还参与编写了教授人们使用 Prompt 的 OpenAI cookbook。
+网络上有许多关于提示词(Prompt, 本教程中将保留该术语)设计的材料,例如《30 prompts everyone has to know》之类的文章,这些文章主要集中在 **ChatGPT 的 Web 界面上**,许多人在使用它执行特定的、通常是一次性的任务。但我们认为,对于开发人员,**大语言模型(LLM) 的更强大功能是能通过 API 接口调用,从而快速构建软件应用程序**。实际上,我们了解到 DeepLearning.AI 的姊妹公司 AI Fund 的团队一直在与许多初创公司合作,将这些技术应用于诸多应用程序上。很兴奋能看到 LLM API 能够让开发人员非常快速地构建应用程序。
-互联网上有很多有关提示词(Prompt, 本教程中将保留该术语)的材料,例如《30 prompts everyone has to know》之类的文章。这些文章主要集中在 ChatGPT 的 Web 界面上,许多人在使用它执行特定的、通常是一次性的任务。但是,我认为对于开发人员,LLM 的更强大功能是能通过 API 调用,从而快速构建软件应用程序。我认为这方面还没有得到充分的重视。实际上,我们在 DeepLearning.AI 的姊妹公司 AI Fund 的团队一直在与许多初创公司合作,将这些技术应用于诸多应用程序上。很兴奋能看到 LLM API 能够让开发人员非常快速地构建应用程序。
+在本书的《Prompt Engineering for Developer》模块中,我们将与读者分享提升大语言模型应用效果的各种技巧和最佳实践。书中内容涵盖广泛,包括软件开发提示词设计、文本总结、推理、转换、扩展以及构建聊天机器人等语言模型典型应用场景。我们衷心希望这本书能激发读者的想象力,开发出更出色的语言模型应用。
-在本课程中,我们将与您分享一些技巧,来挖掘 LLM 的潜力,也会提供应用上的最佳实践。过程中会涉及大量材料。首先,你会学习到用于软件开发的 Prompt 最佳实践,随后会涉及到几个常用使用例,包括概括、推断、转换与扩展,最后会利用 LLM 构建 chatbot(聊天机器人)。希望这能激发你的想象力,去开拓新应用。
+随着 LLM 的发展,其大致可以分为两种类型,后续称为**基础 LLM** 和**指令微调(Instruction Tuned)LLM**。**基础LLM**是基于文本训练数据,训练出预测下一个单词能力的模型。其通常通过在互联网和其他来源的大量数据上训练,来确定紧接着出现的最可能的词。例如,如果你以“从前,有一只独角兽”作为 Prompt ,基础 LLM 可能会继续预测“她与独角兽朋友共同生活在一片神奇森林中”。但是,如果你以“法国的首都是什么”为 Prompt ,则基础 LLM 可能会根据互联网上的文章,将回答预测为“法国最大的城市是什么?法国的人口是多少?”,因为互联网上的文章很可能是有关法国国家的问答题目列表。
-随着 LLM 的发展,其大致可以分为两种类型,后续称为基础 LLM 和指令微调(Instruction Tuned)LLM。基础LLM是基于文本训练数据,训练出预测下一个单词能力的模型。其通常通过在互联网和其他来源的大量数据上训练,来确定紧接着出现的最可能的词。例如,如果你以“从前,有一只独角兽”作为 Prompt ,基础 LLM 可能会继续预测“她与独角兽朋友共同生活在一片神奇森林中”。但是,如果你以“法国的首都是什么”为 Prompt ,则基础 LLM 可能会根据互联网上的文章,将回答预测为“法国最大的城市是什么?法国的人口是多少?”,因为互联网上的文章很可能是有关法国国家的问答题目列表。
+与基础语言模型不同,受**指令微调的LLM**通过专门的训练,可以更好地理解并遵循指令。举个例子,当询问“法国的首都是什么?”时,这类模型很可能直接回答“法国的首都是巴黎”。受指令微调的大语言模型的训练通常基于预训练语言模型,先在大规模文本数据上进行**预训练**,掌握语言的基本规律。在此基础上进行进一步的训练与**微调(finetune)**,输入是指令,输出是对这些指令的正确回复。有时还会采用**RLHF(reinforcement learning from human feedback,人类反馈强化学习)**技术,根据人类对模型输出的反馈进一步增强模型遵循指令的能力。通过这种受控的训练过程。指令微调的的语言模型可以生成对指令高度敏感、更安全可靠的输出,较少无关和损害性内容。因此。许多实际应用已经转向使用这类大语言模型。
-而对于指令微调的 LLM ,相关研究和实践正甚嚣尘上,训练它们来遵循指示。因此,如果你问它,“法国的首都是什么?”,它有极大可能输出“法国的首都是巴黎”。指令微调的LLM的训练通常是基于预训练好的LLM的,即模型已经在大量文本数据上进行了训练。然后对其进行进一步训练与微调(finetune),使用的数据包括输入和理想输出(输入是指令、输出是遵循这些指令的良好回答)。然后通常使用一种称为 RLHF(reinforcement learning from human feedback,人类反馈强化学习)的技术进行进一步改进,使系统更能够有帮助地遵循指令。
+因此,本课程将重点介绍针对指令微调 LLM 的最佳实践,我们也建议您将其用于大多数使用场景。当您使用指令微调 LLM 时,您可以类比为向另一个人提供指令(假设他很聪明但不知道您任务的具体细节)。因此,当 LLM 无法正常工作时,有时是因为指令不够清晰。例如,如果您想问“请为我写一些关于阿兰·图灵( Alan Turing )的东西”,在此基础上清楚表明您希望文本专注于他的科学工作、个人生活、历史角色或其他方面可能会更有帮助。另外您还可以指定回答的语调, 来更加满足您的需求,可选项包括*专业记者写作*,或者*向朋友写的随笔*等。
-因为指令微调的 LLM 已经被训练成有益、诚实、无害的,所以与基础 LLM 相比,它们更不可能输出有问题的文本,如有害输出。许多实际使用场景已经转向指令微调的 LLM 。您在互联网上找到的一些最佳实践可能更适用于基础 LLM ,但对于今天的大多数实际应用,我们建议将注意力集中在指令微调的 LLM 上,这些 LLM 更容易使用,而且由于 OpenAI 和其他 LLM 公司的工作,它们变得更加安全,也更加协调。
-
-因此,本课程将重点介绍**针对指令微调 LLM 的最佳实践**,我们也建议您将其用于大多数使用场景。在继续之前,我想感谢 OpenAI 和 DeepLearning.ai 团队为 Isa 和我所提供的材料作出的贡献。我非常感激 OpenAI 的 Andrew Main、Joe Palermo、Boris Power、Ted Sanders 和 Lillian Weng,他们参与了我们的头脑风暴材料的制定和审核,为这个短期课程编制了课程大纲。我也感激 Deep Learning 方面的 Geoff Ladwig、Eddy Shyu 和 Tommy Nelson 的工作。
-
-当您使用指令微调 LLM 时,您可以类比为向另一个人提供指令(假设他很聪明但不知道您任务的具体细节)。因此,当 LLM 无法正常工作时,有时是因为指令不够清晰。例如,如果您想问“请为我写一些关于阿兰·图灵( Alan Turing )的东西”,在此基础上清楚表明您希望文本专注于他的科学工作、个人生活、历史角色或其他方面可能会更有帮助。另外您还可以指定回答的语调, 来更加满足您的需求,可选项包括*专业记者写作*,或者*向朋友写的随笔*等。
-
-如果你将 LLM 视为一名新毕业的大学生,要求他完成这个任务,你甚至可以提前指定他们应该阅读哪些文本片段来写关于 Alan Turing 的文本,这样能够帮助这位新毕业的大学生更好地完成这项任务。下一章你会看到提示词创建的两个原则,一是**清晰明确**,二是**给LLM时间去思考**。
+如果你将 LLM 视为一名新毕业的大学生,要求他完成这个任务,你甚至可以提前指定他们应该阅读哪些文本片段来写关于 阿兰·图灵 的文本,这样能够帮助这位新毕业的大学生更好地完成这项任务。本书的下一章将详细阐释提示词设计的两个关键原则:**清晰明确**和**给予充足思考时间**。
diff --git a/docs/content/C1 Prompt Engineering for Developer/2. 提示原则 Guidelines.ipynb b/docs/content/C1 Prompt Engineering for Developer/2. 提示原则 Guidelines.ipynb
index 2b2e570..c536d12 100644
--- a/docs/content/C1 Prompt Engineering for Developer/2. 提示原则 Guidelines.ipynb
+++ b/docs/content/C1 Prompt Engineering for Developer/2. 提示原则 Guidelines.ipynb
@@ -1 +1 @@
-{"cells":[{"attachments":{},"cell_type":"markdown","metadata":{},"source":["# 第二章 提示原则 Guidelines"]},{"attachments":{},"cell_type":"markdown","metadata":{},"source":["\n","您应该通过提供尽可能清晰和具体的指令来表达您希望模型执行的操作。这将引导模型给出正确的输出,并降低您得到无关或不正确响应的可能性。清晰的指令不意味着必须简短,在许多情况下,更长的 Prompt 实际上更清晰,且提供了更多上下文,也就可能产生更详细更相关的输出。"]},{"cell_type":"markdown","metadata":{},"source":["## 一、原则一 编写清晰、具体的指令"]},{"cell_type":"markdown","metadata":{},"source":["### 1.1 使用分隔符清晰地表示输入的不同部分"]},{"attachments":{},"cell_type":"markdown","metadata":{},"source":["\n","分隔符可以是:```,\"\",<>,:,\\ \\等。\n","\n","您可以使用任何明显的标点符号将特定的文本部分与 Prompt 的其余部分分开。标记的形式不限,只需要让模型明确知道这是一个单独部分。使用分隔符可以有效避免提示词注入( Prompt injection )。提示词注入是指如果允许用户将某些输入添加到(开发者预定义的) Prompt 中,则所提供的指令可能会与开发者想要执行的操作相冲突,从而使 LLM 遵循用户输入的指令,而非执行开发者预期的操作。即,输入里面可能包含其他指令,会覆盖掉您的指令。对此,使用分隔符是一个不错的策略。\n","\n","在以下的例子中,我们给出一段话并要求 GPT 进行总结,在该示例中我们使用 ``` 来作为分隔符。\n"]},{"cell_type":"code","execution_count":11,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["为了获得所需的输出,您应该提供清晰、具体的指示,避免与简短的提示词混淆,并使用更长的提示词来提供更多的清晰度和上下文信息。\n"]}],"source":["from tool import get_completion\n","\n","text = f\"\"\"\n","您应该提供尽可能清晰、具体的指示,以表达您希望模型执行的任务。\\\n","这将引导模型朝向所需的输出,并降低收到无关或不正确响应的可能性。\\\n","不要将写清晰的提示词与写简短的提示词混淆。\\\n","在许多情况下,更长的提示词可以为模型提供更多的清晰度和上下文信息,从而导致更详细和相关的输出。\n","\"\"\"\n","# 需要总结的文本内容\n","prompt = f\"\"\"\n","把用三个反引号括起来的文本总结成一句话。\n","```{text}```\n","\"\"\"\n","# 指令内容,使用 ``` 来分隔指令和待总结的内容\n","response = get_completion(prompt)\n","print(response)"]},{"cell_type":"markdown","metadata":{},"source":["### 1.2 寻求结构化的输出"]},{"attachments":{},"cell_type":"markdown","metadata":{},"source":["\n","\n","输出可以是 Json、HTML 等格式。\n","\n","第二个策略是要求生成一个结构化的输出,这可以使模型的输出更容易被我们解析,例如,您可以在 Python 中将其读入字典或列表中。\n","\n","在以下示例中,我们要求 GPT 生成三本书的标题、作者和类别,并要求 GPT 以 Json 的格式返回给我们,为便于解析,我们指定了 Json 的键。"]},{"cell_type":"code","execution_count":15,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["{\n"," \"books\": [\n"," {\n"," \"book_id\": 1,\n"," \"title\": \"迷失的时光\",\n"," \"author\": \"张三\",\n"," \"genre\": \"科幻\"\n"," },\n"," {\n"," \"book_id\": 2,\n"," \"title\": \"幻境之门\",\n"," \"author\": \"李四\",\n"," \"genre\": \"奇幻\"\n"," },\n"," {\n"," \"book_id\": 3,\n"," \"title\": \"虚拟现实\",\n"," \"author\": \"王五\",\n"," \"genre\": \"科幻\"\n"," }\n"," ]\n","}\n"]}],"source":["prompt = f\"\"\"\n","请生成包括书名、作者和类别的三本虚构的、非真实存在的中文书籍清单,\\\n","并以 JSON 格式提供,其中包含以下键:book_id、title、author、genre。\n","\"\"\"\n","response = get_completion(prompt)\n","print(response)\n"]},{"cell_type":"markdown","metadata":{},"source":[]},{"cell_type":"markdown","metadata":{},"source":["### 1.3 要求模型检查是否满足条件"]},{"attachments":{},"cell_type":"markdown","metadata":{},"source":["\n","\n","如果任务包含不一定能满足的假设(条件),我们可以告诉模型先检查这些假设,如果不满足,则会指出并停止执行后续的完整流程。您还可以考虑可能出现的边缘情况及模型的应对,以避免意外的结果或错误发生。\n","\n","在如下示例中,我们将分别给模型两段文本,分别是制作茶的步骤以及一段没有明确步骤的文本。我们将要求模型判断其是否包含一系列指令,如果包含则按照给定格式重新编写指令,不包含则回答“未提供步骤”。"]},{"cell_type":"code","execution_count":16,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["Text 1 的总结:\n","第一步 - 把水烧开。\n","第二步 - 拿一个杯子并把茶包放进去。\n","第三步 - 把烧开的水倒在茶包上。\n","第四步 - 等待几分钟,让茶叶浸泡。\n","第五步 - 取出茶包。\n","第六步 - 如果需要,加入糖或牛奶调味。\n","第七步 - 就这样,您可以享受一杯美味的茶了。\n"]}],"source":["# 满足条件的输入(text中提供了步骤)\n","text_1 = f\"\"\"\n","泡一杯茶很容易。首先,需要把水烧开。\\\n","在等待期间,拿一个杯子并把茶包放进去。\\\n","一旦水足够热,就把它倒在茶包上。\\\n","等待一会儿,让茶叶浸泡。几分钟后,取出茶包。\\\n","如果您愿意,可以加一些糖或牛奶调味。\\\n","就这样,您可以享受一杯美味的茶了。\n","\"\"\"\n","prompt = f\"\"\"\n","您将获得由三个引号括起来的文本。\\\n","如果它包含一系列的指令,则需要按照以下格式重新编写这些指令:\n","\n","第一步 - ...\n","第二步 - …\n","…\n","第N步 - …\n","\n","如果文本中不包含一系列的指令,则直接写“未提供步骤”。\"\n","\\\"\\\"\\\"{text_1}\\\"\\\"\\\"\n","\"\"\"\n","response = get_completion(prompt)\n","print(\"Text 1 的总结:\")\n","print(response)"]},{"cell_type":"code","execution_count":17,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["Text 2 的总结:\n","未提供步骤。\n"]}],"source":["# 不满足条件的输入(text中未提供预期指令)\n","text_2 = f\"\"\"\n","今天阳光明媚,鸟儿在歌唱。\\\n","这是一个去公园散步的美好日子。\\\n","鲜花盛开,树枝在微风中轻轻摇曳。\\\n","人们外出享受着这美好的天气,有些人在野餐,有些人在玩游戏或者在草地上放松。\\\n","这是一个完美的日子,可以在户外度过并欣赏大自然的美景。\n","\"\"\"\n","prompt = f\"\"\"\n","您将获得由三个引号括起来的文本。\\\n","如果它包含一系列的指令,则需要按照以下格式重新编写这些指令:\n","\n","第一步 - ...\n","第二步 - …\n","…\n","第N步 - …\n","\n","如果文本中不包含一系列的指令,则直接写“未提供步骤”。\"\n","\\\"\\\"\\\"{text_2}\\\"\\\"\\\"\n","\"\"\"\n","response = get_completion(prompt)\n","print(\"Text 2 的总结:\")\n","print(response)"]},{"cell_type":"markdown","metadata":{},"source":[]},{"cell_type":"markdown","metadata":{},"source":["### 1.4 提供少量示例"]},{"attachments":{},"cell_type":"markdown","metadata":{},"source":["\n","\n","即在要求模型执行实际任务之前,提供给它少量成功执行任务的示例。\n","\n","例如,在以下的示例中,我们告诉模型其任务是以一致的风格回答问题,并先给它一个孩子和祖父之间的对话的例子。孩子说,“请教我何为耐心”,祖父用下述风格的隐喻来回答。由于我们已经告诉模型要以一致的语气回答,因此现在我们问“请教我何为韧性”,由于模型已经有了这个少样本示例( few-shot example ),它将以类似的语气回答下一个任务。"]},{"cell_type":"code","execution_count":22,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["<祖父母>: 韧性是一种坚持不懈的品质,就像一棵顽强的树在风雨中屹立不倒。它是面对困难和挑战时不屈不挠的精神,能够适应变化和克服逆境。韧性是一种内在的力量,让我们能够坚持追求目标,即使面临困难和挫折也能坚持不懈地努力。\n"]}],"source":["prompt = f\"\"\"\n","您的任务是以一致的风格回答问题。\n","\n","<孩子>: 请教我何为耐心。\n","\n","<祖父母>: 挖出最深峡谷的河流源于一处不起眼的泉眼;最宏伟的交响乐从单一的音符开始;最复杂的挂毯以一根孤独的线开始编织。\n","\n","<孩子>: 请教我何为韧性。\n","\"\"\"\n","response = get_completion(prompt)\n","print(response)"]},{"attachments":{},"cell_type":"markdown","metadata":{},"source":["## 二、原则二 给模型时间去思考\n","\n","如果您发现模型推理过程过于匆忙,导致得出了错误的结论,那么您应该尝试重新构思 Prompt ,要求模型在提供最终答案之前开展**思维链**,或进行一系列相关推理(a chain or series of relevant reasoning)。换句话说,如果您给模型一个在短时间内或用少量文字无法完成的复杂任务,它的输出结果就容易出错。这种情况对人来说也是类似:如果您要求某人完成复杂的数学问题,又不给足够时间计算出答案,他们也可能会犯错误。因此,在这些情况下,您应该指示模型花更多时间思考问题,让它在任务上花费更多计算资源。"]},{"cell_type":"markdown","metadata":{},"source":["### 2.1 指定完成任务所需的步骤"]},{"attachments":{},"cell_type":"markdown","metadata":{},"source":["\n","\n","接下来我们将通过给定一个复杂任务,给出完成该任务的一系列步骤,来展示这一策略的效果。"]},{"attachments":{},"cell_type":"markdown","metadata":{},"source":["首先我们描述了杰克和吉尔的故事,并给出提示词执行以下操作:首先,用一句话概括三个反引号限定的文本。第二,将摘要翻译成英语。第三,在英语摘要中列出每个名称。第四,输出包含以下键的 JSON 对象:英语摘要和人名个数。要求输出以换行符分隔。"]},{"cell_type":"code","execution_count":28,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["prompt 1:\n","1-两个兄妹在山上打水时发生意外,但最终平安回家。\n","2-In a charming village, siblings Jack and Jill set off to fetch water from a well on top of a hill. While singing joyfully, they climbed up, but unfortunately, Jack tripped on a stone and rolled down the hill, with Jill following closely behind. Despite some minor injuries, they made it back to their cozy home. Despite the mishap, their adventurous spirit remained undiminished as they continued to explore with delight.\n","3-Jack, Jill\n","4-{\"english_summary\": \"In a charming village, siblings Jack and Jill set off to fetch water from a well on top of a hill. While singing joyfully, they climbed up, but unfortunately, Jack tripped on a stone and rolled down the hill, with Jill following closely behind. Despite some minor injuries, they made it back to their cozy home. Despite the mishap, their adventurous spirit remained undiminished as they continued to explore with delight.\", \"num_names\": 2}\n"]}],"source":["text = f\"\"\"\n","在一个迷人的村庄里,兄妹杰克和吉尔出发去一个山顶井里打水。\\\n","他们一边唱着欢乐的歌,一边往上爬,\\\n","然而不幸降临——杰克绊了一块石头,从山上滚了下来,吉尔紧随其后。\\\n","虽然略有些摔伤,但他们还是回到了温馨的家中。\\\n","尽管出了这样的意外,他们的冒险精神依然没有减弱,继续充满愉悦地探索。\n","\"\"\"\n","# example 1\n","prompt_1 = f\"\"\"\n","执行以下操作:\n","1-用一句话概括下面用三个反引号括起来的文本。\n","2-将摘要翻译成英语。\n","3-在英语摘要中列出每个人名。\n","4-输出一个 JSON 对象,其中包含以下键:english_summary,num_names。\n","\n","请用换行符分隔您的答案。\n","\n","Text:\n","```{text}```\n","\"\"\"\n","response = get_completion(prompt_1)\n","print(\"prompt 1:\")\n","print(response)"]},{"cell_type":"markdown","metadata":{},"source":[]},{"attachments":{},"cell_type":"markdown","metadata":{},"source":["上述输出仍然存在一定问题,例如,键“姓名”会被替换为法语(译注:在英文原版中,要求从英语翻译到法语,对应指令第三步的输出为 'Noms:',为Name的法语,这种行为难以预测,并可能为导出带来困难)\n","\n","因此,我们将Prompt加以改进,该 Prompt 前半部分不变,同时**确切指定了输出的格式**。"]},{"cell_type":"code","execution_count":29,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["\n","prompt 2:\n","Summary: 在一个迷人的村庄里,兄妹杰克和吉尔在山顶井里打水时发生了意外,但他们的冒险精神依然没有减弱,继续充满愉悦地探索。\n","\n","Translation: In a charming village, siblings Jack and Jill set off to fetch water from a well on top of a hill. Unfortunately, Jack tripped on a rock and tumbled down the hill, with Jill following closely behind. Despite some minor injuries, they made it back home safely. Despite the mishap, their adventurous spirit remained strong as they continued to explore joyfully.\n","\n","Names: Jack, Jill\n","\n","JSON Output: {\"English_summary\": \"In a charming village, siblings Jack and Jill set off to fetch water from a well on top of a hill. Unfortunately, Jack tripped on a rock and tumbled down the hill, with Jill following closely behind. Despite some minor injuries, they made it back home safely. Despite the mishap, their adventurous spirit remained strong as they continued to explore joyfully.\", \"num_names\": 2}\n"]}],"source":["prompt_2 = f\"\"\"\n","1-用一句话概括下面用<>括起来的文本。\n","2-将摘要翻译成英语。\n","3-在英语摘要中列出每个名称。\n","4-输出一个 JSON 对象,其中包含以下键:English_summary,num_names。\n","\n","请使用以下格式:\n","文本:<要总结的文本>\n","摘要:<摘要>\n","翻译:<摘要的翻译>\n","名称:<英语摘要中的名称列表>\n","输出 JSON:<带有 English_summary 和 num_names 的 JSON>\n","\n","Text: <{text}>\n","\"\"\"\n","response = get_completion(prompt_2)\n","print(\"\\nprompt 2:\")\n","print(response)"]},{"attachments":{},"cell_type":"markdown","metadata":{},"source":[" "]},{"cell_type":"markdown","metadata":{},"source":["### 2.2 指导模型在下结论之前找出一个自己的解法"]},{"attachments":{},"cell_type":"markdown","metadata":{},"source":["\n","\n","明确地指引模型在匆匆做决策之前,要自己思考出一份解决方案。有时这样会得到更好的结果。这与之前所述思想类似,即给模型时间思考。\n","\n","接下来我们会给出一个问题和一份来自学生的解答,要求模型判断解答是否正确:"]},{"cell_type":"code","execution_count":30,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["学生的解决方案是正确的。他正确地计算了土地费用、太阳能电池板费用和维护费用,并将它们相加得到了总费用。\n"]}],"source":["prompt = f\"\"\"\n","判断学生的解决方案是否正确。\n","\n","问题:\n","我正在建造一个太阳能发电站,需要帮助计算财务。\n","\n"," 土地费用为 100美元/平方英尺\n"," 我可以以 250美元/平方英尺的价格购买太阳能电池板\n"," 我已经谈判好了维护合同,每年需要支付固定的10万美元,并额外支付每平方英尺10美元\n"," 作为平方英尺数的函数,首年运营的总费用是多少。\n","\n","学生的解决方案:\n","设x为发电站的大小,单位为平方英尺。\n","费用:\n","\n"," 土地费用:100x\n"," 太阳能电池板费用:250x\n"," 维护费用:100,000美元+100x\n"," 总费用:100x+250x+100,000美元+100x=450x+100,000美元\n","\"\"\"\n","response = get_completion(prompt)\n","print(response)"]},{"cell_type":"markdown","metadata":{},"source":[]},{"attachments":{},"cell_type":"markdown","metadata":{},"source":["但是注意,学生的解决方案实际上是错误的。(*维护费用项100x应为10x,总费用450x应为360x*)\n","\n","我们可以通过指导模型先自行找出一个解法来解决这个问题。\n","\n","在接下来这个 Prompt 中,我们要求模型先自行解决这个问题,再根据自己的解法与学生的解法进行对比,从而判断学生的解法是否正确。同时,我们给定了输出的格式要求。通过拆分任务、明确步骤,让模型有更多时间思考,有时可以获得更准确的结果。在这个例子中,学生的答案是错误的,但如果我们没有先让模型自己计算,那么可能会被误导以为学生是正确的。"]},{"cell_type":"code","execution_count":40,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["实际解决方案和步骤:\n","\n"," 1. 土地费用:每平方英尺100美元,所以总费用为100x美元。\n"," 2. 太阳能电池板费用:每平方英尺250美元,所以总费用为250x美元。\n"," 3. 维护费用:固定费用为10万美元,额外费用为每平方英尺10美元,所以总费用为10万美元+10x美元。\n"," 4. 总费用:将上述三项费用相加,得到总费用为100x美元+250x美元+10万美元+10x美元=360x+10万美元。\n","\n","学生计算的总费用:450x+10万美元\n","实际计算的总费用:360x+10万美元\n","学生计算的费用和实际计算的费用是否相同:否\n","学生的解决方案和实际解决方案是否相同:否\n","学生的成绩:不正确\n"]}],"source":["prompt = f\"\"\"\n","请判断学生的解决方案是否正确,请通过如下步骤解决这个问题:\n","\n","步骤:\n","\n"," 首先,自己解决问题。\n"," 然后将您的解决方案与学生的解决方案进行比较,对比计算得到的总费用与学生计算的总费用是否一致,并评估学生的解决方案是否正确。\n"," 在自己完成问题之前,请勿决定学生的解决方案是否正确。\n","\n","使用以下格式:\n","\n"," 问题:问题文本\n"," 学生的解决方案:学生的解决方案文本\n"," 实际解决方案和步骤:实际解决方案和步骤文本\n"," 学生计算的总费用:学生计算得到的总费用\n"," 实际计算的总费用:实际计算出的总费用\n"," 学生计算的费用和实际计算的费用是否相同:是或否\n"," 学生的解决方案和实际解决方案是否相同:是或否\n"," 学生的成绩:正确或不正确\n","\n","问题:\n","\n"," 我正在建造一个太阳能发电站,需要帮助计算财务。 \n"," - 土地费用为每平方英尺100美元\n"," - 我可以以每平方英尺250美元的价格购买太阳能电池板\n"," - 我已经谈判好了维护合同,每年需要支付固定的10万美元,并额外支付每平方英尺10美元;\n","\n"," 作为平方英尺数的函数,首年运营的总费用是多少。\n","\n","学生的解决方案:\n","\n"," 设x为发电站的大小,单位为平方英尺。\n"," 费用:\n"," 1. 土地费用:100x美元\n"," 2. 太阳能电池板费用:250x美元\n"," 3. 维护费用:100,000+100x=10万美元+10x美元\n"," 总费用:100x美元+250x美元+10万美元+100x美元=450x+10万美元\n","\n","实际解决方案和步骤:\n","\"\"\"\n","response = get_completion(prompt)\n","print(response)"]},{"cell_type":"markdown","metadata":{},"source":[]},{"attachments":{},"cell_type":"markdown","metadata":{},"source":["## 三、局限性"]},{"attachments":{},"cell_type":"markdown","metadata":{},"source":["**开发大模型相关应用时请务必铭记:**\n","\n","\n","**虚假知识**:模型偶尔会生成一些看似真实实则编造的知识\n","\n","虽然模型在训练过程中接触了大量的知识,但它并没有*完全*记住所见的信息,因此它不甚清楚自己知识的边界。这意味着它可能会尝试回答主题晦涩难懂的问题,并编造听起来合理但实际上并不正确的答案。我们称这些编造的想法为幻觉(Hallucination)。\n","\n","如下示例展示了大模型的幻觉。我们要求告诉我们华为公司生产的 *GT Watch 运动手表* 产品的信息,事实上,这个公司是真实存在的,但产品是编造的,而模型一本正经地提供了它编造的知识,而且迷惑性很强。\n","\n"]},{"cell_type":"code","execution_count":44,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["华为公司生产的GT Watch运动手表是一款智能手表,具有多种功能和特点。以下是相关信息:\n","\n","1. 设计和外观:GT Watch采用圆形表盘设计,具有精致的外观和高质量的材料制造。它有多种颜色和表带选择,可以根据个人喜好进行定制。\n","\n","2. 显示屏:GT Watch配备了1.39英寸的AMOLED显示屏,具有高清分辨率和良好的可视性。用户可以通过触摸屏幕进行操作和导航。\n","\n","3. 运动追踪:GT Watch具有全天候的运动追踪功能,可以监测用户的步数、跑步距离、卡路里消耗和心率等数据。它还支持多种运动模式,如跑步、骑行、游泳等。\n","\n","4. 健康监测:GT Watch可以监测用户的心率、血氧饱和度和睡眠质量等健康指标。它还提供健康建议和提醒,帮助用户保持良好的健康状态。\n","\n","5. 通知和连接:GT Watch可以与用户的手机进行连接,通过蓝牙技术实现通知推送和电话提醒。用户可以在手表上查看短信、电话和社交媒体通知,无需拿出手机。\n","\n","6. 长续航时间:GT Watch具有较长的续航时间,一次充电可以使用数天。它还支持快速充电技术,可以在短时间内充满电。\n","\n","7. 其他功能:GT Watch还具有其他功能,如天气预报、闹钟、计时器、计步器等。它还支持NFC支付和音乐控制等便利功能。\n","\n","总体而言,华为GT Watch是一款功能强大、外观精致的智能运动手表,适合那些注重健康和运动的用户使用。\n"]}],"source":["prompt = f\"\"\"\n","告诉我华为公司生产的GT Watch运动手表的相关信息\n","\"\"\"\n","response = get_completion(prompt)\n","print(response)"]},{"cell_type":"markdown","metadata":{},"source":[]},{"attachments":{},"cell_type":"markdown","metadata":{},"source":["由于很容易以假乱真,请读者根据在本系列教程中所学知识,在构建自己的应用程序时尽量避免幻觉情况。幻觉是大模型的一个已知缺陷(注:截至2023年7月),OpenAI也在努力解决该问题。\n","\n","在您希望模型根据文本生成回答时,另一种减少幻觉的策略是先要求模型获取来源于该文本的所有引用信息(任何相关引用,any relevant quotes),然后要求它基于所引用的信息来回答问题,这使得我们能根据答案追溯源文档,通常对减少幻觉非常有帮助。"]},{"attachments":{},"cell_type":"markdown","metadata":{},"source":["**关于反斜杠使用的说明:**\n","\n","在本教程中,我们使用反斜杠 \\ 来使文本适应屏幕大小以提高阅读体验,而没有用换行符 \\n 。GPT-3 并不受换行符(newline characters)的影响,但在您调用其他大模型时,需额外考虑换行符是否会影响模型性能。"]},{"cell_type":"markdown","metadata":{},"source":["## 四、英文原版 Prompt"]},{"cell_type":"markdown","metadata":{},"source":["**1.1 使用分隔符清晰地表示输入的不同部分**"]},{"cell_type":"code","execution_count":45,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["To guide a model towards the desired output and reduce irrelevant or incorrect responses, it is important to provide clear and specific instructions, which can be achieved through longer prompts that offer more clarity and context.\n"]}],"source":["text = f\"\"\"\n","You should express what you want a model to do by \\ \n","providing instructions that are as clear and \\ \n","specific as you can possibly make them. \\ \n","This will guide the model towards the desired output, \\ \n","and reduce the chances of receiving irrelevant \\ \n","or incorrect responses. Don't confuse writing a \\ \n","clear prompt with writing a short prompt. \\ \n","In many cases, longer prompts provide more clarity \\ \n","and context for the model, which can lead to \\ \n","more detailed and relevant outputs.\n","\"\"\"\n","prompt = f\"\"\"\n","Summarize the text delimited by triple backticks \\ \n","into a single sentence.\n","```{text}```\n","\"\"\"\n","response = get_completion(prompt)\n","print(response)"]},{"cell_type":"markdown","metadata":{},"source":["**1.2**寻求结构化的输出"]},{"cell_type":"code","execution_count":46,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["{\n"," \"books\": [\n"," {\n"," \"book_id\": 1,\n"," \"title\": \"The Enigma of Elysium\",\n"," \"author\": \"Evelyn Sinclair\",\n"," \"genre\": \"Mystery\"\n"," },\n"," {\n"," \"book_id\": 2,\n"," \"title\": \"Whispers in the Wind\",\n"," \"author\": \"Nathaniel Blackwood\",\n"," \"genre\": \"Fantasy\"\n"," },\n"," {\n"," \"book_id\": 3,\n"," \"title\": \"Echoes of the Past\",\n"," \"author\": \"Amelia Hart\",\n"," \"genre\": \"Romance\"\n"," }\n"," ]\n","}\n"]}],"source":["prompt = f\"\"\"\n","Generate a list of three made-up book titles along \\ \n","with their authors and genres. \n","Provide them in JSON format with the following keys: \n","book_id, title, author, genre.\n","\"\"\"\n","response = get_completion(prompt)\n","print(response)\n"]},{"cell_type":"markdown","metadata":{},"source":["**1.3 要求模型检查是否满足条件**"]},{"cell_type":"code","execution_count":56,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["Completion for Text 1:\n","Step 1 - Get some water boiling.\n","Step 2 - Grab a cup and put a tea bag in it.\n","Step 3 - Once the water is hot enough, pour it over the tea bag.\n","Step 4 - Let it sit for a bit so the tea can steep.\n","Step 5 - After a few minutes, take out the tea bag.\n","Step 6 - If you like, add some sugar or milk to taste.\n","Step 7 - Enjoy your delicious cup of tea.\n"]}],"source":["text_1 = f\"\"\"\n","Making a cup of tea is easy! First, you need to get some \\ \n","water boiling. While that's happening, \\ \n","grab a cup and put a tea bag in it. Once the water is \\ \n","hot enough, just pour it over the tea bag. \\ \n","Let it sit for a bit so the tea can steep. After a \\ \n","few minutes, take out the tea bag. If you \\ \n","like, you can add some sugar or milk to taste. \\ \n","And that's it! You've got yourself a delicious \\ \n","cup of tea to enjoy.\n","\"\"\"\n","prompt = f\"\"\"\n","You will be provided with text delimited by triple quotes. \n","If it contains a sequence of instructions, \\ \n","re-write those instructions in the following format:\n","\n","Step 1 - ...\n","Step 2 - …\n","…\n","Step N - …\n","\n","If the text does not contain a sequence of instructions, \\ \n","then simply write \\\"No steps provided.\\\"\n","\n","\\\"\\\"\\\"{text_1}\\\"\\\"\\\"\n","\"\"\"\n","response = get_completion(prompt)\n","print(\"Completion for Text 1:\")\n","print(response)"]},{"cell_type":"code","execution_count":48,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["Completion for Text 2:\n","No steps provided.\n"]}],"source":["text_2 = f\"\"\"\n","The sun is shining brightly today, and the birds are \\\n","singing. It's a beautiful day to go for a \\ \n","walk in the park. The flowers are blooming, and the \\ \n","trees are swaying gently in the breeze. People \\ \n","are out and about, enjoying the lovely weather. \\ \n","Some are having picnics, while others are playing \\ \n","games or simply relaxing on the grass. It's a \\ \n","perfect day to spend time outdoors and appreciate the \\ \n","beauty of nature.\n","\"\"\"\n","prompt = f\"\"\"You will be provided with text delimited by triple quotes. \n","If it contains a sequence of instructions, \\ \n","re-write those instructions in the following format:\n","Step 1 - ...\n","Step 2 - …\n","…\n","Step N - …\n","\n","If the text does not contain a sequence of instructions, \\ \n","then simply write \\\"No steps provided.\\\"\n","\n","\\\"\\\"\\\"{text_2}\\\"\\\"\\\"\n","\"\"\"\n","response = get_completion(prompt)\n","print(\"Completion for Text 2:\")\n","print(response)"]},{"cell_type":"markdown","metadata":{},"source":["**1.4 提供少量示例**(少样本提示词,Few-shot prompting)"]},{"cell_type":"code","execution_count":49,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":[": Resilience is like a mighty oak tree that withstands the strongest storms, bending but never breaking. It is the unwavering determination to rise again after every fall, and the ability to find strength in the face of adversity. Just as a diamond is formed under immense pressure, resilience is forged through challenges and hardships, making us stronger and more resilient in the process.\n"]}],"source":["prompt = f\"\"\"\n","Your task is to answer in a consistent style.\n","\n",": Teach me about patience.\n","\n",": The river that carves the deepest \\ \n","valley flows from a modest spring; the \\ \n","grandest symphony originates from a single note; \\ \n","the most intricate tapestry begins with a solitary thread.\n","\n",": Teach me about resilience.\n","\"\"\"\n","response = get_completion(prompt)\n","print(response)"]},{"cell_type":"markdown","metadata":{},"source":["**2.1 指定完成任务所需的步骤**"]},{"cell_type":"code","execution_count":50,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["Completion for prompt 1:\n","1 - Jack and Jill, siblings, go on a quest to fetch water from a hilltop well, but encounter misfortune when Jack trips on a stone and tumbles down the hill, with Jill following suit, yet they return home and remain undeterred in their adventurous spirits.\n","\n","2 - Jack et Jill, frère et sœur, partent en quête d'eau d'un puits au sommet d'une colline, mais rencontrent un malheur lorsque Jack trébuche sur une pierre et dévale la colline, suivi par Jill, pourtant ils rentrent chez eux et restent déterminés dans leur esprit d'aventure.\n","\n","3 - Jack, Jill\n","\n","4 - {\n"," \"french_summary\": \"Jack et Jill, frère et sœur, partent en quête d'eau d'un puits au sommet d'une colline, mais rencontrent un malheur lorsque Jack trébuche sur une pierre et dévale la colline, suivi par Jill, pourtant ils rentrent chez eux et restent déterminés dans leur esprit d'aventure.\",\n"," \"num_names\": 2\n","}\n"]}],"source":["text = f\"\"\"\n","In a charming village, siblings Jack and Jill set out on \\ \n","a quest to fetch water from a hilltop \\ \n","well. As they climbed, singing joyfully, misfortune \\ \n","struck—Jack tripped on a stone and tumbled \\ \n","down the hill, with Jill following suit. \\ \n","Though slightly battered, the pair returned home to \\ \n","comforting embraces. Despite the mishap, \\ \n","their adventurous spirits remained undimmed, and they \\ \n","continued exploring with delight.\n","\"\"\"\n","# example 1\n","prompt_1 = f\"\"\"\n","Perform the following actions: \n","1 - Summarize the following text delimited by triple \\\n","backticks with 1 sentence.\n","2 - Translate the summary into French.\n","3 - List each name in the French summary.\n","4 - Output a json object that contains the following \\\n","keys: french_summary, num_names.\n","\n","Separate your answers with line breaks.\n","\n","Text:\n","```{text}```\n","\"\"\"\n","response = get_completion(prompt_1)\n","print(\"Completion for prompt 1:\")\n","print(response)"]},{"cell_type":"code","execution_count":51,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["\n","Completion for prompt 2:\n","Summary: Jack and Jill, siblings from a charming village, go on a quest to fetch water from a hilltop well, but encounter misfortune when Jack trips on a stone and tumbles down the hill, with Jill following suit, yet they remain undeterred and continue exploring with delight.\n","\n","Translation: Jack et Jill, frère et sœur d'un charmant village, partent en quête d'eau d'un puits au sommet d'une colline, mais rencontrent un malheur lorsque Jack trébuche sur une pierre et dévale la colline, suivi par Jill, pourtant ils restent déterminés et continuent à explorer avec joie.\n","\n","Names: Jack, Jill\n","\n","Output JSON: \n","{\n"," \"french_summary\": \"Jack et Jill, frère et sœur d'un charmant village, partent en quête d'eau d'un puits au sommet d'une colline, mais rencontrent un malheur lorsque Jack trébuche sur une pierre et dévale la colline, suivi par Jill, pourtant ils restent déterminés et continuent à explorer avec joie.\",\n"," \"num_names\": 2\n","}\n"]}],"source":["prompt_2 = f\"\"\"\n","Your task is to perform the following actions: \n","1 - Summarize the following text delimited by <> with 1 sentence.\n","2 - Translate the summary into French.\n","3 - List each name in the French summary.\n","4 - Output a json object that contains the \n","following keys: french_summary, num_names.\n","\n","Use the following format:\n","Text: \n","Summary: \n","Translation: \n","Names: \n","Output JSON: \n","\n","Text: <{text}>\n","\"\"\"\n","response = get_completion(prompt_2)\n","print(\"\\nCompletion for prompt 2:\")\n","print(response)"]},{"cell_type":"markdown","metadata":{},"source":["**2.2 指导模型在下结论之前找出一个自己的解法**"]},{"cell_type":"code","execution_count":52,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["The student's solution is correct. They correctly identified the costs for land, solar panels, and maintenance, and calculated the total cost for the first year of operations as a function of the number of square feet.\n"]}],"source":["prompt = f\"\"\"\n","Determine if the student's solution is correct or not.\n","\n","Question:\n","I'm building a solar power installation and I need \\\n"," help working out the financials. \n","- Land costs $100 / square foot\n","- I can buy solar panels for $250 / square foot\n","- I negotiated a contract for maintenance that will cost \\ \n","me a flat $100k per year, and an additional $10 / square \\\n","foot\n","What is the total cost for the first year of operations \n","as a function of the number of square feet.\n","\n","Student's Solution:\n","Let x be the size of the installation in square feet.\n","Costs:\n","1. Land cost: 100x\n","2. Solar panel cost: 250x\n","3. Maintenance cost: 100,000 + 100x\n","Total cost: 100x + 250x + 100,000 + 100x = 450x + 100,000\n","\"\"\"\n","response = get_completion(prompt)\n","print(response)"]},{"cell_type":"code","execution_count":53,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["To calculate the total cost for the first year of operations, we need to add up the costs of land, solar panels, and maintenance.\n","\n","1. Land cost: $100 / square foot\n","The cost of land is $100 multiplied by the number of square feet.\n","\n","2. Solar panel cost: $250 / square foot\n","The cost of solar panels is $250 multiplied by the number of square feet.\n","\n","3. Maintenance cost: $100,000 + $10 / square foot\n","The maintenance cost is a flat fee of $100,000 per year, plus $10 multiplied by the number of square feet.\n","\n","Total cost: Land cost + Solar panel cost + Maintenance cost\n","\n","So the actual solution is:\n","Total cost = (100 * x) + (250 * x) + (100,000 + (10 * x))\n","\n","Is the student's solution the same as the actual solution just calculated:\n","No\n","\n","Student grade:\n","Incorrect\n"]}],"source":["prompt = f\"\"\"\n","Your task is to determine if the student's solution \\\n","is correct or not.\n","To solve the problem do the following:\n","- First, work out your own solution to the problem. \n","- Then compare your solution to the student's solution \\ \n","and evaluate if the student's solution is correct or not. \n","Don't decide if the student's solution is correct until \n","you have done the problem yourself.\n","\n","Use the following format:\n","Question:\n","```\n","question here\n","```\n","Student's solution:\n","```\n","student's solution here\n","```\n","Actual solution:\n","```\n","steps to work out the solution and your solution here\n","```\n","Is the student's solution the same as actual solution \\\n","just calculated:\n","```\n","yes or no\n","```\n","Student grade:\n","```\n","correct or incorrect\n","```\n","\n","Question:\n","```\n","I'm building a solar power installation and I need help \\\n","working out the financials. \n","- Land costs $100 / square foot\n","- I can buy solar panels for $250 / square foot\n","- I negotiated a contract for maintenance that will cost \\\n","me a flat $100k per year, and an additional $10 / square \\\n","foot\n","What is the total cost for the first year of operations \\\n","as a function of the number of square feet.\n","``` \n","Student's solution:\n","```\n","Let x be the size of the installation in square feet.\n","Costs:\n","1. Land cost: 100x\n","2. Solar panel cost: 250x\n","3. Maintenance cost: 100,000 + 100x\n","Total cost: 100x + 250x + 100,000 + 100x = 450x + 100,000\n","```\n","Actual solution:\n","\"\"\"\n","response = get_completion(prompt)\n","print(response)"]},{"cell_type":"markdown","metadata":{},"source":["**3.1 幻觉**"]},{"cell_type":"code","execution_count":54,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["The AeroGlide UltraSlim Smart Toothbrush by Boie is a technologically advanced toothbrush designed to provide a superior brushing experience. Boie is a company known for its innovative oral care products, and the AeroGlide UltraSlim Smart Toothbrush is no exception.\n","\n","One of the standout features of this toothbrush is its ultra-slim design. The brush head is only 2mm thick, making it much thinner than traditional toothbrushes. This slim profile allows for better access to hard-to-reach areas of the mouth, ensuring a thorough and effective clean.\n","\n","The AeroGlide UltraSlim Smart Toothbrush also incorporates smart technology. It connects to a mobile app via Bluetooth, allowing users to track their brushing habits and receive personalized recommendations for improving their oral hygiene routine. The app provides real-time feedback on brushing technique, duration, and coverage, helping users to achieve optimal oral health.\n","\n","The toothbrush features soft, antimicrobial bristles made from a durable thermoplastic elastomer. These bristles are gentle on the gums and teeth, while also being effective at removing plaque and debris. The antimicrobial properties help to keep the brush head clean and hygienic between uses.\n","\n","Another notable feature of the AeroGlide UltraSlim Smart Toothbrush is its long battery life. It can last up to 30 days on a single charge, making it convenient for travel or everyday use without the need for frequent recharging.\n","\n","Overall, the AeroGlide UltraSlim Smart Toothbrush by Boie offers a combination of advanced technology, slim design, and effective cleaning capabilities. It is a great option for those looking to upgrade their oral care routine and achieve a healthier smile.\n"]}],"source":["prompt = f\"\"\"\n","Tell me about AeroGlide UltraSlim Smart Toothbrush by Boie\n","\"\"\"\n","response = get_completion(prompt)\n","print(response)"]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.10.11"},"latex_envs":{"LaTeX_envs_menu_present":true,"autoclose":false,"autocomplete":true,"bibliofile":"biblio.bib","cite_by":"apalike","current_citInitial":1,"eqLabelWithNumbers":true,"eqNumInitial":1,"hotkeys":{"equation":"Ctrl-E","itemize":"Ctrl-I"},"labels_anchors":false,"latex_user_defs":false,"report_style_numbering":false,"user_envs_cfg":false},"toc":{"base_numbering":1,"nav_menu":{},"number_sections":true,"sideBar":true,"skip_h1_title":false,"title_cell":"Table of Contents","title_sidebar":"Contents","toc_cell":false,"toc_position":{},"toc_section_display":true,"toc_window_display":true}},"nbformat":4,"nbformat_minor":4}
+{"cells":[{"attachments":{},"cell_type":"markdown","metadata":{},"source":["# 第二章 提示原则 Guidelines"]},{"attachments":{},"cell_type":"markdown","metadata":{},"source":["本章讨论了设计高效Prompt的两个关键原则:**清晰具体**和**给予充足思考时间**。掌握这两点,对创建可靠的语言模型交互尤为重要。\n","\n","首先,Prompt需要清晰明确地表达需求,提供充足上下文,使语言模型准确理解我们的意图,就像向一个外星人详细解释人类世界一样。过于简略的Prompt往往难以把握所要完成的具体任务。\n","\n","其次,让语言模型有充足时间推理也极为关键。就像人类解题一样,匆忙得出的结论多有失误。因此Prompt应加入逐步推理的要求,给模型留出充分思考时间,这样生成的结果才更准确可靠。\n","\n","如果Prompt在这两点上都作了优化,语言模型就能够尽可能发挥潜力,完成复杂的推理和生成任务。掌握这些Prompt设计原则,是开发者取得语言模型应用成功的重要一步。"]},{"cell_type":"markdown","metadata":{},"source":["## 一、原则一 编写清晰、具体的指令\n","亲爱的读者,在与语言模型交互时,您需要牢记一点:以**清晰、具体**的方式表达您的需求。假设您面前坐着一位来自外星球的新朋友,其对人类语言和常识都一无所知。在这种情况下,您需要把想表达的意图讲得非常明确,不要有任何歧义。同样的,在提供Prompt的时候,也要以足够详细和容易理解的方式,把您的需求与上下文说清楚。 \n","\n","并不是说Prompt就必须非常短小简洁。事实上,在许多情况下,更长、更复杂的Prompt反而会让语言模型更容易抓住关键点,给出符合预期的回复。原因在于,复杂的Prompt提供了更丰富的上下文和细节,让模型可以更准确地把握所需的操作和响应方式。\n","\n","所以,记住用清晰、详尽的语言表达Prompt,就像在给外星人讲解人类世界一样,”*Adding more context helps the model understand you better.*“。"]},{"cell_type":"markdown","metadata":{},"source":["### 1.1 使用分隔符清晰地表示输入的不同部分"]},{"attachments":{},"cell_type":"markdown","metadata":{},"source":["在编写Prompt时,我们可以使用各种标点符号作为“分隔符”,将不同的文本部分区分开来。\n","\n","分隔符就像是Prompt中的墙,将不同的指令、上下文、输入隔开,避免意外的混淆。你可以选择用 ` ```,\"\"\",< >, ,: ` 等做分隔符,只要能明确起到隔断作用即可。\n","\n","使用分隔符尤其重要的是可以防止 **“提示词注入” ( Prompt injection )**。什么是提示词注入?就是用户输入的文本可能包含与你的预设Prompt相冲突的内容,如果不加分隔,这些输入就可能“注入”并操纵语言模型,导致模型产生毫无关联的乱七八糟的输出。\n","\n","在以下的例子中,我们给出一段话并要求 GPT 进行总结,在该示例中我们使用 ``` 来作为分隔符。"]},{"cell_type":"code","execution_count":11,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["为了获得所需的输出,您应该提供清晰、具体的指示,避免与简短的提示词混淆,并使用更长的提示词来提供更多的清晰度和上下文信息。\n"]}],"source":["from tool import get_completion\n","\n","text = f\"\"\"\n","您应该提供尽可能清晰、具体的指示,以表达您希望模型执行的任务。\\\n","这将引导模型朝向所需的输出,并降低收到无关或不正确响应的可能性。\\\n","不要将写清晰的提示词与写简短的提示词混淆。\\\n","在许多情况下,更长的提示词可以为模型提供更多的清晰度和上下文信息,从而导致更详细和相关的输出。\n","\"\"\"\n","# 需要总结的文本内容\n","prompt = f\"\"\"\n","把用三个反引号括起来的文本总结成一句话。\n","```{text}```\n","\"\"\"\n","# 指令内容,使用 ``` 来分隔指令和待总结的内容\n","response = get_completion(prompt)\n","print(response)"]},{"cell_type":"markdown","metadata":{},"source":["### 1.2 寻求结构化的输出"]},{"attachments":{},"cell_type":"markdown","metadata":{},"source":["有时候我们需要语言模型给我们一些**结构化的输出**,而不仅仅是连续的文本。\n","\n","什么是结构化输出呢?就是按照某种格式组织的内容,例如JSON、HTML等。这种输出非常适合在代码中进一步解析和处理。例如,您可以在 Python 中将其读入字典或列表中。\n","\n","在以下示例中,我们要求 GPT 生成三本书的标题、作者和类别,并要求 GPT 以 JSON 的格式返回给我们,为便于解析,我们指定了 Json 的键。"]},{"cell_type":"code","execution_count":15,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["{\n"," \"books\": [\n"," {\n"," \"book_id\": 1,\n"," \"title\": \"迷失的时光\",\n"," \"author\": \"张三\",\n"," \"genre\": \"科幻\"\n"," },\n"," {\n"," \"book_id\": 2,\n"," \"title\": \"幻境之门\",\n"," \"author\": \"李四\",\n"," \"genre\": \"奇幻\"\n"," },\n"," {\n"," \"book_id\": 3,\n"," \"title\": \"虚拟现实\",\n"," \"author\": \"王五\",\n"," \"genre\": \"科幻\"\n"," }\n"," ]\n","}\n"]}],"source":["prompt = f\"\"\"\n","请生成包括书名、作者和类别的三本虚构的、非真实存在的中文书籍清单,\\\n","并以 JSON 格式提供,其中包含以下键:book_id、title、author、genre。\n","\"\"\"\n","response = get_completion(prompt)\n","print(response)\n"]},{"cell_type":"markdown","metadata":{},"source":["### 1.3 要求模型检查是否满足条件"]},{"attachments":{},"cell_type":"markdown","metadata":{},"source":["如果任务包含不一定能满足的假设(条件),我们可以告诉模型先检查这些假设,如果不满足,则会指出并停止执行后续的完整流程。您还可以考虑可能出现的边缘情况及模型的应对,以避免意外的结果或错误发生。\n","\n","在如下示例中,我们将分别给模型两段文本,分别是制作茶的步骤以及一段没有明确步骤的文本。我们将要求模型判断其是否包含一系列指令,如果包含则按照给定格式重新编写指令,不包含则回答“未提供步骤”。"]},{"cell_type":"code","execution_count":16,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["Text 1 的总结:\n","第一步 - 把水烧开。\n","第二步 - 拿一个杯子并把茶包放进去。\n","第三步 - 把烧开的水倒在茶包上。\n","第四步 - 等待几分钟,让茶叶浸泡。\n","第五步 - 取出茶包。\n","第六步 - 如果需要,加入糖或牛奶调味。\n","第七步 - 就这样,您可以享受一杯美味的茶了。\n"]}],"source":["# 满足条件的输入(text中提供了步骤)\n","text_1 = f\"\"\"\n","泡一杯茶很容易。首先,需要把水烧开。\\\n","在等待期间,拿一个杯子并把茶包放进去。\\\n","一旦水足够热,就把它倒在茶包上。\\\n","等待一会儿,让茶叶浸泡。几分钟后,取出茶包。\\\n","如果您愿意,可以加一些糖或牛奶调味。\\\n","就这样,您可以享受一杯美味的茶了。\n","\"\"\"\n","prompt = f\"\"\"\n","您将获得由三个引号括起来的文本。\\\n","如果它包含一系列的指令,则需要按照以下格式重新编写这些指令:\n","\n","第一步 - ...\n","第二步 - …\n","…\n","第N步 - …\n","\n","如果文本中不包含一系列的指令,则直接写“未提供步骤”。\"\n","\\\"\\\"\\\"{text_1}\\\"\\\"\\\"\n","\"\"\"\n","response = get_completion(prompt)\n","print(\"Text 1 的总结:\")\n","print(response)"]},{"cell_type":"code","execution_count":17,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["Text 2 的总结:\n","未提供步骤。\n"]}],"source":["# 不满足条件的输入(text中未提供预期指令)\n","text_2 = f\"\"\"\n","今天阳光明媚,鸟儿在歌唱。\\\n","这是一个去公园散步的美好日子。\\\n","鲜花盛开,树枝在微风中轻轻摇曳。\\\n","人们外出享受着这美好的天气,有些人在野餐,有些人在玩游戏或者在草地上放松。\\\n","这是一个完美的日子,可以在户外度过并欣赏大自然的美景。\n","\"\"\"\n","prompt = f\"\"\"\n","您将获得由三个引号括起来的文本。\\\n","如果它包含一系列的指令,则需要按照以下格式重新编写这些指令:\n","\n","第一步 - ...\n","第二步 - …\n","…\n","第N步 - …\n","\n","如果文本中不包含一系列的指令,则直接写“未提供步骤”。\"\n","\\\"\\\"\\\"{text_2}\\\"\\\"\\\"\n","\"\"\"\n","response = get_completion(prompt)\n","print(\"Text 2 的总结:\")\n","print(response)"]},{"cell_type":"markdown","metadata":{},"source":["### 1.4 提供少量示例"]},{"attachments":{},"cell_type":"markdown","metadata":{},"source":["\"Few-shot\" prompting,即在要求模型执行实际任务之前,给模型一两个已完成的样例,让模型了解我们的要求和期望的输出样式。\n","\n","例如,在以下的样例中,我们先给了一个祖孙对话样例,然后要求模型用同样的隐喻风格回答关于“韧性”的问题。这就是一个少样本样例,它能帮助模型快速抓住我们要的语调和风格。\n","\n","利用少样本样例,我们可以轻松“预热”语言模型,让它为新的任务做好准备。这是一个让模型快速上手新任务的有效策略。"]},{"cell_type":"code","execution_count":22,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["<祖父母>: 韧性是一种坚持不懈的品质,就像一棵顽强的树在风雨中屹立不倒。它是面对困难和挑战时不屈不挠的精神,能够适应变化和克服逆境。韧性是一种内在的力量,让我们能够坚持追求目标,即使面临困难和挫折也能坚持不懈地努力。\n"]}],"source":["prompt = f\"\"\"\n","您的任务是以一致的风格回答问题。\n","\n","<孩子>: 请教我何为耐心。\n","\n","<祖父母>: 挖出最深峡谷的河流源于一处不起眼的泉眼;最宏伟的交响乐从单一的音符开始;最复杂的挂毯以一根孤独的线开始编织。\n","\n","<孩子>: 请教我何为韧性。\n","\"\"\"\n","response = get_completion(prompt)\n","print(response)"]},{"attachments":{},"cell_type":"markdown","metadata":{},"source":["## 二、原则二 给模型时间去思考\n","\n","在设计Prompt时,给予语言模型充足的推理时间非常重要。语言模型与人类一样,需要时间来思考并解决复杂问题。如果让语言模型匆忙给出结论,其结果很可能不准确。\n","\n","例如,若要语言模型推断一本书的主题,仅提供简单的书名和一句简介是不足够的。这就像让一个人在极短时间内解决困难的数学题,错误在所难免。\n","\n","相反,我们应通过Prompt指引语言模型进行深入思考。可以要求其先列出对问题的各种看法,说明推理依据,然后再得出最终结论。在Prompt中添加逐步推理的要求,能让语言模型投入更多时间逻辑思维,输出结果也将更可靠准确。\n","\n","综上所述,给予语言模型充足的推理时间,是Prompt工程中一个非常重要的设计原则。这将大大提高语言模型处理复杂问题的效果,也是构建高质量Prompt的关键之处。开发者应注意给Prompt留出思考空间,以发挥语言模型的最大潜力。"]},{"cell_type":"markdown","metadata":{},"source":["### 2.1 指定完成任务所需的步骤"]},{"attachments":{},"cell_type":"markdown","metadata":{},"source":["\n","\n","接下来我们将通过给定一个复杂任务,给出完成该任务的一系列步骤,来展示这一策略的效果。"]},{"attachments":{},"cell_type":"markdown","metadata":{},"source":["首先我们描述了杰克和吉尔的故事,并给出提示词执行以下操作:首先,用一句话概括三个反引号限定的文本。第二,将摘要翻译成英语。第三,在英语摘要中列出每个名称。第四,输出包含以下键的 JSON 对象:英语摘要和人名个数。要求输出以换行符分隔。"]},{"cell_type":"code","execution_count":28,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["prompt 1:\n","1-两个兄妹在山上打水时发生意外,但最终平安回家。\n","2-In a charming village, siblings Jack and Jill set off to fetch water from a well on top of a hill. While singing joyfully, they climbed up, but unfortunately, Jack tripped on a stone and rolled down the hill, with Jill following closely behind. Despite some minor injuries, they made it back to their cozy home. Despite the mishap, their adventurous spirit remained undiminished as they continued to explore with delight.\n","3-Jack, Jill\n","4-{\"english_summary\": \"In a charming village, siblings Jack and Jill set off to fetch water from a well on top of a hill. While singing joyfully, they climbed up, but unfortunately, Jack tripped on a stone and rolled down the hill, with Jill following closely behind. Despite some minor injuries, they made it back to their cozy home. Despite the mishap, their adventurous spirit remained undiminished as they continued to explore with delight.\", \"num_names\": 2}\n"]}],"source":["text = f\"\"\"\n","在一个迷人的村庄里,兄妹杰克和吉尔出发去一个山顶井里打水。\\\n","他们一边唱着欢乐的歌,一边往上爬,\\\n","然而不幸降临——杰克绊了一块石头,从山上滚了下来,吉尔紧随其后。\\\n","虽然略有些摔伤,但他们还是回到了温馨的家中。\\\n","尽管出了这样的意外,他们的冒险精神依然没有减弱,继续充满愉悦地探索。\n","\"\"\"\n","# example 1\n","prompt_1 = f\"\"\"\n","执行以下操作:\n","1-用一句话概括下面用三个反引号括起来的文本。\n","2-将摘要翻译成英语。\n","3-在英语摘要中列出每个人名。\n","4-输出一个 JSON 对象,其中包含以下键:english_summary,num_names。\n","\n","请用换行符分隔您的答案。\n","\n","Text:\n","```{text}```\n","\"\"\"\n","response = get_completion(prompt_1)\n","print(\"prompt 1:\")\n","print(response)"]},{"attachments":{},"cell_type":"markdown","metadata":{},"source":["上述输出仍然存在一定问题,例如,键“姓名”会被替换为法语(译注:在英文原版中,要求从英语翻译到法语,对应指令第三步的输出为 'Noms:',为Name的法语,这种行为难以预测,并可能为导出带来困难)\n","\n","因此,我们将Prompt加以改进,该 Prompt 前半部分不变,同时**确切指定了输出的格式**。"]},{"cell_type":"code","execution_count":29,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["\n","prompt 2:\n","Summary: 在一个迷人的村庄里,兄妹杰克和吉尔在山顶井里打水时发生了意外,但他们的冒险精神依然没有减弱,继续充满愉悦地探索。\n","\n","Translation: In a charming village, siblings Jack and Jill set off to fetch water from a well on top of a hill. Unfortunately, Jack tripped on a rock and tumbled down the hill, with Jill following closely behind. Despite some minor injuries, they made it back home safely. Despite the mishap, their adventurous spirit remained strong as they continued to explore joyfully.\n","\n","Names: Jack, Jill\n","\n","JSON Output: {\"English_summary\": \"In a charming village, siblings Jack and Jill set off to fetch water from a well on top of a hill. Unfortunately, Jack tripped on a rock and tumbled down the hill, with Jill following closely behind. Despite some minor injuries, they made it back home safely. Despite the mishap, their adventurous spirit remained strong as they continued to explore joyfully.\", \"num_names\": 2}\n"]}],"source":["prompt_2 = f\"\"\"\n","1-用一句话概括下面用<>括起来的文本。\n","2-将摘要翻译成英语。\n","3-在英语摘要中列出每个名称。\n","4-输出一个 JSON 对象,其中包含以下键:English_summary,num_names。\n","\n","请使用以下格式:\n","文本:<要总结的文本>\n","摘要:<摘要>\n","翻译:<摘要的翻译>\n","名称:<英语摘要中的名称列表>\n","输出 JSON:<带有 English_summary 和 num_names 的 JSON>\n","\n","Text: <{text}>\n","\"\"\"\n","response = get_completion(prompt_2)\n","print(\"\\nprompt 2:\")\n","print(response)"]},{"cell_type":"markdown","metadata":{},"source":["### 2.2 指导模型在下结论之前找出一个自己的解法"]},{"attachments":{},"cell_type":"markdown","metadata":{},"source":["在设计Prompt时,我们还可以通过明确指导语言模型进行自主思考,来获得更好的效果。\n","\n","举个例子,假设我们要语言模型判断一个数学问题的解答是否正确。仅仅提供问题和解答是不够的,语言模型可能会匆忙做出错误判断。\n","\n","相反,我们可以在Prompt中先要求语言模型自己尝试解决这个问题,思考出自己的解法,然后再与提供的解答进行对比,判断正确性。这种先让语言模型自主思考的方式,能帮助它更深入理解问题,做出更准确的判断。\n","\n","接下来我们会给出一个问题和一份来自学生的解答,要求模型判断解答是否正确:"]},{"cell_type":"code","execution_count":30,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["学生的解决方案是正确的。他正确地计算了土地费用、太阳能电池板费用和维护费用,并将它们相加得到了总费用。\n"]}],"source":["prompt = f\"\"\"\n","判断学生的解决方案是否正确。\n","\n","问题:\n","我正在建造一个太阳能发电站,需要帮助计算财务。\n","\n"," 土地费用为 100美元/平方英尺\n"," 我可以以 250美元/平方英尺的价格购买太阳能电池板\n"," 我已经谈判好了维护合同,每年需要支付固定的10万美元,并额外支付每平方英尺10美元\n"," 作为平方英尺数的函数,首年运营的总费用是多少。\n","\n","学生的解决方案:\n","设x为发电站的大小,单位为平方英尺。\n","费用:\n","\n"," 土地费用:100x\n"," 太阳能电池板费用:250x\n"," 维护费用:100,000美元+100x\n"," 总费用:100x+250x+100,000美元+100x=450x+100,000美元\n","\"\"\"\n","response = get_completion(prompt)\n","print(response)"]},{"attachments":{},"cell_type":"markdown","metadata":{},"source":["但是注意,学生的解决方案实际上是错误的。(*维护费用项100x应为10x,总费用450x应为360x*)\n","\n","我们可以通过指导模型先自行找出一个解法来解决这个问题。\n","\n","在接下来这个 Prompt 中,我们要求模型先自行解决这个问题,再根据自己的解法与学生的解法进行对比,从而判断学生的解法是否正确。同时,我们给定了输出的格式要求。通过拆分任务、明确步骤,让模型有更多时间思考,有时可以获得更准确的结果。在这个例子中,学生的答案是错误的,但如果我们没有先让模型自己计算,那么可能会被误导以为学生是正确的。"]},{"cell_type":"code","execution_count":40,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["实际解决方案和步骤:\n","\n"," 1. 土地费用:每平方英尺100美元,所以总费用为100x美元。\n"," 2. 太阳能电池板费用:每平方英尺250美元,所以总费用为250x美元。\n"," 3. 维护费用:固定费用为10万美元,额外费用为每平方英尺10美元,所以总费用为10万美元+10x美元。\n"," 4. 总费用:将上述三项费用相加,得到总费用为100x美元+250x美元+10万美元+10x美元=360x+10万美元。\n","\n","学生计算的总费用:450x+10万美元\n","实际计算的总费用:360x+10万美元\n","学生计算的费用和实际计算的费用是否相同:否\n","学生的解决方案和实际解决方案是否相同:否\n","学生的成绩:不正确\n"]}],"source":["prompt = f\"\"\"\n","请判断学生的解决方案是否正确,请通过如下步骤解决这个问题:\n","\n","步骤:\n","\n"," 首先,自己解决问题。\n"," 然后将您的解决方案与学生的解决方案进行比较,对比计算得到的总费用与学生计算的总费用是否一致,并评估学生的解决方案是否正确。\n"," 在自己完成问题之前,请勿决定学生的解决方案是否正确。\n","\n","使用以下格式:\n","\n"," 问题:问题文本\n"," 学生的解决方案:学生的解决方案文本\n"," 实际解决方案和步骤:实际解决方案和步骤文本\n"," 学生计算的总费用:学生计算得到的总费用\n"," 实际计算的总费用:实际计算出的总费用\n"," 学生计算的费用和实际计算的费用是否相同:是或否\n"," 学生的解决方案和实际解决方案是否相同:是或否\n"," 学生的成绩:正确或不正确\n","\n","问题:\n","\n"," 我正在建造一个太阳能发电站,需要帮助计算财务。 \n"," - 土地费用为每平方英尺100美元\n"," - 我可以以每平方英尺250美元的价格购买太阳能电池板\n"," - 我已经谈判好了维护合同,每年需要支付固定的10万美元,并额外支付每平方英尺10美元;\n","\n"," 作为平方英尺数的函数,首年运营的总费用是多少。\n","\n","学生的解决方案:\n","\n"," 设x为发电站的大小,单位为平方英尺。\n"," 费用:\n"," 1. 土地费用:100x美元\n"," 2. 太阳能电池板费用:250x美元\n"," 3. 维护费用:100,000+100x=10万美元+10x美元\n"," 总费用:100x美元+250x美元+10万美元+100x美元=450x+10万美元\n","\n","实际解决方案和步骤:\n","\"\"\"\n","response = get_completion(prompt)\n","print(response)"]},{"attachments":{},"cell_type":"markdown","metadata":{},"source":["## 三、局限性"]},{"attachments":{},"cell_type":"markdown","metadata":{},"source":["**开发大模型相关应用时请务必铭记:**\n","\n","\n","**虚假知识**:模型偶尔会生成一些看似真实实则编造的知识\n","\n","虽然模型在训练过程中接触了大量的知识,但它并没有*完全*记住所见的信息,因此它不甚清楚自己知识的边界。这意味着它可能会尝试回答主题晦涩难懂的问题,并编造听起来合理但实际上并不正确的答案。我们称这些编造的想法为幻觉(Hallucination)。\n","\n","如下示例展示了大模型的幻觉。我们要求告诉我们华为公司生产的 *GT Watch 运动手表* 产品的信息,事实上,这个公司是真实存在的,但产品是编造的,而模型一本正经地提供了它编造的知识,而且迷惑性很强。\n","\n","在开发与应用语言模型时,需要注意它们可能生成虚假信息的风险。尽管模型经过大规模预训练,掌握了丰富知识,但它实际上并没有*完全*记住所见的信息,难以准确判断自己的知识边界,可能做出错误推断。若让语言模型描述一个不存在的产品,它可能会自行构造出似是而非的细节。这被称为“幻觉”(Hallucination),是语言模型的一大缺陷。\n","\n","如下示例展示了大模型的幻觉。我们要求告诉我们华为公司生产的 *GT Watch 运动手表* 产品的信息,事实上,这个公司是真实存在的,但产品是编造的,而模型一本正经地提供了它编造的知识,而且迷惑性很强。"]},{"cell_type":"code","execution_count":44,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["华为公司生产的GT Watch运动手表是一款智能手表,具有多种功能和特点。以下是相关信息:\n","\n","1. 设计和外观:GT Watch采用圆形表盘设计,具有精致的外观和高质量的材料制造。它有多种颜色和表带选择,可以根据个人喜好进行定制。\n","\n","2. 显示屏:GT Watch配备了1.39英寸的AMOLED显示屏,具有高清分辨率和良好的可视性。用户可以通过触摸屏幕进行操作和导航。\n","\n","3. 运动追踪:GT Watch具有全天候的运动追踪功能,可以监测用户的步数、跑步距离、卡路里消耗和心率等数据。它还支持多种运动模式,如跑步、骑行、游泳等。\n","\n","4. 健康监测:GT Watch可以监测用户的心率、血氧饱和度和睡眠质量等健康指标。它还提供健康建议和提醒,帮助用户保持良好的健康状态。\n","\n","5. 通知和连接:GT Watch可以与用户的手机进行连接,通过蓝牙技术实现通知推送和电话提醒。用户可以在手表上查看短信、电话和社交媒体通知,无需拿出手机。\n","\n","6. 长续航时间:GT Watch具有较长的续航时间,一次充电可以使用数天。它还支持快速充电技术,可以在短时间内充满电。\n","\n","7. 其他功能:GT Watch还具有其他功能,如天气预报、闹钟、计时器、计步器等。它还支持NFC支付和音乐控制等便利功能。\n","\n","总体而言,华为GT Watch是一款功能强大、外观精致的智能运动手表,适合那些注重健康和运动的用户使用。\n"]}],"source":["prompt = f\"\"\"\n","告诉我华为公司生产的GT Watch运动手表的相关信息\n","\"\"\"\n","response = get_completion(prompt)\n","print(response)"]},{"attachments":{},"cell_type":"markdown","metadata":{},"source":["语言模型生成虚假信息的“幻觉”问题,是使用与开发语言模型时需要高度关注的风险。由于幻觉信息往往令人无法辨别真伪,开发者必须警惕并尽量避免它的产生。\n","\n","目前 OpenAI 等公司正在积极研究解决语言模型的幻觉问题。在技术得以进一步改进之前,开发者可以通过Prompt设计减少幻觉发生的可能。例如,可以先让语言模型直接引用文本中的原句,然后再进行解答。这可以追踪信息来源,降低虚假内容的风险。\n","\n","综上,语言模型的幻觉问题事关应用的可靠性与安全性。开发者有必要认识到这一缺陷(注:截至2023年7月),并采取Prompt优化等措施予以缓解,以开发出更加可信赖的语言模型应用。这也将是未来语言模型进化的重要方向之一。"]},{"attachments":{},"cell_type":"markdown","metadata":{},"source":["**注意**:\n"," \n","关于反斜杠使用的说明:在本教程中,我们使用反斜杠 \\ 来使文本适应屏幕大小以提高阅读体验,而没有用换行符 \\n 。GPT-3 并不受换行符(newline characters)的影响,但在您调用其他大模型时,需额外考虑换行符是否会影响模型性能。"]},{"cell_type":"markdown","metadata":{},"source":["## 四、英文原版 Prompt"]},{"cell_type":"markdown","metadata":{},"source":["**1.1 使用分隔符清晰地表示输入的不同部分**"]},{"cell_type":"code","execution_count":45,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["To guide a model towards the desired output and reduce irrelevant or incorrect responses, it is important to provide clear and specific instructions, which can be achieved through longer prompts that offer more clarity and context.\n"]}],"source":["text = f\"\"\"\n","You should express what you want a model to do by \\ \n","providing instructions that are as clear and \\ \n","specific as you can possibly make them. \\ \n","This will guide the model towards the desired output, \\ \n","and reduce the chances of receiving irrelevant \\ \n","or incorrect responses. Don't confuse writing a \\ \n","clear prompt with writing a short prompt. \\ \n","In many cases, longer prompts provide more clarity \\ \n","and context for the model, which can lead to \\ \n","more detailed and relevant outputs.\n","\"\"\"\n","prompt = f\"\"\"\n","Summarize the text delimited by triple backticks \\ \n","into a single sentence.\n","```{text}```\n","\"\"\"\n","response = get_completion(prompt)\n","print(response)"]},{"cell_type":"markdown","metadata":{},"source":["**1.2**寻求结构化的输出"]},{"cell_type":"code","execution_count":46,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["{\n"," \"books\": [\n"," {\n"," \"book_id\": 1,\n"," \"title\": \"The Enigma of Elysium\",\n"," \"author\": \"Evelyn Sinclair\",\n"," \"genre\": \"Mystery\"\n"," },\n"," {\n"," \"book_id\": 2,\n"," \"title\": \"Whispers in the Wind\",\n"," \"author\": \"Nathaniel Blackwood\",\n"," \"genre\": \"Fantasy\"\n"," },\n"," {\n"," \"book_id\": 3,\n"," \"title\": \"Echoes of the Past\",\n"," \"author\": \"Amelia Hart\",\n"," \"genre\": \"Romance\"\n"," }\n"," ]\n","}\n"]}],"source":["prompt = f\"\"\"\n","Generate a list of three made-up book titles along \\ \n","with their authors and genres. \n","Provide them in JSON format with the following keys: \n","book_id, title, author, genre.\n","\"\"\"\n","response = get_completion(prompt)\n","print(response)\n"]},{"cell_type":"markdown","metadata":{},"source":["**1.3 要求模型检查是否满足条件**"]},{"cell_type":"code","execution_count":56,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["Completion for Text 1:\n","Step 1 - Get some water boiling.\n","Step 2 - Grab a cup and put a tea bag in it.\n","Step 3 - Once the water is hot enough, pour it over the tea bag.\n","Step 4 - Let it sit for a bit so the tea can steep.\n","Step 5 - After a few minutes, take out the tea bag.\n","Step 6 - If you like, add some sugar or milk to taste.\n","Step 7 - Enjoy your delicious cup of tea.\n"]}],"source":["text_1 = f\"\"\"\n","Making a cup of tea is easy! First, you need to get some \\ \n","water boiling. While that's happening, \\ \n","grab a cup and put a tea bag in it. Once the water is \\ \n","hot enough, just pour it over the tea bag. \\ \n","Let it sit for a bit so the tea can steep. After a \\ \n","few minutes, take out the tea bag. If you \\ \n","like, you can add some sugar or milk to taste. \\ \n","And that's it! You've got yourself a delicious \\ \n","cup of tea to enjoy.\n","\"\"\"\n","prompt = f\"\"\"\n","You will be provided with text delimited by triple quotes. \n","If it contains a sequence of instructions, \\ \n","re-write those instructions in the following format:\n","\n","Step 1 - ...\n","Step 2 - …\n","…\n","Step N - …\n","\n","If the text does not contain a sequence of instructions, \\ \n","then simply write \\\"No steps provided.\\\"\n","\n","\\\"\\\"\\\"{text_1}\\\"\\\"\\\"\n","\"\"\"\n","response = get_completion(prompt)\n","print(\"Completion for Text 1:\")\n","print(response)"]},{"cell_type":"code","execution_count":48,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["Completion for Text 2:\n","No steps provided.\n"]}],"source":["text_2 = f\"\"\"\n","The sun is shining brightly today, and the birds are \\\n","singing. It's a beautiful day to go for a \\ \n","walk in the park. The flowers are blooming, and the \\ \n","trees are swaying gently in the breeze. People \\ \n","are out and about, enjoying the lovely weather. \\ \n","Some are having picnics, while others are playing \\ \n","games or simply relaxing on the grass. It's a \\ \n","perfect day to spend time outdoors and appreciate the \\ \n","beauty of nature.\n","\"\"\"\n","prompt = f\"\"\"You will be provided with text delimited by triple quotes. \n","If it contains a sequence of instructions, \\ \n","re-write those instructions in the following format:\n","Step 1 - ...\n","Step 2 - …\n","…\n","Step N - …\n","\n","If the text does not contain a sequence of instructions, \\ \n","then simply write \\\"No steps provided.\\\"\n","\n","\\\"\\\"\\\"{text_2}\\\"\\\"\\\"\n","\"\"\"\n","response = get_completion(prompt)\n","print(\"Completion for Text 2:\")\n","print(response)"]},{"cell_type":"markdown","metadata":{},"source":["**1.4 提供少量示例**(少样本提示词,Few-shot prompting)"]},{"cell_type":"code","execution_count":49,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":[": Resilience is like a mighty oak tree that withstands the strongest storms, bending but never breaking. It is the unwavering determination to rise again after every fall, and the ability to find strength in the face of adversity. Just as a diamond is formed under immense pressure, resilience is forged through challenges and hardships, making us stronger and more resilient in the process.\n"]}],"source":["prompt = f\"\"\"\n","Your task is to answer in a consistent style.\n","\n",": Teach me about patience.\n","\n",": The river that carves the deepest \\ \n","valley flows from a modest spring; the \\ \n","grandest symphony originates from a single note; \\ \n","the most intricate tapestry begins with a solitary thread.\n","\n",": Teach me about resilience.\n","\"\"\"\n","response = get_completion(prompt)\n","print(response)"]},{"cell_type":"markdown","metadata":{},"source":["**2.1 指定完成任务所需的步骤**"]},{"cell_type":"code","execution_count":50,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["Completion for prompt 1:\n","1 - Jack and Jill, siblings, go on a quest to fetch water from a hilltop well, but encounter misfortune when Jack trips on a stone and tumbles down the hill, with Jill following suit, yet they return home and remain undeterred in their adventurous spirits.\n","\n","2 - Jack et Jill, frère et sœur, partent en quête d'eau d'un puits au sommet d'une colline, mais rencontrent un malheur lorsque Jack trébuche sur une pierre et dévale la colline, suivi par Jill, pourtant ils rentrent chez eux et restent déterminés dans leur esprit d'aventure.\n","\n","3 - Jack, Jill\n","\n","4 - {\n"," \"french_summary\": \"Jack et Jill, frère et sœur, partent en quête d'eau d'un puits au sommet d'une colline, mais rencontrent un malheur lorsque Jack trébuche sur une pierre et dévale la colline, suivi par Jill, pourtant ils rentrent chez eux et restent déterminés dans leur esprit d'aventure.\",\n"," \"num_names\": 2\n","}\n"]}],"source":["text = f\"\"\"\n","In a charming village, siblings Jack and Jill set out on \\ \n","a quest to fetch water from a hilltop \\ \n","well. As they climbed, singing joyfully, misfortune \\ \n","struck—Jack tripped on a stone and tumbled \\ \n","down the hill, with Jill following suit. \\ \n","Though slightly battered, the pair returned home to \\ \n","comforting embraces. Despite the mishap, \\ \n","their adventurous spirits remained undimmed, and they \\ \n","continued exploring with delight.\n","\"\"\"\n","# example 1\n","prompt_1 = f\"\"\"\n","Perform the following actions: \n","1 - Summarize the following text delimited by triple \\\n","backticks with 1 sentence.\n","2 - Translate the summary into French.\n","3 - List each name in the French summary.\n","4 - Output a json object that contains the following \\\n","keys: french_summary, num_names.\n","\n","Separate your answers with line breaks.\n","\n","Text:\n","```{text}```\n","\"\"\"\n","response = get_completion(prompt_1)\n","print(\"Completion for prompt 1:\")\n","print(response)"]},{"cell_type":"code","execution_count":51,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["\n","Completion for prompt 2:\n","Summary: Jack and Jill, siblings from a charming village, go on a quest to fetch water from a hilltop well, but encounter misfortune when Jack trips on a stone and tumbles down the hill, with Jill following suit, yet they remain undeterred and continue exploring with delight.\n","\n","Translation: Jack et Jill, frère et sœur d'un charmant village, partent en quête d'eau d'un puits au sommet d'une colline, mais rencontrent un malheur lorsque Jack trébuche sur une pierre et dévale la colline, suivi par Jill, pourtant ils restent déterminés et continuent à explorer avec joie.\n","\n","Names: Jack, Jill\n","\n","Output JSON: \n","{\n"," \"french_summary\": \"Jack et Jill, frère et sœur d'un charmant village, partent en quête d'eau d'un puits au sommet d'une colline, mais rencontrent un malheur lorsque Jack trébuche sur une pierre et dévale la colline, suivi par Jill, pourtant ils restent déterminés et continuent à explorer avec joie.\",\n"," \"num_names\": 2\n","}\n"]}],"source":["prompt_2 = f\"\"\"\n","Your task is to perform the following actions: \n","1 - Summarize the following text delimited by <> with 1 sentence.\n","2 - Translate the summary into French.\n","3 - List each name in the French summary.\n","4 - Output a json object that contains the \n","following keys: french_summary, num_names.\n","\n","Use the following format:\n","Text: \n","Summary: \n","Translation: \n","Names: \n","Output JSON: \n","\n","Text: <{text}>\n","\"\"\"\n","response = get_completion(prompt_2)\n","print(\"\\nCompletion for prompt 2:\")\n","print(response)"]},{"cell_type":"markdown","metadata":{},"source":["**2.2 指导模型在下结论之前找出一个自己的解法**"]},{"cell_type":"code","execution_count":52,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["The student's solution is correct. They correctly identified the costs for land, solar panels, and maintenance, and calculated the total cost for the first year of operations as a function of the number of square feet.\n"]}],"source":["prompt = f\"\"\"\n","Determine if the student's solution is correct or not.\n","\n","Question:\n","I'm building a solar power installation and I need \\\n"," help working out the financials. \n","- Land costs $100 / square foot\n","- I can buy solar panels for $250 / square foot\n","- I negotiated a contract for maintenance that will cost \\ \n","me a flat $100k per year, and an additional $10 / square \\\n","foot\n","What is the total cost for the first year of operations \n","as a function of the number of square feet.\n","\n","Student's Solution:\n","Let x be the size of the installation in square feet.\n","Costs:\n","1. Land cost: 100x\n","2. Solar panel cost: 250x\n","3. Maintenance cost: 100,000 + 100x\n","Total cost: 100x + 250x + 100,000 + 100x = 450x + 100,000\n","\"\"\"\n","response = get_completion(prompt)\n","print(response)"]},{"cell_type":"code","execution_count":53,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["To calculate the total cost for the first year of operations, we need to add up the costs of land, solar panels, and maintenance.\n","\n","1. Land cost: $100 / square foot\n","The cost of land is $100 multiplied by the number of square feet.\n","\n","2. Solar panel cost: $250 / square foot\n","The cost of solar panels is $250 multiplied by the number of square feet.\n","\n","3. Maintenance cost: $100,000 + $10 / square foot\n","The maintenance cost is a flat fee of $100,000 per year, plus $10 multiplied by the number of square feet.\n","\n","Total cost: Land cost + Solar panel cost + Maintenance cost\n","\n","So the actual solution is:\n","Total cost = (100 * x) + (250 * x) + (100,000 + (10 * x))\n","\n","Is the student's solution the same as the actual solution just calculated:\n","No\n","\n","Student grade:\n","Incorrect\n"]}],"source":["prompt = f\"\"\"\n","Your task is to determine if the student's solution \\\n","is correct or not.\n","To solve the problem do the following:\n","- First, work out your own solution to the problem. \n","- Then compare your solution to the student's solution \\ \n","and evaluate if the student's solution is correct or not. \n","Don't decide if the student's solution is correct until \n","you have done the problem yourself.\n","\n","Use the following format:\n","Question:\n","```\n","question here\n","```\n","Student's solution:\n","```\n","student's solution here\n","```\n","Actual solution:\n","```\n","steps to work out the solution and your solution here\n","```\n","Is the student's solution the same as actual solution \\\n","just calculated:\n","```\n","yes or no\n","```\n","Student grade:\n","```\n","correct or incorrect\n","```\n","\n","Question:\n","```\n","I'm building a solar power installation and I need help \\\n","working out the financials. \n","- Land costs $100 / square foot\n","- I can buy solar panels for $250 / square foot\n","- I negotiated a contract for maintenance that will cost \\\n","me a flat $100k per year, and an additional $10 / square \\\n","foot\n","What is the total cost for the first year of operations \\\n","as a function of the number of square feet.\n","``` \n","Student's solution:\n","```\n","Let x be the size of the installation in square feet.\n","Costs:\n","1. Land cost: 100x\n","2. Solar panel cost: 250x\n","3. Maintenance cost: 100,000 + 100x\n","Total cost: 100x + 250x + 100,000 + 100x = 450x + 100,000\n","```\n","Actual solution:\n","\"\"\"\n","response = get_completion(prompt)\n","print(response)"]},{"cell_type":"markdown","metadata":{},"source":["**3.1 幻觉**"]},{"cell_type":"code","execution_count":54,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["The AeroGlide UltraSlim Smart Toothbrush by Boie is a technologically advanced toothbrush designed to provide a superior brushing experience. Boie is a company known for its innovative oral care products, and the AeroGlide UltraSlim Smart Toothbrush is no exception.\n","\n","One of the standout features of this toothbrush is its ultra-slim design. The brush head is only 2mm thick, making it much thinner than traditional toothbrushes. This slim profile allows for better access to hard-to-reach areas of the mouth, ensuring a thorough and effective clean.\n","\n","The AeroGlide UltraSlim Smart Toothbrush also incorporates smart technology. It connects to a mobile app via Bluetooth, allowing users to track their brushing habits and receive personalized recommendations for improving their oral hygiene routine. The app provides real-time feedback on brushing technique, duration, and coverage, helping users to achieve optimal oral health.\n","\n","The toothbrush features soft, antimicrobial bristles made from a durable thermoplastic elastomer. These bristles are gentle on the gums and teeth, while also being effective at removing plaque and debris. The antimicrobial properties help to keep the brush head clean and hygienic between uses.\n","\n","Another notable feature of the AeroGlide UltraSlim Smart Toothbrush is its long battery life. It can last up to 30 days on a single charge, making it convenient for travel or everyday use without the need for frequent recharging.\n","\n","Overall, the AeroGlide UltraSlim Smart Toothbrush by Boie offers a combination of advanced technology, slim design, and effective cleaning capabilities. It is a great option for those looking to upgrade their oral care routine and achieve a healthier smile.\n"]}],"source":["prompt = f\"\"\"\n","Tell me about AeroGlide UltraSlim Smart Toothbrush by Boie\n","\"\"\"\n","response = get_completion(prompt)\n","print(response)"]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.10.9"},"latex_envs":{"LaTeX_envs_menu_present":true,"autoclose":false,"autocomplete":true,"bibliofile":"biblio.bib","cite_by":"apalike","current_citInitial":1,"eqLabelWithNumbers":true,"eqNumInitial":1,"hotkeys":{"equation":"Ctrl-E","itemize":"Ctrl-I"},"labels_anchors":false,"latex_user_defs":false,"report_style_numbering":false,"user_envs_cfg":false},"toc":{"base_numbering":1,"nav_menu":{},"number_sections":true,"sideBar":true,"skip_h1_title":false,"title_cell":"Table of Contents","title_sidebar":"Contents","toc_cell":false,"toc_position":{},"toc_section_display":true,"toc_window_display":true}},"nbformat":4,"nbformat_minor":4}
diff --git a/docs/content/C1 Prompt Engineering for Developer/3. 迭代优化 Iterative.ipynb b/docs/content/C1 Prompt Engineering for Developer/3. 迭代优化 Iterative.ipynb
index e66df9c..5bf5ed4 100644
--- a/docs/content/C1 Prompt Engineering for Developer/3. 迭代优化 Iterative.ipynb
+++ b/docs/content/C1 Prompt Engineering for Developer/3. 迭代优化 Iterative.ipynb
@@ -6,13 +6,15 @@
"source": [
"# 第三章 迭代优化\n",
"\n",
- "当使用 LLM 构建应用程序时,实践层面上很难*第一次尝试*就成功获得适合最终应用的 Prompt。但这并不重要,只要您有一个好的迭代过程来不断改进您的 Prompt,那么您就能够得到一个适合任务的 Prompt。虽然相比训练机器学习模型,在 Prompt 方面一次成功的几率可能会高一些,但正如上所说, Prompt 是否一次完善并不重要。最重要的是**层层迭代**为您的应用程序找到有效 Prompt 的过程。\n",
+ "在开发大语言模型应用时,很难通过第一次尝试就得到完美适用的Prompt。但关键是要有一个**良好的迭代优化过程**,以不断改进Prompt。相比训练机器学习模型,Prompt的一次成功率可能更高,但仍需要通过多次迭代找到最适合应用的形式。\n",
"\n",
- "因此在本章中,我们将以产品说明书中生成营销文案为例,来展示一些流程框架,并提示您思考如何层层迭代地分析和完善您的 Prompt。\n",
+ "本章以产品说明书生成营销文案为例,展示Prompt迭代优化的思路。这与吴恩达在机器学习课程中演示的机器学习模型开发流程相似:有了想法后,编写代码、获取数据、训练模型、查看结果。通过分析错误找出适用领域,调整方案后再次训练。Prompt开发也采用类似循环迭代的方式,逐步逼近最优。\n",
"\n",
- "在吴恩达(Andrew Ng,原教程作者)的机器学习课程中展示过一张图表,说明了机器学习开发的流程。通常是先有一个想法,然后再用以下流程实现:编写代码,获取数据,训练模型,获得实验结果。然后您可以查看结果,分析误差与错误,找出适用领域,甚至可以更改您对具体问题的具体思路或解决方法。此后再次更改实现,并运行另一个实验等,反复迭代,最终获得有效的机器学习模型。在编写基于 LLM 的应用程序的 Prompt 时,流程可能非常相似。您产生了关于要完成的任务的想法后,可以尝试编写第一个 Prompt ,注意要满足上一章说过的两个原则:**清晰明确,并且给系统足够的时间思考**。然后您可以运行并查看结果。如果第一次效果不好,那么迭代的过程就是找出为什么指令不够清晰或为什么没有给算法足够的时间思考,以便改进想法、改进 Prompt 等等,循环多次,直到找到适合您的应用程序的 Prompt。\n",
- "\n",
- "很难有适用于世间万物的所谓“最佳 Prompt ”,更好的方法是找到有效的迭代过程,以便您可以快速地找到一个适合您的应用程序的 Prompt 。\n"
+ "具体来说,有了任务想法后,可以先编写初版Prompt,注意清晰明确并给模型充足思考时间。运行后检查结果,如果不理想,则分析Prompt不够清楚或思考时间不够等原因,做出改进,再次运行。如此循环多次,终将找到适合应用的Prompt。\n",
+ " \n",
+ "\n",
+ " \n",
+ "总之,很难有适用于世间万物的所谓“最佳 Prompt ”,开发高效Prompt的关键在于找到一个好的迭代优化过程,而非一开始就要求完美。通过快速试错迭代,可有效确定符合特定应用的最佳Prompt形式。\n"
]
},
{
@@ -131,9 +133,9 @@
"source": [
"### 1.2 提示优化1: 解决生成文本太长\n",
"\n",
- "它似乎很好地完成了要求,即从技术说明书开始编写产品描述,介绍了一个精致的中世纪风格办公椅。但是当我看到这个时,我会觉得这个太长了。\n",
+ "它似乎很好地完成了要求,即从技术说明书开始编写产品描述,介绍了一个精致的中世纪风格办公椅。但是当我看到这个生成的内容时,我会觉得它**太长了**。\n",
"\n",
- "所以在上述过程中,我产生想法后写了一个 Prompt ,并得到了结果,但是我对它不是很满意,因为它太长了。所以我澄清我的 Prompt ,要求它限制生成文本长度,要求最多使用50个字。\n"
+ "在看到语言模型根据产品说明生成的第一个版本营销文案后,我们注意到文本长度过长,不太适合用作简明的电商广告语。所以这时候就需要对Prompt进行优化改进。具体来说,第一版结果满足了从技术说明转换为营销文案的要求,描写了中世纪风格办公椅的细节。但是过于冗长的文本不太适合电商场景。这时我们就可以**在Prompt中添加长度限制**,要求生成更简洁的文案。\n"
]
},
{
@@ -196,7 +198,12 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "LLM在能堪堪胜任严格的字数限制,但实现得并不精确。此例中,英文输出要求控制在50个词,但有时会输出60或65个单词的内容,但这也还算合理。原因是 LLM 使用分词器(tokenizer)解释文本,但它们往往在计算字符方面表现一般般。有很多不同的方法来尝试控制您得到的输出的长度(如若干句话/词/个汉字/个字母 (characters) 等)。"
+ "\n",
+ "当在Prompt中设置长度限制要求时,语言模型生成的输出长度不总能精确符合要求,但基本能控制在可接受的误差范围内。比如要求生成50词的文本,语言模型有时会生成60词左右的输出,但总体接近预定长度。\n",
+ "\n",
+ "这是因为**语言模型在计算和判断文本长度时依赖于分词器**,而分词器在字符统计方面不具备完美精度。目前存在多种方法可以尝试控制语言模型生成输出的长度,比如指定语句数、词数、汉字数等。\n",
+ "\n",
+ "虽然语言模型对长度约束的遵循不是百分之百精确,但通过迭代测试可以找到最佳的长度提示表达式,使生成文本基本符合长度要求。这需要开发者对语言模型的长度判断机制有一定理解,并且愿意进行多次试验来确定最靠谱的长度设置方法。"
]
},
{
@@ -205,9 +212,13 @@
"source": [
"### 1.3 提示优化2: 处理抓错文本细节\n",
"\n",
- "我们继续完善这段推广词,会发现的第二个问题是,这个网站并不是直接向消费者销售,它实际上面向的是家具零售商,他们会更关心椅子的技术细节和材料。在这种情况下,您可以继续修改这个 Prompt ,让它更精确地描述椅子的技术细节。\n",
+ "在迭代优化Prompt的过程中,我们还需要注意语言模型生成文本的细节是否符合预期。\n",
"\n",
- "解决方法:要求它专注于与目标受众相关的方面。"
+ "比如在这个案例中,进一步分析会发现,该椅子面向的其实是家具零售商,而不是终端消费者。所以生成的文案中过多强调风格、氛围等方面,而较少涉及产品技术细节,与目标受众的关注点不太吻合。这时候我们就可以继续调整Prompt,明确要求语言模型生成面向家具零售商的描述,更多关注材质、工艺、结构等技术方面的表述。\n",
+ "\n",
+ "通过迭代地分析结果,检查是否捕捉到正确的细节,我们可以逐步优化Prompt,使语言模型生成的文本更加符合预期的样式和内容要求。\n",
+ "\n",
+ "细节的精准控制是语言生成任务中非常重要的一点。我们需要训练语言模型**根据不同目标受众关注不同的方面,输出风格和内容上都适合的文本**。"
]
},
{
@@ -285,7 +296,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "以上是许多开发人员通常会经历的 Prompt 开发的迭代过程简短示例。我的建议是,像上一章中所演示的那样,Prompt 应该保持清晰和明确,并在必要时给模型一些思考时间。在这些要求的基础上,常见流程是首先尝试编写一版 Prompt ,看看会发生什么,然后继续迭代完善 Prompt,以逐渐接近所需的结果。许多成功的 Prompt 都是通过这种迭代过程得出的。我将向您展示一个更复杂的 Prompt 示例,可能会让您对 ChatGPT 的能力有更深入的了解。"
+ "通过上面的示例,我们可以看到Prompt迭代优化的一般过程。与训练机器学习模型类似,设计高效Prompt也需要多个版本的试错调整。\n",
+ "\n",
+ "具体来说,第一版Prompt应该满足明确和给模型思考时间两个原则。在此基础上,一般的迭代流程是:首先尝试一个初版,分析结果,然后继续改进Prompt,逐步逼近最优。许多成功的Prompt都是通过这种多轮调整得出的。\n",
+ "\n",
+ "后面我会展示一个更复杂的Prompt案例,让大家更深入地了解语言模型的强大能力。但在此之前,我想强调Prompt设计是一个循序渐进的过程。开发者需要做好多次尝试和错误的心理准备,通过不断调整和优化,才能找到最符合具体场景需求的Prompt形式。这需要智慧和毅力,但结果往往是值得的。\n",
+ "\n",
+ "让我们继续探索提示工程的奥秘,开发出令人惊叹的大语言模型应用吧!"
]
},
{
@@ -427,11 +444,16 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "本章的主要内容是 LLM 在开发应用程序中的迭代式 Prompt 开发过程。开发者需要先尝试编写 Prompt ,然后通过迭代逐步完善它,直至得到需要的结果。作为一名高效的提示词工程师(Prompt Engineer),关键在于掌握有效的开发Prompt的过程,而不是去寻求得到“完美的”Prompt。对于一些更复杂的应用程序,可以对多个样本(如数百张说明书)进行 Prompt 的迭代开发,并在样本集上进行评估。\n",
"\n",
- "最后,在更成熟的应用程序中,可以观察多个Prompt在多个样本集上的表现,测试平均或最差性能。但通常,**仅当**应用较成型之后,才推荐您通过这种评估方式,来精益求精。\n",
+ "本章重点讲解了在开发大语言模型应用时,采用迭代方式不断优化Prompt的过程。作为Prompt工程师,关键不是一开始就要求完美的Prompt,而是掌握有效的Prompt开发流程。\n",
"\n",
- "请使用 Jupyter Notebook,动手实践本节给出的示例,并尝试不同的变化,查看结果。"
+ "具体来说,首先编写初版Prompt,然后通过多轮调整逐步改进,直到生成了满意的结果。对于更复杂的应用,可以在多个样本上进行迭代训练,评估Prompt的平均表现。\n",
+ "\n",
+ "在应用较为成熟后,才需要采用在多个样本集上评估Prompt性能的方式来进行细致优化。因为这需要较高的计算资源。\n",
+ "\n",
+ "总之,Prompt工程师的核心是掌握Prompt的迭代开发和优化技巧,而非一开始就要求100%完美。通过不断调整试错,最终找到可靠适用的Prompt形式才是设计Prompt的正确方法。\n",
+ "\n",
+ "读者可以在Jupyter Notebook上,对本章给出的示例进行实践,修改Prompt并观察不同输出,以深入理解Prompt迭代优化的过程。这会对进一步开发复杂语言模型应用提供很好的实践准备。\n"
]
},
{
diff --git a/docs/content/C1 Prompt Engineering for Developer/6. 文本转换 Transforming.ipynb b/docs/content/C1 Prompt Engineering for Developer/6. 文本转换 Transforming.ipynb
index dd3e543..baa9c47 100644
--- a/docs/content/C1 Prompt Engineering for Developer/6. 文本转换 Transforming.ipynb
+++ b/docs/content/C1 Prompt Engineering for Developer/6. 文本转换 Transforming.ipynb
@@ -14,9 +14,11 @@
"id": "2fac57c2",
"metadata": {},
"source": [
- "LLM非常擅长将输入转换成不同的格式,典型应用包括多语种文本翻译、拼写及语法纠正、语气调整、格式转换等。\n",
+ "大语言模型具有强大的文本转换能力,可以实现多语言翻译、拼写纠正、语法调整、格式转换等不同类型的文本转换任务。利用语言模型进行各类转换是它的典型应用之一。\n",
"\n",
- "本章节将介绍如何使用编程的方式,调用API接口来实现“文本转换”功能。"
+ "在本章中,我们将介绍如何通过编程调用API接口,使用语言模型实现文本转换功能。通过代码示例,读者可以学习将输入文本转换成所需输出格式的具体方法。\n",
+ "\n",
+ "掌握调用大语言模型接口进行文本转换的技能,是开发各种语言类应用的重要一步。文本转换功能的应用场景也非常广泛。相信读者可以在本章的基础上,利用大语言模型轻松开发出转换功能强大的程序。\n"
]
},
{
@@ -28,6 +30,18 @@
"## 一、文本翻译"
]
},
+ {
+ "cell_type": "markdown",
+ "id": "06ba53ba",
+ "metadata": {},
+ "source": [
+ "文本翻译是大语言模型的典型应用场景之一。相比于传统统计机器翻译系统,大语言模型翻译更加流畅自然,还原度更高。通过在大规模高质量平行语料上进行fine-tuning训练,大语言模型可以深入学习不同语言间的词汇、语法、语义等层面的对应关系,模拟双语者的转换思维,进行意义传递的精准转换,而非简单的逐词替换。\n",
+ "\n",
+ "以英译汉为例,传统统计机器翻译多倾向直接替换英文词汇,语序保持英语结构,容易出现中文词汇使用不地道、语序不顺畅的现象。而大语言模型可以学习英汉两种语言的语法区别,进行动态的结构转换。同时,它还可以通过上下文理解原句意图,选择合适的中文词汇进行转换,而非生硬的字面翻译。\n",
+ "\n",
+ "大语言模型翻译的这些优势使其生成的中文文本更加地道、流畅,兼具准确的意义表达。利用大语言模型翻译,我们能够打通多语言之间的壁垒,进行更加高质量的跨语言交流。"
+ ]
+ },
{
"attachments": {},
"cell_type": "markdown",
@@ -204,7 +218,9 @@
"id": "54b00aa4",
"metadata": {},
"source": [
- "随着全球化与跨境商务的发展,交流的用户可能来自各个不同的国家,使用不同的语言,因此我们需要一个通用翻译器,识别各个消息的语种,并翻译成目标用户的母语,从而实现更方便的跨国交流。"
+ "在当今全球化的环境下,不同国家的用户需要频繁进行跨语言交流。但是语言的差异常使交流变得困难。为了打通语言壁垒,实现更便捷的国际商务合作和交流,我们需要一个智能的**通用翻译工具**。该翻译工具需要能够自动识别不同语言文本的语种,无需人工指定。然后它可以将这些不同语言的文本翻译成目标用户的母语。在这种方式下,全球各地的用户都可以轻松获得用自己母语书写的内容。\n",
+ "\n",
+ "开发一个识别语种并进行多语种翻译的工具,将大大降低语言障碍带来的交流成本。它将有助于构建一个语言无关的全球化世界,让世界更为紧密地连结在一起。\n"
]
},
{
@@ -295,7 +311,9 @@
"id": "b85ae847",
"metadata": {},
"source": [
- "写作的语气往往会根据受众对象而有所调整。例如,对于工作邮件,我们常常需要使用正式语气与书面用词,而对同龄朋友的微信聊天,可能更多地会使用轻松、口语化的语气。"
+ "在写作中,语言语气的选择与受众对象息息相关。比如工作邮件需要使用正式、礼貌的语气和书面词汇;而与朋友的聊天可以使用更轻松、口语化的语气。\n",
+ "\n",
+ "选择恰当的语言风格,让内容更容易被特定受众群体所接受和理解,是技巧娴熟的写作者必备的能力。随着受众群体的变化调整语气也是大语言模型在不同场景中展现智能的一个重要方面。"
]
},
{
@@ -346,7 +364,11 @@
"id": "0bf9c074",
"metadata": {},
"source": [
- "ChatGPT非常擅长不同格式之间的转换,例如JSON到HTML、XML、Markdown等。在下述例子中,我们有一个包含餐厅员工姓名和电子邮件的列表的JSON,我们希望将其从JSON转换为HTML。"
+ "大语言模型如ChatGPT在不同数据格式之间转换方面表现出色。它可以轻松实现JSON到HTML、XML、Markdown等格式的相互转化。下面是一个示例,展示如何使用大语言模型**将JSON数据转换为HTML格式**:\n",
+ "\n",
+ "假设我们有一个JSON数据,包含餐厅员工的姓名和邮箱信息。现在我们需要将这个JSON转换为HTML表格格式,以便在网页中展示。在这个案例中,我们就可以使用大语言模型,直接输入JSON数据,并给出需要转换为HTML表格的要求。语言模型会自动解析JSON结构,并以HTML表格形式输出,完成格式转换的任务。\n",
+ "\n",
+ "利用大语言模型强大的格式转换能力,我们可以快速实现各种结构化数据之间的相互转化,大大简化开发流程。掌握这一转换技巧将有助于读者**更高效地处理结构化数据**。\n"
]
},
{
@@ -468,9 +490,13 @@
"id": "22776140",
"metadata": {},
"source": [
- "拼写及语法的检查与纠正是一个十分常见的需求,特别是使用非母语语言,例如,在论坛发帖时,或发表英文论文时,校对是一件十分重要的事情。\n",
+ "在使用非母语撰写时,拼写和语法错误比较常见,进行校对尤为重要。例如在论坛发帖或撰写英语论文时,校对文本可以大大提高内容质量。\n",
"\n",
- "下述例子给定了一个句子列表,其中有些句子存在拼写或语法问题,有些则没有,我们循环遍历每个句子,要求模型校对文本,如果正确则输出“未发现错误”,如果错误则输出纠正后的文本。"
+ "**利用大语言模型进行自动校对可以极大地降低人工校对的工作量**。下面是一个示例,展示如何使用大语言模型检查句子的拼写和语法错误。\n",
+ "\n",
+ "假设我们有一系列英语句子,其中部分句子存在错误。我们可以遍历每个句子,要求语言模型进行检查,如果句子正确就输出“未发现错误”,如果有错误就输出修改后的正确版本。\n",
+ "\n",
+ "通过这种方式,大语言模型可以快速自动校对大量文本内容,定位拼写和语法问题。这极大地减轻了人工校对的负担,同时也确保了文本质量。利用语言模型的校对功能来提高写作效率,是每一位非母语写作者都可以采用的有效方法。\n"
]
},
{
@@ -531,7 +557,9 @@
"id": "538181e0",
"metadata": {},
"source": [
- "以下是一个简单的语法纠错示例(译注:与 Grammarly 功能类似),输入文本为一段关于熊猫玩偶的评价,输出为纠正后的文本。本例使用的 Prompt 较为简单,你也可以进一步要求进行语调的更改。"
+ "下面是一个使用大语言模型进行语法纠错的简单示例,类似于Grammarly(一个语法纠正和校对的工具)的功能。\n",
+ "\n",
+ "输入一段关于熊猫玩偶的评价文字,语言模型会自动校对文本中的语法错误,输出修改后的正确版本。这里使用的Prompt比较简单直接,只要求进行语法纠正。我们也可以通过扩展Prompt,同时请求语言模型调整文本的语气、行文风格等。\n"
]
},
{
@@ -620,6 +648,14 @@
"display(Markdown(diff.output_markdown))"
]
},
+ {
+ "cell_type": "markdown",
+ "id": "4fe418ee",
+ "metadata": {},
+ "source": [
+ "这个示例展示了如何利用语言模型强大的语言处理能力实现自动化的语法纠错。类似的方法可以运用于校对各类文本内容,大幅减轻人工校对的工作量,同时确保文本语法准确。掌握运用语言模型进行语法纠正的技巧,将使我们的写作更加高效和准确。"
+ ]
+ },
{
"attachments": {},
"cell_type": "markdown",
@@ -627,7 +663,9 @@
"metadata": {},
"source": [
"## 五、综合样例\n",
- "下述例子展示了同一段评论,用一段prompt同时进行文本翻译+拼写纠正+风格调整+格式转换。"
+ "语言模型具有强大的组合转换能力,可以通过一个Prompt同时实现多种转换,大幅简化工作流程。\n",
+ "\n",
+ "下面是一个示例,展示了如何使用一个Prompt,同时对一段文本进行翻译、拼写纠正、语气调整和格式转换等操作。"
]
},
{
@@ -680,6 +718,16 @@
"display(Markdown(response))"
]
},
+ {
+ "cell_type": "markdown",
+ "id": "85cc63c4",
+ "metadata": {},
+ "source": [
+ "通过这个例子,我们可以看到大语言模型可以流畅地处理多个转换要求,实现中文翻译、拼写纠正、语气升级和格式转换等功能。\n",
+ "\n",
+ "利用大语言模型强大的组合转换能力,我们可以避免多次调用模型来进行不同转换,极大地简化了工作流程。这种一次性实现多种转换的方法,可以广泛应用于文本处理与转换的场景中。"
+ ]
+ },
{
"cell_type": "markdown",
"id": "c2511118",
diff --git a/docs/content/C1 Prompt Engineering for Developer/7. 文本扩展 Expanding.ipynb b/docs/content/C1 Prompt Engineering for Developer/7. 文本扩展 Expanding.ipynb
index 8b3b58d..6ed2d37 100644
--- a/docs/content/C1 Prompt Engineering for Developer/7. 文本扩展 Expanding.ipynb
+++ b/docs/content/C1 Prompt Engineering for Developer/7. 文本扩展 Expanding.ipynb
@@ -11,9 +11,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "扩展是将短文本(例如一组说明或主题列表)输入到大型语言模型中,让模型生成更长的文本(例如基于某个主题的电子邮件或论文)。这种应用是一把双刃剑,好处例如将大型语言模型用作头脑风暴的伙伴;但也存在问题,例如某人可能会使用它来生成大量垃圾邮件。因此,当你使用大型语言模型的这些功能时,请仅以**负责任** (responsible) 和**有益于人们** (helps people) 的方式使用它们。\n",
+ "**文本扩展**是大语言模型的一个重要应用方向,它可以输入简短文本,生成更加丰富的长文。这为创作提供了强大支持,但也可能被滥用。因此开发者在使用时,必须谨记社会责任,避免生成有害内容。\n",
"\n",
- "在本章中,你将学会如何基于 OpenAI API 生成*针对每位客户评价优化*的客服电子邮件。我们还将利用模型的另一个输入参数称为温度,这种参数允许您在模型响应中变化探索的程度和多样性。\n"
+ "在本章中,我们将学习*基于OpenAI API实现一个客户邮件自动生成的示例*,用于*根据客户反馈优化客服邮件*。这里还会介绍“温度”(temperature)这一超参数,它可以**控制文本生成的多样性**。\n",
+ "\n",
+ "需要注意,扩展功能只应用来辅助人类创作,而非大规模自动生成内容。开发者应审慎使用,避免产生负面影响。只有以负责任和有益的方式应用语言模型,才能发挥其最大价值。\n",
+ "\n",
+ "相信践行社会责任的开发者可以利用语言模型的扩展功能,开发出真正造福人类的创新应用。\n"
]
},
{
@@ -27,9 +31,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "我们将根据客户评价和情感,针对性写自动回复邮件。因此,我们将给定客户评价和情感,使用 LLM 针对性生成响应,即根据客户评价和评论情感生成定制电子邮件。\n",
+ "在这个客户邮件自动生成的示例中,我们**将根据客户的评价和其中的情感倾向,使用大语言模型针对性地生成回复邮件**。\n",
"\n",
- "我们首先给出一个示例,包括一个评论及对应的情感。"
+ "具体来说,我们先输入客户的评论文本和对应的情感分析结果(正面或者负面)。然后构造一个Prompt,要求大语言模型基于这些信息来生成一封定制的回复电子邮件。\n",
+ "\n",
+ "下面先给出一个实例,包括一条客户评价和这个评价表达的情感。这为后续的语言模型生成回复邮件提供了关键输入信息。通过输入客户反馈的具体内容和情感态度,语言模型可以生成针对这个特定客户、考虑其具体情感因素的个性化回复。这种**针对个体客户特点的邮件生成方式,将大大提升客户满意度**。"
]
},
{
@@ -63,9 +69,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "我们已经使用推断课程中所学方法提取了情感,这是一个关于搅拌机的客户评价,现在我们将根据情感定制回复。\n",
+ "在这个例子中,我们已经利用前面章节学到的方法,从客户评价中提取出其表达的情感倾向。这里是一条关于搅拌机的评论。现在我们要基于这条评论中的情感倾向,使用大语言模型自动生成一封回复邮件。\n",
"\n",
- "以下述 Prompt 为例:假设你是一个客户服务 AI 助手,你的任务是为客户发送电子邮件回复,根据通过三个反引号分隔的客户电子邮件,生成一封回复以感谢客户的评价。"
+ "以下述 Prompt 为例:首先明确大语言模型的身份是客户服务 AI 助手;它任务是为客户发送电子邮件回复;然后在三个反引号间给出具体的客户评论;最后要求语言模型根据这条反馈邮件生成一封回复,以感谢客户的评价。"
]
},
{
@@ -112,20 +118,31 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "## 二、引入温度系数\n",
+ "通过这个Prompt,我们将具体的客户评论内容和需要表达的客服助手语气与要生成的回复邮件链接起来。语言模型可以在充分理解客户反馈的基础上,自动撰写恰当的回复。\n",
"\n",
- "接下来,我们将使用语言模型的一个称为“温度” (Temperature) 的参数,它将允许我们改变模型响应的多样性。您可以将温度视为模型探索或随机性的程度。\n",
- "\n",
- "例如,在一个特定的短语中,“我的最爱食品”最有可能的下一个词是“比萨”,其次最有可能的是“寿司”和“塔可”。因此,在温度为零时,模型将总是选择最有可能的下一个词,而在较高的温度下,它还将选择其中一个不太可能的词,在更高的温度下,它甚至可能选择塔可,而这种可能性仅为五分之一。您可以想象,随着模型继续生成更多单词的最终响应,“我的最爱食品是比萨”将会与第一个响应“我的最爱食品是塔可”产生差异。随着模型的继续,这两个响应也将变得越来越不同。\n",
- "\n",
- "一般来说,在构建需要可预测响应的应用程序时,我建议**设置温度为零**。在所有课程中,我们一直设置温度为零,如果您正在尝试构建一个可靠和可预测的系统,我认为您应该选择这个温度。如果您尝试以更具创意的方式使用模型,可能需要更广泛地输出不同的结果,那么您可能需要使用更高的温度。"
+ "这种依据具体客户评价个性化回复的方法,将大大提升客户体验和满意度。\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "同一段来信,我们提醒模型使用用户来信中的详细信息,并设置温度:"
+ "## 二、引入温度系数\n",
+ "\n",
+ "大语言模型中的 “温度”(temperature) 参数可以控制生成文本的随机性和多样性。temperature的值越大,语言模型输出的多样性越大;temperature的值越小,输出越倾向高概率的文本。\n",
+ "\n",
+ "举个例子,在某一上下文中,语言模型可能认为“比萨”是接下来最可能的词,其次是“寿司”和“塔可”。若 temperature 为0,则每次都会生成“比萨”;而当 temperature 越接近 1 时,生成结果是“寿司”或“塔可”的可能性越大,使文本更加多样。\n",
+ "\n",
+ "\n",
+ "\n",
+ "一般来说,如果需要可预测、可靠的输出,则将 temperature 设置为0,在所有课程中,我们一直设置温度为零;如果需要更具创造性的多样文本,那么适当提高 temperature 则很有帮助。调整这个参数可以灵活地控制语言模型的输出特性。"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "在下面例子中,针对同一段来信,我们提醒语言模型使用用户来信中的详细信息,并设置一个较高的 temperature ,运行两次,比较他们的结果有何差异。"
]
},
{
@@ -224,11 +241,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "在温度为零时,每次执行相同的 Prompt ,您获得的回复理应相同。而使用温度为 0.7 时,则每次都会获得不同的输出。\n",
+ "**温度(temperature)参数可以控制语言模型生成文本的随机性**。温度为0时,每次使用同样的Prompt,得到的结果总是一致的。而在上面的样例中,当温度设为0.7时,则每次执行都会生成不同的文本。\n",
"\n",
- "所以,您可以看到它与我们之前收到的电子邮件不同。再次执行将再次获得不同的电子邮件。\n",
+ "所以,这次的结果与之前得到的邮件就不太一样了。再次执行同样的Prompt,邮件内容还会有变化。因此。我建议读者朋友们可以自己尝试不同的 temperature ,来观察输出的变化。总体来说,temperature 越高,语言模型的文本生成就越具有随机性。可以想象,高温度下,语言模型就像心绪更加活跃,但也可能更有创造力。\n",
"\n",
- "因此,我建议您自己尝试温度,以查看输出如何变化。总之,在更高的温度下,模型的输出更加随机。您几乎可以将其视为在更高的温度下,助手**更易分心**,但也许**更有创造力**。"
+ "适当调节这个超参数,可以让语言模型的生成更富有多样性,也更能意外惊喜。希望这些经验可以帮助你在不同场景中找到最合适的温度设置。\n"
]
},
{
diff --git a/docs/content/前言.md b/docs/content/前言.md
new file mode 100644
index 0000000..202ed47
--- /dev/null
+++ b/docs/content/前言.md
@@ -0,0 +1,25 @@
+亲爱的读者朋友:
+
+ 您好!欢迎阅读这本《大模型入门:吴恩达 x OpenAI 系列课程中文实战教程》。
+
+ 最近,以GPT-4为代表的大规模预训练语言模型备受关注。这些模型拥有数十亿到千亿参数,通过学习大规模文本语料库,获得了十分强大的语言理解和生成能力。与此同时,OpenAI等公司推出的API服务,使得访问这些模型变得前所未有的便捷。
+
+ 那么如何运用这些强大的预训练模型开发实用的应用呢?本书汇聚了斯坦福大学的吴恩达老师与OpenAI合作打造的大语言模型(LLM)系列经典课程,从模型原理到应用落地,全方位介绍大模型的开发技能。
+
+ 本书首先介绍Prompt工程的方法,提示是连接用户与模型的桥梁,优化提示对模型效果至关重要。通过案例,读者可以学习文本总结、推理、转换等基础NLP任务的Prompt设计技巧。
+
+ 然后,本书指导读者基于 ChatGPT 提供的 API 开发一个完整的、全面的智能问答系统,包括使用大语言模型的基本规范,通过分类与监督评估输入,通过思维链推理及链式提示处理输入,检查并评估系统输出等,介绍了基于大模型开发的新范式,值得每一个有志于使用大模型开发应用程序的开发者学习。
+
+ 通过对LLM或大型语言模型给出提示(prompt),现在可以比以往更快地开发AI应用程序,但是一个应用程序可能需要进行多轮提示以及解析输出。在此过程有很多胶水代码需要编写,基于此需求,哈里森·蔡斯 (Harrison Chase) 创建了一个用于构建大模型应用程序的开源框架 LangChain ,使开发过程变得更加丝滑。
+
+ 在Langchain部分,读者将会学习如何结合框架 LangChain 使用 ChatGPT API 来搭建基于 LLM 的应用程序,帮助开发者学习使用 LangChain 的一些技巧,包括:模型、提示和解析器,应用程序所需要用到的存储,搭建模型链,基于文档的问答系统,评估与代理等。
+
+ 当前主流的大规模预训练语言模型,如ChatGPT(训练知识截止到2021年9月)等,主要依赖的是通用的训练数据集,而未能有效利用用户自身的数据。这成为模型回答问题的一个重要局限。具体来说,这类模型无法使用用户的私有数据,比如个人信息、公司内部数据等,来生成个性化的回复。它们也无法获得用户最新的实时数据,而只能停留在预训练数据集的时间点。这导致模型对许多需要结合用户情况的问题无法给出满意答案。如果能赋予语言模型直接访问用户自有数据的能力,并让模型能够实时吸收用户最新产生的数据,则其回答质量将能大幅提升。
+
+ 最后,本书重点探讨了如何使用 LangChain 来整合自己的私有数据,包括:加载并切割本地文档;向量数据库与词向量;检索回答;基于私有数据的问答与聊天等。
+
+ 可以说,本书涵盖大模型应用开发的方方面面,相信通过本书的学习,即便您没有丰富编程经验,也可以顺利入门大模型,开发出有实用价值的AI产品。让我们共同推进这一具有革命性的新兴技术领域吧!
+
+ 如果你在学习中遇到任何问题,也欢迎随时与我们交流。
+
+ 祝您的大模型之旅愉快而顺利!
\ No newline at end of file
diff --git a/figures/docs/C1/Iterative Prompt Develelopment.png b/figures/docs/C1/Iterative Prompt Develelopment.png
new file mode 100644
index 0000000..b21522f
Binary files /dev/null and b/figures/docs/C1/Iterative Prompt Develelopment.png differ
diff --git a/figures/docs/C1/Iterative-Prompt-Develelopment.png b/figures/docs/C1/Iterative-Prompt-Develelopment.png
new file mode 100644
index 0000000..e7ef541
Binary files /dev/null and b/figures/docs/C1/Iterative-Prompt-Develelopment.png differ
diff --git a/figures/docs/C1/Temperature.jpg b/figures/docs/C1/Temperature.jpg
new file mode 100644
index 0000000..4d9ad9d
Binary files /dev/null and b/figures/docs/C1/Temperature.jpg differ