利用大模型AI辅助研发快速实现openUBMC的NCSI协议命令字解析

利用大模型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