上周我发布了一期关于使用 AI 以及如何利用 AI 制作项目的视频,其中提到了所有这些项目。有一位评论者询问了我关于进入新项目的基本工作流程。所以我想把它梳理一遍,这并不难。我会使用我的 Forgejo 实例(你可以使用任何你喜欢的仓库类型)。无论是本地 Git、GitHub 还是 GitLab,随你喜欢。基本上,我首先创建一个新的仓库,这样我就有了一个开始工作的地方。可以说这是一个工作目录。

我们每年做的一件事是为家里的各种节日制作像素灯光秀,当然肯定包括万圣节。我想今年我们会在万圣节和圣诞节之间尝试增加一些感恩节的内容,然后是圣诞节本身。因此,万圣节和圣诞节肯定是两个大日子,伴随着大量的灯光、效果和与之同步的音乐。我想做的一件事是,让音乐通过互联网与灯光秀同步,这样人们只需扫描二维码,就能在手机或设备上看到内容。

即使他们在车里也能操作。我想大多数汽车仍然拥有 AM/FM 收音机,这很好,我们也为此配备了发射器。但为了保持简便性,人们还可以获取音乐的链接等信息,如果喜欢的话可以下载音乐。所以,我打算试一试。首先我要创建仓库,我们就叫它 Git Pixel 吧。(我觉得“Pixel”更好。)你可以随意选择各种选项。我没有使用模板,然后问自己是否要初始化仓库?当然。它只是创建了一个 .gitignore 文件、README.md 等,这没关系。

我的一般做法是给它某种开源许可证,在这种情况下,我想 AGPL 3.0 或更高版本可能是最好的。我不确定。然后我们只需点击创建仓库。这样就创建了你的仓库。你可以看到这里有几个文件,没什么大不了的。但我现在要做的是复制这里的这个链接(URL)。然后我进入终端,移动到开发文件夹,这是我处理所有事情的地方。我将执行 git clone 并粘贴那个 URL。

不过我知道如果使用 forge.home.org,我没有将其配置为通过 SSH 连接到 Forgejo,所以我必须使用本地 IP 地址。这样应该就能获取到代码了。现在如果我执行 cd git-pixel,它就在那里。所以这是我的工作目录。做一些设置工作只是为了让你拥有这个与 Git 仓库同步的工作目录。接下来我要打开 Visual Studio Codium,选择“打开文件夹”,基本上切换出当前项目。

然后我进入 git-pixel 并打开那个文件夹。在这里我将创建一个新文件,命名为 requirements.md(需求文档)。在这个文件中,我只是进行头脑风暴,写下我想要什么。我希望这个功能如何运作?我想实现什么目标?这件事的目标是什么?你可以用 Markdown 格式写,或者只是写成一大段信息。完全由你决定如何操作。

但这绝对是一个很好的起点,真的能帮助你理清思路,弄清楚你期望它是如何运作的。所以我要开始打字了,稍后我会回来(我不想让你一直坐在那里等我思考过程)。每个人的流程肯定都是不同的。对我来说,我只是在这里做一个头脑风暴,然后我们将使用一些 AI 工具将其转化为更有用的东西。

我只想非常感谢所有的赞助者以及以各种不同方式支持我的人。如果你想支持该频道和内容,可以跳转到 Patreon 成为赞助者。真的非常感谢你的承诺,这意义重大并帮助维持频道的运营。如果你想进行一次性捐赠,可以通过 PayPal 使用“请我喝啤酒”或“请我喝咖啡”。如果你想从捐款中获得一些回报,可以跳转到描述中链接的商店。

你可以购买一些非常棒的周边商品,上面印有很酷的开源标题。东西真的很不错,我很喜欢这些产品。T 恤很棒,马克杯很棒,玻璃杯、随行杯等一切都很棒。真的是顶级质量的东西,我非常喜欢它。所以也想让你们知道这一点。最后,如果你想买我的书的话……我写了一本书,是一本很棒的科幻小说,真的很有趣。我很享受制作它的过程,乐在其中。

