Q: 简单介绍一下这个项目
这是一个面向离散制造业的虚拟路径MES(制造执行系统),基于微服务架构设计,支持 2000+ 设备并发连接。覆盖了生产工单管理、工艺参数配置、质量检验追溯、设备实时监控、AI 智能预测、AI Agent 生产助理、生产报表统计等核心业务模块。
Q: 技术栈是怎样的?为什么这么选?
| 层级 | 选型 | 理由 |
|---|---|---|
| 前端 | Vue 3 + TypeScript + Element Plus | 响应式、TypeScript 类型安全、生态成熟 |
| 3D 可视化 | Three.js | 数字孪生场景渲染,设备状态实时映射 |
| 后端 | Spring Boot 3.2 + Spring Cloud 2023 | 微服务治理、服务注册发现、负载均衡 |
| ORM | MyBatis-Plus | 代码生成、Lambda 查询、分页插件 |
| AI Agent | GLM-4 + Function Calling + RAG | 自然语言驱动工业任务编排 |
| 数据库 | MySQL + Redis + InfluxDB | 关系数据 / 缓存 / 时序数据各司其职 |
| 消息队列 | Kafka | 高吞吐设备数据采集(10000+ 条/秒) |
| 设备接入 | .NET 8 + MQTT | 工业协议适配,MQTT 轻量级物联网协议 |
| AI 推理 | Python FastAPI + LightGBM | 质量预测、设备故障预警 |
Q: 微服务怎么划分的?
6 个核心服务:
- mes-gateway (9090) — API 网关,统一路由、鉴权、限流
- mes-auth (8081) — 认证服务,JWT + RBAC 权限控制
- mes-workorder (8082) — 工单服务,工单全生命周期管理
- mes-process (8083) — 工艺服务,工艺模板与参数配置
- mes-quality (8084) — 质量服务,质检记录与追溯
- mes-dashboard (8085) — 看板服务,实时数据聚合与 WebSocket 推送
外加独立部署的 .NET 设备网关 (5000)、Python AI 服务 (8087)、Vue 前端 (3000)。
Q: 这个项目参加了什么比赛?
参加了 GOAI 世界人工智能开源大赛 — Boundless Agents 无界应用赛道,赛题是"AI+工业制造"。
作品在现有 MES 系统上增加了 AI Agent 生产助理,实现了从自然语言到任务执行再到结果反馈的完整闭环。详细作品说明见
docs/COMPETITION.md。核心亮点:
- 不是泛聊天机器人,而是可运行、可演示、可复用的工业 Agent
- 支持多步推理编排(如"查设备→判断温度→创建维修工单")
- RAG 知识库增强(设备手册+质检标准文档检索)
- 工具调用步骤可追溯、前端可视化展开
- 基于真实 MES 系统构建,具备完整业务数据闭环
Q: 比赛文档有哪几个核心部分?
我们准备了专门的
COMPETITION.md,覆盖了大赛要求的所有维度:
要求 对应内容 目标用户与场景痛点 生产班长、维护工程师、物料管理员、车间主任 交互流程 3 个完整 Demo 演示(设备查询、知识检索、多步综合任务) 技术路线 架构图 + Agent 编排流程图 + 工具接口表 数据来源与合规 全部为模拟数据,本地部署,JWT 认证 可运行 Demo 完整前后端可本地部署运行 迭代计划 短期/中期/长期技术演进路线 与评分标准对应 场景真实度/闭环完整性/技术复杂度/可演示性/可复用性
Q: 说说你负责的核心功能
主要负责 mes-dashboard 看板服务、mes-ai-service Agent 服务 和 mes-common 公共模块,涉及:
- 生产线/工位管理 — CRUD + Service 层标准化
- BOM 物料清单 — 嵌套明细管理、物料校验、库存联动
- 设备实时监控 — Kafka 消费、WebSocket 推送、3D 数字孪生
- AI Agent 生产助理 — 工具定义、Agent 编排、RAG 知识库
- 公共基础设施 — 统一异常处理、统一返回格式、实体基类
Q: 遇到过哪些技术难点?怎么解决的?
现象: 创建 → 删除 → 再次创建相同编码的数据,报唯一约束冲突。
排查过程:
- 先查数据库,发现删除操作实际上是
UPDATE SET deleted=1(逻辑删除),数据还在 - 检查发现
BaseEntity的@TableLogic已注释,但application.yml中logic-delete-field: deleted全局配置仍生效,二者打架 - 部分表(
mes_workstation、mes_production_line)的唯一索引只有(code),不包含deleted,导致deleted=1的记录与新插入的deleted=0的记录冲突
解决方案:
- 移除了所有模块
application.yml中的logic-delete-field,统一使用物理删除 - 为所有 create 方法加上
setDeleted(0),所有 list 查询加上.eq(Deleted, 0)过滤 - 补齐 Service 层,消除 Controller 直调 Mapper 的不规范写法
- 统一 CRUD 模式,避免后续 AI 生成代码继续踩坑
现象: BOM 列表查询返回空数据,数据实际存在。
排查过程:
Bom实体类继承BaseEntity,BaseEntity有getVersion()方法- MyBatis-Plus 在映射时混淆了
Bom.version(BOM 版本号)和BaseEntity的version字段 - Lambda 查询条件
Bom::getVersion指向了 BOM 版本号,但 MyBatis-Plus 解析时优先匹配基类
解决方案:
Bom实体中显式重命名 getter 为getBomVersion(),配合@JsonProperty保持前端兼容
现象: 50+ 设备同时渲染时页面卡顿,Three.js 场景加载慢。
解决方案:
- Vite 代码分割:vendor-vue / vendor-ui / vendor-chart / vendor-three 分离,index chunk 从 1810kB 降至 52kB
- Raycaster 优化:只对设备节点做碰撞检测,排除厂房元素
- 锁定帧率,非激活标签页暂停渲染
- HUD 面板与 3D 场景分离渲染,互不阻塞
现象: 用户一句话需要拆成多个步骤,且后一步依赖前一步结果。
方案: 基于 GLM-4 function calling 实现多步推理:
用户: "查 DEV-001 状态,温度高就创建维修工单"
Step 1: get_device_detail("DEV-001") → 温度 68°C
Step 2: 判断 68 > 55 → 需要创建工单
Step 3: create_work_order("DEV-001 高温维修", 1, "HIGH")
Step 4: 汇总结果回复用户
- 使用 GLM-4 的
tools参数定义工具 Schema - 每次返回
tool_calls时自动调用对应函数,结果注入下一轮对话 - 设置
max_iterations=8防止死循环
Q: 为什么从逻辑删除改成物理删除?
因为这个项目没有"回收站"业务需求——数据删除就是真的删除,不需要恢复。逻辑删除反而带来了:
- 唯一约束冲突(create → delete → recreate)
- 所有查询都要手动加
deleted=0- 数据表越积越大
Q: Agent 为什么选择 GLM-4 而不是 LangChain?
- 团队已有 ZhipuAI 的 API Key 和集成经验
- GLM-4 原生支持 function calling,不需要额外框架
- LangChain 引入大量依赖,对比赛作品来说过于重
- 自定义编排逻辑更可控,方便调试和展示每一步执行过程
Q: Docker 只跑基础设施,Java 服务跑在宿主机,为什么这么设计?
调试方便。Java 服务在 IDE 里直接启动可以热部署、断点调试。Docker 只用于 MySQL、Redis、Kafka、EMQX 这些基础设施,统一版本、一键拉起。
Q: 怎么保证团队代码风格统一?
通过 企业标准化:
- 统一实体基类
BaseEntity(ID、时间、删除标记)- 统一返回格式
Result<T>+ 全局异常处理GlobalExceptionHandler- 统一分层:Controller → Service(接口) → ServiceImpl → Mapper
- 统一 CRUD 模板:create 初始化、list 过滤、物理删除
- 在项目根目录维护约束文档,AI 工具每次生成代码会自动遵守规则
Q: Agent 的 RAG 知识库怎么实现的?
轻量级方案——使用关键词检索(Jaccard 相似度)匹配文档,原因:
- 知识库规模小(6 篇文档),不需要向量数据库
- 零外部依赖,pip install 即用
- 可扩展:预留了
knowledge/目录,后续可以接入 ChromaDB 内置文档包括 CNC 操作手册、温度异常处理、质检标准、SPC、工单规范、维护计划
Q: Agent 的 Tool 有哪些?
10 个工具:设备列表、设备详情、工单列表、创建工单、生产线列表、工位列表、BOM 列表、物料列表、库存查询、知识库检索。每个工具对应一个 MES 后端 REST API,通过 httpx 异步调用。
Q: 项目有多少代码量?
Java 后端约 3 万行,前端 Vue/TS 约 2 万行,Python AI 服务约 4000 行(含 Agent 层),.NET 设备网关约 2000 行。
这是一个基于 Spring Cloud 微服务架构、覆盖制造执行全流程、集成 3D 数字孪生、AI 预测和 Agent 智能助手的工业互联网平台,参与了 GOAI 世界人工智能开源大赛,验证了 AI Agent 在工业场景中的落地可行性。