diff --git a/docs/content/C1 Prompt Engineering for Developer/1. 简介 Introduction.md b/docs/content/C1 Prompt Engineering for Developer/1. 简介 Introduction.md
new file mode 100644
index 0000000..5df6977
--- /dev/null
+++ b/docs/content/C1 Prompt Engineering for Developer/1. 简介 Introduction.md
@@ -0,0 +1,21 @@
+# 第一章 简介
+
+**作者 吴恩达教授**
+
+欢迎来到本课程,我们将为开发人员介绍 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 能够让开发人员非常快速地构建应用程序。
+
+在本课程中,我们将与您分享一些技巧,来挖掘 LLM 的潜力,也会提供应用上的最佳实践。过程中会涉及大量材料。首先,你会学习到用于软件开发的 Prompt 最佳实践,随后会涉及到几个常用使用例,包括概括、推断、转换与扩展,最后会利用 LLM 构建 chatbot(聊天机器人)。希望这能激发你的想象力,去开拓新应用。
+
+随着 LLM 的发展,其大致可以分为两种类型,后续称为基础 LLM 和指令微调(Instruction Tuned)LLM。基础LLM是基于文本训练数据,训练出预测下一个单词能力的模型。其通常通过在互联网和其他来源的大量数据上训练,来确定紧接着出现的最可能的词。例如,如果你以“从前,有一只独角兽”作为 Prompt ,基础 LLM 可能会继续预测“她与独角兽朋友共同生活在一片神奇森林中”。但是,如果你以“法国的首都是什么”为 Prompt ,则基础 LLM 可能会根据互联网上的文章,将回答预测为“法国最大的城市是什么?法国的人口是多少?”,因为互联网上的文章很可能是有关法国国家的问答题目列表。
+
+而对于指令微调的 LLM ,相关研究和实践正甚嚣尘上,训练它们来遵循指示。因此,如果你问它,“法国的首都是什么?”,它有极大可能输出“法国的首都是巴黎”。指令微调的LLM的训练通常是基于预训练好的LLM的,即模型已经在大量文本数据上进行了训练。然后对其进行进一步训练与微调(finetune),使用的数据包括输入和理想输出(输入是指令、输出是遵循这些指令的良好回答)。然后通常使用一种称为 RLHF(reinforcement learning from human feedback,人类反馈强化学习)的技术进行进一步改进,使系统更能够有帮助地遵循指令。
+
+因为指令微调的 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时间去思考**。
diff --git a/docs/content/C1 Prompt Engineering for Developer/1. 简介.md b/docs/content/C1 Prompt Engineering for Developer/1. 简介.md
deleted file mode 100644
index e69de29..0000000
diff --git a/docs/content/C1 Prompt Engineering for Developer/2. 提示原则 Guidelines.ipynb b/docs/content/C1 Prompt Engineering for Developer/2. 提示原则 Guidelines.ipynb
new file mode 100644
index 0000000..2b2e570
--- /dev/null
+++ b/docs/content/C1 Prompt Engineering for Developer/2. 提示原则 Guidelines.ipynb
@@ -0,0 +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}
diff --git a/docs/content/C1 Prompt Engineering for Developer/4. 文本概括 Summarizing.ipynb b/docs/content/C1 Prompt Engineering for Developer/4. 文本概括 Summarizing.ipynb
new file mode 100644
index 0000000..5b877cf
--- /dev/null
+++ b/docs/content/C1 Prompt Engineering for Developer/4. 文本概括 Summarizing.ipynb
@@ -0,0 +1 @@
+{"cells":[{"attachments":{},"cell_type":"markdown","id":"b58204ea","metadata":{},"source":["# 第四章 文本概括\n"]},{"attachments":{},"cell_type":"markdown","id":"12fa9ea4","metadata":{},"source":["当今世界上文本信息浩如烟海,我们很难拥有足够的时间去阅读所有想了解的东西。但欣喜的是,目前LLM在文本概括任务上展现了强大的水准,也已经有不少团队将概括功能实现在多种应用中。\n","\n","本章节将介绍如何使用编程的方式,调用API接口来实现“文本概括”功能。"]},{"attachments":{},"cell_type":"markdown","id":"9cca835b","metadata":{},"source":["## 一、单一文本概括"]},{"attachments":{},"cell_type":"markdown","id":"0c1e1b92","metadata":{},"source":["以商品评论的总结任务为例:对于电商平台来说,网站上往往存在着海量的商品评论,这些评论反映了所有客户的想法。如果我们拥有一个工具去概括这些海量、冗长的评论,便能够快速地浏览更多评论,洞悉客户的偏好,从而指导平台与商家提供更优质的服务。"]},{"attachments":{},"cell_type":"markdown","id":"aad5bd2a","metadata":{},"source":["**输入文本**"]},{"cell_type":"code","execution_count":2,"id":"43b5dd25","metadata":{},"outputs":[],"source":["prod_review = \"\"\"\n","这个熊猫公仔是我给女儿的生日礼物,她很喜欢,去哪都带着。\n","公仔很软,超级可爱,面部表情也很和善。但是相比于价钱来说,\n","它有点小,我感觉在别的地方用同样的价钱能买到更大的。\n","快递比预期提前了一天到货,所以在送给女儿之前,我自己玩了会。\n","\"\"\""]},{"attachments":{},"cell_type":"markdown","id":"662c9cd2","metadata":{},"source":["### 1.1 限制输出文本长度"]},{"attachments":{},"cell_type":"markdown","id":"a6d10814","metadata":{},"source":["我们尝试限制文本长度为最多30词。"]},{"cell_type":"code","execution_count":5,"id":"bf4b39f9","metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["熊猫公仔软可爱,女儿喜欢,但有点小。快递提前一天到货。\n"]}],"source":["from tool import get_completion\n","\n","prompt = f\"\"\"\n","您的任务是从电子商务网站上生成一个产品评论的简短摘要。\n","\n","请对三个反引号之间的评论文本进行概括,最多30个词汇。\n","\n","评论: ```{prod_review}```\n","\"\"\"\n","\n","response = get_completion(prompt)\n","print(response)"]},{"attachments":{},"cell_type":"markdown","id":"e9ab145e","metadata":{},"source":["### 1.2 设置关键角度侧重"]},{"attachments":{},"cell_type":"markdown","id":"f84d0123","metadata":{},"source":["有时,针对不同的业务,我们对文本的侧重会有所不同。例如对于商品评论文本,物流会更关心运输时效,商家更加关心价格与商品质量,平台更关心整体服务体验。\n","\n","我们可以通过增加Prompt提示,来体现对于某个特定角度的侧重。"]},{"attachments":{},"cell_type":"markdown","id":"d6f8509a","metadata":{},"source":["#### 1.2.1 侧重于快递服务"]},{"cell_type":"code","execution_count":7,"id":"80636c3e","metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["快递提前到货,公仔可爱但有点小。\n"]}],"source":["prompt = f\"\"\"\n","您的任务是从电子商务网站上生成一个产品评论的简短摘要。\n","\n","请对三个反引号之间的评论文本进行概括,最多30个词汇,并且侧重在快递服务上。\n","\n","评论: ```{prod_review}```\n","\"\"\"\n","\n","response = get_completion(prompt)\n","print(response)"]},{"attachments":{},"cell_type":"markdown","id":"76c97fea","metadata":{},"source":["可以看到,输出结果以“快递提前到货”开头,体现了对于快递效率的侧重。"]},{"attachments":{},"cell_type":"markdown","id":"83275907","metadata":{},"source":["#### 1.2.2 侧重于价格与质量"]},{"cell_type":"code","execution_count":8,"id":"728d6c57","metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["可爱的熊猫公仔,质量好但有点小,价格稍高。快递提前到货。\n"]}],"source":["prompt = f\"\"\"\n","您的任务是从电子商务网站上生成一个产品评论的简短摘要。\n","\n","请对三个反引号之间的评论文本进行概括,最多30个词汇,并且侧重在产品价格和质量上。\n","\n","评论: ```{prod_review}```\n","\"\"\"\n","\n","response = get_completion(prompt)\n","print(response)"]},{"attachments":{},"cell_type":"markdown","id":"972dbb1b","metadata":{},"source":["可以看到,输出结果以“可爱的熊猫公仔,质量好但有点小,价格稍高”开头,体现了对于产品价格与质量的侧重。"]},{"attachments":{},"cell_type":"markdown","id":"b3ed53d2","metadata":{},"source":["### 1.3 关键信息提取"]},{"attachments":{},"cell_type":"markdown","id":"ba6f5c25","metadata":{},"source":["在1.2节中,虽然我们通过添加关键角度侧重的 Prompt ,使得文本摘要更侧重于某一特定方面,但是可以发现,结果中也会保留一些其他信息,如偏重价格与质量角度的概括中仍保留了“快递提前到货”的信息。如果我们只想要提取某一角度的信息,并过滤掉其他所有信息,则可以要求 LLM 进行“文本提取( Extract )”而非“概括( Summarize )”"]},{"cell_type":"code","execution_count":9,"id":"c845ccab","metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["产品运输相关的信息:快递提前一天到货。\n"]}],"source":["prompt = f\"\"\"\n","您的任务是从电子商务网站上的产品评论中提取相关信息。\n","\n","请从以下三个反引号之间的评论文本中提取产品运输相关的信息,最多30个词汇。\n","\n","评论: ```{prod_review}```\n","\"\"\"\n","\n","response = get_completion(prompt)\n","print(response)"]},{"attachments":{},"cell_type":"markdown","id":"50498a2b","metadata":{},"source":["## 二、同时概括多条文本"]},{"attachments":{},"cell_type":"markdown","id":"a291541a","metadata":{},"source":["在实际的工作流中,我们往往有许许多多的评论文本,以下示例将多条用户评价放进列表,并利用 ```for``` 循环,使用文本概括(Summarize)提示词,将评价概括至小于 20 词,并按顺序打印。当然,在实际生产中,对于不同规模的评论文本,除了使用 ```for``` 循环以外,还可能需要考虑整合评论、分布式等方法提升运算效率。您可以搭建主控面板,来总结大量用户评论,来方便您或他人快速浏览,还可以点击查看原评论。这样您能高效掌握顾客的所有想法。"]},{"cell_type":"code","execution_count":3,"id":"ef606961","metadata":{},"outputs":[],"source":["review_1 = prod_review\n","\n","# 一盏落地灯的评论\n","review_2 = \"\"\"\n","我需要一盏漂亮的卧室灯,这款灯不仅具备额外的储物功能,价格也并不算太高。\n","收货速度非常快,仅用了两天的时间就送到了。\n","不过,在运输过程中,灯的拉线出了问题,幸好,公司很乐意寄送了一根全新的灯线。\n","新的灯线也很快就送到手了,只用了几天的时间。\n","装配非常容易。然而,之后我发现有一个零件丢失了,于是我联系了客服,他们迅速地给我寄来了缺失的零件!\n","对我来说,这是一家非常关心客户和产品的优秀公司。\n","\"\"\"\n","\n","# 一把电动牙刷的评论\n","review_3 = \"\"\"\n","我的牙科卫生员推荐了电动牙刷,所以我就买了这款。\n","到目前为止,电池续航表现相当不错。\n","初次充电后,我在第一周一直将充电器插着,为的是对电池进行条件养护。\n","过去的3周里,我每天早晚都使用它刷牙,但电池依然维持着原来的充电状态。\n","不过,牙刷头太小了。我见过比这个牙刷头还大的婴儿牙刷。\n","我希望牙刷头更大一些,带有不同长度的刷毛,\n","这样可以更好地清洁牙齿间的空隙,但这款牙刷做不到。\n","总的来说,如果你能以50美元左右的价格购买到这款牙刷,那是一个不错的交易。\n","制造商的替换刷头相当昂贵,但你可以购买价格更为合理的通用刷头。\n","这款牙刷让我感觉就像每天都去了一次牙医,我的牙齿感觉非常干净!\n","\"\"\"\n","\n","# 一台搅拌机的评论\n","review_4 = \"\"\"\n","在11月份期间,这个17件套装还在季节性促销中,售价约为49美元,打了五折左右。\n","可是由于某种原因(我们可以称之为价格上涨),到了12月的第二周,所有的价格都上涨了,\n","同样的套装价格涨到了70-89美元不等。而11件套装的价格也从之前的29美元上涨了约10美元。\n","看起来还算不错,但是如果你仔细看底座,刀片锁定的部分看起来没有前几年版本的那么漂亮。\n","然而,我打算非常小心地使用它\n","(例如,我会先在搅拌机中研磨豆类、冰块、大米等坚硬的食物,然后再将它们研磨成所需的粒度,\n","接着切换到打蛋器刀片以获得更细的面粉,如果我需要制作更细腻/少果肉的食物)。\n","在制作冰沙时,我会将要使用的水果和蔬菜切成细小块并冷冻\n","(如果使用菠菜,我会先轻微煮熟菠菜,然后冷冻,直到使用时准备食用。\n","如果要制作冰糕,我会使用一个小到中号的食物加工器),这样你就可以避免添加过多的冰块。\n","大约一年后,电机开始发出奇怪的声音。我打电话给客户服务,但保修期已经过期了,\n","所以我只好购买了另一台。值得注意的是,这类产品的整体质量在过去几年里有所下降\n",",所以他们在一定程度上依靠品牌认知和消费者忠诚来维持销售。在大约两天内,我收到了新的搅拌机。\n","\"\"\"\n","\n","reviews = [review_1, review_2, review_3, review_4]\n"]},{"cell_type":"code","execution_count":4,"id":"eb878522","metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["评论1: 熊猫公仔是生日礼物,女儿喜欢,软可爱,面部表情和善。价钱有点小,快递提前一天到货。 \n","\n","评论2: 漂亮卧室灯,储物功能,快速送达,灯线问题,快速解决,容易装配,关心客户和产品。 \n","\n","评论3: 这款电动牙刷电池续航好,但牙刷头太小,价格合理,清洁效果好。 \n","\n","评论4: 该评论提到了一个17件套装的产品,在11月份有折扣销售,但在12月份价格上涨。评论者提到了产品的外观和使用方法,并提到了产品质量下降的问题。最后,评论者提到他们购买了另一台搅拌机。 \n","\n"]}],"source":["for i in range(len(reviews)):\n"," prompt = f\"\"\"\n"," 你的任务是从电子商务网站上的产品评论中提取相关信息。\n","\n"," 请对三个反引号之间的评论文本进行概括,最多20个词汇。\n","\n"," 评论文本: ```{reviews[i]}```\n"," \"\"\"\n"," response = get_completion(prompt)\n"," print(f\"评论{i+1}: \", response, \"\\n\")\n"]},{"cell_type":"markdown","id":"f118c0cc","metadata":{},"source":["## 三、英文版"]},{"cell_type":"markdown","id":"a08635df","metadata":{},"source":["**1.1 单一文本概括**"]},{"cell_type":"code","execution_count":12,"id":"e55327d5","metadata":{},"outputs":[],"source":["prod_review = \"\"\"\n","Got this panda plush toy for my daughter's birthday, \\\n","who loves it and takes it everywhere. It's soft and \\ \n","super cute, and its face has a friendly look. It's \\ \n","a bit small for what I paid though. I think there \\ \n","might be other options that are bigger for the \\ \n","same price. It arrived a day earlier than expected, \\ \n","so I got to play with it myself before I gave it \\ \n","to her.\n","\"\"\""]},{"cell_type":"code","execution_count":13,"id":"30c2ef51","metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["This panda plush toy is loved by the reviewer's daughter, but they feel it is a bit small for the price.\n"]}],"source":["prompt = f\"\"\"\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","backticks, in at most 30 words. \n","\n","Review: ```{prod_review}```\n","\"\"\"\n","\n","response = get_completion(prompt)\n","print(response)"]},{"cell_type":"markdown","id":"9bdcfc1b","metadata":{},"source":["**1.2 设置关键角度侧重**"]},{"cell_type":"markdown","id":"5dd0534f","metadata":{},"source":["1.2.1 侧重于快递服务"]},{"cell_type":"code","execution_count":14,"id":"b354cc3f","metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["The customer is happy with the product but suggests offering larger options for the same price. They were pleased with the early delivery.\n"]}],"source":["prompt = f\"\"\"\n","Your task is to generate a short summary of a product \\\n","review from an ecommerce site to give feedback to the \\\n","Shipping deparmtment. \n","\n","Summarize the review below, delimited by triple \n","backticks, in at most 30 words, and focusing on any aspects \\\n","that mention shipping and delivery of the product. \n","\n","Review: ```{prod_review}```\n","\"\"\"\n","\n","response = get_completion(prompt)\n","print(response)"]},{"cell_type":"markdown","id":"af6aaf3a","metadata":{},"source":["1.2.2 侧重于价格和质量"]},{"cell_type":"code","execution_count":15,"id":"1b5358fd","metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["The customer loves the panda plush toy for its softness and cuteness, but feels it is overpriced compared to other options available.\n"]}],"source":["prompt = f\"\"\"\n","Your task is to generate a short summary of a product \\\n","review from an ecommerce site to give feedback to the \\\n","pricing deparmtment, responsible for determining the \\\n","price of the product. \n","\n","Summarize the review below, delimited by triple \n","backticks, in at most 30 words, and focusing on any aspects \\\n","that are relevant to the price and perceived value. \n","\n","Review: ```{prod_review}```\n","\"\"\"\n","\n","response = get_completion(prompt)\n","print(response)"]},{"cell_type":"markdown","id":"0f582677","metadata":{},"source":["**1.3 关键信息提取**"]},{"cell_type":"code","execution_count":16,"id":"32c87014","metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["The shipping department should take note that the product arrived a day earlier than expected.\n"]}],"source":["prompt = f\"\"\"\n","Your task is to extract relevant information from \\ \n","a product review from an ecommerce site to give \\\n","feedback to the Shipping department. \n","\n","From the review below, delimited by triple quotes \\\n","extract the information relevant to shipping and \\ \n","delivery. Limit to 30 words. \n","\n","Review: ```{prod_review}```\n","\"\"\"\n","\n","response = get_completion(prompt)\n","print(response)"]},{"cell_type":"markdown","id":"2043d100","metadata":{},"source":["**2.1 同时概括多条文本**"]},{"cell_type":"code","execution_count":17,"id":"cff48486","metadata":{},"outputs":[],"source":["review_1 = prod_review \n","\n","# review for a standing lamp\n","review_2 = \"\"\"\n","Needed a nice lamp for my bedroom, and this one \\\n","had additional storage and not too high of a price \\\n","point. Got it fast - arrived in 2 days. The string \\\n","to the lamp broke during the transit and the company \\\n","happily sent over a new one. Came within a few days \\\n","as well. It was easy to put together. Then I had a \\\n","missing part, so I contacted their support and they \\\n","very quickly got me the missing piece! Seems to me \\\n","to be a great company that cares about their customers \\\n","and products. \n","\"\"\"\n","\n","# review for an electric toothbrush\n","review_3 = \"\"\"\n","My dental hygienist recommended an electric toothbrush, \\\n","which is why I got this. The battery life seems to be \\\n","pretty impressive so far. After initial charging and \\\n","leaving the charger plugged in for the first week to \\\n","condition the battery, I've unplugged the charger and \\\n","been using it for twice daily brushing for the last \\\n","3 weeks all on the same charge. But the toothbrush head \\\n","is too small. I’ve seen baby toothbrushes bigger than \\\n","this one. I wish the head was bigger with different \\\n","length bristles to get between teeth better because \\\n","this one doesn’t. Overall if you can get this one \\\n","around the $50 mark, it's a good deal. The manufactuer's \\\n","replacements heads are pretty expensive, but you can \\\n","get generic ones that're more reasonably priced. This \\\n","toothbrush makes me feel like I've been to the dentist \\\n","every day. My teeth feel sparkly clean! \n","\"\"\"\n","\n","# review for a blender\n","review_4 = \"\"\"\n","So, they still had the 17 piece system on seasonal \\\n","sale for around $49 in the month of November, about \\\n","half off, but for some reason (call it price gouging) \\\n","around the second week of December the prices all went \\\n","up to about anywhere from between $70-$89 for the same \\\n","system. And the 11 piece system went up around $10 or \\\n","so in price also from the earlier sale price of $29. \\\n","So it looks okay, but if you look at the base, the part \\\n","where the blade locks into place doesn’t look as good \\\n","as in previous editions from a few years ago, but I \\\n","plan to be very gentle with it (example, I crush \\\n","very hard items like beans, ice, rice, etc. in the \\\n","blender first then pulverize them in the serving size \\\n","I want in the blender then switch to the whipping \\\n","blade for a finer flour, and use the cross cutting blade \\\n","first when making smoothies, then use the flat blade \\\n","if I need them finer/less pulpy). Special tip when making \\\n","smoothies, finely cut and freeze the fruits and \\\n","vegetables (if using spinach-lightly stew soften the \\\n","spinach then freeze until ready for use-and if making \\\n","sorbet, use a small to medium sized food processor) \\\n","that you plan to use that way you can avoid adding so \\\n","much ice if at all-when making your smoothie. \\\n","After about a year, the motor was making a funny noise. \\\n","I called customer service but the warranty expired \\\n","already, so I had to buy another one. FYI: The overall \\\n","quality has gone done in these types of products, so \\\n","they are kind of counting on brand recognition and \\\n","consumer loyalty to maintain sales. Got it in about \\\n","two days.\n","\"\"\"\n","\n","reviews = [review_1, review_2, review_3, review_4]"]},{"cell_type":"code","execution_count":18,"id":"3f61080b","metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["0 Soft and cute panda plush toy loved by daughter, but small for the price. Arrived early. \n","\n","1 Great lamp with storage, fast delivery, excellent customer service, and easy assembly. Highly recommended. \n","\n","2 Impressive battery life, but toothbrush head is too small. Good deal if bought around $50. \n","\n","3 The reviewer found the price increase after the sale disappointing and noticed a decrease in quality over time. \n","\n"]}],"source":["for i in range(len(reviews)):\n"," prompt = f\"\"\"\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"," backticks in at most 20 words. \n","\n"," Review: ```{reviews[i]}```\n"," \"\"\"\n"," response = get_completion(prompt)\n"," print(i, response, \"\\n\")"]}],"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":5}
diff --git a/docs/content/C1 Prompt Engineering for Developer/5. 推断 Inferring.ipynb b/docs/content/C1 Prompt Engineering for Developer/5. 推断 Inferring.ipynb
new file mode 100644
index 0000000..f0c549f
--- /dev/null
+++ b/docs/content/C1 Prompt Engineering for Developer/5. 推断 Inferring.ipynb
@@ -0,0 +1,1013 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "3630c235-f891-4874-bd0a-5277d4d6aa82",
+ "metadata": {},
+ "source": [
+ "# 第五章 推断\n",
+ "\n",
+ "在这节课中,你将从产品评论和新闻文章中推断情感和主题。\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5f3abbee",
+ "metadata": {},
+ "source": [
+ "\n",
+ "推断任务可以看作是模型接收文本作为输入,并执行某种分析的过程。其中涉及提取标签、提取实体、理解文本情感等等。如果你想要从一段文本中提取正面或负面情感,在传统的机器学习工作流程中,需要收集标签数据集、训练模型、确定如何在云端部署模型并进行推断。这样做可能效果还不错,但是执行全流程需要很多工作。而且对于每个任务,如情感分析、提取实体等等,都需要训练和部署单独的模型。\n",
+ "\n",
+ "LLM 的一个非常好的特点是,对于许多这样的任务,你只需要编写一个 Prompt 即可开始产出结果,而不需要进行大量的工作。这极大地加快了应用程序开发的速度。你还可以只使用一个模型和一个 API 来执行许多不同的任务,而不需要弄清楚如何训练和部署许多不同的模型。"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "51d2fdfa-c99f-4750-8574-dba7712cd7f0",
+ "metadata": {},
+ "source": [
+ "## 一、情感推断\n",
+ "\n",
+ "### 1.1 情感倾向分析\n",
+ "\n",
+ "以电商平台关于一盏台灯的评论为例,可以对其传达的情感进行二分类(正向/负向)。"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "bc6260f0",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "lamp_review = \"\"\"\n",
+ "我需要一盏漂亮的卧室灯,这款灯具有额外的储物功能,价格也不算太高。\\\n",
+ "我很快就收到了它。在运输过程中,我们的灯绳断了,但是公司很乐意寄送了一个新的。\\\n",
+ "几天后就收到了。这款灯很容易组装。我发现少了一个零件,于是联系了他们的客服,他们很快就给我寄来了缺失的零件!\\\n",
+ "在我看来,Lumina 是一家非常关心顾客和产品的优秀公司!\n",
+ "\"\"\""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "cc4ec4ca",
+ "metadata": {},
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "id": "30d6e4bd-3337-45a3-8c99-a734cdd06743",
+ "metadata": {},
+ "source": [
+ "现在让我们来编写一个 Prompt 来分类这个评论的情感。如果我想让系统告诉我这个评论的情感是什么,只需要编写 “以下产品评论的情感是什么” 这个 Prompt ,加上通常的分隔符和评论文本等等。\n",
+ "\n",
+ "然后让我们运行一下。结果显示这个产品评论的情感是积极的,这似乎是非常正确的。虽然这盏台灯不完美,但这个客户似乎非常满意。这似乎是一家关心客户和产品的伟大公司,可以认为积极的情感似乎是正确的答案。"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "ac5b0bb9",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "情感是积极的。\n"
+ ]
+ }
+ ],
+ "source": [
+ "from tool import get_completion\n",
+ "\n",
+ "prompt = f\"\"\"\n",
+ "以下用三个反引号分隔的产品评论的情感是什么?\n",
+ "\n",
+ "评论文本: ```{lamp_review}```\n",
+ "\"\"\"\n",
+ "response = get_completion(prompt)\n",
+ "print(response)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a562e656",
+ "metadata": {},
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "id": "76be2320",
+ "metadata": {},
+ "source": [
+ "如果你想要给出更简洁的答案,以便更容易进行后处理,可以在上述 Prompt 基础上添加另一个指令:*用一个单词回答:「正面」或「负面」*。这样就只会打印出 “正面” 这个单词,这使得输出更加统一,方便后续处理。"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "84a761b3",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "正面\n"
+ ]
+ }
+ ],
+ "source": [
+ "prompt = f\"\"\"\n",
+ "以下用三个反引号分隔的产品评论的情感是什么?\n",
+ "\n",
+ "用一个单词回答:「正面」或「负面」。\n",
+ "\n",
+ "评论文本: ```{lamp_review}```\n",
+ "\"\"\"\n",
+ "response = get_completion(prompt)\n",
+ "print(response)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "81d2a973-1fa4-4a35-ae35-a2e746c0e91b",
+ "metadata": {},
+ "source": [
+ "### 2.2 识别情感类型\n",
+ "\n",
+ "仍然使用台灯评论,我们尝试另一个 Prompt 。这次我需要模型识别出评论作者所表达的情感,并归纳为列表,不超过五项。"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "e615c13a",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "满意,感激,赞赏,信任,满足\n"
+ ]
+ }
+ ],
+ "source": [
+ "# 中文\n",
+ "prompt = f\"\"\"\n",
+ "识别以下评论的作者表达的情感。包含不超过五个项目。将答案格式化为以逗号分隔的单词列表。\n",
+ "\n",
+ "评论文本: ```{lamp_review}```\n",
+ "\"\"\"\n",
+ "response = get_completion(prompt)\n",
+ "print(response)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c7743a53",
+ "metadata": {},
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "id": "cc4444f7",
+ "metadata": {},
+ "source": [
+ "大型语言模型非常擅长从一段文本中提取特定的东西。在上面的例子中,评论所表达的情感有助于了解客户如何看待特定的产品。"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a428d093-51c9-461c-b41e-114e80876409",
+ "metadata": {},
+ "source": [
+ "### 1.3 识别愤怒\n",
+ "\n",
+ "对于很多企业来说,了解某个顾客是否非常生气很重要。所以产生了下述分类问题:以下评论的作者是否表达了愤怒情绪?因为如果有人真的很生气,那么可能值得额外关注,让客户支持或客户成功团队联系客户以了解情况,并为客户解决问题。"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "85bad324",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "否\n"
+ ]
+ }
+ ],
+ "source": [
+ "# 中文\n",
+ "prompt = f\"\"\"\n",
+ "以下评论的作者是否表达了愤怒?评论用三个反引号分隔。给出是或否的答案。\n",
+ "\n",
+ "评论文本: ```{lamp_review}```\n",
+ "\"\"\"\n",
+ "response = get_completion(prompt)\n",
+ "print(response)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "77905fd8",
+ "metadata": {},
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "id": "11ca57a2",
+ "metadata": {},
+ "source": [
+ "上面这个例子中,客户并没有生气。注意,如果使用常规的监督学习,如果想要建立所有这些分类器,不可能在几分钟内就做到这一点。我们鼓励大家尝试更改一些这样的 Prompt ,也许询问客户是否表达了喜悦,或者询问是否有任何遗漏的部分,并看看是否可以让 Prompt 对这个灯具评论做出不同的推论。"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "936a771e-ca78-4e55-8088-2da6f3820ddc",
+ "metadata": {},
+ "source": [
+ "## 二、信息提取\n",
+ "\n",
+ "### 2.1 商品信息提取 \n",
+ "\n",
+ "接下来,让我们从客户评论中提取更丰富的信息。信息提取是自然语言处理(NLP)的一部分,与从文本中提取你想要知道的某些事物相关。因此,在这个 Prompt 中,我要求它识别以下内容:购买物品和制造物品的公司名称。\n",
+ "\n",
+ "同样,如果你试图总结在线购物电子商务网站的许多评论,对于这些评论来说,弄清楚是什么物品、谁制造了该物品,弄清楚积极和消极的情感,有助于追踪特定物品或制造商收获的用户情感趋势。\n",
+ "\n",
+ "在下面这个示例中,我们要求它将响应格式化为一个 JSON 对象,其中物品和品牌作为键。"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "e9ffe056",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "{\n",
+ " \"物品\": \"卧室灯\",\n",
+ " \"品牌\": \"Lumina\"\n",
+ "}\n"
+ ]
+ }
+ ],
+ "source": [
+ "# 中文\n",
+ "prompt = f\"\"\"\n",
+ "从评论文本中识别以下项目:\n",
+ "- 评论者购买的物品\n",
+ "- 制造该物品的公司\n",
+ "\n",
+ "评论文本用三个反引号分隔。将你的响应格式化为以 “物品” 和 “品牌” 为键的 JSON 对象。\n",
+ "如果信息不存在,请使用 “未知” 作为值。\n",
+ "让你的回应尽可能简短。\n",
+ " \n",
+ "评论文本: ```{lamp_review}```\n",
+ "\"\"\"\n",
+ "response = get_completion(prompt)\n",
+ "print(response)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "1342c732",
+ "metadata": {},
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "id": "954d125d",
+ "metadata": {},
+ "source": [
+ "如上所示,它会说这个物品是一个卧室灯,品牌是 Luminar,你可以轻松地将其加载到 Python 字典中,然后对此输出进行其他处理。"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a38880a5-088f-4609-9913-f8fa41fb7ba0",
+ "metadata": {},
+ "source": [
+ "### 2.2 综合情感推断和信息提取\n",
+ "\n",
+ "提取上述所有信息使用了 3 或 4 个 Prompt ,但实际上可以编写单个 Prompt 来同时提取所有这些信息。"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "id": "939c2b0e",
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "{\n",
+ " \"情感倾向\": \"正面\",\n",
+ " \"是否生气\": false,\n",
+ " \"物品类型\": \"卧室灯\",\n",
+ " \"品牌\": \"Lumina\"\n",
+ "}\n"
+ ]
+ }
+ ],
+ "source": [
+ "# 中文\n",
+ "prompt = f\"\"\"\n",
+ "从评论文本中识别以下项目:\n",
+ "- 情绪(正面或负面)\n",
+ "- 审稿人是否表达了愤怒?(是或否)\n",
+ "- 评论者购买的物品\n",
+ "- 制造该物品的公司\n",
+ "\n",
+ "评论用三个反引号分隔。将您的响应格式化为 JSON 对象,以 “情感倾向”、“是否生气”、“物品类型” 和 “品牌” 作为键。\n",
+ "如果信息不存在,请使用 “未知” 作为值。\n",
+ "让你的回应尽可能简短。\n",
+ "将 Anger 值格式化为布尔值。\n",
+ "\n",
+ "评论文本: ```{lamp_review}```\n",
+ "\"\"\"\n",
+ "response = get_completion(prompt)\n",
+ "print(response)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5e09a673",
+ "metadata": {},
+ "source": [
+ "这个例子中,我们告诉它将愤怒值格式化为布尔值,然后输出一个 JSON。您可以自己尝试不同的变化,或者甚至尝试完全不同的评论,看看是否仍然可以准确地提取这些内容。"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "235fc223-2c89-49ec-ac2d-78a8e74a43ac",
+ "metadata": {},
+ "source": [
+ "## 三、主题推断\n",
+ "\n",
+ "大型语言模型的另一个很酷的应用是推断主题。给定一段长文本,这段文本是关于什么的?有什么话题?以以下一段虚构的报纸报道为例。"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "id": "811ff13f",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# 中文\n",
+ "story = \"\"\"\n",
+ "在政府最近进行的一项调查中,要求公共部门的员工对他们所在部门的满意度进行评分。\n",
+ "调查结果显示,NASA 是最受欢迎的部门,满意度为 95%。\n",
+ "\n",
+ "一位 NASA 员工 John Smith 对这一发现发表了评论,他表示:\n",
+ "“我对 NASA 排名第一并不感到惊讶。这是一个与了不起的人们和令人难以置信的机会共事的好地方。我为成为这样一个创新组织的一员感到自豪。”\n",
+ "\n",
+ "NASA 的管理团队也对这一结果表示欢迎,主管 Tom Johnson 表示:\n",
+ "“我们很高兴听到我们的员工对 NASA 的工作感到满意。\n",
+ "我们拥有一支才华横溢、忠诚敬业的团队,他们为实现我们的目标不懈努力,看到他们的辛勤工作得到回报是太棒了。”\n",
+ "\n",
+ "调查还显示,社会保障管理局的满意度最低,只有 45%的员工表示他们对工作满意。\n",
+ "政府承诺解决调查中员工提出的问题,并努力提高所有部门的工作满意度。\n",
+ "\"\"\""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a8ea91d6-e841-4ee2-bed9-ca4a36df177f",
+ "metadata": {},
+ "source": [
+ "### 3.1 推断讨论主题\n",
+ "\n",
+ "上面是一篇虚构的关于政府工作人员对他们工作机构感受的报纸文章。我们可以让它确定五个正在讨论的主题,用一两个字描述每个主题,并将输出格式化为逗号分隔的列表。"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "id": "cab27b65",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "['NASA', '满意度', '评论', '管理团队', '社会保障管理局']\n"
+ ]
+ }
+ ],
+ "source": [
+ "# 中文\n",
+ "prompt = f\"\"\"\n",
+ "确定以下给定文本中讨论的五个主题。\n",
+ "\n",
+ "每个主题用1-2个词概括。\n",
+ "\n",
+ "请输出一个可解析的Python列表,每个元素是一个字符串,展示了一个主题。\n",
+ "\n",
+ "给定文本: ```{story}```\n",
+ "\"\"\"\n",
+ "response = get_completion(prompt)\n",
+ "print(response)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "790d1435",
+ "metadata": {},
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "id": "34be1d2a-1309-4512-841a-b6f67338938b",
+ "metadata": {},
+ "source": [
+ "### 3.2 为特定主题制作新闻提醒\n",
+ "\n",
+ "假设我们有一个新闻网站或类似的东西,这是我们感兴趣的主题:NASA、地方政府、工程、员工满意度、联邦政府等。假设我们想弄清楚,针对一篇新闻文章,其中涵盖了哪些主题。可以使用这样的prompt:确定以下主题列表中的每个项目是否是以下文本中的主题。以 0 或 1 的形式给出答案列表。"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "id": "9f53d337",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[\n",
+ " {\"美国航空航天局\": 1},\n",
+ " {\"当地政府\": 1},\n",
+ " {\"工程\": 0},\n",
+ " {\"员工满意度\": 1},\n",
+ " {\"联邦政府\": 1}\n",
+ "]\n"
+ ]
+ }
+ ],
+ "source": [
+ "# 中文\n",
+ "prompt = f\"\"\"\n",
+ "判断主题列表中的每一项是否是给定文本中的一个话题,\n",
+ "\n",
+ "以列表的形式给出答案,每个元素是一个Json对象,键为对应主题,值为对应的 0 或 1。\n",
+ "\n",
+ "主题列表:美国航空航天局、当地政府、工程、员工满意度、联邦政府\n",
+ "\n",
+ "给定文本: ```{story}```\n",
+ "\"\"\"\n",
+ "response = get_completion(prompt)\n",
+ "print(response)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "8f39f24a",
+ "metadata": {},
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "id": "08247dbf",
+ "metadata": {},
+ "source": [
+ "有结果可见,这个故事是与关于 NASA 、员工满意度、联邦政府有关,而与当地政府的、工程学无关。这在机器学习中有时被称为 Zero-Shot (零样本)学习算法,因为我们没有给它任何标记的训练数据。仅凭 Prompt ,它就能确定哪些主题在新闻文章中有所涵盖。\n",
+ "\n",
+ "如果我们想生成一个新闻提醒,也可以使用这个处理新闻的过程。假设我非常喜欢 NASA 所做的工作,就可以构建一个这样的系统,每当 NASA 新闻出现时,输出提醒。"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "id": "53bf1abd",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "{'美国航空航天局': 1, '当地政府': 1, '工程': 0, '员工满意度': 1, '联邦政府': 1}\n",
+ "提醒: 关于美国航空航天局的新消息\n"
+ ]
+ }
+ ],
+ "source": [
+ "result_lst = eval(response)\n",
+ "topic_dict = {list(i.keys())[0] : list(i.values())[0] for i in result_lst}\n",
+ "print(topic_dict)\n",
+ "if topic_dict['美国航空航天局'] == 1:\n",
+ " print(\"提醒: 关于美国航空航天局的新消息\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "9fc2c643",
+ "metadata": {},
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "id": "76ccd189",
+ "metadata": {},
+ "source": [
+ "这就是关于推断的全部内容了,仅用几分钟时间,我们就可以构建多个用于对文本进行推理的系统,而以前则需要熟练的机器学习开发人员数天甚至数周的时间。这非常令人兴奋,无论是对于熟练的机器学习开发人员,还是对于新手来说,都可以使用 Prompt 来非常快速地构建和开始相当复杂的自然语言处理任务。"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "9ace190d",
+ "metadata": {},
+ "source": [
+ "## 英文版"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a3b34fec",
+ "metadata": {},
+ "source": [
+ "**1.1 情感倾向分析**"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "id": "57b08c8d",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "lamp_review = \"\"\"\n",
+ "Needed a nice lamp for my bedroom, and this one had \\\n",
+ "additional storage and not too high of a price point. \\\n",
+ "Got it fast. The string to our lamp broke during the \\\n",
+ "transit and the company happily sent over a new one. \\\n",
+ "Came within a few days as well. It was easy to put \\\n",
+ "together. I had a missing part, so I contacted their \\\n",
+ "support and they very quickly got me the missing piece! \\\n",
+ "Lumina seems to me to be a great company that cares \\\n",
+ "about their customers and products!!\n",
+ "\"\"\""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "id": "5456540c",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The sentiment of the product review is positive.\n"
+ ]
+ }
+ ],
+ "source": [
+ "prompt = f\"\"\"\n",
+ "What is the sentiment of the following product review, \n",
+ "which is delimited with triple backticks?\n",
+ "\n",
+ "Review text: ```{lamp_review}```\n",
+ "\"\"\"\n",
+ "response = get_completion(prompt)\n",
+ "print(response)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 27,
+ "id": "cc0fe287",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "positive\n"
+ ]
+ }
+ ],
+ "source": [
+ "prompt = f\"\"\"\n",
+ "What is the sentiment of the following product review, \n",
+ "which is delimited with triple backticks?\n",
+ "\n",
+ "Give your answer as a single word, either \"positive\" \\\n",
+ "or \"negative\".\n",
+ "\n",
+ "Review text: ```{lamp_review}```\n",
+ "\"\"\"\n",
+ "response = get_completion(prompt)\n",
+ "print(response)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "7dc01fe8",
+ "metadata": {},
+ "source": [
+ "**1.2识别情感类型**"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 28,
+ "id": "07708a7d",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "satisfied, pleased, grateful, impressed, happy\n"
+ ]
+ }
+ ],
+ "source": [
+ "prompt = f\"\"\"\n",
+ "Identify a list of emotions that the writer of the \\\n",
+ "following review is expressing. Include no more than \\\n",
+ "five items in the list. Format your answer as a list of \\\n",
+ "lower-case words separated by commas.\n",
+ "\n",
+ "Review text: ```{lamp_review}```\n",
+ "\"\"\"\n",
+ "response = get_completion(prompt)\n",
+ "print(response)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5ebd8903",
+ "metadata": {},
+ "source": [
+ "**1.3 识别愤怒**"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 29,
+ "id": "0fb1fa65",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "No\n"
+ ]
+ }
+ ],
+ "source": [
+ "prompt = f\"\"\"\n",
+ "Is the writer of the following review expressing anger?\\\n",
+ "The review is delimited with triple backticks. \\\n",
+ "Give your answer as either yes or no.\n",
+ "\n",
+ "Review text: ```{lamp_review}```\n",
+ "\"\"\"\n",
+ "response = get_completion(prompt)\n",
+ "print(response)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "60186c02",
+ "metadata": {},
+ "source": [
+ "**2.1 商品信息提取**"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 30,
+ "id": "58ec19cd",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "{\n",
+ " \"Item\": \"lamp\",\n",
+ " \"Brand\": \"Lumina\"\n",
+ "}\n"
+ ]
+ }
+ ],
+ "source": [
+ "prompt = f\"\"\"\n",
+ "Identify the following items from the review text: \n",
+ "- Item purchased by reviewer\n",
+ "- Company that made the item\n",
+ "\n",
+ "The review is delimited with triple backticks. \\\n",
+ "Format your response as a JSON object with \\\n",
+ "\"Item\" and \"Brand\" as the keys. \n",
+ "If the information isn't present, use \"unknown\" \\\n",
+ "as the value.\n",
+ "Make your response as short as possible.\n",
+ " \n",
+ "Review text: ```{lamp_review}```\n",
+ "\"\"\"\n",
+ "response = get_completion(prompt)\n",
+ "print(response)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "0a290d15",
+ "metadata": {},
+ "source": [
+ "**2.2 综合情感推断和信息提取**"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 31,
+ "id": "785ccfe2",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "{\n",
+ " \"Sentiment\": \"positive\",\n",
+ " \"Anger\": false,\n",
+ " \"Item\": \"lamp\",\n",
+ " \"Brand\": \"Lumina\"\n",
+ "}\n"
+ ]
+ }
+ ],
+ "source": [
+ "prompt = f\"\"\"\n",
+ "Identify the following items from the review text: \n",
+ "- Sentiment (positive or negative)\n",
+ "- Is the reviewer expressing anger? (true or false)\n",
+ "- Item purchased by reviewer\n",
+ "- Company that made the item\n",
+ "\n",
+ "The review is delimited with triple backticks. \\\n",
+ "Format your response as a JSON object with \\\n",
+ "\"Sentiment\", \"Anger\", \"Item\" and \"Brand\" as the keys.\n",
+ "If the information isn't present, use \"unknown\" \\\n",
+ "as the value.\n",
+ "Make your response as short as possible.\n",
+ "Format the Anger value as a boolean.\n",
+ "\n",
+ "Review text: ```{lamp_review}```\n",
+ "\"\"\"\n",
+ "response = get_completion(prompt)\n",
+ "print(response)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "28f57f53",
+ "metadata": {},
+ "source": [
+ "**3.1 推断讨论主题**"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 32,
+ "id": "8d2859c4",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "story = \"\"\"\n",
+ "In a recent survey conducted by the government, \n",
+ "public sector employees were asked to rate their level \n",
+ "of satisfaction with the department they work at. \n",
+ "The results revealed that NASA was the most popular \n",
+ "department with a satisfaction rating of 95%.\n",
+ "\n",
+ "One NASA employee, John Smith, commented on the findings, \n",
+ "stating, \"I'm not surprised that NASA came out on top. \n",
+ "It's a great place to work with amazing people and \n",
+ "incredible opportunities. I'm proud to be a part of \n",
+ "such an innovative organization.\"\n",
+ "\n",
+ "The results were also welcomed by NASA's management team, \n",
+ "with Director Tom Johnson stating, \"We are thrilled to \n",
+ "hear that our employees are satisfied with their work at NASA. \n",
+ "We have a talented and dedicated team who work tirelessly \n",
+ "to achieve our goals, and it's fantastic to see that their \n",
+ "hard work is paying off.\"\n",
+ "\n",
+ "The survey also revealed that the \n",
+ "Social Security Administration had the lowest satisfaction \n",
+ "rating, with only 45% of employees indicating they were \n",
+ "satisfied with their job. The government has pledged to \n",
+ "address the concerns raised by employees in the survey and \n",
+ "work towards improving job satisfaction across all departments.\n",
+ "\"\"\""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 38,
+ "id": "48774999",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "survey, satisfaction rating, NASA, Social Security Administration, job satisfaction\n"
+ ]
+ }
+ ],
+ "source": [
+ "prompt = f\"\"\"\n",
+ "Determine five topics that are being discussed in the \\\n",
+ "following text, which is delimited by triple backticks.\n",
+ "\n",
+ "Make each item one or two words long. \n",
+ "\n",
+ "Format your response as a list of items separated by commas.\n",
+ "Give me a list which can be read in Python.\n",
+ "\n",
+ "Text sample: ```{story}```\n",
+ "\"\"\"\n",
+ "response = get_completion(prompt)\n",
+ "print(response)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 39,
+ "id": "35afde60",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "['survey',\n",
+ " ' satisfaction rating',\n",
+ " ' NASA',\n",
+ " ' Social Security Administration',\n",
+ " ' job satisfaction']"
+ ]
+ },
+ "execution_count": 39,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "response.split(sep=',')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4874c5bb",
+ "metadata": {},
+ "source": [
+ "**3.2 为特定主题制作新闻提醒**"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 40,
+ "id": "a4d3d64f",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "topic_list = [\n",
+ " \"nasa\", \"local government\", \"engineering\", \n",
+ " \"employee satisfaction\", \"federal government\"\n",
+ "]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 41,
+ "id": "a0ceea1a",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[1, 0, 0, 1, 1]\n"
+ ]
+ }
+ ],
+ "source": [
+ "prompt = f\"\"\"\n",
+ "Determine whether each item in the following list of \\\n",
+ "topics is a topic in the text below, which\n",
+ "is delimited with triple backticks.\n",
+ "\n",
+ "Give your answer as list with 0 or 1 for each topic.\\\n",
+ "\n",
+ "List of topics: {\", \".join(topic_list)}\n",
+ "\n",
+ "Text sample: ```{story}```\n",
+ "\"\"\"\n",
+ "response = get_completion(prompt)\n",
+ "print(response)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 45,
+ "id": "82489580",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "{'nasa': 1, 'local government': 0, 'engineering': 0, 'employee satisfaction': 1, 'federal government': 1}\n",
+ "ALERT: New NASA story!\n"
+ ]
+ }
+ ],
+ "source": [
+ "topic_dict = {topic_list[i] : eval(response)[i] for i in range(len(eval(response)))}\n",
+ "print(topic_dict)\n",
+ "if topic_dict['nasa'] == 1:\n",
+ " print(\"ALERT: New NASA story!\")"
+ ]
+ }
+ ],
+ "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": {
+ "height": "calc(100% - 180px)",
+ "left": "10px",
+ "top": "150px",
+ "width": "256px"
+ },
+ "toc_section_display": true,
+ "toc_window_display": true
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}