同步调用 · 拿到结果才进下一步
异步事件 · 业务已受理,后续继续跑
本次新增
现有平台
用户接入层 · Vue 3 + Cesium
浏览器前端静态资源
三维地图圈选 · 自然语言输入 · 计划与确认界面 · SSE 客户端
网关基础设施层
前端经网关访问后端;日志、监控、密钥与网络都在这一层
POST /plans · POST /plans/{planId}/confirm · GET /tasks/{taskId} · GET /tasks/{taskId}/events(SSE)
Copilot 应用 · 独立 Spring Boot 模块化单体
业务应用层管权限、规则与业务接口,AI 能力层管理解与编排;两层初期同进程部署,代码包与职责仍分开。
会话与权限
校验请求格式与登录身份,加载会话上下文
意图与编排
Spring AI ChatClient · 工具调用 · RAG 检索 · 结构化输出校验
工具适配器
把设备、空域、航线、任务包成有契约的业务接口
草稿与确认
保存草稿及版本;确认时重查权限、空域与执行条件
模型服务层
- 对话模型
- Embedding 模型
- 视觉模型
- 外部推理端点
- API Key 只在服务端
Spring AI 是 Java 应用调用模型的抽象,模型服务层是实际提供推理的端点,两者不是一回事;Spring AI Alibaba 只在确有需要时经适配层引入。
同步工具调用:查可用性 → 校验空域 → 生成航线 → 校验规划结果 → 保存草稿
现有业务服务 · 权威操作,不为接 AI 而合并
设备服务
无人机、载荷、在线状态与可用性
空域服务
禁飞区、限飞区、授权与飞行约束
航线服务
生成航线、检查参数与约束
任务服务
创建任务、维护状态机、下发
遥测与告警
飞行状态、视觉告警、异常事件
报告服务
汇总任务、航迹、告警与影像
事件流:任务下发 → 遥测与告警回传 → 状态更新 → 完成事件
无人机与机场 · 真实设备
沿用平台既有的设备接入与遥测回传链路。Copilot 不直接操纵设备,起飞由任务服务在校验与确认之后驱动。
数据层 · 不同类型的数据交给合适的存储
- PostgreSQL
会话元数据、任务草稿与版本、正式任务、审计、Outbox(唯一权威状态) - Redis
会话短期状态、热点缓存、幂等键、限流(会过期,不是任务状态的最终依据) - RocketMQ
任务执行、遥测处理、告警、报告生成事件(不当实时查询库用) - Milvus
手册、规则、历史案例的向量(召回只作参考,不判断设备是否在线) - MinIO
图片、视频、报告附件(对象键与采集时间存在 PG) - 基础设施层
Java 21 运行环境、容器、网关、日志、监控、密钥与网络(不实现业务逻辑)
异步链路 · 用户点确认之后怎么跑
- 任务状态变更与待发布事件写进同一个 PG 事务(
outbox_event) - Outbox 再发到 RocketMQ——事务与发消息不是同一个原子操作,靠可靠重试 + 幂等消费兜住
- 执行消费者调现有任务服务与设备控制链路下发
- 遥测与告警产生事件,消费者回写任务状态
- 任务结束发布完成事件,报告服务汇总生成
- Copilot 用 SSE 推状态、告警与报告进度
系统边界
- 模型给的是计划,不是已批准的飞行指令;权限、空域、航线一律由业务服务校验。
- 权威状态只有一处:PG 里的任务记录。Redis 会过期,SSE 只是通道、不保存状态。
- 向量召回不能替代实时空域查询;RAG 文档与工具返回都按待验证数据处理。
模型超时或不可用返回明确的规划失败状态,不自动执行。
设备/空域服务超时标记待重试或失败,不把「未查询到」当成「没有限制」。
MQ 积压或重复投递按事件 ID 或业务幂等键去重;积压期间任务状态不变。
SSE 断开用任务查询接口恢复状态,必要时按事件 ID 补取。