我使用开源软件完成了所有工作。所以一定要去看看那本书。我在节目备注和描述中提供了所有内容链接。非常感谢大家。现在,让我们回到视频中。(我已经把头脑风暴的内容写出来了)并给出了一些细节以确保我能得到预期的结果。首先,我说:“嘿,这是我们要构建的目标。”然后我给出了一些参考链接,因为我知道自己使用了 Falcon Pi Player。我希望这个应用能够与之配合工作,可能需要一个插件。

我尽可能多地提供了文档和维基的链接。然后我又详细说明了我对这个应用的期望。在下面这部分,我提供了更多信息:这个应用的主要目的是什么?抛开其他一切不谈,我真的希望这个东西做什么?这就是我要的。我想要最好的体验并提供选项。我告诉它:“在我们进行对话以确保一切都能正确工作之前,不要开始构建。”

我还有一段我始终使用的小代码块(提示词),而且我得反复把它放进去。我想如果你用 Claude,它有某种方式可以输入指令告诉它:“嘿,这是你应该始终做的事情。”我不认为 OpenCode 有那个功能。所以真的重要的是把它放进去并确保你有类似这样的内容来满足你的需求。这只是我的头脑风暴,你可以看出它有点条理但不算太有条理。

所以我想做的是把这个喂给本地 AI 模型,让它生成更好的东西。所以我告诉它……

"嘿,这里有一个 Markdown 文件。你能把它整理得更有结构一些吗?如果需要的话,让它更简洁一点,或者内容更全面、组织得更有序?”我想这是最好的表达方式。所以,我们开始吧,我会展示一下我通常是怎么做的。LM Studio 在后台使用的是 llama.cpp,这也是一个开源应用程序。你可以看到我在这里做了一些不同的事情。让我到这里来。所以,你可以在这里看到这个。我在 Visual Studio Codium 里有一个 Open Code 的小插件,我准备把它打开。然后,我们需要在这里输入 {slash} models(/models)。我要进去切换一下那个模型,我会去查看我本地的……我想我在运行 Gemma 4。可能是其他的版本之一,但让我看看是不是那个正在运行的模型。我们可以用“你好”来测试一下。它回复说好像无法联系到服务器,我想是的。嗯,没有加载模型了哦,不,是没有已加载的模型。这有问题。我想我需要加载一个模型。好了,我们开始吧。我们要选哪一个呢?就这个吧。它将加载这个模型。然后我们应该就能使用 Gemma 了。“今天我能帮你什么?”好的,很酷。所以这是有效的。

现在我们要说:“查看 requirements.md 文件,并帮助将其整理为 get pixel 应用的初始规格说明书。”现在我在构建模式中,所以我可能应该从“构建”切换到“规划”。呃,但我们就让它运行吧。我已经在系统指令中告诉它不要实际构建任何东西。如果你在规划模式下,那很好,但它不能写入任何文件,所以之后你得让它去写文件。所以你可以看到速度很快。我的意思是,这是在本地运行的。现在这是一个相当小的模型,但它擅长总结和组织事物,这很棒。所以我可以在本地运行它,而且速度相当快。我的意思是,这还不赖。呃,比我能读的速度还要快。所以它正在处理……实际上只是根据我放入这个文档的内容构建一切,并大致填充一些能帮我更好地搭建东西的东西。所以如果我们回去看看这个……在这里我们可以暂时关闭需求部分。这里我们会看到它刚才做了什么。

所以它说:“好的,项目标题为 get pixel。”基本上说明了目标,列出了核心目标和主要功能:完美同步流媒体音乐与实时像素灯光秀,这很完美。是的,使用 P 控制器(可能是指某种硬件控制器)。目标体验大概是到达一个位置,扫描二维码和网络 URL。然后使用他们的设备,立即呈现出一个引人入胜的功能界面。太棒了。然后它开始分解我在该界面中想要的所有内容。它说:“这里是技术限制、重点领域。”它会给你一个很好的功能规格说明。所以这一切都是通过本地 AI 完成的,它所做的只是把我已经写好的内容拿过来,说:“嘿,这是我有的。”然后它又说:“在所有体验方面都选定之前不要开始构建。”这很好。还有后续步骤。

