gpt-engineer 体验记录
本文记录了使用 gpt-engineer 开发一个简单的 Web 应用程序的经历,并在后文粗浅地解析了一下 gpt-engineer 的源码。
2024-02-15
gpt-engineer
- 使用自然语言定义软件功能;
- 由 AI 自动编写和执行代码;
- 提供反馈让 AI 进行改进。
使用 gpt-engineer 创建一个应用程序
根据官方文档的说明,下面将使用 stable 版编
gpt-engineer
Python
venv
gpt-engineer
mkdir gpt-engineer-sample
cd gpt-engineer-sample
python3 -m venv venv
source venv/bin/activate
python -m pip install gpt-engineer
mkdir app
touch app/prompt
完成初始化后,首先在 app/prompt
使用 Next.js@14 实现一个 Web 应用程序,这个 Web 应用程序有以下 3 个页面: 1. 登录 2. 用户主页 3. 广场页 在“登录”页面中,用户需要: 1. 输入用户名 2. 输入密码 3. 点击登录 3.1 用户存在且密码匹配则跳转至“用户主页” 3.2 用户不存在或密码匹配失败则显示“登录失败”弹框 系统预置的用户为: 用户名:admin 密码:admin 在“用户主页”中,用户可以: 1. 上传新的图片 1.1 如果图片的名称中不包含“cat”,则弹框提示“图片名称中不包含 cat,请重新上传” 1.2 如果图片名称中包含“cat”则完成上传 2. 查看我上传的图片 2.1 以瀑布流的形式展示用户已经上传的图片,按照上传时间逆序排序 3. 退出登录 在“广场页”中,用户可以: 1. 查看所有用户上传的图片 1.1 以瀑布流的形式展示所有用户上传的图片,按照上传时间逆序排序
app/prompt
完成上述操作后,使用下面的脚本开始创建应用程序:
export OPENAI_API_KEY=<api-key>
gpte app
在
gpt-engineer
app
npm run dev
生成的代码中可能会存在一些细微的语法错误,比如缺少 import 语句,进行简单的修复后打开应用,发现生成的应用中没有添加任何的样式,但是
prompt
gpt-engineer
使用 gpt-engineer 优化已有项目
如上所述,
gpt-engineer
gpt-engineer
首先创建一个文件夹用于保存用户 prompts:
mkdir app/.prompts
mv app/prompt app/.prompts/prompt.0_init
然后创建一个新的 prompt 用于指导
gpt-engineer
touch app/prompt
echo '在“用户主页”中,添加前往“广场”页的按钮' >> app/prompt
输入完成后使用下面的指令让
gpt-engineer
gpte app -i # -i 或 --improve
gpt-engineer
:wq
gpt-engineer
gpt-engineer
gpt-engineer
git commit
示例项目迭代了 15 次 improve,虽然依旧不能算得上是一个完备的应用程序,但是基本功能也算是 OK。
生成效果
在简单使用了一段时间后(约莫两个小时,模型是
gpt-4-1106-preview
gpt-engineer
- 没有使用网络请求的能力,因此能够使用的知识完全依赖于 LLM,无法使用较新的技术;
- 输出的代码大概率可用,但是还是会出现一些问题(缺少 import 语句、语法错误等),使用者还是需要具备一定的开发能力;
- improve 前需要手动选择相关的文件,没有办法识别 import 语句并自动读取,因此如果项目复杂的话,还是需要手动确定需要调整的文件。
gpt-engineer 源码分析
gpt-engineer 的源码算不上复杂,主流程非常简单:
- 解析参数;
- 初始化 LLM(model、azure_endpoint);
- 读取用户 prompt;
- 确定代码生成函数;
- 确定代码执行函数;
- 初始化 preprompts;
- 初始化 、
DiskMemory
和DiskExecutionEnv
;CliAgent
- 执行 (生成应用程序代码)或
agent.init
(优化已有代码)agent.improve
- 更新文件。
下面是一些核心概念的说明。
代码生成函数
用于生成项目代码。根据启动时的参数,有以下三种生成方法:
- :默认的生成方法,直接使用用户的 prompt 生成代码。该方法会使用
gen_code
方法生成系统 PROMPT,具体步骤是拼接setup_sys_prompt
、preprompts/roadmap
、preprompts/generate
以及preprompts/file_format
,然后调用 LLM 生成代码,并通过preprompts/philosophy
方法从 chat 中提取代码块并保存为chat_to_files_dict
对象。FilesDict
- :当使用
clarified_gen
选项时使用此方法,首先通过 AI 整理需求,然后使用整理后的 prompt 生成应用代码。具体而言首先使用-c
以交互的方式整理prompt/clarify
(使用文件输入的 prompt),后续步骤和prompt
方法相同。gen_code
- :使用
lite_gen
选项时使用此方法,类似-l
方法,区别在于直接将gen_code
作为系统 PROMPT。preprompts/file_format
应用 ENTRYPOINT 文件
项目代码的入口文件。
生成方法:调用 gen_entrypoint
preprompts/entrypoint
执行方法:调用 execute_entrypoint
代码执行函数
该方法用于执行应用 ENTRYPOINT 文件。根据使用的参数不同有以下两种方式:
- :使用
self_heal
选项时使用此方法。该方法会读取 ENTRYPOINT 文件并尝试执行,如果执行失败则会将文件内容、执行的输出内容以及-sh
整合为一条消息发送给 AI 以获取修复结果,并返回修复后的preprompts/file_format_fix
;FilesDict
- :直接执行 ENTRYPOINT 文件。
execute_entrypoint
代码优化函数
improve
-i
该方法的执行步骤是使用 setup_sys_prompt_existing_code
improve
philosophy
FileSelector
overwrite_code_with_edits
代码执行环境 DiskExecutionEnv
DiskExecutionEnv
上下文记忆 DiskMemory
DiskMemory
Preprompts 容器 PrepromptsHolder
PrepromptsHolder
--use-custom-preprompts
临时文件存储 FileStore
FileStore
文件选择器 FileSelector
FileSelector
CliAgent 智能体
CliAgent
在 Agent 实例中主要使用两个方法: