地平线官方最近推出了OE Agent"天工",一个基于大模型的AI助手,能辅助写代码、查文档、排错。我试用了一段时间,发现对新手很友好,老手也能省不少查文档的时间。这篇把天工的安装、使用场景和实际体验记下来,后面想用的同学可以参考。
一、天工是什么
天工是地平线基于大模型开发的AI Agent,专门面向征程系列芯片的开发者。主要功能:
1. 代码生成:根据自然语言描述生成征程6相关的代码(如UCP调用、模型推理、ISP配置)
2. 文档查询:直接问问题,天工从官方文档里找答案
3. 错误诊断:把报错信息贴给天工,它会分析可能的原因和解决方案
4. API解释:解释某个API的参数、返回值和使用示例
二、安装与配置
天工有两个版本:云端版和本地部署版。
云端版(推荐新手)
直接用浏览器访问地平线开发者社区,在右下角有AI助手入口。不用安装,注册账号就能用。
本地部署版(推荐老手/隐私敏感场景)
```bash
# 克隆OE-Skills仓库
git clone https://github.com/HorizonRobotics/OE-Skills.git
cd OE-Skills
# 安装依赖
pip install -r requirements.txt
# 配置API Key(需要地平线开发者账号)
export HORIZON_API_KEY="your_api_key"
# 启动本地服务
python server.py --port 8080
```
本地部署的好处是数据不上传云端,适合处理敏感代码。但需要自己的API Key,而且模型能力受限于服务器配置。
三、实际使用场景
场景1:快速生成UCP代码
以前写UCP代码要翻半天文档,现在直接问天工:
```
用户:写一个征程6的UCP图像分类代码,输入640x640 RGB
天工输出:
#include "hb_ucp.h"
#include "hb_dnn.h"
int main() {
// 初始化UCP
hbUCPHandle_t ucp_handle;
hbUCPInit(&ucp_handle, "nash-e");
// 加载模型
hbDNNHandle_t model;
hbDNNLoadFromFile("model.hbm", &model);
// 准备输入
hbUCPImage_t input;
input.data = rgb_buffer;
input.width = 640;
input.height = 640;
input.format = HB_UCP_IMAGE_RGB;
// 推理
hbDNNTaskHandle_t task;
hbDNNInfer(&task, model, &input, 1);
hbDNNWait(task);
// 获取输出
float* output;
hbDNNGetOutput(task, 0, (void**)&output);
// 清理
hbDNNReleaseTask(task);
hbDNNUnload(model);
hbUCPDeinit(ucp_handle);
return 0;
}
```
代码框架基本正确,但细节(如错误处理、内存分配)需要人工补充。省了不少查API文档的时间。
场景2:报错诊断
编译时遇到HB_DNN_LAYOUT_MISMATCH报错,把完整报错贴给天工:
```
用户:hb_mapper编译通过,但板端加载报HB_DNN_LAYOUT_MISMATCH,怎么排查?
天工输出:
HB_DNN_LAYOUT_MISMATCH通常由以下原因导致:
1. hb_mapper版本和板端OE版本不匹配
- 检查:hb_mapper --version 和 cat /opt/horizon/version
- 解决:确保两者版本一致
2. march参数错误
- 检查:hb_mapper配置里的march是否为"nash-e"
- 解决:征程6用nash-e,不是bernoulli2
3. 输入layout不匹配
- 检查:模型编译时的input_layout和板端代码里的实际layout是否一致
- 解决:统一用NCHW或NHWC
```
诊断思路基本正确,但第3条在我的案例里不是根因。实际原因是第1条(版本不匹配)。天工给了一个排查checklist,帮我快速定位了问题。
场景3:API用法查询
忘记hbDNNGetOutput的参数顺序,直接问天工:
```
用户:hbDNNGetOutput的参数是什么?
天工输出:
hbDNNGetOutput(hbDNNTaskHandle_t task_handle, int output_index, void** output_data);
参数说明:
- task_handle: DNN任务句柄,由hbDNNInfer生成
- output_index: 输出索引,从0开始
- output_data: 输出数据指针的指针,函数会把输出数据地址写入这里
返回值:
- 0: 成功
- 非0: 错误码,可用hbDNNGetErrorString查询
示例:
float* output;
int ret = hbDNNGetOutput(task, 0, (void**)&output);
if (ret != 0) {
printf("GetOutput failed: %s\n", hbDNNGetErrorString(ret));
}
```
比翻PDF文档快多了。
四、天工的局限性
用了这段时间,也发现几个不足:
1. 代码不完整:生成的代码是框架级别的,缺少错误处理、内存管理、多线程等工程化细节
2. 版本滞后:天工的知识库更新有延迟,OE 3.5.0+的新特性可能还没收录
3. 复杂问题诊断能力有限:对于跨模块的复杂bug(如VIN+ISP+BPU协同问题),天工给的排查建议比较笼统
4. 代码隐私:云端版会把代码上传到地平线服务器,处理敏感代码时建议用本地部署版
五、使用建议
场景 推荐用法 注意事项
快速查API 云端版 简单问题直接问
生成代码框架 本地版 生成后人工review补充
报错排查 云端版 结合官方文档交叉验证
学习新特性 官方文档+天工 天工做引导,文档做细节
六、顺便提一嘴
· 天工的本地部署版需要Node.js >= v22(参考社区经验:Node.js v18跑不起来,要手动升级到v22)。
· 天工不是万能的,它更像一个"智能文档助手",帮你快速找到答案,但最终的代码质量和工程化还是要靠开发者自己把控。
· 地平线社区正在持续优化天工,建议定期更新OE-Skills仓库,获取最新能力。
数据来源:本文OE Agent天工使用体验参考地平线开发者社区官方OE-Skills仓库(https://github.com/HorizonRobotics/OE-Skills)及社区博客《OE Agent天工|赋能地平线征程系列》。