所以我现在可以说:“好的,更新需求文件。”它会去把那个内容塞进 requirements.md 中。我本来可以很容易地直接复制粘贴,但只是为了向你展示它实际上能够出去做这件事并且应该能做得很好。呃,我们让它在这里运行吧,因为因为我是在本地 AI 上运行的,所以这不会花费我任何令牌(tokens)。我想让你看看总结、准备和实际编写东西之间的区别。在这种情况下,我只是要求它重写一些它已经做过的内容,但你可以看到它在每次都在思考。所以它有这个思维过程,你可以点击它来看看它在做什么。

所以在试图弄清楚……就像它想:“这是什么?我想要什么?”以及“它需要做什么?”它说这个文件相当长,而我基本上是在写大部分内容。所以它在试图弄清楚应该如何做这件事。你看,所有这些思考在你在互联网上使用任何服务时都会消耗令牌(tokens)。所以这已经用了 8900 个令牌,其实并不多。呃,考虑到我给了它相当大的一段文本,这还不算太坏。然后它重写了那段文本,现在正在做所有这些思考来弄清楚如何处理这段文本。呃,然后你现在可以看到它正准备编辑这个文件。所以我可以上去并在这里关闭思考过程……我喜欢我能使用这些本地模型并以这种方式操作它们。呃,如果你确实需要使用在线模型,这将节省令牌用于这类任务。然后你可以实际使用在线模型来进行编码方面的工作(如果需要的话)。

但同样,如果你能运行更大的模型……它们目前完全有能力进行编码。呃,而且代码质量相当不错。再次强调,你可以提供提示来帮助它更好地进行编码。就像我在我的提示中看到的那样:“始终在最后创建你的测试 API 单元测试。”“确保它们运行。”“确保它们通过。”我也喜欢……一旦我有一个项目实际上已经启动并运行良好,并且我达到了一个点,我觉得“好的,这感觉像是一个良好的早期采用者版本。”我会告诉它:“好了,现在你是一名高级开发人员、一名高级 DevOps 工程师、一名高级信息安全工程师和一名高级 QA(质量保证)工程师,以及一名高级设计工程师。就像所有这些角色集于一身一样。”“去检查这个应用程序并查看所有代码,确保所有地方都遵循安全性、可用性和稳定性的最佳实践。在我们使用多行代码但可以用更少行数实现且仍然安全、快速和功能齐全的地方,做出那些更改。始终记得运行你的测试。”“始终记得更新你的测试。”确保所有测试都通过。“然后它会去执行这些操作。

它实际上会削减相当一部分代码量,使事情变得更加精简流畅。一旦你让它运行起来,这是一种很好的清理方式,在很多情况下人们也是这样工作的。你知道,它真的能改变应用程序中发生的事情……通过检查并让它解决那些安全问题,真正认识到‘嘿,这里有地方可以做得更好。’呃,AI 也能做到这一点,这在现阶段相当令人印象深刻。”

任务已完成,正在编辑需求文档,现在它正在进行思考。完成后它会告诉我:“嘿,我完成了你要求的任务,结果在这里。”如果我点击 requirements.md 文件并选择预览,就能看到 Markdown 文档的渲染效果。这就是它梳理出的内容及其格式,这是一个很好的开始。

但这并非我们要做的全部。我们需要将这些内容转化为“史诗”(epics)和“用户故事”(stories),AI 能理解这些概念,这是构建应用的分解方式。我们将告诉它进行下一步操作,回到窗口并切换到“计划模式”(plan mode)。按 Tab 键可以看到它显示为 Plan,或者可以切换到产品经理、构建或设计师模式。我选择回到计划模式,这意味着它现在不能直接写代码,但能协助我们梳理流程。

让我们根据 requirements.md 构建史诗及相关的故事和验收标准。加上标点有助于 AI 准确理解意图,避免消耗过多 Token。需求文档需要构建此应用,请创建这些史诗、故事及验收标准。我给出的提示是:基于需求文档创建史诗、相关故事和验收标准,以便 AI 编码代理能以最少的问题澄清构建应用。

我告诉它:“提出所有必要的问题和澄清,以达到最佳结果。”让它处理一下。由于使用的是本地模型,它需要读取提示、思考并生成问题。这取决于上下文窗口的大小,我设置为 65,000 Token。如果使用在线模型或拥有更多 RAM/GPU,可以使用更大的上下文窗口。

