1.概述
什么是GPT-Pilot?
一个AI开发者伴侣,可以从0开始构建应用程序,可以自己编写代码、配置开发环境、管理开发任务、调试代码。
项目地址:https://github.com/Pythagora-io/gpt-pilot
不仅仅是一个自动完成功能或 PR 消息的助手,而是一个真正的 AI 开发人员,可以编写完整的功能、调试它们、与您讨论问题、请求审核等。
主要思想是人工智能可以为应用程序编写大部分代码(也许 95%),但对于其余的 5%,在我们获得完整的 AGI 之前,现在和将来都需要开发人员。
2.如何使用GPT-Pilot
GPT-Pilot创建的App:https://github.com/Pythagora-io/gpt-pilot/wiki/Apps-created-with-GPT-Pilot
方式1:VS Code Plugin
方式2:CLI
CLI是与AI问答的形式
python main.py -step #5
>>>
? What is the project name? timer app
? Describe your app in as much detail as possible. Create a simple timer app usi
ng HTML, CSS, and JavaScript that allows users to set a countdown timer and rece
ive an alert when the time is up.
? Should the timer be digital or analog? digital, in browser
? Does the timer need to have any specific format, like hh:mm:ss or mm:ss? mm:ss
? Should there be any visual indication or progress bar showing how much time is left? yes
? Can a user set multiple timers at once or just one at a time? multiple
? Should the countdown timers continue to run even if the web browser is closed? no
……
A user will receive an alert when the countdown on a timer reaches zero. yes
……
? Please set up your local environment so that the technologies
above can be utilized. When you're done, write "DONE" DONE
……
Can i execute the command: 'npm init -y' with 10000ms time out?
? If yes, just press ENTER
……
样例:
Timer: http://localhost:3000/
Chat: https://vanish-talk.examples.pythagora.ai/
3.GPT-Pilot背后的思想
3.1 三大支柱
-
GPT Pilot 被设想为真正的人工智能开发人员,而不是自动完成或聊天机器人。
-
它像人类开发者那样逐步构建程序,完成大部分的编码任务。但当它遇到困难时,需要向人类寻求帮助。
-
GPT-Pilot专注于构建应用程序层,而不是致力于获取输出更好的结果。
作者的陈述:ChatGPT就像拥有超级资深知识的工程师,但是记忆力犹如金鱼,你必须准确地告诉它下一步做什么。GPT-Pilot致力于创建一个思维框架,通过结合前后的上下文,建立反馈循环,并确定下一步做什么,逐步构建完整的程序。
基于上面的思想,在GPT-Pilot设计的时候需要遵循三大主要思想:
1.人类开发者需要更多地参与程序创建的过程
-
AI距离完全100%自主开发还比较遥远,因此需要与人类开发人员密切合作,监督开发过程,并且可以随时更改代码,而GPT-Pilot需要继续处理这些更改。
-
以下是开发人员可以干预开发过程的领域:
-
在每个小的开发任务完成后,开发人员应该检查它并确保它按预期工作。
-
在每次测试失败的时候,开发人员需要介入调试。
-
当出现一些AI无法完成的工作的时候(例如需要密钥之类的)。
-
2.程序需要被逐步编码,而不是一次生成尽可能完整的程序
-
和人类一样,AI编码肯定会犯错误,所以为了让它更容易地进行调试,并让开发人员了解生成的代码中发生了什么,AI不应该只是一次吐出整个代码库。
-
相反,应用程序应该像开发人员一样一步一步地生成和调试。
-
如果GPT Pilot一步一步地创建一款应用程序,人工智能和监督它的开发人员都将能够更容易地解决问题,整个开发过程也将更加顺利。
3.GPT-Pilot需要具有可扩展性
-
GPT-Pilot必须能够创建可投入生产的大型应用程序,而不仅仅是小型应用程序,在小型应用程序中,整个代码库都可以融入LLM环境。
-
问题是,LLM 的所有学习都是在上下文中完成的。也许有一天,LLM可以针对每个具体项目进行微调,但现在看来,这将是一个非常缓慢的过程。
-
GPT-Pilot解决这个问题的方式是使用上下文回溯(context rewinding)、递归对话和TDD。
-
上下文回溯
-
每一个开发任务都需要带上迄今为止前面所有的上下文。如此一来,每个任务都有相似的上下文(都对当前的整个开发任务有相同的理解)。
-
例如,#40任务和#50任务,在构建的时候,都需要回溯到#1的上下文,这样GPT-Pilot可以用相似的方式来解决#40和#50任务。
-
-
递归对话
-
如果GPT-Pilot检测到错误,则需要对其进行调试。但是在调试的过程中发生了另一个错误,GPT-Pilot需要停止调试第一个问题,修复第二个问题,然后再返回修复第一个问题。一旦修复了最深层次的错误,我们就在递归中向上移动并继续修复错误,直到整个递归完成。
-
-
TDD(测试驱动开发)
-
为了让GPT-Pilot扩展代码库、改进代码库、更改需求并添加新功能,它需要能够在不破坏以前编写的代码的情况下创建新代码。
-
没有比使用 TDD 方法更好的方法了。按期望输出的逻辑编写测试,然后进行开发,直到测试可以通过为止。
-
对于GPT-Pilot编写的所有代码,它需要编写测试来检查代码是否按预期工作,以便每当进行新更改时,都可以运行所有回归测试以检查是否有任何问题。
-
-
3.2 GPT-Pilot设计的的一些理论基础
1.需要人类来监督人工智能
-
不仅仅是因为AI还不够强大,对于开发或者产品经理来说,一旦看到实现的样子,很可能会想更改它,这是很常见的。
-
在开发过程中,会逐渐意识到最初意识不到的各种边缘情况,并且认为重构整个程序,比解决当前遇到的所有问题要更容易(狗头🐶)。但是每次重构,都会影响其他模块或功能。
-
因此在GPT-Pilot继续执行下一个任务之前,需要人类工程师来进行代码审查CodeReview。如果有人告诉GPT-Pilot出了什么问题,那么解决任务本身的问题就会容易得多。
2.人工智能可以迭代自己的错误
很多人判断ChatGPT给出的代码是否靠谱的时候,经常是根据最开始第一次使用ChatGPT的时候的表现情况。如果一开始询问ChatGPT给出的代码并不符合预期,那么可能此后都觉得ChatGPT不靠谱。
-
事实上,人类几乎从来不会在第一次构建程序的时候,就编写出可用的代码。相反,一般来说都是编写代码,运行它,查看错误,然后迭代。这正是GPT-Pilot能够做的事情——编写代码后,GPT-Pilot可以运行代码,获取输出,并询问 LLM 输出是否正确,是否应该修复某些内容,如果是,如何修复。
3.软件开发是可以精心策划的
-
开发程序的过程可以有很多种模式:
-
其中一种比较常见的模式是:编写代码 -- 运行 -- 读取错误 -- 修复代码 -- 重新运行(重复直到符合预期) -- 交付
-
另一种模式是:编写代码 -- 测试实现(重复直到所有测试通过) -- 代码审核者审核 -- 修复问题(直到所有审核者通过) -- 交付
-
整个程序开发的过程,是可以精心编排的。
4.编码过程并不是一条直线
-
绝大部分时候,我们编写代码的时候,会不断地反复迭代、重写代码。在初始实现之后,可能意识到有更好的方法来实现某些内容,或者需求发生了变化。
-
在现有解决方案无法实现的时候,我们可能需要回滚一系列的更改,考虑新的解决方案。
-
为了让GPT-Pilot或任何其他人工智能开发人员大规模工作,它需要有一种机制,使其能够返回、选择替代路径并重新实现任务。
3.3 GPT-Pilot作者对AI Coding的一些思考:
1.程序的最初描述比我们想象的重要得多
-
我们最初的想法是,通过人类的输入,GPT-Pilot将能够朝着正确的方向进行构建,并越来越接近最终的解决方案,即使最初的描述很模糊。
-
然而,GPT-Pilot的思维从最初的描述开始贯穿整个构建过程。这样,如果最初的输入中有误导性的内容,GPT-Pilot可能最终会朝着错误的方向去构建,哪怕其他大部分内容都是正确的。
如何写一个优秀的程序描述:https://github.com/Pythagora-io/gpt-pilot/wiki/How-to-write-a-good-initial-project-description
2.编码不是一条直线
-
如上面提到的,代码可能会不断修改和迭代。因此GPT-Pilot在构建决策树的时候,会不断地创建标记,当出现问题的时候,它可以查看标记,并思考哪里出现了问题,应该重新朝着什么方向去解决问题。
3.开发者可以自行审核
-
开发者并不会因为处理相同的信息而无法有效审核,相反,这个过程是很有效的。GPT-Pilot设置了2个审核:代码审核和文件审核。
4.AI更善于专注解决一个问题
-
如果告诉GPT-Pilot在单个描述中进行 2 个不同的更改,它将很难同时关注这两个更改。因此,我们将每个人工的输入分成多个部分,以防输入包含多个不同的请求。
5.详细的日志是很有帮助的
-
GPT-Pilot会创建带有详细日志记录的代码,这样当运行应用程序并遇到错误时,可以查看当前的日志,及这些日志在代码中的位置,可以更轻松地进行调试。
6.将代码库分割成更小的文件有很大帮助
-
如果代码被分割成许多文件而不是几个大文件,那么GPT-Pilot实现功能和修复错误会容易得多。
-
就像我们人类所想的那样——处理较小的代码块比处理大的代码块容易得多。我们通过创建抽象级别(函数、类等)来做到这一点。
-
GPT-Pilot会创建更多模块化代码并将其拆分为更多文件。它的效果非常好,而且最终结果对我们开发人员来说也更好。
7.为了使人们能够修复代码,他们需要清楚地展示任务中编写的内容及其背后的想法
-
GPT-Pilot的目标是完成所有编码任务的 90%,并将其余 10% 留给人类。这 10% 通常包括GPT-Pilot很难注意到的修复或小变化,但对于人类来说,这可能是一个简单的变化。
-
然而,问题在于,告诉人们哪些代码不起作用以及他们应该查看哪些代码并不容易。如果GPT-Pilot编写了 3,000 行代码,那么人类开发人员如果想要帮助GPT-Pilot,则需要在深入实际代码之前了解整个代码库。
-
GPT-Pilot需要做到的是,人类开发人员将详细解释当前任务中添加了哪些代码及其背后的原因。这样能够帮助GPT-Pilot。
8.人类是懒惰的🐶
-
GPT-Pilot最好向人类提出问题,而不是让人类思考所有可能的错误。
-
我们注意到的一件事情是,人们更愿意回答GPT-Pilot提出的问题,而不是有一个开放式的输入字段,让他们可以编写不受限制的反馈。
9.很难让AI跳出框框思考
-
在GPT-Pilot思考的过程当中,我们可以尝试用一些已知的解决方案去提示它,但是这其实并不容易。我们最终做的是要求GPT-Pilot列出它能想到的所有可能的解决方案并将它们保存到内存中。当我们需要尝试其他方法时,我们会提取替代解决方案并告诉它尝试不同但具体的解决方案。
4.GPT-Pilot工作流程
4.1 主流程
-
人类开发者输入期望构建的程序的描述。
-
AI产品负责人分解业务的需求,并向人类开发者提问,以澄清任何不清楚的地方。
-
AI软件架构师分解技术需求,并列出将用于构建应用程序的技术。
-
AIDevOps构建开发环境。
-
AI技术主管负责将整个开发过程分解成若干任务,其中每个任务包含以下信息:
-
任务描述。
-
自动化测试的描述,以便GPT-Pilot能够遵循TDD原则
-
人工验证的描述(是人类开发者检查任务是否执行成功的方式)
-
-
AI开发者和CodeMonkey开始一项一项地执行开发任务。
-
AI开发者在执行一个任务的时候,会把这个任务分解成更小的步骤,每个步骤都是相对简单和低级的技术步骤,大部分不需要人工审核或可以通过自动化测试进行测试。
-
4.2 执行任务的内部流程
1.任务分解 Task breakdown
-
这里有2个不同的概念:开发任务(Task)和开发步骤(Step)
-
开发任务(Task):高级描述,包含:
-
description:完成此任务需要执行什么。
-
user_review_goal:如何确定任务是否被正确地完成。
-
programmatic_goal:描述自动化测试编写和测试。
-
-
开发步骤(Step):任务分解之后,更小块的执行块,它是以下三种之一:
-
命令运行:需要在计算机上运行的命令,例如安装依赖项。
-
代码更改:最重要的开发步骤,它解释了实际代码中到底需要实现什么才能完成当前步骤。它可以包含需要编写的新代码或需要更改的代码。它的工作方式是代码更改是对需要实现的内容的详细的、人类可读的描述。它包含需要实现的代码以及其用途的描述。这与您要求 ChatGPT 编写代码非常相似。它将为您提供代码以及编写该代码的原因的解释。
-
人类干预:人工智能无法独自完成的发展步骤,需要人类的帮助来完成该步骤。
-
-
2.获取当前实现的代码 Fetching of currently implemented code
-
对于人工智能来说,编写包含代码的新文件很容易,但实际上,这种情况很少发生。大多数情况下,我们写入现有文件并更改现有代码或添加新代码。
-
在大型工程中处理某项任务时,通常会查看代码库的一小部分(可能是 1000 行),并只修改这一小部分相关的代码。
-
GPT-Pilot的做法:
-
AI 会获得开发步骤描述以及整个项目文件/文件夹结构以及每个文件和文件夹的描述。由此,LLM 告诉我们哪些文件与上述步骤相关。
-
在缩小了必要的文件范围后,我们给出了列出的每个文件的 LLM 伪代码,并要求它告诉我们哪些函数与当前的开发步骤相关。
-
一旦我们知道了它选择的伪代码,我们就可以获取实际代码并将其放入原始对话中。
-
3.编码 Coding
-
创建一条LLM信息,其中包含描述、以及当前的代码,它将返回:
-
如果需要对整个文件进行编码,LLM 的响应将包含所有代码。
-
但如果只需要更改文件内的部分代码,LLM 会告诉我们类似“After the Mongo setup, add the following rows of code”的信息
-
CodeMonkey负责代码库中插入/替换它们。
-
4.测试 Testing
-
有 2 个地方需要进行测试:
-
在每个开发任务(Task)之后,GPT-Pilot 创建集成测试来测试高级功能是否按预期工作;
-
在每个开发步骤(Step)之后,创建较小的单元测试以确保所有功能都正常工作。功能按预期工作。
-
-
GPT-Pilot 可以执行 3 种不同类型的测试:
-
自动化测试
-
命令运行
-
人工干预
-
5.调试 Debugging
-
以递归对话的方式进行调试。
-
当递归深度达到 5 级时,GPT-Pilot 将停止调试过程并要求开发人员修复最初的问题。一旦开发人员解决了这个问题,他们就会将结果写入 GPT-Pilot。然后,它可以继续开发过程,就像它本身调试了问题一样。
5.参考资料
GPT-Pilot主页:https://github.com/Pythagora-io/gpt-pilot
使用GPT-Pilot创建的App展示:https://github.com/Pythagora-io/gpt-pilot/wiki/Apps-created-with-GPT-Pilot
如何写一个优秀的项目描述:https://github.com/Pythagora-io/gpt-pilot/wiki/How-to-write-a-good-initial-project-description
GPT-Pilot博客介绍第一部分:https://blog.pythagora.ai/2023/08/23/430/
GPT-Pilot博客介绍第二部分:https://blog.pythagora.ai/2023/09/04/gpt-pilot-coding-workflow-part-2-3/
作者的开发博客和思考:https://blog.pythagora.ai/2024/02/19/gpt-pilot-what-did-we-learn-in-6-months-of-working-on-a-codegen-pair-programmer/