本章内容包括:
- 理解系统化的提示工程并设置您的第一个提示流程
- 制作有效的个人资料/角色提示
- 评估个人资料:评分标准和基础
- 大型语言模型个人资料的基础评估
- 比较提示:获得完美的个人资料
在本章中,我们深入探讨了“系统地测试变化”这一提示工程策略。如果你还记得,我们在第二章中介绍了OpenAI提示工程框架的宏大策略。这些策略对于帮助我们构建更好的提示,并进而建立更好的代理人个人资料和角色至关重要。理解这个角色是我们提示工程旅程的关键。
“系统地测试变化”是提示工程中的核心部分,微软围绕这一策略开发了一个名为“提示流程”(prompt flow)的工具,本章后面会介绍这个工具。在讲解提示流程之前,我们需要理解为什么我们需要系统化的提示工程。
9.1 为什么我们需要系统化的提示工程
提示工程本质上是一个迭代的过程。在构建提示时,你通常会进行多次迭代和评估。为了更好地理解这一概念,可以考虑将提示工程简单应用于一个ChatGPT问题。
你可以通过打开浏览器访问ChatGPT(chat.openai.com/),输入以下(文本)提示并点击发送消息按钮来跟随操作(此对话的示例见图9.1,位于左侧):can you recommend something
我们可以看到,ChatGPT的回复要求提供更多的信息。接下来,打开一个新的对话并输入以下提示,如图9.1右侧所示:
Can you please recommend a time travel movie set in the medieval period.
图9.1中的结果清楚地展示了省略细节与在请求中提供更多具体信息之间的明显差异。我们刚刚应用了礼貌地写明清晰指令的策略,ChatGPT为我们提供了一个不错的推荐。但同时也可以注意到,ChatGPT本身是如何引导用户更好地提出提示的。图9.2中显示的更新屏幕展示了OpenAI提示工程策略。
我们刚刚应用了简单的迭代来改进我们的提示。我们可以通过使用系统提示/消息来扩展这个例子。图9.3展示了系统提示在迭代沟通中的使用和作用。在第二章中,我们在多个示例中使用了系统消息/提示。
你也可以在ChatGPT中尝试这个。此次,输入以下提示,并将“system”一词小写输入,后面加上一个换行符(在消息窗口中按Shift+Enter输入新的一行,但不要发送消息):
system
You are an expert on time travel movies.
ChatGPT将会做出一些愉快的回应,如图9.4所示。由于此时它已经乐于接受了自己的新角色,并且会询问是否有后续问题。现在,像之前一样输入以下通用提示:
can you recommend something
我们刚刚看到了通过迭代优化提示、进行提示工程,从而获得更好回应的过程。这是通过三个不同的对话在ChatGPT界面中完成的。虽然这不是最高效的方式,但它有效。
然而,我们还没有定义评估提示并确定何时提示有效的迭代流程。图9.5展示了使用迭代和评估系统的提示工程的系统化方法。
迭代和评估提示的系统涵盖了广泛的“系统地测试变化”策略。评估提示的性能和有效性仍然是一个新的领域,但我们将使用教育中的一些技术,如评分标准和基础,这些内容将在本章稍后的部分进行探讨。然而,正如下一节所指出的,在我们进行这些操作之前,我们需要理解角色和代理人个人资料之间的区别。
9.2 理解代理人个人资料和角色
代理人个人资料是对描述代理人的组件提示或消息的封装。它包括代理人的角色、特别指令以及可以指导用户或其他代理人消费者的其他策略。
图9.6展示了代理人个人资料的主要元素。这些元素与本书中描述的提示工程策略相对应。并非所有代理人都会使用完整代理人个人资料的所有元素。
从基本层面来看,代理人个人资料是一组描述代理人的提示。它可能包括与行为/工具、知识、记忆、推理、评估、计划和反馈相关的其他外部元素。这些元素的组合构成了整个代理人提示个人资料。
提示是代理人功能的核心。一个提示或一组提示驱动着个人资料中的每个代理人组件。对于行为/工具,这些提示是明确的,但正如我们所见,记忆和知识的提示在不同用例中可能会有显著差异。
AI代理人个人资料的定义不仅仅是一个系统提示。提示流程可以让我们构建代理人个人资料所需的提示和代码,同时还可以评估其有效性。在下一节中,我们将打开提示流程并开始使用它。
9.3 设置你的第一个提示流程
提示流程是微软在其Azure机器学习工作室平台内开发的一款工具。该工具后来作为开源项目发布在GitHub上,吸引了更多的关注和使用。虽然最初它是作为应用平台开发的,但它已经展示出在开发和评估提示/个人资料方面的优势。
由于提示流程最初是为了在Azure上作为服务运行而开发的,因此它拥有强大的核心架构。该工具支持多线程批处理,使其非常适合大规模评估提示。接下来的部分将介绍如何开始使用提示流程的基础知识。
9.3.1 入门
在进行本书中的练习之前,有一些先决条件需要完成。本节和本章的相关先决条件如下所示;确保在尝试练习之前完成这些步骤:
-
Visual Studio Code (VS Code) — 请参阅附录A的安装说明,包括其他扩展。
-
提示流程,VS Code扩展 — 请参阅附录A了解安装扩展的详细信息。
-
Python虚拟环境 — 请参阅附录A了解设置虚拟环境的详细信息。
-
安装提示流程包 — 在你的虚拟环境中,快速执行pip安装,如下所示:
pip install promptflow promptflow-tools -
LLM (GPT-4或更高版本) — 你需要通过OpenAI或Azure OpenAI Studio访问GPT-4或更高版本。如需帮助访问这些资源,请参阅附录B。
-
本书的源代码 — 将本书的源代码克隆到本地文件夹;如需帮助克隆仓库,请参阅附录A。
打开VS Code并进入本书源代码的文件夹,第3章。确保你已连接虚拟环境并安装了提示流程包和扩展。
首先,你需要在提示流程扩展中创建一个与LLM资源的连接。在VS Code中打开提示流程扩展,然后点击打开连接。接着,点击LLM资源旁边的加号,创建一个新连接,如图9.7所示。
这将打开一个YAML文件,你需要在其中填写连接名称以及与连接相关的其他信息。按照说明操作,注意不要在文档中输入API密钥,如图9.8所示。
输入连接信息后,点击文档底部的“Create Connection”链接。这将打开文档下方的终端提示,要求你输入密钥。根据终端的配置,你可能无法使用粘贴功能(Ctrl-V,Cmd-V)。作为替代,你可以通过将鼠标光标悬停在终端上,并在Windows系统中右键点击来粘贴密钥。
现在,我们通过首先打开位于chapter_09/promptflow/simpleflow文件夹中的简单流程来测试连接。然后,在VS Code中打开flow.dag.yaml文件。这是一个YAML文件,但提示流程扩展提供了一个可视化编辑器,你可以通过点击文件顶部的“Visual Editor”链接访问该编辑器,如图9.9所示。
打开可视化编辑器窗口后,你将看到一个表示流程和流程块的图形。双击推荐器块,设置连接名称、API类型以及模型或部署名称,如图9.10所示。
一个提示流程由一组块组成,从输入块(Inputs block)开始,到输出块(Outputs block)结束。在这个简单的流程中,推荐器块表示与LLM的连接和与模型对话所使用的提示。对于这个简单示例中的回显块,它会回显输入内容。
在创建与LLM的连接时,无论是在提示流程中还是通过API,这里有一些关键参数我们需要始终考虑(提示流程文档:microsoft.github.io/promptflow):
- Connection — 这是连接名称,它还代表你正在连接的服务。提示流程支持多个服务,包括本地部署的LLM。
- API — 这是API类型。选项包括“chat”(用于聊天完成API,如GPT-4)或“completion”(用于旧版的完成模型,如OpenAI Davinci)。
- Model — 这可能是模型或部署名称,具体取决于你的服务连接。对于OpenAI,这是模型的名称;对于Azure OpenAI,它代表的是部署名称。
- Temperature — 这是模型响应的随机性或变异性。值为1表示响应具有较高的变异性,而值为0表示没有变异性。这是一个关键参数,需要理解,并且如我们所见,它会根据用例的不同而有所变化。
- Stop — 这个可选设置指示LLM停止生成标记。它更适合旧版和开源模型。
- Max tokens — 这是限制对话中使用的标记数。了解你使用了多少标记对于评估LLM交互在扩展时的表现至关重要。如果你只是进行探索和研究,标记数量可能不是什么问题。然而,在生产系统中,标记代表着LLM的负载,使用大量标记的连接可能无法良好扩展。
- Advanced parameters — 你可以设置一些额外的选项来调整与LLM的交互,但我们将在本书后续章节中讨论这些内容。
配置完LLM块后,向上滚动到输入块(Inputs block)部分,查看用户输入字段中的主要输入,如图9.11所示。保持默认设置,然后点击窗口顶部的播放按钮。
流程中的所有块将会运行,结果会显示在终端窗口中。你应该会发现有趣的是,输出显示了时间旅行电影的推荐。这是因为推荐器块已经设置了一个简单的个人资料,接下来我们将在下一节看到它是如何工作的。
9.3.2 使用Jinja2模板创建个人资料
流程之所以能够响应时间旅行电影推荐,是因为它使用了提示或个人资料。默认情况下,提示流程使用Jinja2模板来定义提示的内容,或者我们将其称为个人资料。在本书及我们对AI代理人的探索中,我们将这些模板称为流程或代理人的个人资料。
尽管提示流程并没有明确将自己称为助手或代理引擎,但它确实符合生成代理和一般类型代理的标准。如你所见,提示流程甚至支持将流程部署到容器中并作为服务使用。
打开VS Code并进入chapter_09/promptflow/simpleflow/flow.dag.yaml,然后在可视化编辑器中打开该文件。接着,找到“Prompt”字段,并点击推荐的.jinja2链接,如图9.12所示。
Jinja是一个模板引擎,而Jinja2是该引擎的一个特定版本。模板是定义任何形式的文本文档布局和部分的优秀方式。它们被广泛用于生成HTML、JSON、CSS以及其他文档格式。此外,模板支持直接将代码应用到模板中。尽管没有标准的方式来构建提示或代理人个人资料,但在本书中,我们倾向于使用Jinja等模板引擎。
此时,修改推荐.jinja2模板中系统提示的角色。然后,通过在可视化编辑器中打开流程并点击播放按钮来运行所有流程块。下一节将介绍运行提示流程进行测试或实际部署的其他方法。
9.3.3 部署提示流程API
由于提示流程也被设计为可以作为服务进行部署,因此它支持几种快速部署为应用程序或API的方式。提示流程可以作为本地Web应用程序和API从终端运行,或作为Docker容器进行部署。
返回到VS Code中的flow.dag.yaml文件,在窗口顶部播放按钮旁边有几个我们希望进一步调查的选项。点击“Build”按钮,如图9.13所示,然后选择将其部署为本地应用程序。将创建一个新的YAML文件来配置应用程序。保持默认设置,然后点击“Start Local App”链接。
这将把流程作为本地Web应用程序启动,你将看到一个浏览器标签页打开,如图9.14所示。在标有红色星号的user_input字段中输入一些文本,该字段被标记为必填项。点击回车键并等待几秒钟以获取回复。
你应该看到类似图9.12中显示的回复,其中流程或代理人回复了一个时间旅行电影的列表。这很棒——我们刚刚开发了我们的第一个代理人个人资料和一个相当于代理的代理。然而,我们需要确定这些推荐的成功性或价值。在下一节中,我们将探讨如何评估提示和个人资料。
9.4 评估个人资料:评分标准和基础
任何提示或代理人个人资料的一个关键元素是其执行给定任务的效果。如我们在推荐示例中所见,提示代理人个人资料以给出推荐列表相对容易,但了解这些推荐是否有用需要我们评估其响应。
幸运的是,提示流程已经设计成可以大规模评估提示/个人资料。强大的基础设施使得LLM交互的评估可以并行化并作为工作者进行管理,允许数百个个人资料评估和变化迅速进行。
在下一节中,我们将探讨如何配置提示流程来进行提示/个人资料变体之间的比较。在评估个人资料性能之前,我们需要理解这一点。
提示流程提供了一种机制,允许LLM提示/个人资料中存在多个变体。这一工具非常适合比较个人资料变体之间的微妙或显著差异。当用于执行大规模评估时,它对于快速评估个人资料的表现是非常宝贵的。
在VS Code中打开recommender_with_variations/flow.dag.yaml文件,并进入流程可视化编辑器,如图9.15所示。这一次,我们将个人资料做得更为通用,并允许在输入层面进行自定义。这使得我们可以将推荐扩展到任何内容,而不仅仅是时间旅行电影。
新的输入字段Subject、Genre、Format和Custom使我们能够定义一个可以轻松调整以适应任何推荐的个人资料。这也意味着我们必须根据推荐的使用案例来预设输入。预设这些输入有多种方法;图9.16展示了两种预设输入的示例。图中展示了预设输入的两种选项,选项A和选项B。选项A代表经典的UI界面;例如,可能有供用户选择主题或类型的对象。选项B则放置了一个代理/聊天代理,旨在与用户互动,更好地理解所需的主题、类型等。
即使考虑到LLM的强大功能,你仍然可能希望或需要使用选项A。选项A的优点是你可以像使用任何现代UI一样约束和验证输入。另一方面,选项A的缺点是其约束行为可能会限制和限制未来的使用场景。
选项B则代表了一种更流畅和自然的方式,没有传统的UI。它比选项A更强大且具有可扩展性,但也带来了更多的未知因素来进行评估。然而,如果选项B使用的代理编写得好,它可以在从用户那里收集更好的信息方面提供很大的帮助。
你选择的选项将决定你如何评估个人资料。如果你可以接受一个受限的UI,那么输入也可能会限制为一组离散的值。现在,我们假设选项B用于输入预设,这意味着输入值将通过其名称来定义。
要回到VS Code并查看带有变体的推荐流程的可视化视图,点击图9.15中显示的图标以打开变体并允许编辑。然后,点击recommend.jinja2和recommender_variant_1.jinja2链接,像图9.17所示那样并排打开文件。
图9.17展示了变体个人资料之间的差异。一个个人资料将输入注入到用户提示中,另一个则将输入注入到系统提示中。然而,必须理解的是,变体不仅限于个人资料设计,如表9.1所示,它们还可以包含更多内容。
表9.1 提示流程中的LLM变体选项
| 选项 | 评估选项示例 | 备注 |
|---|---|---|
| Jinja2提示模板 | 比较系统提示变体、用户提示变体或混合提示变体。 | 这里可以应用一些无尽的组合和技术。提示工程一直在发展。 |
| LLM | 比较GPT-9.5与GPT-4。 比较GPT-4与GPT-4 Turbo。 比较开源模型与商业模型。 | 这是一种有效的方式来评估和验证模型在提示下的表现。它还可以帮助你调整个人资料,以便与开源和/或更便宜的模型一起使用。 |
| Temperature | 比较0温度(无随机性)与1温度(最大随机性)。 | 温度的变化会显著改变一些提示的响应,这可能会改善或降低性能。 |
| Max tokens | 比较有限的标记数与更大的标记数。 | 这可以让你减少或最大化标记的使用。 |
| Advanced parameters | 比较top_p、presence_penalty、frequency_penalty和logit_bias等选项的差异。 | 我们将在后续章节中讨论这些高级参数的使用。 |
| Function calls | 比较替代的函数调用。 | 函数调用将在本章稍后讨论。 |
对于这个简单示例,我们将仅通过改变输入来使用提示变体,将其反映在系统或用户提示中。参见图9.17了解其具体内容。然后,通过点击顶部的播放(运行全部)按钮并选择两者,我们可以快速运行这两种变体,如图9.18所示。
在终端窗口中,你将看到两次运行的结果。这些结果可能看起来相似,因此接下来我们必须探讨如何评估变体之间的差异,在下一节中进行详细讲解。
9.5 理解评分标准和基础
评估提示/个人资料的表现通常不是通过准确性或正确率来衡量的。评估个人资料的表现取决于用例和预期结果。如果任务只是判断响应是否正确,那就简单了。然而,在大多数情况下,评估不会这么简单。
在教育中,评分标准的概念定义了学生必须达到的标准和标准集,以便获得某个特定的成绩。评分标准也可以用来定义评估个人资料或提示的指南。我们可以通过以下步骤来定义一个评分标准,用于评估个人资料或提示的表现:
- 确定目的和目标。确定你希望个人资料或代理完成的目标。例如,你是想评估给定观众的推荐质量,还是给定主题、格式或其他输入的总体质量?
- 定义标准。制定一组评估个人资料的标准或维度。这些标准应该与你的目标对齐,并为评估提供明确的指南。每个标准应具体且可衡量。例如,你可能希望根据推荐内容与类型的契合度来衡量推荐,然后再根据主题和格式进行衡量。
- 创建评分尺度。建立一个评分尺度,用于描述每个标准的表现水平。标准的尺度包括数值尺度(例如1-5)或描述性尺度(例如优秀、良好、一般、差)。
- 提供描述。对于尺度上的每个等级,提供清晰简洁的描述,表明什么构成强表现,什么表示较弱表现。
- 应用评分标准。在评估提示或个人资料时,使用评分标准根据已定义的标准评估提示的表现。为每个标准分配分数或评级,考虑每个等级的描述。
- 计算总分。根据你的评分标准,你可以通过将每个标准的分数相加来计算总分,或者如果某些标准比其他标准更重要,可以使用加权平均。
- 确保评估一致性。如果有多个评估人员在评估个人资料,确保评分的一致性是至关重要的。
- 审查、修订和迭代。定期审查和修订评分标准,确保它与你的评估目标和目的对齐。根据需要调整评分标准,以提高其有效性。
基础是一个可以应用于个人资料和提示评估的概念——它定义了响应与给定评分标准的具体标准和要求的对齐程度。你也可以将基础视为提示或个人资料输出的基本期望。
以下是使用基础进行个人资料评估时需要考虑的其他一些重要事项:
- 基础是指将响应与评分标准和提示定义的标准、目标和上下文对齐。
- 基础涉及评估响应是否直接解决评分标准,是否保持主题一致,是否遵循提供的指令。
- 评估者和评估通过衡量准确性、相关性和标准遵循性来评估基础。
- 基础确保响应输出牢牢根植于指定的上下文中,使评估过程更加客观和有意义。
- 一个好的基础响应会在给定的上下文和目标内与所有评分标准对齐。基础不好的响应会失败或错过所有标准、上下文和目标。
由于评分标准和基础的概念仍可能较为抽象,让我们来看如何将它们应用于当前的推荐器示例。以下是应用于我们推荐器示例的定义评分标准过程:
- 确定目的和目标。我们的个人资料/提示的目的是在给定主题、格式、类型和自定义输入的情况下推荐三项最佳项目。
- 定义标准。为了简化,我们将评估某一推荐与给定输入标准(主题、格式和类型)的契合度。例如,如果个人资料在请求电影格式时推荐了书籍,我们预计在格式标准上得分较低。
- 创建评分尺度。为了简化,我们将使用1-5的尺度(1表示差,5表示优秀)。
- 提供描述。请参见表9.2中显示的评分尺度的常规描述。
- 应用评分标准。在此阶段分配评分标准后,手动评估推荐内容是一个很好的练习。
- 计算总分。对于我们的评分标准,我们将通过对所有标准的得分进行平均来计算总分。
- 确保评估一致性。我们将使用的评估技术将提供非常一致的结果。
- 审查、修订和迭代。我们将审查、比较并迭代我们的个人资料、评分标准和评估本身。
表9.2 评分标准
| 评分 | 描述 |
|---|---|
| 1 | 适配差:与给定标准完全相反。 |
| 2 | 适配差:与给定标准不太匹配。 |
| 3 | 适配一般:可能适配或不适配给定标准。 |
| 4 | 适配好:可能与标准不完全对齐,但总体匹配较好。 |
| 5 | 适配优秀:非常符合给定标准的推荐。 |
现在,可以应用这个基本评分标准来评估我们个人资料的响应。你可以手动进行评估,或者正如你将在下一节中看到的那样,使用第二个LLM个人资料进行评估。
9.6 使用LLM个人资料进行基础评估
本节将使用另一个LLM提示/个人资料进行评估和基础设置。这个第二个LLM提示将在生成推荐后添加另一个块。它将处理生成的推荐并根据先前的评分标准对每个推荐进行评估。
在GPT-4和其他复杂LLM出现之前,我们从未考虑使用另一个LLM提示来评估或进行基础设置。当使用LLM来进行基础评估时,通常希望使用不同的模型。然而,如果你是在比较个人资料之间的表现,使用相同的LLM进行评估和基础设置是合适的。
打开位于recommender_with_LLM_evaluation\flow.dag.yaml中的文件,在提示流程可视化编辑器中滚动到evaluate_recommendation块,然后点击evaluate_recommendation.jinja2链接打开文件,如图9.19所示。图中标出了评分标准的每个部分。
我们有一个不仅定义良好且可以作为提示使用的评分标准,用于评估推荐内容。这使我们能够自动评估给定个人资料的推荐效果。当然,你也可以手动使用评分标准来为推荐打分和评估,以获得更好的基准。
注意:使用LLM评估提示和个人资料为比较个人资料的表现提供了一个强有力的基准。它还可以在受控和可重复的方式下消除人为偏差来完成这项任务。这为任何个人资料或提示建立基准基础提供了一个极好的机制。
回到recommender_with_LLM_evaluation流程的可视化编辑器,我们可以通过点击播放按钮来运行流程并观察输出。你可以在提示时运行单个推荐或运行两个变体。使用默认输入进行单次评估的输出如下所示。
示例9.1 LLM评分标准评估输出
{
"recommendations": "Title: The Butterfly Effect\nSubject: 5\nFormat: 5\nGenre: 4\n\nTitle: Primer\nSubject: 5\nFormat: 5\nGenre: 4\n\nTitle: Time Bandits\nSubject: 5\nFormat: 5\nGenre: 5"
}
现在我们有了一个用于基础评估的评分标准,并且使用第二个LLM提示自动运行了评估。在下一节中,我们将探讨如何同时进行多个评估,然后查看所有评估的总分。
9.7 比较个人资料:获得完美的个人资料
通过理解评分标准和基础,我们现在可以开始评估并迭代完美的个人资料了。然而,在这之前,我们需要清理LLM评估块的输出。这将需要我们将推荐内容解析为更符合Python习惯的格式,我们将在下一节中解决这个问题。
9.7.1 解析LLM评估输出
由于评估块的原始输出是文本,我们现在希望将其解析为更可用的形式。当然,编写解析函数是简单的,但也有更好的方法来自动转换响应。在第五章中,我们讨论了更好的方法来返回响应,具体是在代理操作部分。
在VS Code中打开chapter_09\prompt_flow\recommender_with_parsing\flow.dag.yaml文件,并在可视化编辑器中查看流程。找到parsing_results块,点击链接以在编辑器中打开Python文件,如图9.20所示。
我们有一个评分标准,不仅定义明确,而且还以提示的形式存在,可以用来评估推荐内容。这使我们能够自动评估给定个人资料的推荐效果。当然,你也可以手动使用评分标准来为推荐打分和评估,以获得更好的基准。
注意:使用LLM来评估提示和个人资料为比较个人资料的表现提供了一个强有力的基准。它还可以在受控和可重复的方式下消除人为偏差来完成这项任务。这为任何个人资料或提示建立基准基础提供了一个极好的机制。
回到recommender_with_LLM_evaluation流程的可视化编辑器,我们可以通过点击播放按钮来运行流程并观察输出。你可以在提示时运行单个推荐或运行两个变体。使用默认输入进行单次评估的输出如下所示。
示例9.1 LLM评分标准评估输出
{
"recommendations": "Title: The Butterfly Effect\nSubject: 5\nFormat: 5\nGenre: 4\n\nTitle: Primer\nSubject: 5\nFormat: 5\nGenre: 4\n\nTitle: Time Bandits\nSubject: 5\nFormat: 5\nGenre: 5"
}
现在我们有了一个用于基础评估的评分标准,并且使用第二个LLM提示自动运行了评估。在下一节中,我们将探讨如何同时进行多个评估,然后查看所有评估的总分。
9.7.2 在提示流程中运行批处理
在我们的通用推荐个人资料中,我们希望评估各种输入标准如何影响生成的推荐内容。幸运的是,提示流程可以批量处理我们想要测试的任何变体。限制仅在于我们愿意投入的时间和资金。
要执行批处理,我们必须首先创建一个JSON Lines(JSONL)或JSON列表文档,用于存储我们的输入标准。如果你还记得,我们的输入标准如下所示:
{
"subject": "time travel",
"format": "books",
"genre": "fantasy",
"custom": "don't include any R rated content"
}
我们希望创建一个类似于上述的JSON对象列表,最好是随机生成的。当然,执行这一操作的简单方法是提示ChatGPT生成一个JSONL文档,使用以下提示:
I am developing a recommendation agent. The agent will recommend anything given the following criteria:
1. subject - examples: time travel, cooking, vacation
2. format - examples: books, movies, games
3. genre: documentary, action, romance
4. custom: don't include any R rated content
Can you please generate a random list of these criteria and output it in the format of a JSON Lines file, JSONL. Please include 10 items in the list.
你可以尝试通过访问ChatGPT并输入上述提示来生成文件。一个之前生成的文件可以在flow文件夹中找到,名为\bulk_recommend.jsonl。这个文件的内容如下所示:
{
"subject": "time travel",
"format": "books",
"genre": "fantasy",
"custom": "don't include any R rated content"
}
{
"subject": "space exploration",
"format": "podcasts",
"genre": "sci-fi",
"custom": "include family-friendly content only"
}
{
"subject": "mystery",
"format": "podcasts",
"genre": "fantasy",
"custom": "don't include any R rated content"
}
{
"subject": "space exploration",
"format": "podcasts",
"genre": "action",
"custom": "include family-friendly content only"
}
{
"subject": "vacation",
"format": "books",
"genre": "thriller",
"custom": "don't include any R rated content"
}
{
"subject": "mystery",
"format": "books",
"genre": "sci-fi",
"custom": "don't include any R rated content"
}
{
"subject": "mystery",
"format": "books",
"genre": "romance",
"custom": "don't include any R rated content"
}
{
"subject": "vacation",
"format": "movies",
"genre": "fantasy",
"custom": "don't include any R rated content"
}
{
"subject": "cooking",
"format": "TV shows",
"genre": "thriller",
"custom": "include family-friendly content only"
}
{
"subject": "mystery",
"format": "movies",
"genre": "romance",
"custom": "include family-friendly content only"
}
有了这个批量文件,我们可以使用批量JSONL文件中的各种输入标准运行两个变体。打开flow.dag.yaml文件,在可视化编辑器中点击批处理(烧杯图标)以开始批量数据加载过程,并选择该文件,如图9.21所示。对于某些操作系统,这可能会显示为本地数据文件。
选择批量文件后,将会打开一个新的YAML文档,并在文件底部添加一个运行链接,如图9.22所示。点击该链接以执行批量输入运行。
此时,会发生几件事情。流程可视化编辑器将会出现,旁边会打开一个日志文件,显示运行进度。在终端窗口中,你将看到各种工作进程正在生成并运行。
请耐心等待。即使是10个项目的批量运行,可能也需要几分钟或几秒钟,具体时间取决于硬件、先前的调用等各种因素。等待运行完成,你将在终端中看到结果摘要。
你也可以通过打开提示流程扩展并选择最后一次运行来查看运行结果,如图9.23所示。然后,通过点击表格单元格来查看每次运行的详细信息。在这个对话框中,暴露了大量信息,可以帮助你排查流程和个人资料的问题。
在批量运行期间,捕获了大量的信息,你可以通过可视化工具探索其中的许多内容。通过点击终端窗口中的输出文件夹链接,还可以找到更多信息。这将打开一个新的VS Code会话,并展示输出文件夹,允许你查看运行日志和其他细节。
现在,我们已经完成了每个变体的批量运行,可以应用基础设置并评估两个提示的结果。下一节将使用一个新的流程来执行个人资料/提示的评估。
9.7.3 创建评估流程进行基础设置
在可视化编辑器中打开chapter_3\prompt_flow\evaluate_groundings\flow.dag.yaml文件,如图9.24所示。在评估流程中没有LLM块——只有Python代码块,这些代码块将执行评分并汇总分数。
现在我们可以查看评分和汇总块的代码,从评分代码开始,见示例9.3。这个评分代码将每个标准的分数平均成一个平均分数。该函数的输出是处理过的推荐列表。
示例9.3 line_process.py
@tool
def line_process(recommendations: str): #1
inputs = recommendations
output = []
for data_dict in inputs: #2
total_score = 0
score_count = 0
for key, value in data_dict.items(): #2
if key != "title": #3
try:
total_score += float(value)
score_count += 1
data_dict[key] = float(value) #4
except:
pass
avg_score = total_score / score_count if score_count > 0 else 0
data_dict["avg_score"] = round(avg_score, 2) #5
output.append(data_dict)
return output
#1 将一组三个推荐输入到函数中。
#2 遍历每个推荐和标准
#3 “title”不是标准,因此忽略它。
#4 总结所有标准的分数,并将浮动值赋给对应的键
#5 将平均分作为推荐的基础分数添加
从已基础化的推荐中,我们可以继续通过汇总块来汇总分数——汇总块的代码如以下示例所示。
示例9.4 aggregate.py
@tool
def aggregate(processed_results: List[str]):
items = [item for sublist in processed_results
for item in sublist] #1
aggregated = {}
for item in items:
for key, value in item.items():
if key == 'title':
continue
if isinstance(value, (float, int)): #2
if key in aggregated:
aggregated[key] += value
else:
aggregated[key] = value
for key, value in aggregated.items(): #3
value = value / len(items)
log_metric(key=key, value=value) #4
aggregated[key] = value
return aggregated
#1 输入是一个列表的列表,将其扁平化为一个项目列表。
#2 检查值是否为数字,并为每个标准的键累计分数
#3 遍历已汇总的标准分数
#4 将标准记录为度量
汇总的结果将是每个标准的总结分数和平均分数。由于评估/基础流程是独立的,它可以在我们执行的任何推荐运行上进行。这将使我们能够使用批量运行的结果对任何变体进行比较。
我们可以通过在可视化编辑器中打开flow.dag.yaml并点击批处理(烧杯图标)来运行基础流程。然后,当被提示时,我们选择一个现有的运行记录,然后选择我们想要评估的运行,如图9.25所示。这将打开一个YAML文件,底部会有“Run”链接,正如我们之前看到的那样。点击“Run”链接以运行评估。
运行完成后,你将在终端窗口中看到结果摘要。你可以点击输出链接在VS Code中打开文件夹并分析结果,但还有一种更好的方式来进行比较。
打开提示流程扩展,聚焦于批量运行历史窗口,向下滚动到“Run against Run”部分,如图9.26所示。选择你想比较的运行记录——通常是顶部的那些——这样就会出现勾选标记。然后,右键点击运行记录,选择“Visualize Runs”选项。批量运行可视化窗口会打开,你将看到每次运行的度量指标位于顶部。
现在我们可以看到个人资料/提示变体0(用户提示)和变体1(系统提示)之间的显著差异。如果你需要回顾提示/个人资料的外观,可以参考图9.15。此时,应该很明显,将输入参数注入到系统提示中能提供更好的推荐结果。
你现在可以返回并尝试其他个人资料或其他变体选项,以查看这些变化对推荐结果的影响。可能性几乎是无穷无尽的,但希望你能看到提示流程作为构建代理人个人资料和提示的优秀工具。
9.7.4 练习
使用以下练习来提高你对材料的理解:
练习1 — 为推荐流程创建新的提示变体(中级)
目标 — 通过创建和测试新的提示变体来改进推荐结果。
任务:
- 在提示流程中为推荐流程创建新的提示变体。
- 在批处理模式下运行流程。
- 评估结果,确定它们是否比原始提示更好或更差。
练习2 — 向评分标准中添加自定义字段并评估(中级)
目标 — 通过将自定义字段添加到评分标准中并更新评估流程来增强评估标准。
任务:
- 将自定义字段作为新标准添加到评分标准中。
- 更新评估流程以为新标准打分。
- 评估结果,并分析新标准对评估的影响。
练习3 — 开发新的使用案例和评估评分标准(高级)
目标 — 通过开发新使用案例和创建评估评分标准来扩展提示工程的应用。
任务:
- 开发一个与推荐无关的新使用案例。
- 为新使用案例构建提示。
- 创建评估新提示的评分标准。
- 更新或修改评估流程,汇总并比较新使用案例与现有案例的结果。
练习4 — 使用LM Studio评估其他LLM(中级)
目标 — 通过使用LM Studio托管本地服务器,评估不同开源LLM的性能。
任务:
- 使用LM Studio托管本地服务器来评估LLM。
- 评估其他开源LLM。
- 如果需要设置服务器并执行评估的帮助,请参考第二章。
练习5 — 使用提示流程构建并评估提示(中级)
目标 — 应用提示工程策略,使用提示流程构建并评估新的提示或个人资料。
任务:
- 使用提示流程构建新的提示或个人资料进行评估。
- 应用第二章中的“写清晰指令”提示工程策略。
- 使用提示流程评估提示和个人资料。
- 如果需要回顾策略和实现细节,请参考第二章。
总结
- 代理人个人资料由几个其他组件提示组成,这些提示可以驱动如行为/工具、知识、记忆、评估、推理、反馈和规划等功能。
- 提示流程可以用来评估代理人的组件提示。
- 系统化的提示工程是一个迭代过程,评估提示和代理人个人资料。
- “系统地测试变化”策略描述了迭代和评估提示,系统提示工程实现了这一策略。
- 代理人个人资料和提示工程有很多相似之处。我们将代理人个人资料定义为由提示工程元素组合而成,这些元素指导并帮助代理人完成任务。
- 提示流程是微软的开源工具,提供了多个功能用于开发和评估个人资料和提示。
- 提示流程中的LLM连接支持附加参数,包括温度、停止标记、最大标记数以及其他高级参数。
- LLM块支持提示和个人资料变体,这允许评估对提示/个人资料或其他连接参数的更改。
- 应用于LLM提示的评分标准是提示/个人资料必须满足的标准和要求,以便进行基础设置。基础设置是对评分标准的评分和评估。
- 提示流程支持将多个变体作为单次运行或批量运行进行执行。
- 在提示流程中,评估流程在生成流程之后运行,用于对结果进行评分和汇总。使用“Visualize Runs”选项可以比较多个运行中的评分标准汇总。