背景
在HZERO PaaS平台的AIP(AI Platform)模块中,Agent词典是AI智能体理解业务语义的关键组件。词典中的每个条目会被同步到向量数据库和ElasticSearch中,供Agent在对话时进行语义匹配。
某天在HZERO开发环境中,发现词典「对象使用方式」(编码:HMDE.BUSINESS_OBJECT.USE_TYPE)下的三个条目(CREATE、MODIFY、MATCHING)全部显示「(向量)同步失败」,而ES同步正常。向量同步时间停留在很久以前,ES同步时间则是刚刚更新的。
本文记录了使用OpenClaw(AI运维助手)从发现问题到定位根因、修复验证的完整过程。
问题现象
| 条目 | 向量状态 | 向量同步时间 | ES同步时间 |
|---|---|---|---|
| CREATE | 🔴 同步失败 | 2025-06-03 08:00:00 | 2026-07-04 12:35:25 |
| MODIFY | 🔴 同步失败 | 2025-06-03 08:00:00 | 2026-07-04 12:35:25 |
| MATCHING | 🔴 同步失败 | 2025-06-03 08:00:00 | 2026-07-04 12:35:25 |
关键观察点:
- 界面显示「向量库集合:
haip_dictionary_value_0(已加载)」,看似配置正常 - ES同步完全正常,只有向量同步失败
- 三个条目同时失败,不是个别数据问题
排查过程
第一步:检查服务状态
首先确认AIP相关服务是否正常运行:
docker ps --filter name=hzero-aip --format "table {{.Names}} {{.Status}}"
结果:hzero-aip-server 和 hzero-aip-app 均正常运行,排除服务宕机问题。
第二步:查看服务日志
检查AIP服务最近1小时的日志,过滤向量同步相关错误:
docker logs hzero-aip-server --since 1h 2>&1 | grep -iE "vector|向量|sync.*fail|embedding.*error" | tail -30
立刻发现大量重复错误:
ERROR - Unexpected exception occurred invoking async method:
DictionaryVectorRepositoryImpl.remove()
java.lang.IllegalArgumentException: collectionName is blank
at CollectionRequest$Builder.build(CollectionRequest.java:87)
at VectorDb.exists(VectorDb.java:125)
at VectorDb.deleteByCondition(VectorDb.java:256)
at DictionaryVectorRepositoryImpl.remove(DictionaryVectorRepositoryImpl.java:189)
核心错误:collectionName is blank — 向量集合名称为空。
第三步:检查数据库配置
错误明确指向集合名称为空,直接查数据库确认:
SELECT dictionary_id, dictionary_code, collection_name, sync_type
FROM hzero_aip.haip_aigc_dictionary;
结果:
| dictionary_id | dictionary_code | collection_name | 状态 |
|---|---|---|---|
| 2 | HMDE.BUSINESS_OBJECT.USE_TYPE | (空) | 🔴 问题所在 |
| 3 | LOWCODE.DOMAIN | (空) | 🔴 同样有问题 |
| 7 | HAIP.APPLICATION_LINK | haip_dictionary_value_0 | ✅ 正常 |
根因确认:词典ID 2和3的 collection_name 字段为空,而词典ID 7有值且正常。
第四步:分析为何界面显示正常但实际失败
这里有一个容易误导的点:界面上明明显示「向量库集合:haip_dictionary_value_0(已加载)」,为什么数据库里是空的?
通过进一步分析日志,发现同步流程分为两个阶段:
- remove阶段(清理旧向量):直接读取Dictionary实体的
collection_name字段 → 为空 → 抛collectionName is blank异常 → 失败 - doSync阶段(写入新向量):通过其他途径(可能是全局配置或Redis缓存)获取到了集合名
haip_dictionary_value_0→ ES操作实际执行 → 成功
由于同步流程是「先remove → 后doSync」,remove阶段失败导致整个同步任务被标记为「失败」,尽管后续doSync的ES操作实际已执行。
界面显示的集合名来自运行时全局配置,而非该词典的 collection_name 字段,因此看起来「正常」。
根因总结
| 层面 | 说明 |
|---|---|
| 直接原因 | haip_aigc_dictionary 表中部分词典的 collection_name 字段为空 |
| 触发条件 | 向量同步时 remove 阶段直接使用该字段,为空即抛 IllegalArgumentException |
| 误导因素 | 界面通过全局配置显示集合名,掩盖了字段为空的事实 |
| 影响范围 | dictionary_id=2(对象使用方式)和 dictionary_id=3(低代码领域) |
修复方案与执行
修复SQL
UPDATE hzero_aip.haip_aigc_dictionary
SET collection_name = 'haip_dictionary_value_0'
WHERE dictionary_id IN (2, 3);
完整修复步骤
1. 执行SQL补全字段
docker exec mysql-hzero mysql -uhzero -phzero -e "
UPDATE hzero_aip.haip_aigc_dictionary
SET collection_name = 'haip_dictionary_value_0'
WHERE dictionary_id IN (2, 3);"
2. 清除Redis向量集合缓存
docker exec redis-hzero redis-cli -n 1 DEL "haip:config:vector:collection:DEFAULT_ES" "haip:config:vector:collection:DEFAULT" "haip:config:vector:database" "haip:config:vector:database:last-updated-time"
3. 重启AIP服务
docker restart hzero-aip-server
4. 界面重新触发向量同步
在HZERO AIP → Agent词典 → 对象使用方式 → 数据同步 → 向量同步
结果:三个条目全部显示「已同步」✅
OpenClaw运维价值体现
这个问题如果纯人工排查,典型流程是:看界面 → 查日志(在大量日志中找关键错误)→ 理解Java调用栈 → 关联数据库配置 → 发现字段为空 → 分析为何界面显示与实际不符。整个过程至少30-60分钟。
使用OpenClaw的排查过程:
| 步骤 | 操作 | 耗时 |
|---|---|---|
| 1. 服务状态检查 | docker ps 确认服务运行 | ~5秒 |
| 2. 日志错误提取 | grep 过滤关键错误,定位异常堆栈 | ~10秒 |
| 3. 数据库验证 | SQL查询确认 collection_name 为空 | ~5秒 |
| 4. 根因确认 | 分析调用链,解释界面与实际不一致的原因 | ~10秒 |
| 5. 修复执行 | SQL + Redis缓存清除 + 服务重启 | ~30秒 |
| 6. 验证 | 用户界面触发同步,确认成功 | ~1分钟 |
从问题报告到修复完成,全程约3分钟。OpenClaw的核心价值在于:
- 快速定位:自动执行服务检查 → 日志分析 → 数据库验证的完整诊断链路
- 准确分析:理解Java异常堆栈,关联数据库配置,解释表面现象与根因的差异
- 安全修复:执行精确的SQL修复,清除相关缓存,重启服务,全流程闭环
- 知识沉淀:问题分析过程自动记录到工作日志,便于后续回顾
经验总结
- 界面显示 ≠ 数据库实际值:HZERO很多界面字段来自运行时全局配置或缓存,不直接反映数据库字段值。排查问题时要以数据库为准。
- 同步流程是多阶段的:向量同步包含 remove → doSync 两个阶段,任一阶段失败都会标记整体失败。看日志要关注失败发生在哪个阶段。
- Redis缓存是常见陷阱:修改数据库后必须清除对应Redis缓存,否则服务可能仍读取旧值。这次修复也包含了缓存清除步骤。
- collection_name 是关键配置:HZERO AIP的向量同步依赖此字段,初始化环境时应确保所有词典都有正确的集合名。
环境信息
- 平台:HZERO PaaS + AIP 1.6.1.ALPHA.6.13
- 向量数据库:ElasticSearch(作为向量存储后端)
- 缓存:Redis DB 1
- 部署方式:Docker 容器化
- 运维工具:OpenClaw AI运维助手
视频信息
视频演示
OpenClaw排查HZERO Agent词典向量同步问题全过程:
视频地址:https://www.bilibili.com/video/BV1uxMw6kEwG