利用大模型AI辅助研发快速实现openUBMC的NCSI协议命令字解析
本文将分享openUBMC 25.06版本交付中的一个真实案例:作为一名刚接触 openUBMC 的开发者,在项目交付过程中,如何借助 AI 辅助策略,快速完成 NCSI 标准命令字的 Lua 代码编写。同时,通过实战总结出可复用的 Prompt 编写技巧与代码重构范式,旨在帮助社区开发者更高效地完成简单重复的协议命令字开发工作。
作者简介:钱昱霏,进入BMC领域4个月的BMC开发者,专注于软件开发与自动化效率提升,在AI辅助研发有独特的见解。
背景:协议命令字开发遭遇重复劳动难题
NCSI(Network Controller Sideband Interface,网络控制器边带接口)是一种用于 BMC 与网络控制器通信的协议。在openUBMC 25.06版本项目开发过程中,我面临着以下几方面的挑战:
模块代码重复率高:
不同命令之间,除了命令字的请求响应体存在差异外,其他代码的重复度极高。
测试数据需手动编写:
需要自己手动计算二进制测试数据,过程复杂且极易出错。
文档晦涩难懂:
NCSI 协议文档仅有英文版本,阅读需耗费大量精力,且容易对部分章节产生误解。
为保证高质量交付,我将目光投向了当下热门的 AI 辅助编码能力,期望借助大模型的力量辅助完成这项开发工作。
重复模式分析:抓住“可自动化”的核心
当前 AI 辅助编码能力尚未能完全替代人工手写,盲目让 AI 独立编写代码只会适得其反。因此,首要任务是对代码结构与功能模块进行分析,识别出适合 AI 发挥作用的场景。
1. 协议文档理解和命令字提取
经过多年迭代优化,当前大模型对自然语言的理解效率极高,尤其在英文文档理解方面表现突出,因此可通过大模型提取 NCSI 命令字的请求体和响应体封装格式。
2. 编写命令处理函数
为避免大模型自由发挥,预设协议请求和响应体函数格式能更有效地引导其生成所需代码。同时,为与 openUBMC 社区编码风格保持一致,可将已有代码作为上下文传递给大模型作为参考。
对于操作日志记录等 BMC 专有的要求,也可通过模板提供给大模型,要求其在所有设置类命令字函数中添加操作日志记录。
3. 编写测试用例,保证生成代码符合协议要求
为了保证生成代码的质量,利用openUBMC社区UT框架可以快速验证生成代码是否正确。同样,测试代码也可以利用大模型生成。
由于 NCSI 通讯采用二进制格式,利用大模型对协议的理解能力,可快速推导所需测试数据,省去手动编写二进制数据的繁琐过程。
编码实战:Prompt模板实用技巧
在工具选型上,采用 GPT-4.1 与 Cursor 组合。经过多轮实践,总结出一套高效 Prompt 模板,现分享如下。
实战成果:
- 自动生成80+个函数与测试用例,准确率超90%,UT覆盖率达86%以上。
- 整体开发效率提升65%,累计节省30+人天。
- 代码风格与社区通用规范一致,顺利通过 SIG Committer 审核。
知识背景设置:
得益于 Cursor 强大的上下文感知机制,同一仓库内的代码文件会被自动纳入大模型的分析范围,开发者无需额外配置 Lua 语法和编码风格。不过,由于 NCSI 协议文档不属于仓库内置文件,需单独处理。
值得一提的是,Cursor 支持将完整协议文档作为知识库集成到上下文环境中。笔者已将公开的 NCSI 协议文档导入 Cursor,为后续命令字解析工作提供了坚实的理论依据。
模板编写:
将任务拆解为多步骤,通过迭代式生成与问答交互,可进一步提升代码生成准确性。
我将任务分成三步,并编写了对应的Prompt:
1.生成NCSI命令字的响应和解析函数。
2.针对生成的函数,生成对应的UT函数和测试数据。
3.优化所有新增代码。
Prompt示例1:生成新函数
请基于以下现有代码模式,为新的NCSI命令 [COMMAND_NAME] 生成相应的函数: 参考的头文件定义: 命令类型宏定义:参考 test-main/ncsi 路径下头文件中的命令常量 包结构定义:参考头文件中的请求/响应结构体定义 长度宏定义:参考头文件中的 *_REQ_LEN、*_RSP_LEN、*_PAD_LEN 等宏 现有模式: function ncsi_cmd.ncsi_enable_channel(package_id, channel_id, eth_name) 要求: 1. 函数名为 ncsi_[COMMAND_NAME] 2. 参数为 package_id, channel_id, eth_name 3. 包含相同的参数验证逻辑 4. 调用对应的模块函数 5. 返回相同的错误码Prompt示例2: 测试用例生成
请基于以下测试模式,为 [MODULE_NAME] 模块生成完整的测试用例: 现有测试模式: function TestNCSIBroadcastFilter:test_enable_broadcast_filter() 要求: 1. 为 [MODULE_NAME] 创建测试类 TestNCSI[MODULE_NAME] 2. 包含 setUp 和 tearDown 方法 3. 为每个公共函数生成测试用例 4. 包含成功和失败场景测试 5. 验证请求报文格式 6. 包含边界条件测试 请生成完整的测试文件。Prompt示例3: 代码优化
代码优化建议 分析 src/lualib/ncsi/ncsi_protocol/ 目录下的代码, 识别可以进一步优化的重复模式。 当前已优化的模式: 1. 使用 handle_channel_operation 通用函数 2. 使用 ncsi_utils.create_custom_cmd_table 3. 使用命令表模式 请分析还有哪些重复代码可以进一步优化, 并提供具体的优化方案和代码实现。高效 Prompt 编写技巧总结
最后,给大家分享一些我自己总结的有效Prompt编写技巧:
总结
尽管目前无法实现 “一键生成完整代码”,但大模型在研发辅助中仍具较高实用价值。这种新型开发模式有望颠覆传统开发流程,为 BMC、固件领域带来革新性体验。
期待在 openUBMC 社区看到更多 AI 辅助编码实践,激发更多创新思路。欢迎开发者分享经验、交流见解,共同探索 AI 辅助编码的无限可能。
欢迎关注我们
社区官网:https://www.openubmc.cn
代码仓地址:https://gitcode.com/openUBMC/network_adapter
