Skip to content

系统总体架构

架构哲学

前后端分离 + GraphRAG 中台 + 多模态供应商池 —— 三层架构、单机部署、零外部依赖。

整体架构图

海域智舱系统总体架构图

整体分为三层

  • 前端层:React 19 + Vite 6 + PWA,6 个核心页面
  • 服务层:Go net/http 中台,6 个核心模块(含 GraphRAG 引擎)
  • 基础设施层:SQLite + 知识图谱存储 + 多模态供应商池

三层架构详解

Layer 1: 浏览器层

模块技术职责
UI 框架React 19 + Tailwind组件渲染、样式
构建工具Vite 6HMR + 生产构建
路由React RouterSPA 路由
状态管理React State + localStorage简单可控
持久化IndexedDB大文件 + 长会话
PWAvite-plugin-pwa离线缓存

浏览器层亮点

  • 图片直连:浏览器直接调用 Gemini / OpenAI 图片接口,节省服务端带宽
  • PWA 离线:Service Worker 注册,Lighthouse PWA 90 分
  • 海量历史:IndexedDB 承载 GB 级图片,千张级历史秒级加载

Layer 2: Go 后端中台

模块实现职责
HTTP Servernet/http 标准库路由分发
认证HttpOnly Cookie + Session登录态
鉴权RBAC 中间件角色权限
配额行级事务 + reaper goroutine三类配额扣减 + 失败回滚
GraphRAG实体抽取 + 子图召回核心创新模块
模型路由priority + weight 加权随机多供应商调度
日志request_logs 表审计链

后端架构亮点

  • 零外部依赖:纯 Go 实现,仅依赖 SQLite 单文件
  • 单二进制:交叉编译后 ≤ 30MB,可放 U 盘演示
  • 启动迁移:自动执行 migrations/*.sql,零运维

Layer 3: 数据 + 供应商层

子层实现职责
关系型数据SQLite (modernc.org/sqlite)用户、会话、配额、日志
知识图谱复用 SQLite + 1024 维向量GraphRAG 实体 + 关系
多模态供应商HTTP 客户端 + 路由Gemini / OpenAI / Veo

数据流向

流向 1:图片生成(直连模式)

图片生成调用流程

两段式协议

text
浏览器 ──[1] POST /api/generate/image/prepare──→ Go 后端
              ↑                                      │
              │                                      ▼
              │                              ┌──────────┐
              │                              │ 配额预扣  │
              │                              │ 写 pending│
              │                              └────┬─────┘
              │                                   │
        [2] 返回供应商配置                         │
              ←──────────────────────────────────  │
              │                                   │
              │                                   │
              ▼                                   │
       Gemini / OpenAI                            │
              │                                   │
              │ [3] 直连调用图片接口                │
              ↓                                   │
       生成图片(Blob)                            │
              │                                   │
              ├──[4] POST /api/generate/image/complete──→ Go 后端
              │                                   ↓
              │                              ┌──────────┐
              │                              │ 扣次/回滚 │
              │                              │ 改日志   │
              │                              └──────────┘

流向 2:文案 / 视频(代理模式)

text
浏览器 ──[1] POST /api/generate/copy──→ Go 后端
              ↑                              │
              │                              ▼
              │                        ┌──────────────┐
              │                        │ GraphRAG 注入│
              │                        │ Prompt 模板  │
              │                        └──────┬───────┘
              │                               │
              │                               ▼
              │                        ┌──────────────┐
              │                        │ 调用 GPT 5.5 │
              │                        └──────┬───────┘
              │                               │
              │ [2] 流式返回 token             │
              ←───────────────────────────────┘

              ├──[3] 完成后扣次(无需 complete 接口)

        前端展示

为什么图片直连,文案代理?

方面图片文案
数据大小MB 级(Blob)KB 级(文本)
服务端转发成本高(占带宽)
上下文管理无状态多轮对话
GraphRAG 注入提示词层System Prompt 层
配额扣减预扣 + 回滚同步扣减

→ 图片直连节省带宽,文案代理便于流式输出与上下文管理。

流向 3:GraphRAG 知识图谱

text
用户输入商品 ──→ Go 后端


            ┌──────────────────┐
            │ 实体抽取 LLM     │
            │ (Gemini 3 Pro)   │
            └──────┬───────────┘


            ┌──────────────────┐
            │ 关系建模         │
            │ + 1024 维向量    │
            └──────┬───────────┘


            ┌──────────────────┐
            │ kg_entities      │
            │ kg_relations     │ ← SQLite
            └──────┬───────────┘

                   │ 后续生成任务

            ┌──────────────────┐
            │ 子图召回         │
            │ + Prompt 注入   │
            └──────────────────┘

🔗 查看 GraphRAG 完整原理 →

端口与协议

服务端口协议
前端 Dev:3000HTTP(Vite)
后端 API:8788HTTP / HTTPS
前端代理/api/*:8788Vite 代理
生产部署单端口 :8788Go 后端托管前端静态文件

关键设计决策

1. 为什么 Go + SQLite?

决策理由

候选优势劣势决策
Node.js + Postgres生态丰富依赖多、部署重
Python + RedisAI 生态完整GIL 性能瓶颈
Java + MySQL企业级JVM 启动慢、内存大
Go + SQLite单二进制 + 单文件生态相对小

比赛展示场景核心需求是"git clone + 一行命令启动",Go + SQLite 完美契合。

2. 为什么图片直连?

  • 节省带宽:图片大文件不经过我们的服务器(节省 60% 带宽成本)
  • 降低延迟:浏览器直接到 CDN 边缘节点
  • 可靠性:失败时通过 prepare/complete 两段式协议保证配额一致性

3. 为什么 PWA + IndexedDB?

  • 离线访问:地铁、咖啡馆等弱网环境也可查看历史
  • 海量存储:IndexedDB GB 级容量,远超 localStorage 5MB
  • 性能:异步 API 不阻塞 UI

部署形态

海域智舱单机部署拓扑图

双模式启动

text
开发环境(双端口)
  npm run dev
  ├── Vite (:3000) ──/api 代理──→ Go (:8788)
  └── Hot Reload + Source Map

生产环境(单端口)
  npm run build && npm run start
  └── Go (:8788)
       ├── 托管 frontend/dist 静态文件
       └── 处理 /api/* 接口

性能指标

指标数值说明
/api/me P95 延迟38 msGo 单进程,无 ORM
100 并发 Apache Bench全部 < 100ms单 SQLite 写读
Listing 生成耗时平均 8.4sGPT-5.5 网络抖动
主图生成耗时平均 14sGemini 3 Pro Image
GraphRAG 子图召回< 60ms1 万节点规模
前端 gzip 大小612 KBVite 6 优化
Lighthouse PWA90 分已注册 SW

下一步

基于 MIT 协议开源 · 中国大学生计算机设计大赛软件应用与开发类作品