30 秒看懂
Matthew Berman 通过构建一个调用 OpenAI 模型的 Python 命令行客户端,展示如何把 ChatGPT 当作编程伙伴。他先制定计划,用文档纠正过时的 API 建议,测试程序,故意引入错误,再迭代实现打字效果。他对生产力和就业的预测属于个人观点;模型名称、限制、价格和代码反映的是 2023 年 4 月的情况,可能已不再适用。
- 1像指挥一样工作Berman 描述如何指导 AI 编程伙伴,同时保留理解、测试和修正工作的责任。
- 2编程前先规划创建项目之前,他要求提供 Python 命令行聊天机器人、文件结构和代码大纲。
- 3纠正过时的 API 建议当生成的方法使用旧写法时,他提供相关 API 文档并要求修改。
- 4利用错误调试他故意更改模型名称,运行程序,再让 ChatGPT 诊断产生的错误堆栈。
- 5完善打字效果第一版只延迟输出,因此他解释自己希望回复逐字显示。
要点建议
- 先清楚描述目标、编程语言、文件结构和期望的代码大纲。
- 审查并测试生成的代码;演示中 ChatGPT 给出过时的 API 写法后,需要人工纠正。
- 有用的调试上下文包括错误输出和相关代码,应先移除其中的秘密信息。
- 当第一次实现不符合预期时,可以要求其他设计方案并细化需求。
- 对话上下文有限,助手跟不上时应重新提供相关代码。
- 演示使用的是历史模型限制、软件包和接口;实际操作前应查阅当前文档。
按章节阅读整理后的全文
编程伙伴及其局限
Berman 介绍自己对 AI 辅助开发的看法,并讨论入门所需的技能。他关于模型访问和上下文限制的讨论反映了服务在 2023 年的状态。
ChatGPT 改变了我构建软件的方式,我预计学会使用 AI 的开发者会提高生产力。我认为不会使用的人将失业,这是个人预测,并非既定结果。我也根据自己的体验描述了十倍生产力提升;这段教程没有测量或证明普遍适用的生产力倍数。
我把开发者看作指挥:描述工作、引导模型,并检查它的产出。对编程和项目结构有基本了解会有所帮助。我建议从 Python 入手,边做边学,包括询问 ChatGPT 文件应放在哪里,同时要认识到生成的代码仍需理解和检查。
在这次 2023 年 4 月的演示中,我用 ChatGPT 中的 GPT-4 辅助编写代码,而应用本身调用 GPT-3.5 Turbo。我讨论了当时可用的消息与上下文限制,包括每三小时 25 条消息的上限以及不同的 token 限制。这些数字和模型可用性只适用于当时,并非当前规格。
随着代码库增长,在提示中提供全部上下文会越来越难。清晰的文件和方法名称有助于表达意图,简洁的描述也能概括周边代码。但这些做法不能保证模型知道省略的文件实际做了什么:如果回答依赖具体细节,就应提供相关上下文。
规划命令行应用
他请 ChatGPT 设计一个 Python 聊天机器人,并在 VS Code 中创建项目文件。应用是调用远程 API 的本地界面。
演示项目是一个通过 OpenAI API 提问的 Python 命令行界面。界面运行在我的电脑上,但模型通过 API 远程调用。编写文件之前,我请 ChatGPT 给出高层计划、文件结构和代码大纲,并指定使用 GPT-3.5 Turbo 和 Python。
ChatGPT 建议使用 OpenAI 软件包。在 VS Code 中,我创建项目文件夹,安装依赖,并添加 `chatgpt.py`、`requirements.txt` 和 `.env` 文件。requirements 文件记录依赖,环境文件保存 API 密钥。视频中的命令和 SDK 写法属于 2023 年版本,复制使用前应查阅当前文档。
我创建一个秘密 API 密钥并放入环境文件。我在视频中表示,会在发布前轮换画面中显示的密钥。一般来说,应避免将密钥放进源代码管理、截图和提示;如果密钥泄露,应撤销或轮换。随后,我把生成的代码框架复制到 Python 文件,并选择已安装依赖的 Python 解释器。

