使用工件管道解决GPT分支问题
使用自定义GPT设计一款餐饮计划应用
创建一个应用帮助我为一周进行餐饮计划。
假设您可以要求ChatGPT实现一个完整的应用程序并提供下载。目前,这项技术还不足以实现这一点,但人工智能已经可以自动化工作流程的某些部分,如需求定义、任务规划,甚至编码。
当提供正确的指令时,ChatGPT(或自定义的GPT)可以帮助递归地分解问题。当我们将问题分解为子问题时,我们必须跟踪生成的所有不同的“分支”。分支分裂成更多的分支,形成一个复杂的树状结构。我将其称为“分支问题”。
我们将探索使用基于GPT的工具来创建明确定义的输出文档的几种方法,作为应用设计流程的一部分。最后,我将解释这如何帮助克服分支问题。
AI免责声明:本故事的文本内容不包含任何人工智能生成,除非我明确引用ChatGPT以突出某个观点。
像人一样思考
首先,让我们思考一下一个人如何处理我的应用请求。假设我正在向一个实际上具备履行此请求能力的人提问,例如一家软件机构的项目经理。
初始请求不够具体。人类项目经理会立刻开始询问问题。
什么样的应用?
它可以是一个网站、一个移动应用,甚至是类似于Slack机器人的东西。在这种情况下,我更倾向于一个移动应用和一个适用于移动设备的网页应用,但我也可以接受其中一个。
我想要如何进行膳食计划?
原来我已经考虑过这个问题很多次了。有一些我更喜欢购买和烹饪的食材,因此我希望这款应用能够利用人工智能根据我提供的食材清单生成食谱。我已经用ChatGPT实现过这个功能,所以我知道这是可能的。
我通过实验证实,ChatGPT可以估计成分的卡路里和宏量营养成分含量,所以我希望这些都能被包含进来。我也知道ChatGPT往往会低估这些数量,所以我希望能有一种处理方式,可以通过手动审查(更安全)或自动按某个百分比增加这些值(更方便)来解决这个问题。
当我向软件机构提出请求时,我通常会将所有这些事情都考虑在内,但我不会只是把它作为一次信息倾销。我会让他们在对话的过程中慢慢挖掘出细节。这样不仅减轻了我的认知负荷,也使得机构的代表能够以适当的速度整合这些信息,记录下来或者按照他们自己的接收流程操作。
这是人类自然交流的方式,但是ChatGPT不知道我希望它向我提出澄清问题。
ChatGPT不知道自己所不知道的
这是GPT-4在我询问“创建一个帮助我制定每周饮食计划的应用程序”时的回答。由于篇幅原因,回答进行了简化。
创建一个应用程序需要几个关键步骤:
1. 定义应用程序的目的和特点 2. 设计用户界面(UI) 3. 选择开发方法 4. 开发应用程序 5. 测试应用程序 6. 发布和推广应用程序 7. 维护和更新应用程序
这是一个简化的概述。每一步都涉及基于您特定需求和资源的详细流程和决策。
ChatGPT的回答令人沮丧且毫无用处。
我已经知道所有这些事情。更糟糕的是,ChatGPT对每个要点都进行了详细的煎熬解释,告诉我开发应用程序意味着什么。
如果我停在这里,我可能会得出结论说人工智能很愚蠢,不知道如何实际构建一个应用程序,但我会错的。
告诉它你想要的东西
明显的第一个解决方案是直接告诉ChatGPT你希望它做什么。OpenAI为我们提供了一个便利的功能,称为自定义指令,允许我们在开始与它交谈之前给ChatGPT额外的指示。
以下是前 OpenAI Prompt Whisperer Andrew Mayne 推荐的一些自定义指导:
梅恩的指示简练而有用,提供了三个有价值的功能:
- 根据说明,建议ChatGPT向您提出澄清问题。更明确地说,将此“应该”明确化可能会更好。
- 他们要求ChatGPT提供多种澄清方法。这样做可以减轻一部分澄清思维负担,因为你可以从列表中选择而不是从零开始生成。
- 题目用字母编号,你只需回答字母及任何你想添加的内容。
装备了这些定制指令,ChatGPT给我提供了一种更有趣的回应:
设计一款餐饮计划应用是个好主意!为了根据您的需求量身定制,我有几个问题将有助于指导开发过程:1. 用户体验和界面:
A. 你喜欢简单和极简主义的设计还是更生动互动的样式?B. 应该在应用中包含餐食的照片之类的视觉元素,还是保持以文本为基础?
2. 功能和特点:
A. 您是否希望应用根据饮食偏好(例如素食主义、生酮饮食、无麸质)来推荐餐食? B. 应该包含一个杂货清单功能,根据您的餐食计划进行更新吗? C. 您是否希望有一个功能来跟踪每个餐食的营养信息? D. 是否希望与智能家居设备或其他应用(例如健身追踪器)进行集成?
个性化和数据输入:
A. 应该允许你输入个人数据(比如体重、身高、饮食限制)以定制餐食计划吗? B. 你想要手动输入或编辑餐食计划的能力吗? C. 对一个能随着时间学习你喜好的功能感兴趣吗?
4. 附加功能:
A. 你想要社区功能,例如与其他用户分享餐计划或食谱吗? B. 应该在应用中包含烹饪教学视频或食谱链接吗? C. 对于计划节日或派对等特殊场合的餐饮功能,你觉得重要吗?
随意回答以下问题或添加您认为对理想的餐饮规划应用程序至关重要的其他功能!
这要更加有帮助。也许ChatGPT终究可以帮助构建一个应用程序!
不幸的是,安德鲁·梅恩的三个指令还不足以创建一个真正有用的工作流助手。
ChatGPT存在的问题
在你使用 ChatGPT 一段时间后,你会注意到一些问题:
- ChatGPT问了很多问题,你必须对所有问题进行跟踪。你最终会得到一个需要以某种方式维护的分支树。这就是分支问题。
- 它所问的问题大部分是随机的。两个对话可能有完全不同的问题集,从而导致不同的应用设计。那么,你如何知道何时停止回答问题呢?实际上,我们需要找到最佳设计的方法。
- 长时间的对话线程越长,ChatGPT就越容易忘记你的自定义指令,重新提供那些令人烦恼的模糊概述列表。根据我的经验,ChatGPT在短时间内效果最佳。
在开发一款饮食计划应用的背景下,我们将探讨解决这些问题的两种不同方法。
- GPT试点代理商
- OpenAI的新定制GPTs
代理人方法:GPT试点
GPT Pilot项目通过创建多个具有定义角色和输出的AI代理,实施概念验证软件开发流程。
他们有一个产品负责人的角色,负责创建用户故事,一个架构师的角色来确定技术需求,一个技术领导来分配开发任务,以及一个开发者角色来编写代码。
他们使用OpenAI API在每个角色中创建一个或多个代理。将“代理”视为单个AI实例。用户通过工作流程进行引导,与每个代理合作开发Web应用程序。
首先,产品负责人代理向用户询问他们的应用程序想法的澄清问题。然后,架构师代理建议使用特定的软件框架集。技术负责人代理创建一个开发任务队列,然后由开发人员代理一次处理一个任务。
这个策略看起来朝着正确的方向迈出了一步。AI代理无法完全独立地执行工作流程的任何步骤,但它们可以通过指导用户按照预先定义的流程进行部分工作并要求用户提供更多信息,然后请求用户批准或拒绝制品来大大加速开发过程。如果代理收到用户的拒绝,它将继续迭代。如果代理收到批准,我们可以继续进行下一步开发流程。
实际使用中,我发现GPT Pilot尚不可用。我花了几分钟使用它来设置一个带有Python Flask后端的React.js应用程序,而ChatGPT可以轻松引导用户完成这个任务。
GPT Pilot代理经常迷失在运行目录中。总体而言,这个测试在OpenAI API的使用上花费了我大约1.50美元。虽然不多,但由于它频繁且早期失败,我决定它与ChatGPT还不具有竞争力。我们会给他们一些时间来修复错误并使工具更加灵活。
自定义GPT方法
与此同时,我们可以实施一种类似的策略——将任务分解为步骤,但是不使用基于API的代理来执行每个步骤,而是使用自定义的GPTs。
在具有自定义GPT流水线的情况下,我们不会按照使用量收费-只需支付每月20美元的ChatGPT Plus计划固定费用。
一个缺点是自定义GPT每位用户每3个小时只能发出50个请求。
3小时除以50个请求等于大约每4分钟一个请求。
我个人从未达到过那个限制,并且我认为只要你不经常浪费请求以及提供模糊或不准确的提示,这种情况是不太可能发生的。我能够在不到4分钟的时间内将ChatGPT生成的代码整合到我的代码库中,但是瓶颈在于弄清楚接下来该向ChatGPT提问什么。通常情况下,这要比4分钟更长。
人类不会思考得很快…我们需要很多咖啡休息时间。
需求收集 GPT
创建餐饮规划应用程序的第一步是明确应用程序的实际需求。有多种不同的方法来定义需求,但是敏捷开发方法学推荐从最终用户的角度来定义需求。我们称之为用户故事。
以下是对于餐饮计划应用想法的一些用户故事示例:
As a user, I want to create an account to access and personalize my experience.
As a user, I want to input a list of ingredients and receive meal recipe suggestions.
As a user, I want to add meals to a customizable weekly meal plan.
As a user, I want to adjust the number of servings for each meal in the plan.
As a user, I want to generate a grocery list based on my weekly meal plan.
As a user, I want to view a recipe with its title, description, ingredients, macronutrient stats, and total price.
As a user, I want to edit ingredient quantities and prices in a recipe.
As a user, I want to set dietary restrictions in my profile settings.
As a user, I want to save my favorite recipes and meal plans for future use.
注意:从技术上讲,这些还应该包括用户为什么想要执行这些操作,但为简单起见,我省略了这一点。
我使用以下说明创建了一个自定义的需求收集GPT。
You are an experienced software project manager who manages the entire process of creating software applications for clients from the client specifications to the development. You are talking to a client who wants your team to develop an application for them.
// 1. DO be concise and to-the-point.
// 2. DO ensure every word you say has a very specific purpose.
// 3. DO NOT repeat yourself.
// 4. DO NOT use pleasantries and formalities like "good morning" and "hello".
// 5. DO focus on listening to the client.
GOAL: Gather requirements and create a collection of user stories for the application that will be provided to a software architect for system design.
THINK STEP BY STEP to perform the following steps:
1. ASK the client for a description of their app.
2. ITERATE through the following steps in a loop:
* STEP 1: SUMMARIZE the app requirements so far.
* STEP 2: ASK the client to either answer 3 clarifying questions about the app OR approve the the requirements summary as-is.
* STEP 3: IF client has chosen to answer the clarifying questions rather than approving, LOOP to SUMMARIZE and ASK questions again.
3. Once the requirements are approved, WRITE user stories into a file in MARKDOWN FORMAT. The file should contain bullet items ONLY.
4. PROVIDE that file as a DOWNLOAD.
EXAMPLE USER STORIES for a to-do list app:
- As a user, I want to press a button to create a new to-do list.
- As a user, I want to enter a new todo list item using a text input.
- As a user, I want to delete any list item at any point.
- ...
Conduct the conversation as though you are talking to the client.
Translate to Simplified Chinese
提供一个人设
You are an experienced software project manager
在其默认角色“贴心助手”的情况下,ChatGPT给出的建议相当无聊。通过赋予定制GPT一个具体的个性,可以避免这种情况。
2. 定义语气
// 1. DO be concise and to-the-point.
// 2. DO ensure every word you say has a very specific purpose.
// 3. DO NOT repeat yourself.
// 4. DO NOT use pleasantries and formalities like "good morning" and "hello".
// 5. DO focus on listening to the client.
我基于最近几周可以通过黑科技访问的实际ChatGPT自定义指南,设计了这种特定的提示格式。使用"//"字符、列表项目和大写字母的组合,可以使模型更好地注意到指令。
提供目标
GOAL: Gather requirements and create a collection of user stories for the application that will be provided to a software architect for system design.
非常简单 —— 只需告诉模型你想要做什么。
提供方法
THINK STEP BY STEP to perform the following steps:
1. ASK the client for a description of their app.
2. ITERATE through the following steps in a loop:
* STEP 1: SUMMARIZE the app requirements so far.
* STEP 2: ASK the client to either answer 3 clarifying questions about the app OR approve the the requirements summary as-is.
* STEP 3: IF client has chosen to answer the clarifying questions rather than approving, LOOP to SUMMARIZE and ASK questions again.
3. Once the requirements are approved, WRITE user stories into a file in MARKDOWN FORMAT. The file should contain bullet items ONLY.
4. PROVIDE that file as a DOWNLOAD.
正如OpenAI的Andrej Karpathy所说,“最炽热的新编程语言就是英语”。
问题在于英语不适合提供详细和精确的指示。这就是我们创造编程语言的原因!
在这个例子中,我设计了自己的伪代码来告诉模型如何生成用户故事。我对模型能够遵循我给定的循环感到着迷。这种方法开启了很多提示的可能性。
给出示例
EXAMPLE USER STORIES for a to-do list app:
- As a user, I want to press a button to create a new to-do list.
- As a user, I want to enter a new todo list item using a text input.
- As a user, I want to delete any list item at any point.
如果你想使你的GPT始终以相同的格式输出,提供示例!这是告诉它你期望的输出类型的最佳方法。
6. 采用角色扮演
Conduct the conversation as though you are talking to the client.
GPT 应该立即进入角色,所以我用这句话结束指示,提醒它直接与客户交谈。
文物解决分支问题
分支问题
自由形式的对话往往具有分支状的树形结构,每一次对话的转折都会开启几种不同的可能性,决定对话将走向何方。通常情况下,我们从大局出发,逐渐深入细节。不幸的是,我们每次只能选择一条路径前进,很难回溯并探索其他路径,特别是经过多层分支后。
例如,我必须决定如何开始为我的餐饮计划应用程序详细说明用户故事。我可以选择添加用户账户管理、构建原料清单、生成餐饮点子或生成购物清单的用户故事,但我一次只能探索一个功能集。最终,我需要返回并定义其他功能。我将需要遍历整个功能树。
文物作为共享记忆
我们可以通过构建一个工件来处理分支。
由于我使用GPT来构建一个特定的工件,即用户故事清单,所以我可以更容易地“返回”到之前错过的分支。我可以随时查看清单,找出需要更详细说明的任何主题,然后要求GPT添加更多用户故事。这样,这个工件就成为了我的外部记忆。
此外,这种方法还迫使GPT在其上下文中保持艺术品的最新版本新鲜,因为该艺术品在每次迭代中都更新和重复。一旦我完成详细说明特定功能,比如餐食生成,GPT就会输出整个更新后的用户故事列表。我可以立即继续处理其他话题,比如购物清单生成,而无需重新向GPT解释整个应用程序。
该工件对用户和定制的GPT来说都作为外部共享内存。
多层次文物
在定义需求时,我使用一个扁平列表作为我的输出文档,但是你也可以通过使用多级列表来模拟树形结构的文档。对于无序组件,请使用项目符号列表,对于有序序列,请使用编号列表。
举个例子,假如我正在为一个应用程序概述软件模块,可能需要将设计分成一般模块,然后为每个高级模块拥有几个子模块。例如,我可能想要一个“餐饮计划”模块,其中包含“编辑餐饮计划”和“生成食品清单”两个子模块。这个例子有点牵强,但是对于更复杂的项目来说,多层次的设计是有用的。
文物滋养着传承的管道
文物可以在您和模型之间提供共享内存,但它们也可以用于连接管道的不同部分。在确定技术需求之前必须定义用户故事。在设计用户界面或编写代码之前必须明确技术需求。
总之,不要只和ChatGPT交流。创建定制GPT,用于构建特定的artifact(制品)。将定制GPT连接起来,形成一个pipeline(流水线)。
将来的某一天,AI将能够独立完成整个流程。您将向ChatGPT请求一个应用程序,它将使用Neuralink读取您的思维,并给您提供一个可下载的压缩文件。
与此同时,利用人工智能自动化流程并执行工作流程中繁琐的部分。这仍然是计算机擅长的事情。
如果你对人工智能或智能理论感兴趣,请查看我的Substack出版物《自主人工智能》。