较大的上下文意味着 AI 能保留更多信息在活跃记忆中。想象一下《海底总动员》中的多莉,它记不住所有事情,随着时间推移会丢失上下文。一旦丢失信息,若无特殊文件辅助,它可能需要重新查找并消耗更多 Token。虽然使用特殊文件有帮助,但达到上下文窗口上限时仍可能丢失信息。

现在它开始创建我们想要的史诗和故事,展示了史诗一及其子故事 1.1、1.2 及各自的验收标准。模型不同,效果也不同。使用 Google Gemini 等在线模型速度更快且可能提供更好结果。这里使用的是 Google 的 Gemma 本地模型,参数约为 40 亿。虽然不如数百亿参数的模型强大,但对此目的而言运行迅速且效果良好。

它正在快速推进,并提出需要澄清的问题和决策选项(A/B)。如果都不符合需求,可以直接输入数字并手写答案。例如关于多用户流媒体解决方案的技术栈选择:推荐的是 WebSockets 加 AWS Media Services,或标准 HTTP CDN。我不喜欢这两个选项,因为不想用 AWS,希望本地托管且只需 1GB 内存。

我选择“都不”,并指定了本地托管和 1GB 限制,然后按 Shift+Enter。由于未选择预设选项,它需要重新思考并生成最终架构版本。虽然它短暂停止后说已准备好展示但未立即呈现,我提示“请执行”后,它会思考并输出最终结果。

在等待它写入文件时,我准备下一个提示:请将构建计划、史诗和故事写入名为 build plan.md 的新文档。由于当前处于“计划模式”,无法直接写文件,我需要按 Tab 切换回“构建模式”(build mode)。

现在按 Enter 让它执行。它会经过思考阶段,最终在左侧创建名为 build plan.md 的新文件。

它在这里停了一分钟左右,什么也没做。不过我喜欢运行 LM Studio 或 llama.cpp 的一点是,我可以看看它在做什么。我可以看到它每秒处理一些 token(词元),正在努力解决这个问题。目前我们大约得到 10 到 14 个 token/秒,具体取决于你看的是输入还是输出 token。嗯,它在做点什么,因为屏幕上的内容在继续滚动,我也听到风扇转速提高了。所以,虽然它没有显示“正在思考”,但我相信它在处理某些东西。然后我们可以看到这里发生了变化。

我们可以回去看看它是否真的做了我们要它做的事。目前我还没看到新文件,所以它还没有创建文件。而且它停止了。我不确定为什么停止。这又是那种你会遇到的情况之一。嗯,所以我们切换到 build(构建)模式,再试一次。有时候你只需要再次点击它。所以我按了上箭头键,就像使用命令行一样。得到了相同的结果,现在你可以看到它说“正在准备”。不确定为什么第一次没成功,但有时会发生这种情况。

这是使用不同 AI 系统时会出现的情况之一。因为工作原因,我用过很多。Gemini、Google,情况一样;Claude,也一样;Open Code(开源代码助手),也是一样。老实说,我没怎么用过 ChatGPT,只是还没用到它的需求。但确实,有时候这些系统会出些奇怪的问题,你只需要告诉它们怎么做。现在它开始生成文件了,并说:“嘿,我已经写好了,这是我们的 build plan.md。”

如果我们右键点击选择“打开预览”,我们可以看到构建计划、项目概述、产品积压规范、核心同步管道,以及我们的用户故事。接着是我们的第二个史诗任务(epic):展示内容和信息页面;第三个史诗任务;以及阶段开发工作流计划。这一切看起来都不错,似乎是这个项目的一个良好起点。现在这将随着时间推移而增长,特别是当它开始编码并进行所有开发工作时。

我此刻要做的是回到 Open Code 侧。我们可以关闭这个窗口。我已经处于 build 模式,我要切换模型。我将使用他们的一款免费在线模型。“Big Pickle”(可能是指某种特定配置或昵称,原文如此)通常效果最好。我会说:“好的。”基于……但我总是先抓取这段文字,以确保我复制了它。然后我们启动它。

这将使用他们的在线 Big Pickle 模型,不再仅仅使用我的本地模型。你会看到它在“思考”,所以现在它正在增加我们使用的 token 数量,但我们之前用本地模型用了约 21,400 个 token。随着它开始工作,这个数字可能会大幅增长。它将检查文件夹结构,看看它能读取什么内容,并尝试获取所有能访问的信息。

