长期以来,启动新的 Node.js 项目的一种常见方式是使用样板。这些样板帮助开发者重用熟悉的代码结构,实现标准功能,例如访问云文件存储。随着 LLM 的最新进展,项目样板文件似乎比任何时候都更有用。
在此进展的基础上,我扩展了现有的 Node.js API 模板功能,并添加了一个新的工具 LLM Codegen,该工具可以独立运行。这个工具使得模板可以根据文本描述自动生成任何用途的模块代码。生成的模块包括端到端测试(E2E测试)、数据库迁移、种子数据以及必要的业务逻辑。
历史故事我最初创建了一个GitHub仓库,用于整合多年来我积累的最佳实践。这是一个Node.js API 模板项目,大部分实现基于实际运行在AWS上的Node.js API代码。
我对垂直切分架构和“清洁代码”原则充满热情,以保持代码库的可维护性和整洁。鉴于最近在大型语言模型(LLM)方面的进展,特别是它对大上下文的支持和生成高质量代码的能力,我决定基于我的样板代码,实验生成清洁的TypeScript代码。我的样板代码遵循我认为质量很高的特定结构和模式。关键是生成的代码能否遵循相同的模式和结构。根据我的发现,确实如此。
以下是一些 Node.js API 模板关键特性的概览:
- 基于
DDD
和MVC
原则的垂直切分架构 - 服务输入验证使用
ZOD
- 使用依赖注入(
InversifyJS
)解耦应用程序组件 - 使用Supertest进行集成和
E2E
测试 - 使用
Docker
compose部署多服务
在过去的一个月里,我用周末的时间来规范化解决方案并实现了必要的代码生成逻辑。下面,我来分享一下具体的细节。
实现概要让我们具体看看实现的细节。所有的代码生成逻辑都位于项目根目录下的 llm-codegen
文件夹内,方便大家查阅。Node.js 的样板代码独立于 llm-codegen
,可以直接当作普通的模板使用,无需任何修改。
LLM-Codegen folder structure
它包括以下用例:
- 根据输入描述生成新模块的干净、结构良好的代码。新生成的模块会集成到 Node.js REST API 应用程序中。
- 创建数据库迁移,并为新模块扩展种子脚本,添加基本数据。
- 为新代码生成和修复端到端测试,并确保所有测试均能通过。
生成的第一阶段代码干净且遵循垂直切片架构原则。它仅包含 CRUD 操作所需的必要业务逻辑。与其它代码生成方法相比,它生成的代码干净、可维护且编译无误,并且包含有效的 E2E 测试。
第二个用例涉及生成带有适当模式的数据库迁移脚本,并用必要的数据更新种子文件。这项任务特别适合LLM来处理,LLM处理得非常好。
最终的使用场景是生成E2E测试,这些测试有助于确认生成的代码正确工作。在运行E2E测试时,会使用一个SQLite3数据库来进行迁移和种子。
我们主要支持的大型语言模型包括OpenAI和Claude。
使用指南要开始,请进入根文件夹 llm-codegen
,并在终端中运行命令以安装所有依赖。
npm i (安装依赖包)
llm-codegen
不依赖于 Docker 或任何其他重型第三方依赖项,使得设置和运行变得简单直接。在运行工具之前,请确保在 .env
文件中至少设置一个 *_API_KEY
环境变量,例如 OPENAI_API_KEY, CLAUDE_API_KEY
等,并使用适合您选择的 LLM 提供商的 API 密钥。所有支持的环境变量,如 OPENAI_API_KEY
, CLAUDE_API_KEY
等,都列在 .env.sample
文件中。您可以选择 OpenAI
, Anthropic Claude
或 OpenRouter LLaMA
。截至12月中旬,OpenRouter LLaMA
出乎意料地免费使用。您可以在这里注册 here 并免费获取一个访问令牌。然而,这个免费的 LLaMA 模型的输出质量可以进一步提高,因为大多数生成的代码无法通过编译。
要运行llm-codegen
,运行以下命令。
运行npm start命令(启动项目)
接下来,请输入模块描述和名称。在这里,你可以详细描述模块的需求,比如实体属性和需要的操作。剩下的核心任务由三个微代理完成:Developer
,Troubleshooter
和 TestsFixer
。
这是一个成功的代码生成过程的例子。
代码生成成功了
下面是一个修复编译错误的另一个例子,展示了如何解决一个编译时的错误。
以下是一个生成的 orders
(订单)模块代码示例,仅供参考:
关键是你可以逐步生成代码,从一个模块开始,逐步添加其他模块,直到所有必要的API都完成。这种方法只需几次命令就能完成所有所需模块代码的生成。
— 它是怎么工作的正如前面提到的,所有工作均由这些微代理完成:Developer
(开发者),Troubleshooter
(故障排除者)和 TestsFixer
(测试修复者),由 Orchestrator
(管理者)管理。它们按照列出的顺序运行,其中 Developer
生成大部分代码。每次代码生成步骤后,会检查缺失的文件,根据其角色(例如,路由、控制器、服务)。如果缺失文件,则会再次尝试生成代码,并在提示中包含关于缺失文件的说明和每个角色的示例。一旦开发者完成其工作,TypeScript 编译开始。如果发现任何错误,则 Troubleshooter
接管,将错误反馈到提示并等待修正。最后,当编译成功时,运行E2E测试。每当测试失败时,TestsFixer
介入并根据具体说明进行操作,确保所有测试通过并使代码保持干净整洁。
所有微型代理都继承自 BaseAgent
类,并积极利用其基础方法的实现。这里有一个 Developer
实现供参考:
每个代理都使用自己特定的提示。你可以在这里查看 GitHub 链接,看看开发者(Developer)使用的提示。
经过大量的研究和测试,我改进了所有微代理程序的提示,结果是得到了干净、结构良好的代码,很少的问题。
在开发和测试期间,它被用来处理各种模块描述,从简单的到高度详细的。以下是一些例子:
- 负责图书馆书籍管理的模块必须处理对书籍的创建、读取、更新、删除(CRUD)操作。
- 负责订单管理的模块。它必须提供处理客户订单的创建、读取、更新、删除(CRUD)操作。用户可以查看订单的详细信息,更新订单状态或信息,并删除已取消或已结束的订单。订单必须包含以下属性:名称、状态、下单来源、描述、图片URL
- 该资产管理系统中的“资产”模块提供对公司资产的创建、读取、更新、删除(CRUD)操作。用户可以向库存添加新的资产,更新维护计划、资产位置等信息,并删除已处置或已售出的资产记录。
使用 gpt-4o-mini
和 claude-3-5-sonnet-20241022
进行测试,显示了相当的代码输出质量,尽管 Sonnet 更贵。Claude Haiku (claude-3–5-haiku-20241022
) 虽然价格与 gpt-4o-mini
相当,但更便宜,经常生成无法编译的代码。总体而言,使用 gpt-4o-mini
,一次代码生成会话平均消耗大约 11k 输入 token 和 15k 输出 token。按每 1M 输入 token 15 美分和每 1M 输出 token 60 美分(截至 2024 年 12 月)的 token 价格计算,每个会话的成本约为 2 美分。
以下是Anthropic的使用日志,显示token的消耗情况。
经过我过去几周的测试,我得出结论,虽然生成的测试可能存在一些问题,但95%的情况下生成的代码是的可编译和可运行。
希望这里能给你一些灵感,并可以作为你下一个 Node.js API 或当前项目升级的起点。如果你有改进建议,欢迎通过提交代码或更新提示的方式贡献。
如果你觉得这篇文章不错,不妨给个赞或在评论区分享你的想法或问题,无论是想法还是问题。感谢你的支持,祝你玩得开心!
更新通知 [2025年2月9日]:LLM-Codegen的GitHub仓库更新,新增了对DeepSeek API的支持。它的价格比
gpt-4o-mini
更便宜,输出质量几乎与gpt-4o-mini
相同,不过响应时间稍长,偶尔会出现API请求错误。
除非另有注明,所有图片均为作者提供,未特别标注的。
共同學(xué)習(xí),寫下你的評(píng)論
評(píng)論加載中...
作者其他優(yōu)質(zhì)文章