字节 AI 全栈挑战赛课题 — 覆盖「数据生产 → AI 预审 → 人工审核 → 多格式导出」全生命周期的 Web 数据标注平台。
评委友好链接:
submission/— 评委交付包(完整 walkthrough、演示视频脚本、截图)docs/ARCHITECTURE.md— 架构图与决策表docs/DEPLOY.md— 单机部署 SOPdocs/openapi.yaml·docs/LabelHub.postman_collection.json— API 契约与请求集submission/CODE-REVIEW-FINAL.md— 交付前 4 路并行 code review 汇总
已部署在线 demo,无需本地搭建,打开即用:
http://43.155.210.70 — 用下方演示账号登录(如
owner1/123456)
想本地完整跑(改代码、看 AI worker、换真实豆包 key)见下方「快速启动」。
多格式导出 — 8 格式(含 SFT / DPO 训练格式,直达模型微调)+ DPO 偏好对字段映射
| 可视化模板 Designer 拖拽物料 / 字段联动 / 多 Tab 嵌套 ![]() |
Owner 任务管理 全生命周期 + 统计卡 + 状态筛选 ![]() |
|---|---|
| Labeler 作答工作台 多物料 + Tabs + 草稿自动保存 ![]() |
Reviewer + AI 预审结论 verdict / 维度评分 / 审计时间线 ![]() |
截图为 1920×1080;1280×800 版本见
submission/assets/screenshots/。
# 前置: Docker Desktop / Colima、Go 1.22+、Node 24+、pnpm 10+
# 0. 复制环境文件(默认 LLM_PROVIDER=mock,无需真实豆包 key)
cp .env.example .env
# 1. 一键起基础设施 + 装依赖 + seed
make dev
# 2. 三个终端分别跑长进程
make api # 终端 A — http://localhost:8080/health
make worker # 终端 B — AI 预审 worker
make web # 终端 C — http://localhost:5173若本机 :8080 被占用:API_PORT=18080 make api 起 API,再 VITE_API_PROXY_TARGET=http://localhost:18080 make web 起前端。
make seed 会创建以下账号(密码均为 123456):
| 用户名 | 角色 | 用途 |
|---|---|---|
owner1 |
Owner | 任务/模板/AI Prompt/Golden Sample 配置 |
labeler1 |
Labeler | 任务广场领题、作答、提交 |
reviewer1 · reviewer2 |
Reviewer | 审核队列、AI verdict、两级独立复核(初审 + 终审需不同审核员) |
system_ai |
System | AI 预审 Agent(后台,不需登录) |
- 浏览器打开 demo(在线 http://43.155.210.70 或本地 http://localhost:5173)→ 登
owner1/123456 - 进 Owner Dashboard → 选官方
qa_quality任务 → 看模板/AI Prompt/Golden Sample/Stats Board(官方任务 seed 后已启用 AI review) - 退出登
labeler1/123456→ 任务广场 → 领取一题 → 作答并提交,触发 AI 预审 - 退出登
reviewer1/123456→ 审核队列 → 看 AI verdict + 维度评分 → 初审通过;再登reviewer2做终审(两级独立,需不同审核员)→ 定稿 - 回
owner1→ 导出(JSON/JSONL/CSV/XLSX/Markdown/COCO/SFT/DPO 任选,SFT/DPO 直达模型微调)→ 下载
完整 walkthrough 见 submission/ 交付包。
apps/web React 18 + TypeScript(strict)+ Semi Design(单一 SPA,角色路由)
apps/api Go + Gin + GORM REST API(:8080)
apps/ai-worker Go + Asynq AI 预审 Worker(豆包 Function Calling)
pkg/exporter 共享多格式导出器(JSON / JSONL / CSV / XLSX / Markdown / COCO / SFT / DPO)
pkg/llmreview 共享 LLM provider(mock / OpenAI-compatible / 豆包)
| 基础设施 | 端口 |
|---|---|
| MySQL 8 | localhost:13306(user=labelhub, pass=labelhub_dev) |
| Redis 7 | localhost:6379 |
| Adminer(DB GUI) | http://localhost:18080 |
| Asynqmon(queue 监控,ops profile) | http://localhost:18081 |
完整架构图与设计决策见 docs/ARCHITECTURE.md。
- 状态机驱动 — 任务 4 态 + 提交 7 态,所有跃迁走
internal/statemachine.Transitions(),100% 单测覆盖,违法事件直接 reject - Outbox 一致性 — 业务事务同写
outbox_events,后台 publisher 用FOR UPDATE SKIP LOCKED+ deterministic Asynq TaskID 防双投 - AI 预审幂等 — Worker
complete()/failover()双锁 +RowsAffected != 1守每个状态跃迁,保证 5xx 重试不破坏状态 - 熔断 + 限流 — Provider 5xx 连续 20 次/5 分钟自动熔断,dry-run 走 task-scoped quota,登录走 IP token bucket
- 导出直达训练管线 — 除 JSON/JSONL/CSV/XLSX/Markdown/COCO 外,新增 SFT(OpenAI Chat 微调
messages)与 DPO(偏好对prompt/chosen/rejected,自preference_compare任务推导)导出,内联质量溯源 metadata(AI 分数 / 人工结论),标注产物可直接喂模型微调 - AI prompt 快照 + 配置漂移 — 每条预审落库「AI 实际看到的 prompt 全文」
prompt_snapshot+ sha256 指纹(与发送给 LLM 的buildMessages同源,保证快照即真相);审核台展示渲染后快照,并在该预审所用 prompt 配置已非任务当前生效版本时标「配置漂移」,审核员可判断结论是否基于旧配置 - Schema 破坏性变更检测 —
internal/schemadiff递归比对模板版本间字段变更(穿透 Group/Tabs 嵌套),分级 safe / warning / breaking(删字段、改控件、加必填、删选项…);Owner 保存新版本前「兼容性检查」预知改动是否让历史标注失效 - 类型契约 —
docs/openapi.yaml是真相源,pnpm -F web gen:api生成schema.d.ts,前端 TypeScript strict mode + 0 个any - 测试纪律 — testcontainers 真 MySQL+Redis 集成测试覆盖主链路(submit→outbox→Redis→AI→review→export);CI 跑 Go workspace + web test+lint+build + 独立
-tags=integrationjob - 首屏性能 — VChart 通过
React.lazy+ Vite vendor split,首屏 eager vendor 从 2.2MB(gzip 616KB)降到 412KB(gzip 125KB) - 大数据量压测 + 虚拟滚动(线上实测) — 单任务导入 5000 题:
import-file5.4s、publish0.24s、GET labeler/items(全量 5000 行 ≈468KB)0.7s、领题/打开题目 0.2–0.4s,API 侧均无瓶颈。压测发现题目导航原为全量渲染(5000 题 → DOM ~20K 节点、4× 节流首屏 Layout 220ms + Style 重算 237ms,有可感卡顿),已落地定高虚拟滚动(ItemNav仅渲染视口内行 + overscan):渲染行数由视口决定、与题目总数解耦(实测视口 120px 仅渲染 11 行,5000 题同视口约 18 行),切题自动滚入视口;核心区间逻辑visibleRange纯函数单测覆盖(ItemNav.test.tsx) - 编辑级 UI 系统 — 自建 Editorial design tokens(serif headings + 7 态 status + skeleton/top-progress),非套模板默认
- A11y — Tabs 完整 ARIA
tablist/tab/tabpanel+ auto-jump first error tab,全局:focus-visiblering,LabelerCtrl/Cmd+Enter提交快捷键
make dev # 一键起基础设施 + 装依赖 + seed
make up / down # 起/停基础设施
make install # 装 pnpm + Go 依赖
make seed # 初始化两个官方任务(qa_quality 30 条 + preference_compare 12 条)
make api # 跑 API
make worker # 跑 AI worker
make web # 跑前端
# 测试
go test ./apps/api/... ./apps/ai-worker/... ./pkg/...
pnpm -F web test # vitest
pnpm -F web lint # eslint
pnpm -F web build # 类型检查 + 打包
# 集成测试(需 Docker)
go test -tags=integration ./apps/api/internal/integration -count=1
# 生产部署
docker compose -f deploy/docker-compose.prod.yml --env-file deploy/.env.example up -d.
├── apps/
│ ├── web/ React 前端(单一 SPA,角色路由)
│ ├── api/ Gin REST API(handler / service / model)
│ └── ai-worker/ Asynq AI 预审 worker
├── pkg/
│ ├── exporter/ JSON / JSONL / CSV / XLSX / MD / COCO / SFT / DPO 导出器
│ └── llmreview/ LLM provider(mock + OpenAI-compatible)
├── tools/seed/ 官方数据集(qa_quality + preference_compare)+ 模板
├── deploy/ 生产 docker-compose + Caddyfile + Dockerfile
├── docs/ 架构 / 部署 / API / Code Review / CHANGELOG
├── submission/ 评委交付包
└── .github/workflows/ CI(单测 + 集成测试)