纠正并测试 API 代码
生成的代码使用了较旧的 API 写法,因此 Berman 提供文档并替换方法。他运行客户端并检查回答。
ChatGPT 提供了调用 API 的函数,但我注意到第一条建议使用的是较旧模型,而不是我要求的 GPT-3.5 Turbo。要求它切换模型后,第二条建议仍沿用了旧的 API 写法。这说明看似合理的回答需要检查,不能自动接受。
我将 GPT-3.5 Turbo API 文档中的相关示例复制到对话里,要求给出正确用法。修改后的版本采用了当时使用的 chat-completion 写法。我替换该方法并更新主函数,让应用维护对话历史。API 接口会变化,因此不能假定这段历史代码今天无需修改就能运行。

脚本加载环境文件和 API 密钥,初始化客户端,然后启动命令行循环。我在 VS Code 中运行它,要求写一首十词的 AI 诗;回答不足十词,但确认了界面能够响应。然后我要求生成数到 100 的 Python 代码,它返回了使用 `range(1, 101)` 的循环。

审查、上下文与调试
Berman 解释为何生成的代码和建议需要人工审查。他引入模型名称错误,并利用错误堆栈请求修复。
生成的代码可能有错,因此要阅读并运行测试。助手也可能过于轻易地遵循错误建议。如果希望获得替代方案而非盲目执行,应明确要求它讨论你提出的方法并建议更好的做法。这种讨论会有所帮助,但判断建议是否合理仍是你的责任。
助手可以将此前消息作为上下文,所以我不会每一轮都重复整个项目。但上下文有限,也不能保证它一直保留所有信息。当回答反复提出错误建议或不再符合代码时,应重新提供相关文件和细节,而不是假定助手仍掌握全部内容。
为了演示调试,我故意把模型名称改成无效的 GPT-3.0 Turbo,然后重新运行脚本。应用产生了错误堆栈。我把错误输出复制到 ChatGPT 并请求帮助;它识别出模型名称问题,并建议使用 GPT-3.5 Turbo。实际分享日志时,应先移除 API 密钥及其他敏感信息。

调试循环很直接:编写代码、测试、提供错误和相关上下文、应用建议的修复,然后再次测试。我把模型名称改回去,重新运行诗歌请求。有用的错误消息可以直接指出问题,但 AI 给出的诊断仍需验证。
通过迭代扩展程序
ChatGPT 提出功能建议,Berman 选择打字效果。第一次实现不符合他的意图后,他修改了请求。
接下来我询问 ChatGPT 可以添加哪些功能来扩展应用。它建议保存对话历史、支持多用户、富媒体、个性化、模拟打字、翻译、语音和外部 API 等选项。我选择模拟打字,并要求给出实现方法。

第一个建议使用 `time.sleep` 延迟聊天机器人的回复。我添加建议的导入和方法,替换主函数并运行程序。它先显示正在输入的消息,再显示回复,但这不完全符合我的意思:我希望文字本身逐渐出现。
我进一步说明,希望模拟有人正在输入回复。ChatGPT 建议在每个字符之间加入延迟,逐字显示回复。我添加新的输入和显示函数,更新主循环并再次测试。这次字符逐渐出现;这是视觉模拟,与将模型回复按块流式传输并不相同。
项目变大后的上下文管理
他建议在项目大到无法放入一条提示时,选择相关代码提供给助手。最后,他谈到了对未来编程工具的期待。
随着项目变大,应选择解释当前任务所必需的代码部分,并在需要时提供。经过练习,你会了解助手何时丢失上下文,以及哪些建议需要更仔细的检查。我也期待 GitHub Copilot X,希望它能让项目上下文更易于处理;这一期待反映了录制时的情况。
同频道的其他文章
34:21EN → 简体中文
0:36EN → 简体中文
25:50EN → 简体中文
32:20EN → 简体中文
1:03:37EN → 简体中文
0:53EN → 简体中文