如果它有疑问,应该会回来问我问题。这是我刚才给它的指令中包含的内容。它告诉我有一些可能影响架构的问题。它还表示仍在思考,确实如此。这就是我之前提到的:你可以点击这些选项,或者按向下箭头并按回车键选择你想要的选项,然后它会像向导一样引导你。

后端栈提示:“嘿,你想用什么?Node.js 加 Express 加 WebSocket。”它通常会推荐某个选项或告诉你它的建议,但你也可以选择其他的。我对 Node.js、Express 和 WebSockets 非常熟悉。所以对我来说,为了能够检查这段代码,我觉得“是的,这是正确的选择”。

前端方面:React 加 Vite、Vue 3 加 Vite、Vanilla JS(原生 JavaScript)加 Vite,如果你不想使用这些,还可以输入你自己的答案。我不是 React 派的人。我不太擅长 React……我是说,我能读懂并理解它,但我更喜欢 Vue 3。所以即使另一个被推荐为最佳选项,我还是要告诉它使用那个(Vue)。

获取像素服务器主机音频被推荐。嗯……客端面向的音频应该来自哪里?这是核心同步检测的一部分。这个选项说它最适合延迟同步。我是觉得这可能从 Pi 播放器那边会更好,但我们就按它的建议来选吧。然后是 FPP 访问:你是否有一个实时的 FPP 实例供应用指向,以便在开发期间使用?还是说我也应该在本地开发和同步时构建 FPP 模拟器/模拟环境?

所以,如果你不想在当下设置你的 FPP,你可以选择这个选项。我确实有一个 FPP,所以这取决于你。如果你走这条路(使用模拟器),可能需要进行一些额外的故障排除,因为它只是试图模拟某些东西。但你知道的,我们也可以直接让 FTP 可用(原文如此)。我必须告诉它 IP 地址和主机名,以便它能连接到这些东西。

由于我实际上并没有把它插好并连接起来,我们就先选第一个吧,然后处理后续问题。一旦到达确认屏幕,你只需按回车键,它就会将所有这些信息汇总并继续执行。现在它可能会有更多问题,所以你只需要让它按自己的方式运行和工作即可。

它说:“所有决策已锁定,正在设置任务列表并在 agents.md 中编写计划。”所以它完全按照我最初指令中的要求在做,即创建 agents.md。虽然这里还没显示出来,但这基本上就是它跟踪所做工作、记录会话信息的地方。这样如果你必须停止并开始新会话,当你告诉它“获取你的上下文”时——第一次启动时让它这样做——它会实际去查看那个 agents.md 以及这几个其他 MD 文件,弄清楚上次到底在哪里中断了,以及如何接着之前的进度继续工作。

这将运行一段时间。如果它停止,它会问我一个问题;或者当它说“嘿,我完成了第一阶段”时,它可能会问我想不想进入第二阶段。但总体而言,它会一直运行直到达到当天的 token 或时间限制。它说:“现在服务器核心配置 SP REST 客户端。”所以它已经在运行所需的项目了,并且你……

可以看到它在这里生成的代码以及正在执行的操作。目前,这主要是我们的 package.json 文件,它会去获取所需的各项依赖内容。接着,它正在构建所需的目标文件夹结构。这里有一些代码片段,但随后会出现一份它将逐一执行的清单。随着过程的推进,你会看到这些内容逐渐被创建出来。

如果我将窗口稍微移动一下,你会发现它实际上将这份清单放置在了侧边栏中。因此,在操作过程中,你无需一直盯着屏幕顶部查看。它还会实时显示各项任务的勾选状态,让你可以在侧边栏中随时跟踪进度。简而言之,它创建了这份包含所有待办事项的清单,并会在执行过程中逐一进行核对。

以上就是整个流程的概览。虽然设置过程看似简单直接,但我实际使用的搭建方法并没有那么轻松。如果你对更详细的视频感兴趣,想了解我是如何具体操作及完成设置的,请告诉我。目前有很多优秀的频道和视频资源可供参考。

我会在视频简介中尽量链接其中一些优质内容。希望你喜欢本期节目,如果你喜欢的话,请点赞、订阅并分享给朋友,让他们也能加入我们的开源之旅。我们下次再见。