这个月对我来说是个小小的胜利。我与我新搭档的GitHub Copilot一起,为Home Assistant发布了一个自定义插件,可以从Renogy太阳能充电控制器中提取数据,我们一起完成了这个任务。
快速且粗略的TL;DR:大型语言模型的编程已经到来,它既疯狂又好玩。是的,缺点也有。是的,可能会让你养成坏习惯。但天啊,真是太酷了。而且它每天都在变得越来越好。
背景:如果你不熟悉,Home Assistant 是一个智能家居自动化平台,也是 GitHub 上第二大开源项目。我已经使用并喜欢 Home Assistant 有超过 5 年的时间了。通常,Home Assistant 的爱好者会用它来管理他们的家庭,而我甚至将其安装在我的房车中。Home Assistant 控制着我的暖气、热水器、报警系统以及网络连接设备等。自然而然,我也想在我的 Renogy 品牌的太阳能板产生的能源数据中加入 Home Assistant 的追踪!
我父亲和我在2023年,8月安装了太阳能板和约5千瓦时的锂铁磷酸电池容量。
网上有人发布了与Renogy蓝牙低功耗模块交互的脚本,这些脚本可以获取太阳能数据,有些人甚至用MQTT将这些数据发布到Home Assistant。但我想要构建一个与Home Assistant的原生集成,理由有几条:
- 更高效地利用共享的Home Assistant资源,比如现有的蓝牙适配器和计算资源
- 简单性——无需额外硬件或Docker容器
- 我使用Home Assistant多年,想做出贡献!
也许你见过在 X 或 LinkedIn 上的“氛围程序员”。人们将一个想法输入到 LLM(大型语言模型)中,任由它自由发挥,完全交给 LLM 来处理。一些人所创造出的东西真是令人印象深刻。我的动态里充满了他们声称能产生每月1万到10万美元收入的完整应用。
反对Vibe编码的家伙们喊道:“但安全怎么办?”“如果AI替他们做了所有工作,他们怎么学得会真正的开发技能?”嗯。这些都是有效的担忧,或许。Vibe编码者常常夸耀自己完全没有开发经验就开始发布自己的Vibe编码应用,有时他们的决定确实证明了这一点。有谁看到过那个Vibe编码者放手让Claude管理他的代码库,并且Claude把代码搞砸了,根本没法恢复?那个年轻的开发者公开希望能有一个系统可以保存版本并回滚,实际上在描述已经使用了几十年的版本控制系统……另一个Vibe编码者无意中发布了一个布满了漏洞的服务。当他的应用程序被非法的API调用淹没了时,他不得不暂停运营。
总之,听起来挺好玩的,孩子们都在做,那我也想,试试看吧?咱们用人工智能来做一个Home Assistant集成怎么样?
进行vibe编码所需的氛围感
工具在过去的一年里,LLM市场变得异常竞争激烈。每隔4小时就有一个新模型被推出,这个模型在某些方面声称比其他所有模型都要好。作为消费者,这是很棒的,我们可以根据当下的最佳选择或最实惠的价格来挑选,而且转换成本很低,几乎可以忽略不计。在我看来,没有哪家AI公司有真正的竞争优势。虽然ChatGPT可能是大品牌,但就技术而言,几乎所有公司的技术都大同小异,而且大家都在你追我赶。
作为一名几乎在所有生活方面都遵循价值投资理念的人,我想要花最小的代价获得最大的效益。我还希望我的选择能够具备“自主性”——也就是说,我选择的AI工具应该能够创建文件、运行命令,当然还有编写代码,而不需要我频繁干涉。毕竟,没有人喜欢事事都要管的人。
我最初研究了像Claude Code和aider这样的工具。这些可能是目前市场上最省心的工具之一。然而,它们都是根据API使用量收费的。我的第一想法是这很好,你只用为实际使用的服务付费。然而,我在线上读到了几条抱怨,人们发现每次请求Claude和aider修复bug都要被收取5到20美元的费用。
这仍然比支付开发人员为你的代码库工作便宜好几个数量级,但我却找到了一个更好的交易:GitHub Copilot Pro。每月只需10美元,你就可以获得“无限”的代理模式访问权限,并且可以使用一系列模型,包括OpenAI的o3-mini和Anthropic的Claude 3.7模型。只需固定费用就可以使用来自多个供应商的最新模型,这简直是个明智的选择。
微软随后为Copilot增加了新的套餐选项,包括每月39美元的Pro+计划。这似乎成为了整个行业的趋势。似乎所有AI供应商都感到需要通过提供越来越昂贵的计划来筹集资金。OpenAI和Anthropic现在都提供了每月200美元的计划。我希望每月10美元的Copilot基础套餐仍能满足我的需求。从长远看,激烈的竞争肯定会继续推动成本下降,但最先进的技术往往价格不菲。
现在,一个快速澄清。几个月前我就已经是付费的ChatGPT用户了。我使用的是每月20美元的订阅,这让我可以访问聊天界面,但没有真正的代理编码工具。为了更好地融入这种氛围,我认为你需要像GitHub Copilot这样的代理工具以及一个传统的聊天机器人。你可能仅靠免费版的ChatGPT、Google或Claude也能应付,但使用传统的聊天机器人界面进行规划是必不可少的。当然,我继续使用我的现有订阅。关于这个规划阶段的具体内容,我会稍后再详细说明。
雇用了新的AI伙伴后,我就打开了VS Code和ChatGPT桌面应用,就开始忙起来了,做起事情来。
规划一下最重要的一点。即使你想自己动手编码,我发现这个练习很有帮助。正如人们常说,烂计划总比没有计划强。
我觉得许多开发者一上来就开始动手做。“帮我建个应用,能让我上传食物的照片并告诉我卡路里的。”好的,这在现在确实挺管用的。然而,稍微规划一下可以省不少事。我最近读了哈珀·里德写的这篇有趣的博客文章。我直接用了他的提示模板来想主意。
一次只问一个问题,这样我们可以逐步地为这个想法制定详细的规格。每个问题都应该基于我之前的回答来提出,我们的最终目标是制定一个详细的规范,这样我就可以把它交给开发者。让我们迭代地进行,深入探讨每一个相关细节。记住,一次只问一个问题。这个想法是:(有关Home Assistant集成的高层次细节)
计划会议的开始
聊了大约15到20分钟的技术细节后,我让ChatGPT生成一个规格文件,一个用于迭代构建集成的提示清单,以及一个待办事项列表,用于跟踪进度。再次感谢哈珀·里德提供的这个流程。它确实非常有效。(我认为稍微修改一下这个提示,就可以应用于任何事情,如商业想法、开始种植花园、做三明治等。)
建造最后是有趣的部分。我创建了GitHub仓库,用UV(我最近很喜欢的Python工具)启动了项目,并构建了一个带有合理命名的目录和文件的项目框架。GitHub Copilot现在可以自动完成这些步骤中的大多数,但我发现,在项目的早期阶段提供指导非常重要。在我将项目配置成想要的样子后,我开始将规划阶段生成的提示粘贴到Copilot。这里举个例子:
在这一步中,实现BLE通信模块(`ble.py`),该模块:
- 使用它们独特的蓝牙标识符来扫描带有BT-1和BT-2模块的Renogy Rover BLE设备。
- 实现一个默认间隔为60秒的轮询功能,并提供一个配置选项,将间隔设置在10到600秒之间。
此外:
- 编写一个简单的类(例如`RenogyBLEClient`),启动BLE扫描,并返回发现的设备列表。
- 包含扫描开始和停止的日志记录。
同时,在`tests/test_ble.py`中创建一个基本的测试桩,模拟BLE扫描,并断言扫描函数返回一个虚拟的设备列表。
确保代码具有模块化和可测试性。
结果部分
我发现将Copilot设置为代理模式,并选择Claude 3.7作为模型时,效果最好。我还添加了一些特定文件作为上下文,这样Copilot就知道该在哪些文件中编写代码了。如果你不确定哪些文件需要修改,可以选择“代码库”作为上下文。这种方法还算可以,但手动选择文件效果更好。
Copilot 会编写代码,构建测试,然后问我是否可以运行测试。在我同意后,Copilot 会运行测试并查看输出结果。如果有问题,Copilot 会继续编写代码。重复这个过程。有时 Copilot 需要多次尝试才能修复失败的测试。偶尔它会完全卡住。这时我会用自己掌握的 Python 知识帮忙解决,或者将部分代码粘贴到 ChatGPT o3-mini 获取另一个意见。(将代码库精简成易于粘贴到 ChatGPT 的内容,可以通过名为 Repomix 的工具完成。)靠 Claude、ChatGPT 和我自己,我们通常能在几分钟内解决大多数问题。这确实感觉就像有一个随时待命的开发团队,随时准备解决问题。
面对分裂的代码库在这个项目中,最大的挑战之一是开发一个用来解析Renogy BLE数据的独立库。Home Assistant的标准倾向于让实际的Home Assistant集成保持轻量,并利用外部库处理API调用和解析。因为使用Home Assistant的API来管理蓝牙连接,所以我需要在集成代码中做很多事情,但我仍然希望将解析工作单独放在一个库中。
当所有内容都在同一个项目中时,Copilot 在管理上下文方面做得相当不错。当项目被拆分到两个仓库(库和集成)时,它会不可避免地会感到困惑。我处理这个问题的方法是将库视为一个完全独立的项目,有自己的规格和指令。这样,在完成库的构建后,我让 Copilot 生成文档并将库发布到 PyPI。然后我再次使用 Repomix 将库代码库压缩成一个单独的文件,并在 Copilot 处理集成部分时将此文件作为上下文提供给它。
这个策略运作得很顺利,因为库相对较小,并未占据太多令牌资源。然而,在这种情况下,这将是一个真正的问题,因为在这种情况下,这会成为一个实际障碍。这涉及到一些大型语言模型的局限性:知识截止和上下文窗口大小。当需要使用的库和语言有详细的文档并且开放时,大型语言模型在编码方面表现出色。如果你深入到一些专有内容或是在该大型语言模型训练后创建或修改的库中,大型语言模型将对此一无所知。此时你需要将相关文档作为提示一起提交。若文档超出大型语言模型的上下文窗口,问题就来了。上下文窗口正在逐渐增大,人们也通过管理上下文管线(MCPs)、增强检索生成(RAG)或者甚至训练自己的模型来应对这一挑战,但这仍然是需要考虑的一个方面。
还有一个问题是 Copilot 坚持自己开发蓝牙扫描和连接功能。后来回想起来,ChatGPT 生成的一些提示确实促使 Copilot 自己开发扫描器。也许 ChatGPT 不知道这些蓝牙 API。我每次给 Copilot 提示时都附上了相关的 Home Assistant 文档,成功让它使用了 Home Assistant 提供的正确 API。
收获:最终,我仅用了保守估计的没有AI时三分之一的时间就完成了Home Assistant集成的开发。我仍然需要自己解决一些问题,特别是处理了Copilot留下的BLE数据解析器中的混乱代码,它留下了一些通用示例代码。如果我更擅长编写提示,并将BLE命令和响应组织成更好的参考资料,我相信Copilot可以处理得更好。
有时候,Copilot 的输出根本看不懂。
但总的来说,Copilot 没有让人失望。你可以通过 HACS 直接安装这个集成。我已经运行了几周时间。下面是我的一个能源仪表盘。
620D和D56B是两个独立的400瓦太阳能板组(每组),加起来是800瓦。(读数较低是因为我接了岸电,而且电池已经充满。当我们脱离电网运行时,效果会更酷!)
以下是我们到目前为止集成所提供的所有传感器:
用户可以将这些传感器添加到他们的仪表板或自动化里。
看这里!实用小技巧- 我发现Claude 3.7模型的效果最好。偶尔在让Copilot进行几十轮迭代循环修复错误时会遇到使用限制。遇到限制时,我只需切换模型到Claude 3.5或OpenAI 4o。第二天我又能继续使用Claude 3.7了。这种情况只发生过两次。以每月10美元的价格来看,这已经很不错了。如果按照API使用量计费,这会很有趣。
- 我对Copilot在日志中使用较旧风格的Python“%字符串”格式感到不满,而不是我喜爱的“f字符串”。我发现Home Assistant的文档因为性能原因更倾向于在日志消息中使用%格式。看来Copilot比我更清楚。
- 考虑设置一个.github/copilot-instructions.md文件,提供项目特定的指导。这里你可以写“使用pytest进行测试。用uv管理Python和包。使用制表符而不是空格。”你可以在这里添加Home Assistant的完整风格指南。我真该这么做的!
- GitHub Copilot的代码审查功能对于拉取请求非常酷。你可以为拉取请求分配它,它会评论并提出一些改进建议,就像一个代码审查工具。
- 如上所述,用AI来解决规划阶段的问题非常棒。如果我在规划阶段没有考虑这些问题,我可能就需要回溯解决。
- 请记住,AI倾向于同意你。不要指望它会告诉你你的想法是不好的。它会取悦你。(我见过其他人在线尝试通过提示工程来绕过这一点,比如假装这个想法是别人的,或者让AI无情地批评这个想法。)
- 让它继续运行。使用代理模式和测试驱动开发。Copilot可以自行构建代码并进行测试。它会很好地收集反馈并循环运行直到代码工作。
- 不过也别害怕回滚到上一个工作提交,重新开始。有时候Copilot确实会偏离轨道并陷入困境。尝试从另一个角度重新开始工作。清理上下文并重新审视你的建议。如果可能,可以在提示中提供一些工作代码或文档的示例。
- 有时,自己修复问题仍然更快。
GitHub Copilot 配合 Claude 3.7 实在是不错,而且每次新版本发布都变得更好。在我写这段文字的时间里,OpenAI 已经发布了好几个新模型,而 Google 推出了 Firebase Studio,声称可以从零开始编写完整的应用。
虽然这一切很酷,但也引发了一些存在主义的问题。人类有被取代的风险吗?学编程还有意义吗?开发人员、SRE 和信息安全专家是否已经过时或即将过时?我不这么认为——至少目前还不至于。
当前状态下使用大型语言模型(LLM)有点像使用计算器。虽然计算器可以比手工计算更快、更准确地完成数学运算,但你仍然需要掌握数学基础知识才能操作计算器。在解决某个问题时,拥有该问题的背景知识可以让你更好地利用LLM。但更重要的是,你仍然需要掌握解决问题的基础知识,因为LLM也可能出错。 使用LLM就像你的计算器偶尔也会出错一样,比如可能每10次中有1次。这就是为什么我们仍然需要程序员、运维工程师和信息安全专家。
如果你想用AI进行开发,你应该掌握编程的基础知识,并投资学习DevSecOps。你需要能够验证AI生成的代码是否既有效又安全。你需要提升项目管理技能。使用AI编码工具就像管理一个实习生一样,你需要保持专注,并确保提出明确的需求。
常识和探索你在构建和部署的应用程序可能会带来的风险是必不可少的。随意开发一个用于存储真实客户数据的应用程序吗?你进入了相当危险的领域。最好还是找专业的安全顾问咨询一下。随意开发一个用于跟踪你不在家时狗叫次数的应用程序,而这个应用程序你只打算本地运行吗?应该问题不大。
有一点可以肯定:世界正在快速变化。也许新一代模型会少一些幻觉,更加注重安全。就像任何技术一样,它不一定要完美,而要比人类更优秀。无论如何,现在真是个激动人心的时代。我用AI增强能力感到很有趣。而且,这篇文章并不是ChatGPT替我写的!
共同學習,寫下你的評論
評論加載中...
作者其他優質文章