Files
guangdong-red-base/技术实现方案.md

127 KiB
Raw Permalink Blame History

延安精神(大湾区)学习展示中心 — 技术实现方案

本文档将《终极目标导向创新升级方案》中的产品设计和系统架构,转化为可落地的技术架构、技术选型、数据模型和工程实施方案。

编制日期:2026-07-12


一、总体技术架构

1.1 技术分层模型

系统采用六层架构,从下到上依次为基础设施层、数据资产层、AI能力层、公共平台层、应用服务层和用户触达层。

┌──────────────────────────────────────────────────────────────────────┐
│                         用户触达层                                     │
│  线下终端(触屏/VR/环幕/UWB/RFID) │ 线上(Web/小程序/APP) │ 节点终端    │
├──────────────────────────────────────────────────────────────────────┤
│                         应用服务层                                     │
│  F1自适应叙事  F2情境任务  F3文物数字生命  F4成长护照                │
│  F5云上共同体  F6青年共创  F7行动实验室    F8星火节点OS              │
├──────────────────────────────────────────────────────────────────────┤
│                         公共平台层                                     │
│  X1体验编排引擎  X2成长护照档案  X3内容治理中心  S9节点协同           │
├──────────────────────────────────────────────────────────────────────┤
│                         AI能力层                                       │
│  可信叙事引擎    学习成长引擎    编审助手引擎    策展助手引擎          │
├──────────────────────────────────────────────────────────────────────┤
│                         数据资产层                                     │
│  知识图谱(Neo4j) │ 向量库(Milvus) │ 内容仓(MinIO) │ 业务库(PG)       │
│  时序库(ClickHouse) │ 缓存(Redis) │ 消息(Kafka)                       │
├──────────────────────────────────────────────────────────────────────┤
│                         基础设施层                                     │
│  私有云(K8s) │ GPU集群 │ 5G专网 │ IoT网关 │ CDN │ 安防网络            │
└──────────────────────────────────────────────────────────────────────┘

1.2 技术栈总览

层级 技术选型 选型理由
前端框架 React 18 + TypeScript / React Native 线上Web端+移动端统一技术栈,生态成熟
3D/WebGL Three.js + WebGPU / Unity WebGL 云展馆3D渲染 + 轻量化Web3D访问
VR/AR Unity 2022 LTS + XR Interaction Toolkit 主流XR开发平台,支持Pico/Meta Quest
后端框架 Spring Boot 3 (Java 21) / FastAPI (Python) Java负责业务微服务,Python负责AI推理服务
微服务 Spring Cloud + Nacos + Gateway 国产化兼容,服务注册发现+配置中心+网关
数据库 PostgreSQL 16 + ClickHouse + Redis 7 业务OLTP + 分析OLAP + 缓存
知识图谱 Neo4j 5.x 图数据库标杆,支持Cypher语义查询
向量数据库 Milvus 2.x 开源高性能向量检索,支持亿级向量
对象存储 MinIO (私有化) S3兼容,支持私有化部署,用于3D模型/视频/图片
消息队列 Kafka 3.x 高吞吐事件流,支撑实时客流和体验编排
大模型 Qwen2.5 / GLM-4 (私有化部署) 国产开源大模型,支持中文+英文双语
RAG框架 LlamaIndex + LangChain 主流RAG框架,支持多源检索+引用溯源
数字人 Unreal Engine 5 + MetaHuman + AI口型同步 高保真数字人,支持实时驱动
容器编排 Kubernetes 1.28 + Helm 容器化部署,支持弹性扩缩容
CI/CD GitLab CI + ArgoCD GitOps发布流程,支持灰度和回滚
监控 Prometheus + Grafana + Loki 指标+日志+链路追踪一体化
IoT MQTT (EMQX) + Modbus网关 支持温湿度/客流/安防设备统一接入
CDN 阿里云CDN / 腾讯云CDN (港澳节点) 港澳及海外访问加速

1.3 系统部署拓扑

                        ┌──────────────┐
                        │  公网入口     │
                        │  WAF + SLB   │
                        └──────┬───────┘
                               │
                    ┌──────────┴──────────┐
                    │                     │
              ┌─────┴─────┐        ┌──────┴──────┐
              │ 线上云区   │        │ 线下场馆区   │
              │ (公有云)   │        │ (私有云)     │
              └─────┬─────┘        └──────┬──────┘
                    │                     │
         ┌──────────┴──────────┐  ┌───────┴────────┐
         │                     │  │                │
   ┌─────┴─────┐      ┌───────┴──┴──┐    ┌───────┴──────┐
   │ Web/小程序 │      │ AI推理GPU集群│    │ IoT/安防/VR  │
   │ API网关    │      │ K8s集群      │    │ 设备网络     │
   │ CDN节点    │      │ 数据库集群   │    │ 边缘计算盒子 │
   └───────────┘      └─────────────┘    └──────────────┘

部署策略

  • AI推理+数据库+知识图谱:部署在场馆私有云,保证数据安全和低延迟;
  • Web端/小程序/云展馆:部署在公有云,通过CDN加速港澳访问;
  • 两区通过VPN专线互联,数据按需同步;
  • 全国节点:通过S9节点协同系统远程部署组件包,各节点可独立运行。

二、AI可信知识引擎技术实现

2.1 整体架构

AI引擎是全馆公共能力底座,不是单一展项。采用"知识图谱 + RAG + 大模型微调"三层架构。

┌──────────────────────────────────────────────────────┐
│                   AI能力输出层                         │
│  可信馆员API  学习教练API  策展助手API  编审助手API    │
├──────────────────────────────────────────────────────┤
│                   推理与编排层                         │
│  意图识别 → 路由选择 → 检索增强 → 生成 → 审核护栏     │
│  (LlamaIndex编排 + 自研路由 + 安全过滤)               │
├──────────────────────────────────────────────────────┤
│                   知识检索层                           │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐            │
│  │ 知识图谱  │  │ 向量知识库│  │ 史料文档库│            │
│  │ (Neo4j)  │  │ (Milvus) │  │ (PG+FTS) │            │
│  └──────────┘  └──────────┘  └──────────┘            │
├──────────────────────────────────────────────────────┤
│                   模型层                               │
│  基座大模型(Qwen2.5-72B) + 领域微调LoRA + 安全护栏模型 │
└──────────────────────────────────────────────────────┘

2.2 知识图谱构建

2.2.1 图谱本体设计

节点类型(Node Labels):
  - Event       历史事件 (如: 大生产运动、延安整风)
  - Person      历史人物 (如: 毛泽东、朱德、东江纵队指战员)
  - Artifact    革命文物 (如: 纺车、窑洞桌椅、作战地图)
  - Document    文献档案 (如: 《论持久战》、整风文献)
  - Place       历史地点 (如: 延安、南泥湾、华南抗日根据地)
  - Concept     精神概念 (如: 实事求是、群众路线、自力更生)
  - Course      课程内容 (如: 小学红色故事课、干部廉政党课)
  - Era         历史时期 (如: 延安十三年、抗战时期、改革开放)

关系类型(Relationship Types):
  - OCCURRED_AT    事件→地点
  - PARTICIPATED   人物→事件
  - USED_ARTIFACT  事件→文物
  - CITED_IN       文献→事件
  - EMBODIES       事件→概念
  - BELONGS_TO     事件→时期
  - CONNECTS_TO    课程→事件/文物/概念
  - RELATED_TO     通用关联

2.2.2 图谱构建流程

权威史料入库
    ↓
实体识别与抽取 (NER + 人工校验)
    ↓
关系抽取 (RE + 专家审核)
    ↓
实体对齐与消歧
    ↓
图谱入库 (Neo4j Cypher导入)
    ↓
专家审核确认
    ↓
版本发布 (带版本号和审核标记)

技术实现

  • 使用HanLP/LTP进行中文NER,识别史料文本中的人物、地点、事件;
  • 关系抽取使用大模型辅助 + 人工审核双重确认;
  • 每个实体和关系必须标注史料来源(文献名+页码+原文片段);
  • 图谱版本化管理:每次发布生成新版本快照,支持回滚。

2.2.3 查询接口

// 示例:查询"大生产运动"关联的所有文物、人物和概念
MATCH (e:Event {name: '大生产运动'})-[:USED_ARTIFACT]->(a:Artifact),
      (e)-[:PARTICIPATED]->(p:Person),
      (e)-[:EMBODIES]->(c:Concept)
RETURN a, p, c

提供REST API封装常用图谱查询,供各旗舰产品调用。

2.3 RAG检索增强系统

2.3.1 架构

用户提问
    ↓
意图识别 (分类: 史实查询/概念解释/课程推荐/创作辅助)
    ↓
┌─────────────────────────────────────┐
│         多级检索                     │
│  第一级: 知识图谱精确匹配 (Neo4j)     │
│  第二级: 向量语义检索 (Milvus)        │
│  第三级: 全文检索 (PostgreSQL FTS)    │
└─────────────────────────────────────┘
    ↓
检索结果融合与排序 (Reciprocal Rank Fusion)
    ↓
上下文构建 (拼接检索结果 + 来源标注)
    ↓
大模型生成 (Qwen2.5 + 安全护栏)
    ↓
输出审核 (事实校验 + 政治合规过滤)
    ↓
返回回答 + 来源引用 + 不确定性说明

2.3.2 向量库构建

  • Embedding模型:使用BGE-M3(中文优化,支持中英双语);
  • 分块策略:史料文档按段落分块,每块保留来源元数据(文献名、页码、章节);
  • 索引类型HNSW(高召回率+低延迟);
  • 更新机制:新史料入库后自动Embedding并增量插入向量库。

2.3.3 引用溯源机制

每条AI回答必须包含:

{
  "answer": "延安大生产运动始于1939年...",
  "sources": [
    {
      "document": "《延安精神研究》第3卷",
      "page": 45,
      "excerpt": "1939年2月,毛泽东在延安干部生产动员大会上提出...",
      "verified": true
    }
  ],
  "confidence": "high",
  "uncertainty_note": null
}

当检索结果不足时,返回:

{
  "answer": "关于该问题的史料依据尚不充分,建议咨询现场讲解员或查阅文献库。",
  "sources": [],
  "confidence": "low",
  "uncertainty_note": "未找到权威史料支撑,已转交人工"
}

2.4 大模型微调方案

2.4.1 基座模型选择

候选模型 参数量 优势 劣势
Qwen2.5-72B 72B 中文能力强,开源许可清晰 推理资源需求大
Qwen2.5-14B 14B 资源需求适中,可多卡部署 复杂推理略弱
GLM-4-9B 9B 中文优化,推理效率高 知识广度略逊

推荐策略

  • 主力模型Qwen2.5-72B4×A100 80G推理),用于复杂问答和内容生成;
  • 轻量模型Qwen2.5-14B2×A100 40G推理),用于实时导览和简单问答;
  • 路由策略:意图识别后自动路由到合适模型,平衡质量和延迟。

2.4.2 微调数据准备

训练数据来源:
  1. 延安精神理论著作 (经中国延安精神研究会授权)
  2. 党史权威文献 (中央党史和文献研究院公开出版物)
  3. 东江纵队华南抗战史 (广东省委党史研究室编审)
  4. 广东改革开放史 (官方出版物)
  5. 自贸区发展实践 (官方报告)
  6. 太极文化史料 (非遗传承人提供)
  7. 知识图谱结构化数据 (转化为指令对)

数据格式 (指令微调):
  {"instruction": "用小学生能理解的语言解释什么是延安大生产运动",
   "input": "",
   "output": "在延安时期,因为物资非常缺少...",
   "source": "《延安精神研究》第3卷p45",
   "audience_level": "primary"}

2.4.3 微调方法

  • 方法LoRA (Low-Rank Adaptation)rank=64alpha=128
  • 训练框架LLaMA-Factory / DeepSpeed
  • 训练数据量:首期10,000条高质量指令对(经专家审核);
  • 评估方式:党史专家盲评 + 自动化事实校验 + 政治安全测试集;
  • 迭代频率:每季度补充新数据并重新微调。

2.4.4 安全护栏

用户输入
    ↓
输入安全过滤 (敏感词 + 意图安全分类)
    ↓
RAG检索 + 大模型生成
    ↓
输出安全过滤:
  - 事实校验: 与知识图谱交叉验证关键事实
  - 政治合规: 对标三级审核规则自动检查
  - 人物保护: 禁止模拟革命领袖发表新言论
  - 来源强制: 无来源回答降级为"不确定"
    ↓
安全通过 → 返回用户
安全未通过 → 转人工审核 / 返回安全兜底回复

技术实现

  • 输入过滤:基于规则引擎(Drools)+ 轻量分类模型(BERT微调);
  • 输出过滤:事实校验API(与Neo4j图谱比对)+ 规则引擎 + 关键词拦截;
  • 全过程日志:记录输入、检索结果、生成内容、过滤结果、模型版本,支持审计追溯。

2.5 四种AI角色API设计

可信馆员API

POST /api/ai/librarian/ask
Request:
  {
    "question": "延安整风运动的核心内容是什么?",
    "audience": "adult",          // primary/secondary/university/adult/hk_macau
    "language": "zh-CN",          // zh-CN / zh-HK / en
    "context": {                   // 可选的上下文
      "current_artifact_id": "art_001",
      "current_zone": "zone_b"
    }
  }

Response:
  {
    "answer": "延安整风运动的核心内容是...",
    "sources": [...],
    "confidence": "high",
    "follow_up_questions": ["整风运动对今天有什么启示?"],
    "related_artifacts": ["art_002", "art_005"],
    "request_id": "req_xxx"        // 全链路追踪ID
  }

学习教练API

POST /api/ai/coach/reflect
Request:
  {
    "task_id": "task_nanniwan",
    "team_answer": "我们决定优先种植粮食...",
    "audience": "secondary"
  }

Response:
  {
    "feedback": "你们的方案考虑了粮食优先,这符合当时'不饿死一个人'的紧迫需求。但你们是否考虑了...",
    "historical_comparison": "历史上,八路军选择了...",
    "follow_up_questions": ["如果工具不足怎么办?"],
    "evidence_used": ["doc_003", "artifact_012"]
  }

策展助手API

POST /api/ai/curator/search
Request:
  {
    "topic": "南泥湾大生产",
    "content_type": "all",        // image/video/3d/document/course
    "audience": "primary"
  }

Response:
  {
    "results": [
      {"type": "artifact", "id": "art_001", "title": "纺车", "relevance": 0.95},
      {"type": "document", "id": "doc_003", "title": "毛泽东生产动员讲话", "relevance": 0.92}
    ],
    "suggested_narrative": "建议以南泥湾纺车为起点,连接..."
  }

编审助手API

POST /api/ai/reviewer/check
Request:
  {
    "content": "1942年延安开展了大生产运动...",
    "content_type": "exhibit_text"
  }

Response:
  {
    "issues": [
      {"type": "fact_check", "severity": "warning", "detail": "大生产运动始于1939年,非1942年", "source": "《延安精神研究》p45"},
      {"type": "missing_source", "severity": "error", "detail": "该段落未标注史料来源"}
    ],
    "compliance_status": "needs_revision",
    "suggested_fixes": [...]
  }

三、三引擎技术实现

3.1 可信叙事引擎

职责

把同一权威史料转化为面向不同人群的准确表达。不是AI临场改写历史,而是在已审核内容组件中进行安全编排。

技术架构

┌────────────────────────────────────────────────────┐
│                  可信叙事引擎                         │
├────────────────┬────────────────┬──────────────────┤
│  内容组件仓库    │  叙事编排引擎    │  分层表达引擎     │
│  (已审核内容块)  │  (路线生成器)    │  (分众适配器)     │
├────────────────┼────────────────┼──────────────────┤
│ 组件元数据:      │ 编排规则:        │ 适配规则:         │
│ - 史料来源       │ - 人群→组件集    │ - 小学: 简化表述  │
│ - 适用人群       │ - 时长→节点数    │ - 中学: 因果逻辑  │
│ - 时长估算       │ - 客流→备选节点  │ - 干部: 理论深度  │
│ - 空间位置       │ - 教学目标→必选  │ - 港澳: 双语+轻量 │
│ - 版本号         │   节点          │                  │
└────────────────┴────────────────┴──────────────────┘

内容组件数据模型

CREATE TABLE content_components (
    id              VARCHAR(64) PRIMARY KEY,
    title           TEXT NOT NULL,
    content_type    VARCHAR(32) NOT NULL,  -- text/audio/video/3d/interactive
    source_refs     JSONB NOT NULL,         -- 史料来源引用列表
    audience_tags   JSONB NOT NULL,         -- ["primary","secondary","adult","hk_macau"]
    duration_min    INT,                    -- 预估时长(分钟)
    zone_id         VARCHAR(32),            -- 所在空间区域
    learning_objectives JSONB,              -- 教学目标列表
    language_versions JSONB,                -- {"zh-CN": "...", "zh-HK": "...", "en": "..."}
    review_status   VARCHAR(32) DEFAULT 'draft',  -- draft/reviewed/published
    reviewer_id     VARCHAR(64),
    reviewed_at     TIMESTAMP,
    version         INT DEFAULT 1,
    created_at      TIMESTAMP DEFAULT NOW(),
    updated_at      TIMESTAMP DEFAULT NOW()
);

叙事路线生成算法

def generate_narrative_route(audience, duration_min, learning_goals, current_load):
    """
    audience: 用户人群类型
    duration_min: 可用时长
    learning_goals: 学习目标列表
    current_load: 各区域实时客流负载
    """
    # 1. 检索适用该人群的已审核内容组件
    components = query_components(
        audience_tags=[audience],
        review_status='published'
    )

    # 2. 按教学目标筛选必选节点
    must_include = filter_by_goals(components, learning_goals)

    # 3. 按时长约束贪心填充
    route = greedy_fill(must_include, components, duration_min)

    # 4. 客流负载感知:拥挤区域替换为备选节点
    route = replace_overloaded_nodes(route, current_load)

    # 5. 空间路径优化:按物理位置排序减少折返
    route = optimize_physical_path(route)

    return route

关键API

POST /api/narrative/route/generate
GET  /api/narrative/route/{route_id}
POST /api/narrative/route/{route_id}/adapt   (实时客流适配)
GET  /api/narrative/learnings/{user_id}      (个人学习脉络)

3.2 学习成长引擎

职责

管理每个人从提问、体验到行动和再传播的成长路径。对应F4成长护照。

数据模型

-- 成长护照主表
CREATE TABLE growth_passports (
    id              VARCHAR(64) PRIMARY KEY,
    user_id         VARCHAR(64) NOT NULL,
    passport_type   VARCHAR(32) NOT NULL,   -- youth/party/hk_macau/researcher
    created_at      TIMESTAMP DEFAULT NOW(),
    status          VARCHAR(32) DEFAULT 'active'
);

-- 学习记录
CREATE TABLE learning_records (
    id              VARCHAR(64) PRIMARY KEY,
    passport_id     VARCHAR(64) REFERENCES growth_passports(id),
    record_type     VARCHAR(32) NOT NULL,   -- pre_visit/visit/post_visit
    event_type      VARCHAR(64) NOT NULL,   -- question_asked/artifact_viewed/
                                            -- task_completed/ai_interaction/
                                            -- understanding_expressed/action_chosen/
                                            -- feedback_submitted
    event_data      JSONB NOT NULL,          -- 事件详情
    artifact_ids    JSONB,                   -- 关联文物
    source_refs     JSONB,                   -- 关联史料
    timestamp       TIMESTAMP DEFAULT NOW()
);

-- 行动承诺
CREATE TABLE action_commitments (
    id              VARCHAR(64) PRIMARY KEY,
    passport_id     VARCHAR(64) REFERENCES growth_passports(id),
    action_type     VARCHAR(32) NOT NULL,   -- individual/team/bay_area
    action_content  TEXT NOT NULL,
    target_days     INT NOT NULL,            -- 7/30/90
    status          VARCHAR(32) DEFAULT 'pending',  -- pending/in_progress/completed/expired
    created_at      TIMESTAMP DEFAULT NOW(),
    feedback_7d     JSONB,
    feedback_30d    JSONB,
    feedback_90d    JSONB
);

-- 团队学习
CREATE TABLE team_learning (
    id              VARCHAR(64) PRIMARY KEY,
    team_name       VARCHAR(128),
    organization    VARCHAR(128),
    learning_goal   TEXT,
    route_id        VARCHAR(64),
    member_ids      JSONB NOT NULL,
    created_at      TIMESTAMP DEFAULT NOW()
);

7/30/90天回访机制

用户离馆时选择行动
    ↓
系统创建action_commitment记录
    ↓
定时任务(Scheduled Task):
  - 第7天: 推送回顾消息(微信/短信/邮件) → 用户点击 → 记录feedback_7d
  - 第30天: 推送进展反馈表单 → 用户提交 → 记录feedback_30d
  - 第90天: 推送成果提交入口 → 用户提交作品/实践记录 → 记录feedback_90d
    ↓
反馈数据进入S8数据中台 → 计算北极星指标

技术实现

  • 定时任务:使用XXL-Job分布式任务调度;
  • 消息推送:微信模板消息 + 短信网关 + 邮件SMTP;
  • 反馈表单:H5页面 + 小程序页面,数据写入PostgreSQL。

3.3 复制运营引擎

职责

把内容、课程、体验和运营方法打包输出到全国节点。对应F8星火节点和S9节点协同。

技术架构

┌──────────────────────────────────────────────────────┐
│                   旗舰中心 (L4)                        │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐            │
│  │ 组件仓库  │  │ 版本管理  │  │ 节点管理  │            │
│  │ Registry │  │ Release  │  │ Registry │            │
│  └────┬─────┘  └────┬─────┘  └────┬─────┘            │
│       │             │             │                   │
│       └──────┬──────┘             │                   │
│              │                    │                   │
│         组件打包发布               │                   │
│              │                    │                   │
└──────────────┼────────────────────┘                   │
               │ (HTTPS API / 离线包)                    │
    ┌──────────┼──────────┐                             │
    │          │          │                             │
┌───┴───┐ ┌───┴───┐ ┌───┴───┐                          │
│ L1节点 │ │ L2节点 │ │ L3节点 │  ...                    │
│ 微节点 │ │ 标准节点│ │ 城市节点│                        │
└───────┘ └───────┘ └───────┘                          │

组件包格式

{
  "package_id": "pkg_2026_q3_v1",
  "package_type": "standard_exhibition",
  "version": "1.0.0",
  "contents": {
    "knowledge": {
      "graph_snapshot": "kg_2026q3.graphml",
      "vector_index": "vec_2026q3.bin",
      "term_dict": "terms_bilingual.json"
    },
    "courses": [
      {"id": "course_001", "files": ["course_001.json", "course_001_media.zip"]}
    ],
    "experiences": [
      {"id": "task_nanniwan", "files": ["task_nanniwan.json", "task_nanniwan_3d.glb"]}
    ],
    "operations": {
      "sop_documents": "sop_2026q3.pdf",
      "config_templates": "config_templates.json"
    },
    "tech": {
      "api_specs": "openapi_2026q3.yaml",
      "deploy_templates": "helm_charts/",
      "data_dictionary": "data_dict_2026q3.json"
    }
  },
  "min_hardware": {"screen": true, "internet": true},
  "install_script": "install.sh",
  "checksum": "sha256:..."
}

节点协同API

POST   /api/s9/node/register          节点注册
GET    /api/s9/node/{node_id}         节点信息
POST   /api/s9/package/publish        发布组件包
GET    /api/s9/package/list           可用组件包列表
POST   /api/s9/node/{node_id}/deploy  向节点部署组件包
GET    /api/s9/node/{node_id}/health  节点健康状态
POST   /api/s9/node/{node_id}/content 节点提交本地内容
GET    /api/s9/metrics/compare        节点效果对比

四、八个旗舰产品技术实现

4.1 F1"一馆千面"自适应叙事空间

技术架构

┌──────────────────────────────────────────────────────┐
│              F1 自适应叙事空间系统                      │
├────────────────┬────────────────┬────────────────────┤
│  入馆选择终端    │  空间联动控制    │  学习脉络生成       │
│  (自助机/小程序) │  (X1编排引擎)   │  (离馆报告)         │
├────────────────┼────────────────┼────────────────────┤
│ 用户画像采集:    │ 设备联动:       │ 报告内容:           │
│ - 人群类型(选择) │ - 屏幕内容切换  │ - 路线节点列表      │
│ - 学习问题(选择) │ - 灯光场景切换  │ - 查看过的文物      │
│ - 可用时长(选择) │ - 音频导览切换  │ - 完成的任务        │
│ - 语言(选择)     │ - AI讲解适配    │ - AI问答记录        │
│                  │ - 互动任务推送  │ - 个人理解表达      │
│                  │ - 客流实时感知  │ - 推荐后续学习      │
└────────────────┴────────────────┴────────────────────┘

空间联动控制技术

X1全场景体验编排引擎是F1的技术核心:

┌──────────────────────────────────────────────────────┐
│                X1 体验编排引擎                         │
├──────────────────────────────────────────────────────┤
│  输入:                                               │
│  - 用户路线(来自可信叙事引擎)                          │
│  - 实时位置(UWB定位)                                  │
│  - 实时客流(摄像头+IoT)                               │
│  - 设备状态(监控)                                     │
├──────────────────────────────────────────────────────┤
│  编排逻辑:                                           │
│  1. 用户进入区域 → 匹配路线节点                        │
│  2. 查询该节点对应的内容组件                           │
│  3. 下发指令到对应设备:                                │
│     - 屏幕: 播放对应内容(WebSocket推送)               │
│     - 灯光: 切换场景灯光(DMX/Art-Net协议)             │
│     - 音频: 播放对应导览(RTP/RTSP流)                  │
│     - AI终端: 加载对应讲解上下文                       │
│     - 互动设备: 激活对应任务                           │
│  4. 客流拥挤 → 切换备选节点 → 重新下发指令             │
├──────────────────────────────────────────────────────┤
│  输出:                                               │
│  - 设备控制指令(WebSocket/MQTT)                       │
│  - 用户学习记录(写入学习成长引擎)                      │
│  - 客流调度信号(反馈给S3智慧场馆)                      │
└──────────────────────────────────────────────────────┘

设备控制协议

设备类型 控制协议 技术方案
LED屏幕/投影 WebSocket + 媒体服务器API 通过媒体服务器(如Resolume)控制播放内容
灯光系统 Art-Net / sACN (DMX512 over IP) 灯光场景预设 + 编排引擎触发切换
音频系统 RTP / RTSP / AirPlay 分区音频矩阵控制,按区域播放不同内容
VR/AR设备 Unity + WebSocket Unity客户端接收编排指令,切换场景
互动终端 WebSocket + REST API 触屏终端接收任务推送和内容更新
AI数字人 gRPC + Unreal Engine 远程驱动数字人表情、口型和语音

UWB室内定位

硬件: UWB锚点(天花板安装) + UWB标签(手环/胸卡)
精度: 10-30cm
频率: 10Hz更新
数据流:
  UWB锚点 → 位置引擎(TDOA算法) → 位置坐标(x,y,z)
      → Kafka → X1编排引擎 → 区域判定 → 设备联动

具体场景示例:香港中学生小陈的45分钟参观

入场前 (参观前一天):
├── 小陈通过学校统一预约,收到微信小程序链接
├── 打开小程序导学页面:
│   ├── 选择人群类型: 「中学生」
│   ├── 选择学习问题: 「延安精神和我们有什么关系?」
│   ├── 选择可用时长: 「45分钟」
│   ├── 选择语言: 「繁体中文」
│   └── 系统生成推荐路线 (6个节点,含1个VR体验)
├── 系统推送导学材料:
│   ├── 3分钟短视频: 「延安在哪里?为什么去延安?」
│   └── 预习思考题: 「如果你是1939年的香港青年,你会去延安吗?」
└── 小陈完成预习,系统记录到成长护照

入馆 (第0分钟):
├── 小陈在入馆终端刷身份证 + 扫小程序码
├── 系统识别身份,调取已生成的路线
├── 领取UWB手环(编号关联到小陈的护照)
└── 路线推送至小程序: 
    节点1→延安十三年全景(8min) → 节点2→南泥湾大生产文物(10min)
    → 节点3→VR沉浸体验:南泥湾(8min) → 节点4→东江纵队展区(7min)
    → 节点5→改革开放蛇口展区(7min) → 节点6→行动选择(5min)

节点1: 延安十三年全景 (第0-8分钟):
├── UWB检测小陈进入「序厅A区」
├── X1编排引擎下发指令:
│   ├── 环形屏幕: 播放繁体中文字幕版「延安十三年」全景影像
│   ├── 灯光: 暖黄色调(窑洞氛围)
│   ├── 音频: 繁体中文语音导览
│   └── AI终端: 加载「中学生+繁体」讲解上下文
├── 小陈通过AI终端提问: 
│   「为什么延安能成为革命中心?」
│   → AI可信馆员回答(附史料引用,繁体中文)
└── 系统记录: AI问答1次,停留8分钟

节点2: 南泥湾大生产文物 (第8-18分钟):
├── UWB检测小陈进入「文物展区B区」
├── X1编排引擎下发指令:
│   ├── 展柜屏幕: 播放纺车3D旋转动画 + 繁体说明
│   ├── 灯光: 聚焦展柜,环境光降低
│   └── 互动终端: 激活「纺车操作体验」互动
├── 小陈扫描文物二维码 → 手机显示纺车五层内容星图
├── 小陈操作互动终端体验虚拟纺纱
└── 系统记录: 查看文物3件,互动1次,停留10分钟

节点3: VR沉浸体验 (第18-28分钟):
├── 小陈到达VR体验区,排队等待(约3分钟)
│   └── 排队区屏幕播放: 南泥湾历史背景 + VR操作教学
├── 进入VR工位,佩戴Pico头显 + 触觉背心
├── VR场景加载: 南泥湾大生产(繁体中文UI)
├── 体验内容:
│   ├── 挥锄开荒(座椅前倾+背心振动+微风)
│   ├── 操作纺车(座椅节律振动+背心腰部振动)
│   └── 丰收场景(座椅加速感+全身振动+温暖气流)
├── VR内AI NPC(老乡形象)讲解大生产背景
└── 系统记录: VR体验完成,停留10分钟(含排队)

节点4: 东江纵队展区 (第28-35分钟):
├── UWB检测小陈进入「华南抗战D区」
├── X1编排引擎下发指令:
│   ├── 屏幕播放: 东江纵队港九大队营救文化名人
│   ├── 灯光: 冷色调(战争氛围)
│   └── AI终端: 加载东江纵队相关史料上下文
├── 小陈发现「香港」相关内容,产生共鸣
├── AI终端提问: 
│   「东江纵队和香港有什么关系?」
│   → AI回答港九大队营救何香凝、茅盾等文化名人
└── 系统记录: AI问答1次,查看文物2件,停留7分钟

节点5: 改革开放蛇口展区 (第35-42分钟):
├── UWB检测小陈进入「改革开放E区」
├── X1编排引擎下发指令:
│   ├── 屏幕播放: 蛇口工业区「时间就是金钱」场景
│   ├── 灯光: 明亮现代色调
│   └── 互动终端: 激活「如果你是蛇口建设者」决策互动
├── 小陈完成互动决策,系统生成对比分析
└── 系统记录: 互动1次,停留7分钟

节点6: 行动选择 (第42-47分钟):
├── 小陈进入「行动实验室F区」
├── 终端展示: 基于参观记录推荐的行动方向
│   ├── 个人行动: 「采访一位长辈,记录他们知道的延安故事」
│   ├── 团队行动: 「和同学一起制作一个关于东江纵队的短视频」
│   └── 湾区行动: 「参加湾区青年红色文化研学营」
├── 小陈选择: 团队行动「制作东江纵队短视频」
├── 系统生成行动卡片,写入成长护照
└── 系统设置: 7天/30天/90天回访提醒

离馆 (第47分钟):
├── 小陈在小程序查看离馆报告:
│   ├── 路线完成度: 6/6节点 (100%)
│   ├── 查看文物: 8件
│   ├── AI问答: 2次
│   ├── VR体验: 1次
│   ├── 互动任务: 2次
│   ├── 理解表达: (待填写)
│   └── 行动承诺: 制作东江纵队短视频(30天)
├── 小陈填写理解表达: 
│   「我以前觉得延安精神离我很远,但看到东江纵队在香港的故事,
│    我觉得延安精神就是不怕困难、敢做别人没做过的事。」
├── 报告生成PDF,可分享到社交媒体
└── UWB手环归还

离馆后:
├── 第7天: 微信推送回顾消息 + 东江纵队延伸阅读
├── 第30天: 推送进展反馈表单 → 小陈提交短视频初稿
├── 第90天: 推送成果提交 → 小陈提交完成的短视频
├── 优秀视频入选F6青年共创平台展示
└── 小陈的成长护照记录完整闭环

4.2 F2"十三年·十三问"历史情境任务剧场

技术架构

┌──────────────────────────────────────────────────────┐
│              F2 情境任务剧场系统                        │
├────────────────┬────────────────┬────────────────────┤
│  任务引擎        │  团队协作终端    │  AI复盘引擎         │
│  (剧本+状态机)   │  (多屏互动)     │  (学习教练API)      │
├────────────────┼────────────────┼────────────────────┤
│ 任务定义:       │ 协作方式:       │ 复盘内容:           │
│ - 历史问题       │ - 主屏: 情境展示 │ - 团队方案 vs 历史  │
│ - 角色分配       │ - 分屏: 证据查看 │ - AI追问(史料引用)  │
│ - 资源约束       │ - 个人终端: 决策 │ - 证据使用分析      │
│ - 证据集         │ - 团队屏: 方案汇总│ - 现实连接问题     │
│ - 历史事实       │                │                    │
│ - 评价维度       │                │                    │
└────────────────┴────────────────┴────────────────────┘

任务状态机

class TaskStateMachine:
    states = [
        "INTRO",           # 任务介绍
        "ROLE_ASSIGN",     # 角色分配
        "EVIDENCE_REVIEW", # 证据查看
        "TEAM_DISCUSSION", # 团队讨论
        "DECISION_SUBMIT", # 方案提交
        "HISTORY_REVEAL",  # 历史揭示
        "AI_REVIEW",       # AI复盘
        "REALITY_LINK",    # 现实连接
        "REPORT_GENERATE"  # 报告生成
    ]

    transitions = [
        ("INTRO", "ROLE_ASSIGN"),
        ("ROLE_ASSIGN", "EVIDENCE_REVIEW"),
        ("EVIDENCE_REVIEW", "TEAM_DISCUSSION"),
        ("TEAM_DISCUSSION", "DECISION_SUBMIT"),
        ("DECISION_SUBMIT", "HISTORY_REVEAL"),
        ("HISTORY_REVEAL", "AI_REVIEW"),
        ("AI_REVIEW", "REALITY_LINK"),
        ("REALITY_LINK", "REPORT_GENERATE")
    ]

任务定义数据模型

CREATE TABLE scenario_tasks (
    id              VARCHAR(64) PRIMARY KEY,
    title           TEXT NOT NULL,
    era             VARCHAR(32) NOT NULL,     -- 延安十三年中的具体时期
    historical_question TEXT NOT NULL,         -- 真实历史问题
    duration_min    INT DEFAULT 20,
    roles           JSONB NOT NULL,            -- 角色列表及资源约束
    evidence        JSONB NOT NULL,            -- 证据集(文物/档案/地图/口述史)
    historical_fact JSONB NOT NULL,            -- 真实历史进程和结果
    reality_question TEXT,                     -- 当代湾区现实连接问题
    evaluation_dims JSONB NOT NULL,            -- 评价维度
    review_status   VARCHAR(32) DEFAULT 'draft',
    version         INT DEFAULT 1
);

复盘报告生成

团队方案提交
    ↓
AI学习教练API分析:
  - 提取团队方案关键词
  - 与历史事实比对
  - 分析证据使用情况
  - 生成追问问题
    ↓
报告模板渲染:
  - 使用过的史料列表
  - 团队方案摘要
  - 历史事实对比
  - AI复盘评语
  - 现实行动建议
    ↓
PDF/H5报告生成 → 推送到团队终端 → 存入成长护照

具体场景示例:南泥湾大生产任务剧本

{
  "task_id": "task_nanniwan",
  "title": "如何在「不饿死一个人」的前提下实现自给?",
  "era": "1941-1943",
  "duration_min": 20,
  "historical_question": "1941年,国民党对陕甘宁边区实行经济封锁,外援断绝。你是八路军三五九旅的一员,奉命进驻南泥湾开荒生产。你面前有5000亩荒地、有限的农具和种子、即将到来的冬天。你如何制定生产计划,确保部队和百姓都能度过难关?",
  "roles": [
    {
      "role_id": "commander",
      "title": "旅长",
      "resources": ["5000亩荒地", "2000名战士", "有限农具", "3个月时间"],
      "constraints": ["不能向百姓征粮", "必须保留一定战斗训练时间", "冬天前必须有收成"],
      "decision_power": "最终决策权"
    },
    {
      "role_id": "production_chief",
      "title": "生产队长",
      "resources": ["种子库存清单", "农具清单", "劳动力分配表"],
      "constraints": ["种子有限必须合理分配", "农具不足需要自制"],
      "decision_power": "生产方案建议权"
    },
    {
      "role_id": "logistics",
      "title": "后勤处长",
      "resources": ["粮食储备清单", "百姓人口数据", "冬季物资需求"],
      "constraints": ["现有粮食只够45天", "百姓也需要粮食"],
      "decision_power": "粮食分配建议权"
    },
    {
      "role_id": "political",
      "title": "政治指导员",
      "resources": ["战士思想状况报告", "动员材料"],
      "constraints": ["战士情绪波动", "有人质疑「当兵的为什么要种地」"],
      "decision_power": "动员方案建议权"
    }
  ],
  "evidence": [
    {
      "type": "document",
      "id": "doc_mao_1939",
      "title": "毛泽东:自己动手,丰衣足食(1939年生产动员讲话)",
      "excerpt": "「我们不要饿死一个人,也不要困死一个人...我们要自己动手,解决吃穿问题。」",
      "source": "《毛泽东选集》第二卷"
    },
    {
      "type": "artifact",
      "id": "art_spinning_wheel",
      "title": "三五九旅纺车",
      "description": "战士们用废木料自制的纺车,用于纺纱织布",
      "image_url": "art_spinning_wheel.jpg",
      "model_3d_url": "art_spinning_wheel.glb"
    },
    {
      "type": "document",
      "id": "doc_wangzhen_report",
      "title": "王震:三五九旅南泥湾生产报告(1943年)",
      "excerpt": "「第一年开荒一万亩,产粮千余石;第二年开荒两万六千亩...」",
      "source": "陕甘宁边区财政经济史"
    },
    {
      "type": "photo",
      "id": "photo_nanniwan_1942",
      "title": "南泥湾开荒照片(1942年)",
      "description": "战士们在荒地上挥锄开荒的历史照片"
    },
    {
      "type": "oral_history",
      "id": "oral_veteran_001",
      "title": "老战士口述:南泥湾的第一个冬天",
      "excerpt": "「没有房子,我们就挖窑洞;没有农具,就用废铁打锄头...」",
      "source": "延安革命纪念馆口述史项目"
    }
  ],
  "historical_fact": {
    "what_happened": "三五九旅1941年3月进驻南泥湾,当年开荒1.1万亩,产粮1200石。到1943年,开荒面积达26.1万亩,产粮3.7万石,实现了「不要公家一粒米、一寸布、一文钱」的自给目标。",
    "key_decisions": [
      "优先种植生长周期短的粮食作物(小米、玉米)",
      "组织战士自制农具(用废铁打造锄头、犁)",
      "挖窑洞解决住宿,不占用百姓房屋",
      "开展生产竞赛,激发劳动热情",
      "保留每日2小时军事训练"
    ],
    "outcome": "南泥湾从「荒山臭水黑泥潭」变为「陕北好江南」,成为大生产运动的旗帜。",
    "spirit_connection": "自力更生、艰苦奋斗的延安精神"
  },
  "reality_question": "如果你所在的社区/学校面临资源短缺,你能从南泥湾经验中学到什么?你会如何用有限的资源解决一个实际问题?",
  "evaluation_dims": [
    {"dim": "证据使用", "weight": 0.25, "description": "是否充分使用了提供的史料"},
    {"dim": "方案可行性", "weight": 0.25, "description": "方案在历史条件下是否可行"},
    {"dim": "团队协作", "weight": 0.20, "description": "各角色是否充分履职协作"},
    {"dim": "精神理解", "weight": 0.15, "description": "是否理解自力更生的精神内核"},
    {"dim": "现实迁移", "weight": 0.15, "description": "能否将历史经验迁移到现实问题"}
  ]
}

体验流程:

1. INTRO (2分钟): 主屏播放南泥湾历史背景视频
2. ROLE_ASSIGN (1分钟): 4人分配角色(旅长/生产队长/后勤处长/政治指导员)
3. EVIDENCE_REVIEW (5分钟): 
   - 各角色查看专属证据(分屏显示)
   - 可查看公共证据集(5条史料)
   - VR模式: 在虚拟南泥湾场景中查看3D文物和文献
4. TEAM_DISCUSSION (5分钟):
   - 团队讨论生产计划
   - 各角色提出资源约束和建议
   - VR模式: 在虚拟窑洞中围坐讨论
5. DECISION_SUBMIT (2分钟):
   - 旅长综合意见,提交最终方案
   - 方案格式: {作物选择, 劳动力分配, 农具方案, 粮食分配, 动员策略}
6. HISTORY_REVEAL (2分钟):
   - 主屏揭示历史事实: 三五九旅的真实做法和成果
   - 对比团队方案与历史方案的差异
7. AI_REVIEW (2分钟):
   - AI学习教练分析:
     「你们的方案优先种植粮食,这和历史上一致。但你们没有考虑自制农具,
      而三五九旅用废铁打造了锄头和犁——这正是「自力更生」的体现。」
   - 追问: 「如果种子不够,你们会怎么办?」
8. REALITY_LINK (1分钟):
   - 展示现实连接问题
   - 引导思考: 南泥湾经验对今天的启示
9. REPORT_GENERATE:
   - 生成复盘报告PDF
   - 写入团队所有成员的成长护照

4.3 F3"一物一世界"革命文物数字生命工程

技术架构

┌──────────────────────────────────────────────────────┐
│              F3 文物数字生命系统                        │
├────────────────┬────────────────┬────────────────────┤
│  数字采集管理    │  五层内容管理    │  关系星图引擎       │
├────────────────┼────────────────┼────────────────────┤
│ 3D扫描:         │ 五层结构:       │ 可视化:            │
│ - 激光扫描任务   │ L1看见: 图像/3D │ - D3.js力导向图    │
│ - 摄影测量任务   │ L2知道: 元数据  │ - 交互式星图       │
│ - 质量检测       │ L3理解: 关联网络│ - 时间轴           │
│ - 元数据录入     │ L4研究: 档案    │ - 点击节点展开     │
│                 │ L5连接: 课程/任务│                   │
├────────────────┼────────────────┼────────────────────┤
│  数字修复工作台  │  展示终端        │  组件生成器         │
│  (Blender插件)  │  (扫码→星图)    │  (一物一课/短片)    │
└────────────────┴────────────────┴────────────────────┘

文物数据模型

CREATE TABLE artifacts (
    id              VARCHAR(64) PRIMARY KEY,
    name            TEXT NOT NULL,
    era             VARCHAR(32),
    level           VARCHAR(32),           -- 一级/二级/三级
    origin          TEXT,
    material        TEXT,
    dimensions      JSONB,                 -- 尺寸
    condition       TEXT,                  -- 保存状况
    status          VARCHAR(32),           -- on_display/in_storage/on_loan/repairing
    -- 数字资产
    model_3d_url    TEXT,                  -- 3D模型MinIO路径
    model_3d_format VARCHAR(32),           -- glb/gltf/obj
    images          JSONB,                 -- 高清图片列表
    -- 五层内容
    layer1_see      JSONB,                 -- 看见层内容
    layer2_know     JSONB,                 -- 知道层内容
    layer3_understand JSONB,               -- 理解层: 关联人物/事件/地点/文献
    layer4_research JSONB,                 -- 研究层: 原始档案/专家解读/争议
    layer5_connect  JSONB,                 -- 连接层: 对应课程/任务/创作
    -- 知识图谱关联
    graph_node_id   VARCHAR(64),           -- Neo4j中的Artifact节点ID
    -- 版本与审核
    review_status   VARCHAR(32) DEFAULT 'draft',
    version         INT DEFAULT 1,
    created_at      TIMESTAMP DEFAULT NOW()
);

关系星图前端实现

// 使用D3.js力导向图渲染文物关系网络
const svg = d3.select("#artifact-starmap");
const simulation = d3.forceSimulation(nodes)
    .force("link", d3.forceLink(links).id(d => d.id))
    .force("charge", d3.forceManyBody().strength(-300))
    .force("center", d3.forceCenter(width / 2, height / 2));

// 节点类型颜色编码
const colorMap = {
    Event: "#e74c3c",    // 红色 - 事件
    Person: "#3498db",   // 蓝色 - 人物
    Place: "#2ecc71",    // 绿色 - 地点
    Document: "#f39c12", // 橙色 - 文献
    Concept: "#9b59b6",  // 紫色 - 概念
    Course: "#1abc9c"    // 青色 - 课程
};

// 点击节点展开详情面板
node.on("click", (event, d) => {
    showDetailPanel(d);  // 显示该节点的五层内容
});

3D模型展示

  • 格式glTF 2.0 (.glb)Web标准3D格式,支持Web和原生加载;
  • Web展示Three.js + OrbitControls,支持旋转、缩放、测量;
  • 高精度研究版:WebGPU渲染,支持法线贴图、PBR材质;
  • 轻量公众版:减面+压缩纹理,适配移动端;
  • 推测性复原标识:在UI上用不同颜色边框区分"史实确认"和"推测复原"。

具体场景示例:纺车(art_spinning_wheel)五层内容

文物基本信息:
  名称: 三五九旅纺车
  年代: 1941-1943
  级别: 一级革命文物
  材质: 木材、铁钉、棉线
  尺寸: 长85cm × 宽40cm × 高70cm
  来源: 南泥湾三五九旅旧址
  现状: 完整,木质有自然老化

L1 看见层 (人人可看):
  ├── 3D模型: 可360°旋转查看(Three.js渲染)
  ├── 高清图片: 6个角度高清照片
  ├── 基本信息: 名称/年代/材质/尺寸
  └── 简要说明: 「这是三五九旅战士在南泥湾用废木料自制的纺车」

L2 知道层 (元数据):
  ├── 使用者: 八路军三五九旅战士
  ├── 使用地点: 南泥湾
  ├── 使用时间: 1941-1943年
  ├── 功能: 纺纱织布,解决穿衣问题
  ├── 制作材料: 废木料、废铁钉(就地取材)
  └── 文物级别: 一级

L3 理解层 (关联网络 → 星图):
  ├── 关联事件: 南泥湾大生产(1941-1943)
  ├── 关联人物: 王震(三五九旅旅长)、毛泽东(发起大生产运动)
  ├── 关联地点: 南泥湾(延安东南)
  ├── 关联文献: 《毛泽东选集》「自己动手,丰衣足食」
  ├── 关联概念: 自力更生、艰苦奋斗
  └── 星图可视化: D3.js力导向图,纺车为中心节点
      → 连接5个事件节点、3个人物节点、2个地点节点、
        4个文献节点、2个概念节点

L4 研究层 (深度档案):
  ├── 原始档案: 三五九旅生产报告(1943年)摘录
  ├── 专家解读: 延安革命纪念馆研究员视频讲解(8分钟)
  ├── 历史争议: 纺车设计是否参考了民间传统纺车?
  ├── 修复记录: 2015年文物保护修复全过程文档
  ├── 同类文物对比: 晋绥边区纺车、太行山区纺车对比表
  └── 口述史: 老战士回忆纺纱经历(录音+文字稿)

L5 连接层 (课程与行动):
  ├── 对应课程:
  │   ├── 小学: 「南泥湾的故事」(15分钟动画课)
  │   ├── 中学: 「自力更生的力量」(45分钟探究课)
  │   └── 干部: 「从南泥湾看艰苦奋斗精神」(90分钟专题课)
  ├── 对应任务: F2南泥湾情境任务(作为可交互证据)
  ├── 对应VR: VR南泥湾场景中的可操作文物
  ├── 创作素材: 可用于F6青年共创的3D模型和史料
  └── 行动连接: F7「用有限资源解决一个问题」行动模板

扫码体验流程:

观众在展柜前扫描文物二维码
  ↓
手机加载文物星图H5页面
  ↓
默认显示L1看见层: 3D模型 + 基本信息
  ↓
向上滑动 → L2知道层: 元数据卡片
  ↓
点击星图节点 → L3理解层: 关联网络可视化
  ↓
点击「深度研究」→ L4研究层: 档案文献
  ↓
点击「相关课程」→ L5连接层: 课程推荐
  ↓
点击「做一做」→ 跳转到F7行动选择

4.4 F4"一人一程"成长护照

技术架构

┌──────────────────────────────────────────────────────┐
│              F4 成长护照系统                            │
├────────────────┬────────────────┬────────────────────┤
│  参观前导学      │  参观中记录      │  离馆后回访         │
│  (小程序/H5)    │  (终端+UWB+RFID)│  (定时推送+反馈)    │
├────────────────┼────────────────┼────────────────────┤
│ - 人群选择       │ - 文物查看记录  │ - 第7天推送回顾     │
│ - 问题选择       │ - 任务完成记录  │ - 第30天进展反馈    │
│ - 团队目标创建   │ - AI问答记录    │ - 第90天成果提交    │
│ - 参观建议生成   │ - 理解表达记录  │ - 后续课程推荐      │
│ - 导学材料推送   │ - 行动选择记录  │ - 临展/活动提醒     │
└────────────────┴────────────────┴────────────────────┘

前端技术方案

场景 技术方案 理由
参观前导学 微信小程序 + H5 无需下载,覆盖面广
参观中记录 小程序 + UWB手环联动 自动记录位置,手动记录学习
离馆报告 H5页面 + PDF下载 即时生成,可分享
离馆后回访 微信模板消息 + 小程序 触达率高,体验连贯
港澳青年 独立H5门户(繁体/英文) 不依赖微信,支持港澳访问

数据采集边界

# 允许采集的数据
ALLOWED_DATA = {
    "audience_type": "用户主动选择",      # 人群类型
    "learning_question": "用户主动输入",   # 学习问题
    "duration_choice": "用户主动选择",     # 可用时长
    "language_choice": "用户主动选择",     # 语言偏好
    "viewed_artifacts": "UWB/RFID自动记录", # 查看过的文物ID
    "completed_tasks": "系统自动记录",     # 完成的任务ID
    "ai_qa_log": "系统自动记录",          # AI问答记录(脱敏)
    "understanding_text": "用户主动输入",  # 理解表达
    "action_choice": "用户主动选择",       # 行动承诺
    "feedback_text": "用户主动提交"        # 回访反馈
}

# 禁止采集的数据
FORBIDDEN_DATA = [
    "人脸特征",
    "情绪识别结果",
    "政治倾向推断",
    "宗教信仰推断",
    "非主动行为的态度标签",
    "未成年人非必要个人信息"
]

具体场景示例:党员干部老张的完整学习旅程

参观前 (提前一周):
├── 老张收到单位通知,扫码进入小程序
├── 选择人群类型: 「党员干部」
├── 选择学习问题: 
│   「延安整风运动对今天党的作风建设有什么启示?」
├── 选择可用时长: 「半天(3小时)」
├── 选择语言: 「简体中文」
├── 系统生成路线: 8个节点(含2个情境任务+1个VR)
├── 推送导学材料:
│   ├── 文献: 《改造我们的学习》原文
│   ├── 视频: 延安整风历史背景(15分钟)
│   └── 预习问题: 整风运动要解决的核心问题是什么?
└── 老张完成预习,护照记录「导学完成」

参观中 (3小时):
├── 节点1: 延安十三年全景(15min) → AI深度问答
├── 节点2: 整风运动文献展区(20min) → 查看22篇原始文献
├── 节点3: 情境任务「如何开展整风?」(25min)
│   ├── 角色: 政治指导员
│   ├── 证据: 整风文献22篇 + 口述史3条
│   ├── 团队决策: 制定整风实施方案
│   └── AI复盘: 对比历史整风方案
├── 节点4: 窑洞生活VR体验(10min)
├── 节点5: 群众路线展区(20min) → AI问答2次
├── 节点6: 情境任务「如何处理群众矛盾?」(25min)
├── 节点7: 廉政教育展区(20min) → 查看案例
└── 节点8: 行动选择(15min)

行动选择:
├── 老张选择团队行动: 
│   「在单位组织一次「实事求是」专题学习会」
├── 行动步骤:
│   ├── 第1周: 收集单位工作中「不实事求是」的案例
│   ├── 第2-3周: 组织专题讨论会
│   └── 第4周: 形成改进方案并提交
├── 证据要求: 会议记录 + 改进方案文档
└── 目标: 30天内完成

离馆报告 (关键内容):
├── 学习时长: 3小时12分
├── 路线完成: 8/8节点
├── AI问答: 5次(全部有史料引用)
├── 情境任务: 2次(评价: 良好/优秀)
├── VR体验: 1次
├── 查看文物: 23件
├── 查看文献: 38篇
├── 理解表达: 
│   「整风运动的核心是「实事求是」,今天我们工作中
│    形式主义的问题,本质上就是脱离了实事求是。
│    我要在单位推动解决几个实际问题,而不是开会走过场。」
└── 行动承诺: 组织「实事求是」专题学习会(30天)

离馆后回访:
├── 第7天: 推送 → 老张反馈「已收集3个形式主义案例」
├── 第30天: 推送 → 老张提交:
│   ├── 会议记录(照片+文字)
│   ├── 改进方案(PDF)
│   └── 同事反馈(3条)
├── 系统评估: 行动完成 ✓
├── 优秀案例 → 纳入S4教研培训案例库
└── 老张护照记录: 完整闭环 ✓

4.5 F5"永不闭馆"云上学习共同体

技术架构

┌──────────────────────────────────────────────────────┐
│              F5 云上学习共同体                          │
├────────────────┬────────────────┬────────────────────┤
│  Web3D云展馆    │  云端课程平台    │  协作任务平台        │
├────────────────┼────────────────┼────────────────────┤
│ Three.js+WebGPU │ 视频点播/直播   │ WebRTC实时协作      │
│ 虚拟漫游        │ 课程管理        │ 多人同堂任务        │
│ AI导览          │ 学时记录        │ 粤港澳三地同步      │
│ 文物3D展示      │ 证书发放        │ 在线研讨室          │
├────────────────┼────────────────┼────────────────────┤
│  8分钟精华模式  │  一节课模式      │  协作任务模式        │
│  (轻量H5)      │  (视频+互动)    │  (WebRTC+白板)      │
├────────────────┼────────────────┼────────────────────┤
│  深度研究模式    │  同步在场模式                    │
│  (文献检索+图谱) │  (直播+弹幕+连麦)                │
└────────────────┴────────────────┴────────────────────┘

Web3D云展馆技术

渲染方案:
  高端模式: WebGPU + Three.js (支持PBR、实时光照)
  轻量模式: WebGL 2.0 + 减面模型 + 烘焙光照贴图
  极简模式: 全景图片热点导航 (360° panorama + hotspot)

加载优化:
  - 模型LOD: 根据设备性能自动选择精度等级
  - 渐进式加载: 先加载低精度模型,后台替换高精度
  - 资源CDN: 静态资源通过CDN分发,港澳节点加速
  - Service Worker: 缓存已访问区域的3D资源

AI导览集成:
  - 虚拟空间中嵌入AI数字人(Three.js + 视频纹理)
  - 或通过语音+文字方式提供导览(不依赖3D数字人)
  - AI导览路线与线下路线共享同一套内容组件

粤港澳三地协作技术

WebRTC架构:
  信令服务器: Node.js + Socket.IO
  TURN/STUN: 自建TURN服务器(穿透防火墙)
  媒体流: 每个参与者音视频流
  协作白板: Yjs (CRDT协同编辑) + Canvas
  屏幕共享: getDisplayMedia API

协作场景:
  - 三地同上一堂课: 教师直播 + 学生实时互动
  - 跨校团队任务: 共享白板 + 语音讨论 + 文件协作
  - 线上研讨室: 多人视频圆桌 + AI记录摘要

具体场景示例:澳门中学生小李的线上学习旅程

背景: 小李是澳门某中学初三学生,学校未组织线下参观。
      她通过老师推荐访问云上学习共同体。

第一次访问 (8分钟精华模式):
├── 小李通过浏览器访问云展馆H5门户
├── 选择语言: 「繁体中文」
├── 选择模式: 「8分钟精华」
├── 系统加载: 全景图片热点导航模式(极简模式)
├── 体验流程:
│   ├── 热点1: 延安十三年全景(2分钟视频)
│   ├── 热点2: 南泥湾纺车3D展示(可旋转)
│   ├── 热点3: 东江纵队港九大队故事(2分钟视频)
│   └── 热点4: AI问答: 「延安精神对澳门青年有什么意义?」
├── AI回答(繁体中文+史料引用):
│   「延安精神的核心是自力更生和艰苦奋斗。
│    澳门回归前,澳门同胞也展现了这种精神...」
└── 小李注册成长护照(线上版)

第二次访问 (一节课模式,3天后):
├── 老师布置课后学习任务
├── 小李选择课程: 「自力更生的力量」(45分钟)
├── 课程内容:
│   ├── 视频1: 南泥湾大生产历史(15分钟)
│   ├── 互动: 虚拟纺车操作体验(5分钟)
│   ├── 视频2: 澳门回归建设中的自力更生(10分钟)
│   ├── 互动: 思考题「你在生活中遇到过需要自力更生的情况吗?」
│   └── 测验: 5道选择题(全部通过)
├── 系统记录学时: 45分钟
└── 护照更新: 课程完成 + 学时记录

第三次访问 (协作任务模式,2周后):
├── 学校组织粤港澳三地跨校协作任务
├── 任务: 「三地青年共讲一个延安精神故事」
├── 小李被分入混合小组(广州1人+香港1人+澳门2人)
├── 协作过程:
│   ├── WebRTC视频连线: 三地学生面对面讨论
│   ├── Yjs协同白板: 共同绘制故事大纲
│   ├── 小李负责: 澳门视角的延安精神理解
│   ├── 分工制作: 各自录制1分钟视频片段
│   └── 合成: 使用平台在线编辑器合并
├── 提交作品: 4分钟短视频「延安精神在湾区」
├── AI编审助手检查: 史实准确 ✓ 来源完整 ✓
├── 人工审核通过 → 发布到线上专区
└── 护照更新: 协作任务完成

持续学习:
├── 系统推荐课程: 「实事求是的思想方法」
├── 临展提醒: 「湾区青年红色文创展」线上版
├── 行动选择: 「在学校组织一次延安精神分享会」
└── 小李的成长护照: 线上学习闭环

4.6 F6"湾区青年共创计划"

技术架构

┌──────────────────────────────────────────────────────┐
│              F6 湾区青年共创平台                        │
├────────────────┬────────────────┬────────────────────┤
│  共创项目管理    │  创作工具集      │  审核与展示         │
├────────────────┼────────────────┼────────────────────┤
│ - 年度主题发布   │ - AI辅助写作    │ - 三级审核工作流    │
│ - 混合小组组建   │ - AI辅助绘画    │ - 线上专区展示      │
│ - 专家工作坊预约 │ - 短视频编辑    │ - 优秀作品入临展    │
│ - 进度跟踪       │ - 声音档案录制  │ - 青年公开讲述直播  │
│ - 资源库访问     │ - 互动网页制作  │                    │
└────────────────┴────────────────┴────────────────────┘

AI辅助创作工具

工具 技术方案 安全约束
AI辅助写作 大模型生成 + 模板引导 强制标注AI辅助,人工审核
AI辅助绘画 Stable Diffusion + 红色文化LoRA 生成内容经编审助手API检查
短视频编辑 FFmpeg + Web编辑器 输出经审核后发布
声音档案 Web Audio API + 录音 口述史需标注来源

共创审核流程

青年提交作品
    ↓
AI编审助手自动检查:
  - 史实准确性(与知识图谱比对)
  - 来源完整性(是否标注史料来源)
  - 版权合规(是否使用授权素材)
  - 政治合规(规则引擎检查)
    ↓
人工审核(编辑复审)
    ↓
专家终审(必要时的史实终审)
    ↓
发布到线上专区
    ↓
优秀作品 → 线下临展 → 青年公开讲述

具体场景示例:2026年秋季共创项目

年度主题: 「延安精神 × 湾区故事」

项目发布:
├── 旗舰中心发布年度共创主题
├── 面向湾区高校征集混合小组(每校2-3人)
├── 提供创作资源包:
│   ├── 50件文物3D模型(可商用)
│   ├── 100条史料文献(已授权)
│   ├── AI辅助创作工具(写作/绘画/视频)
│   └── 专家工作坊预约入口

混合小组示例:
├── 组名: 「延安·蛇口·我」
├── 成员:
│   ├── 组长: 深圳大学 小王 (策划+文案)
│   ├── 组员: 香港中文大学 小陈 (视频拍摄)
│   ├── 组员: 澳门大学 小李 (资料研究)
│   └── 组员: 中山大学 小刘 (交互设计)
├── 指导专家: 延安精神研究会研究员(线上指导2次)

创作过程 (30天):
├── 第1周: 选题与资料研究
│   ├── 小李使用策展助手API检索史料
│   ├── 确定主题: 「从南泥湾到蛇口——自力更生的两个故事」
│   └── 提交选题报告 → 专家审核通过
├── 第2周: 内容创作
│   ├── 小王使用AI辅助写作工具撰写脚本
│   │   └── AI生成初稿 → 人工修改 → 标注AI辅助
│   ├── 小陈在深圳蛇口拍摄实景
│   └── 小刘设计交互网页原型
├── 第3周: 整合制作
│   ├── 小陈使用平台视频编辑器剪辑
│   ├── 小刘制作交互网页(Three.js展示文物)
│   └── 小李补充史料注释和来源
└── 第4周: 审核与提交
    ├── AI编审助手检查:
    │   ├── 史实准确性: ✓ (与知识图谱比对通过)
    │   ├── 来源完整性: ✓ (12条史料引用)
    │   ├── 版权合规: ✓ (使用授权素材)
    │   └── 政治合规: ✓
    ├── 编辑复审: 通过
    ├── 专家终审: 通过
    └── 提交完成

成果展示:
├── 线上专区: 「延安精神×湾区故事」作品页
├── 作品内容: 5分钟视频 + 交互网页 + 史料注释
├── 线下临展: 入选「湾区青年红色文创展」
├── 青年讲述: 小王在临展开幕式做5分钟公开讲述(直播)
└── 所有成员成长护照记录共创成果

4.7 F7"把精神带回去"现实行动实验室

技术架构

┌──────────────────────────────────────────────────────┐
│              F7 现实行动实验室                          │
├────────────────┬────────────────┬────────────────────┤
│  行动选择终端    │  行动跟踪系统    │  成果回流系统       │
├────────────────┼────────────────┼────────────────────┤
│ - 行动方向展示   │ - 行动卡片生成  │ - 成果提交入口      │
│ - 行动模板选择   │ - 7/30/90天跟踪 │ - 成果墙展示       │
│ - 自定义行动     │ - 进展提醒      │ - 课程案例转化      │
│ - 团队行动创建   │ - 反馈表单      │ - 年度优秀评选      │
└────────────────┴────────────────┴────────────────────┘

行动模板数据模型

CREATE TABLE action_templates (
    id              VARCHAR(64) PRIMARY KEY,
    spirit_category VARCHAR(32) NOT NULL,   -- seek_truth/serve_people/self_reliance/right_direction
    title           TEXT NOT NULL,
    description     TEXT NOT NULL,
    target_days     INT NOT NULL,            -- 7/30/90
    action_type     VARCHAR(32) NOT NULL,    -- individual/team/bay_area
    audience_tags   JSONB,
    steps           JSONB NOT NULL,           -- 行动步骤列表
    evidence_required JSONB,                  -- 需要提交的证明材料类型
    review_required BOOLEAN DEFAULT true,
    version         INT DEFAULT 1
);

具体场景示例:三类行动方向实例

行动方向A: 个人行动 — 「实事求是调查员」
├── 精神类别: seek_truth (实事求是)
├── 适用人群: 中学生/大学生/党员干部
├── 行动内容: 在7天内,找到一个自己学习或工作中
│   「不实事求是」的例子,记录下来并提出改进建议
├── 行动步骤:
│   ├── Day 1-2: 观察并记录一个「形式主义」或「走过场」的例子
│   ├── Day 3-5: 分析原因(是制度问题还是态度问题?)
│   ├── Day 6-7: 写一份200字的改进建议
│   └── 提交: 文字记录 + 改进建议
├── 证据要求: 文字描述(可选照片)
├── 回访节点: 第7天提交成果
└── 优秀案例 → 转化为S4教研案例

行动方向B: 团队行动 — 「南泥湾式创新项目」
├── 精神类别: self_reliance (自力更生)
├── 适用人群: 企业团队/机关支部/学生社团
├── 行动内容: 在30天内,用有限资源解决团队面临的
│   一个实际问题(不能增加预算)
├── 行动步骤:
│   ├── Week 1: 团队讨论确定要解决的问题
│   ├── Week 2: 制定「零预算」解决方案
│   ├── Week 3: 实施方案
│   └── Week 4: 总结成果并提交
├── 证据要求: 问题描述 + 方案文档 + 实施记录 + 成果照片
├── 回访节点: 第7天(进展) + 第30天(成果)
└── 优秀案例 → 成果墙展示 + 年度评选

行动方向C: 湾区行动 — 「红色故事传播者」
├── 精神类别: serve_people (为人民服务)
├── 适用人群: 港澳青年/大学生/志愿者
├── 行动内容: 在90天内,采访3位长辈(家人/邻居/老师),
│   记录他们知道的红色故事,制作一个传播作品
├── 行动步骤:
│   ├── Month 1: 采访3位长辈,录音/录像记录
│   ├── Month 2: 整理故事,使用F6平台AI工具辅助创作
│   │   └── 可选形式: 短视频/播客/图文/交互网页
│   └── Month 3: 发布作品(社交媒体/学校/社区)
├── 证据要求: 采访录音 + 创作作品 + 发布截图
├── 回访节点: 第7天 + 第30天 + 第90天
└── 优秀作品 → F6青年共创平台 + 线下临展

行动选择终端交互流程:

┌──────────────────────────────────────┐
│         你想把什么精神带回去?          │
├──────────────────────────────────────┤
│                                      │
│  ┌──────────┐  ┌──────────┐         │
│  │ 实事求是  │  │ 自力更生  │         │
│  │ 调查员    │  │ 创新项目  │         │
│  │ (7天)    │  │ (30天)   │         │
│  └──────────┘  └──────────┘         │
│                                      │
│  ┌──────────┐  ┌──────────┐         │
│  │ 为人民    │  │ 自定义    │         │
│  │ 服务      │  │ 行动      │         │
│  │ 传播者    │  │          │         │
│  │ (90天)   │  │          │         │
│  └──────────┘  └──────────┘         │
│                                      │
│  基于你的参观记录推荐:                 │
│  → 你在东江纵队展区停留最久            │
│  → 推荐: 「红色故事传播者」            │
└──────────────────────────────────────┘

4.8 F8"星火节点"全国复制网络

节点技术架构

L1 微节点技术栈:
  - 一块触屏交互一体机(Android)
  - 离线内容包(课程视频+AI问答轻量版)
  - 定期同步更新(WiFi/4G)
  - 无需本地服务器

L2 标准节点技术栈:
  - 标准展陈屏幕 + 互动终端
  - 边缘计算盒子(NVIDIA Jetson)运行AI推理
  - 本地内容缓存 + 云端AI增强
  - 成长护照接入
  - 云端连线能力

L3 城市节点技术栈:
  - 完整展陈系统(屏幕+灯光+音频)
  - 本地服务器(2-4台)运行K8s
  - 本地知识图谱子集 + 向量库子集
  - 本地内容审核 + 总馆规则校验
  - 独立运营 + 数据上报

L4 旗舰中心技术栈:
  - 完整私有云(20+服务器)
  - GPU推理集群(8×A100)
  - 完整知识图谱 + 向量库 + 内容仓
  - 全国节点调度中心
  - 权威内容生产与发布

具体场景示例:L2标准节点部署到某高校

节点信息:
  节点名称: 某理工大学「延安精神学习角」
  节点级别: L2标准节点
  部署位置: 图书馆一楼大厅
  空间面积: 30㎡
  日接待量: 约200人

部署流程 (7天):

Day 1-2: 硬件安装
├── 触屏一体机×2 (65寸交互屏)
├── 边缘计算盒子×1 (NVIDIA Jetson AGX Orin)
├── VR设备: Pico头显×2 + ALVR串流方案
├── 网络配置: 5G路由 + 校园网对接
└── 安防: 摄像头×1 + 设备锁

Day 3-4: 软件部署
├── 从S9节点协同系统拉取组件包:
│   ├── pkg_2026_q3_v1 (标准展览组件包)
│   │   ├── 知识图谱子集: 延安十三年核心事件
│   │   ├── 向量库子集: 500条核心史料
│   │   ├── 课程: 10门(覆盖5个人群)
│   │   ├── 体验: 2个情境任务 + 1个VR场景
│   │   └── 运营SOP: 日常操作手册
│   └── Helm Chart: node-deployment.yaml
├── K3s轻量集群部署(Jetson上运行)
├── AI推理: Qwen2.5-7B量化版(本地运行)
├── 内容缓存: 3D模型+视频本地存储
└── 云端增强: 复杂问题转发旗舰中心AI

Day 5: 系统联调
├── 触屏终端测试: 课程播放 + AI问答 + 文物浏览
├── VR串流测试: ALVR连接 + 延迟<40ms
├── 云端连线测试: 与旗舰中心视频连线正常
├── 成长护照测试: 扫码登录 + 记录同步
└── 健康检查: POST /api/s9/node/{node_id}/health → OK

Day 6: 内容适配
├── 接入本校特色: 
│   ├── 学校红色校史片段(提交到旗舰中心审核)
│   └── 本校师生优秀作品(从F6平台同步)
├── 设置本校推荐路线:
│   ├── 大学生路线(30分钟): AI问答+1个任务+VR
│   └── 教师路线(20分钟): AI问答+课程浏览
└── 配置运营信息: 开放时间/预约方式/联系人

Day 7: 上线运营
├── 正式开放
├── 学生刷校园卡进入
├── 体验数据每日上报旗舰中心
└── 运营效果纳入S8数据中台对比分析

日常运营:
├── 学生体验流程:
│   ├── 刷卡 → 选择人群/问题/时长
│   ├── 触屏浏览课程 + AI问答
│   ├── VR体验(排队预约)
│   └── 成长护照同步到个人手机
├── 内容更新: 每季度从旗舰中心同步新组件包
├── 本地内容提交: 本校优秀作品 → 旗舰中心审核 → 全国共享
└── 远程监控: 旗舰中心实时监控设备状态

节点部署自动化

# Helm Chart: node-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: yan-an-node-core
spec:
  replicas: 1
  template:
    spec:
      containers:
        - name: ai-service
          image: registry.yan-an.example/ai-service:{{.Values.version}}
          resources:
            limits:
              nvidia.com/gpu: {{.Values.gpu_count}}
        - name: content-service
          image: registry.yan-an.example/content-service:{{.Values.version}}
        - name: experience-orchestrator
          image: registry.yan-an.example/orchestrator:{{.Values.version}}
        - name: knowledge-graph
          image: registry.yan-an.example/neo4j-custom:{{.Values.version}}

五、VR/XR沉浸体验技术实现

5.1 VR/XR整体架构

VR/XR沉浸体验是线下场馆"不可替代性"的核心组成,不是独立展项,而是嵌入F1自适应叙事空间和F2情境任务剧场的沉浸交互层。

┌──────────────────────────────────────────────────────────────┐
│                    VR/XR 沉浸体验系统                          │
├──────────────┬──────────────┬──────────────────────────────┤
│  内容生产层    │  运行时引擎    │  设备与体感层                  │
├──────────────┼──────────────┼──────────────────────────────┤
│ Unity场景工程 │ 场景管理器    │ VR头显(Pico 4 Enterprise)     │
│ 3D资产管线    │ 多人同步引擎  │ MR设备(Meta Quest 3)          │
│ 交互逻辑脚本  │ 编排对接层    │ 体感座椅(6DOF动态平台)         │
│ AI NPC驱动   │ 安全监控守护  │ 手部追踪(Leap Motion)         │
│ 场景烘焙渲染  │ 性能监控      │ 触觉反馈手套(bHaptics)        │
│              │              │ 定位基站(Lighthouse)          │
│              │              │ 环绕音响(5.1/7.1)             │
│              │              │ 风效/热效/气味发生器           │
└──────────────┴──────────────┴──────────────────────────────┘

5.2 VR场景开发架构

5.2.1 Unity项目结构

YanAnVR/
├── Assets/
│   ├── Scenes/                    # 场景文件
│   │   ├── Nanniwan.unity         # 南泥湾大生产
│   │   ├── EnemyRear.unity        # 敌后根据地
│   │   ├── Yaodong.unity          # 延安窑洞生活
│   │   ├── Dongjiang.unity        # 东江纵队游击战场
│   │   ├── ReformOpening.unity    # 改革开放蛇口场景
│   │   └── Loading.unity          # 加载过渡场景
│   ├── Prefabs/                   # 预制体
│   │   ├── Artifacts/             # 可交互文物预制体
│   │   ├── Characters/            # NPC角色预制体
│   │   ├── Environment/           # 环境元素(地形/植被/建筑)
│   │   └── UI/                    # VR空间UI预制体
│   ├── ScriptableObjects/         # 数据资产
│   │   ├── TaskDefinitions/       # 任务定义(与F2共享数据格式)
│   │   ├── NarrativeNodes/        # 叙事节点(与可信叙事引擎共享)
│   │   └── ArtifactData/          # 文物元数据(与F3共享)
│   ├── Scripts/                   # C#脚本
│   │   ├── Core/                  # 核心框架
│   │   │   ├── SceneManager.cs    # 场景加载与切换
│   │   │   ├── MultiplayerSync.cs # 多人同步
│   │   │   ├── OrchestratorClient.cs # 与X1编排引擎通信
│   │   │   ├── AIBridge.cs        # 与AI可信馆员API通信
│   │   │   └── SafetyGuard.cs     # 安全监控守护
│   │   ├── Interaction/           # 交互逻辑
│   │   │   ├── GrabInteractable.cs # 抓取交互
│   │   │   ├── TaskTrigger.cs     # 任务触发
│   │   │   ├── EvidenceInspector.cs # 证据查看
│   │   │   └── HapticFeedback.cs  # 触觉反馈
│   │   └── NPC/                   # AI NPC
│   │       ├── NPCController.cs   # NPC行为控制
│   │       ├── LipSync.cs        # 口型同步
│   │       └── VoicePlayer.cs    # 语音播放
│   ├── Models/                    # 3D模型(FBX/glTF)
│   ├── Textures/                  # 纹理贴图
│   ├── Audio/                     # 音频资源
│   └── Shaders/                   # 自定义着色器
├── Plugins/
│   ├── UnityXR/                   # XR Interaction Toolkit
│   ├── PhotonFusion/              # 多人联网
│   └── WebSocket/                 # WebSocket客户端
└── ProjectSettings/

5.2.2 场景管理器

/// <summary>
/// VR场景管理器:负责场景加载、切换和生命周期管理
/// </summary>
public class VRSceneManager : MonoBehaviour
{
    // 场景加载采用Addressables异步加载,避免卡顿
    [SerializeField] private AssetReferenceScene loadingScene;
    
    // 当前激活的场景ID(与X1编排引擎同步)
    private string currentSceneId;
    
    // 场景元数据(从ScriptableObjects加载)
    private Dictionary<string, SceneMetadata> sceneMetadataMap;
    
    /// <summary>
    /// 从X1编排引擎接收场景切换指令
    /// </summary>
    public async void SwitchScene(string sceneId, string audienceType, string language)
    {
        // 1. 淡出当前场景
        await FadeOut(0.5f);
        
        // 2. 卸载当前场景
        await SceneManager.UnloadSceneAsync(currentSceneId);
        
        // 3. 加载过渡场景
        await loadingScene.LoadSceneAsync(LoadSceneMode.Additive);
        
        // 4. 预加载目标场景资源
        var sceneMetadata = sceneMetadataMap[sceneId];
        await PreloadAssets(sceneMetadata.assetRefs);
        
        // 5. 加载目标场景
        var loadOp = SceneManager.LoadSceneAsync(sceneId, LoadSceneMode.Additive);
        loadOp.completed += (op) =>
        {
            // 6. 根据人群类型适配内容
            AdaptToAudience(audienceType, language);
            
            // 7. 淡入
            FadeIn(0.5f);
            
            // 8. 通知编排引擎场景就绪
            OrchestratorClient.NotifySceneReady(sceneId);
            
            // 9. 卸载过渡场景
            SceneManager.UnloadSceneAsync("Loading");
        };
        
        currentSceneId = sceneId;
    }
    
    /// <summary>
    /// 根据人群类型适配VR场景内容
    /// </summary>
    private void AdaptToAudience(string audienceType, string language)
    {
        // 小学:简化交互、增加引导NPC、缩短任务时长
        // 中学:增加因果推理任务、证据收集环节
        // 干部:增加理论深度、历史决策复盘
        // 港澳:繁体/英文UI、轻量化叙事
        var adapter = GetComponent<AudienceAdapter>();
        adapter.Apply(audienceType, language);
    }
}

5.2.3 五大VR场景定义

场景 历史时期 核心体验 交互重点 对应F2任务
南泥湾大生产 1941-1943 开荒、纺纱、生产竞赛 抓取农具、操作纺车、种植作物 "如何在不饿死一个人的前提下实现自给"
敌后根据地 1938-1945 游击战术、群众工作、地雷战 地图标注、群众动员、物资调配 "在敌后如何建立并维持一个根据地"
延安窑洞生活 1938-1947 日常起居、整风学习、文艺活动 翻阅文献、参与讨论、体验生活条件 "在极端艰苦中如何保持信念和创造力"
东江纵队游击战场 1943-1945 华南抗日、港九大队、营救文化名人 穿越封锁线、传递情报、营救行动 "如何在日占区开展有效抵抗"
改革开放蛇口 1979-1984 蛇口工业区、时间就是金钱、敢为人先 工程决策、招商引资、制度创新 "如何在一片荒滩上建起现代工业区"

5.3 体感设备集成方案

5.3.1 体感设备矩阵

┌──────────────────────────────────────────────────────────────┐
│                    VR体验工位 (4座/场景)                       │
├──────────────────────────────────────────────────────────────┤
│                                                              │
│  ┌────────┐  ┌────────┐  ┌────────┐  ┌────────┐             │
│  │ 座位1   │  │ 座位2   │  │ 座位3   │  │ 座位4   │             │
│  │ VR头显  │  │ VR头显  │  │ VR头显  │  │ VR头显  │             │
│  │ 动态座椅│  │ 动态座椅│  │ 动态座椅│  │ 动态座椅│             │
│  │ 触觉背心│  │ 触觉背心│  │ 触觉背心│  │ 触觉背心│             │
│  │ 手柄×2  │  │ 手柄×2  │  │ 手柄×2  │  │ 手柄×2  │             │
│  └───┬────┘  └───┬────┘  └───┬────┘  └───┬────┘             │
│      │           │           │           │                    │
│      └───────────┴───────────┴───────────┘                    │
│                      │                                       │
│              ┌───────┴───────┐                               │
│              │  边缘计算盒子   │                               │
│              │  (VR渲染主机)   │                               │
│              │  NVIDIA RTX    │                               │
│              │  4080/4090     │                               │
│              └───────┬───────┘                               │
│                      │                                       │
│              ┌───────┴───────┐                               │
│              │  环绕音响5.1   │                               │
│              │  风效/热效     │                               │
│              │  气味发生器    │                               │
│              └───────────────┘                               │
└──────────────────────────────────────────────────────────────┘

5.3.2 体感联动控制

/// <summary>
/// 体感设备联动控制器:根据VR场景事件触发物理体感
/// </summary>
public class HapticEnvironmentController : MonoBehaviour
{
    // 动态座椅控制 (通过串口/USB)
    private DynamicSeatInterface seatController;
    
    // 触觉反馈背心 (bHaptics SDK)
    private bHapticsHandler hapticsHandler;
    
    // 环境效果控制器 (通过MQTT)
    private MQTTClient envController;
    
    // 效果预设库
    private Dictionary<string, EnvironmentEffect> effectPresets;
    
    /// <summary>
    /// 场景事件触发体感效果
    /// </summary>
    public void TriggerEffect(string effectId, float intensity = 1.0f)
    {
        var effect = effectPresets[effectId];
        
        // 1. 动态座椅运动
        if (effect.seatMotion != null)
        {
            seatController.PlayMotion(effect.seatMotion, intensity);
        }
        
        // 2. 触觉背心振动
        if (effect.hapticPattern != null)
        {
            hapticsHandler.PlayPattern(effect.hapticPattern, intensity);
        }
        
        // 3. 环境效果(风/热/气味)
        if (effect.environment != null)
        {
            envController.Publish("env/effect", JsonUtility.ToJson(effect.environment));
        }
    }
}

// 效果预设示例
[CreateAssetMenu(fileName = "EnvEffect", menuName = "VR/EnvironmentEffect")]
public class EnvironmentEffect : ScriptableObject
{
    public string effectId;
    public SeatMotion seatMotion;        // 座椅运动模式
    public string hapticPattern;         // 触觉反馈模式名
    public EnvironmentTrigger environment; // 环境效果
    public float defaultIntensity;
    public float maxIntensity;
    public float duration;
}

// 南泥湾场景体感效果示例
// "开荒挥锄": 座椅轻微前倾 + 背心肩部振动 + 微风
// "纺车转动": 座椅轻微振动 + 背心腰部节律振动
// "大生产竞赛": 座椅加速感 + 背心全身振动 + 强风 + 热感
// "丰收喜悦": 座椅上升感 + 背心轻柔振动 + 温暖气流

5.3.3 体感效果场景映射

VR场景 事件 座椅动作 触觉反馈 环境效果
南泥湾 挥锄开荒 前倾15° 肩部+手臂振动 微风
南泥湾 纺车转动 轻微节律振动 腰部节律振动
南泥湾 丰收奔跑 加速后仰 全身渐强振动 强风+热感
敌后根据地 爆炸远处 瞬间后仰 全身冲击振动 气浪(风)
敌后根据地 蹲伏隐蔽 下降10cm 背部轻压感
延安窑洞 煤油灯阅读 静止 手部微振动 微热
东江纵队 穿越封锁线 左右摇晃 全身紧张振动 夜间冷风
改革开放 工程爆破 瞬间震动 全身冲击 气浪+尘味

5.4 多人协同VR技术

5.4.1 架构

┌──────────────────────────────────────────────────────────────┐
│                  多人协同VR架构                               │
├──────────────────────────────────────────────────────────────┤
│                                                              │
│  ┌────────┐  ┌────────┐  ┌────────┐  ┌────────┐             │
│  │ VR座位1 │  │ VR座位2 │  │ VR座位3 │  │ VR座位4 │             │
│  │ (队长)  │  │ (队员)  │  │ (队员)  │  │ (队员)  │             │
│  └───┬────┘  └───┬────┘  └───┬────┘  └───┬────┘             │
│      │           │           │           │                    │
│      └───────────┴───────────┴───────────┘                    │
│                      │                                       │
│              ┌───────┴───────┐                               │
│              │ Photon Fusion  │                               │
│              │ (状态同步服务器)│                               │
│              └───────┬───────┘                               │
│                      │                                       │
│              ┌───────┴───────┐                               │
│              │  房间管理服务   │                               │
│              │  (Node.js)    │                               │
│              └───────┬───────┘                               │
│                      │                                       │
│              ┌───────┴───────┐                               │
│              │  X1编排引擎    │                               │
│              │  (任务推送)    │                               │
│              └───────────────┘                               │
└──────────────────────────────────────────────────────────────┘

5.4.2 Photon Fusion多人同步

/// <summary>
/// 多人协同VR控制器:基于Photon Fusion实现4人同场景同步
/// </summary>
public class MultiplayerVRController : NetworkBehaviour
{
    // 玩家角色定义(与F2任务角色对应)
    public enum VRRole { Leader, Scout, Logistics, Negotiator }
    
    [Networked] public VRRole Role { get; set; }
    [Networked] public string PlayerName { get; set; }
    [Networked] public NetworkBool TaskCompleted { get; set; }
    
    // 玩家头像同步(位置+旋转+手部姿态)
    [Networked] public Vector3 HeadPosition { get; set; }
    [Networked] public Quaternion HeadRotation { get; set; }
    [Networked] public Vector3 LeftHandPos { get; set; }
    [Networked] public Vector3 RightHandPos { get; set; }
    
    /// <summary>
    /// 玩家进入VR房间
    /// </summary>
    public override void Spawned()
    {
        // 从X1编排引擎获取分配的角色
        Role = OrchestratorClient.GetAssignedRole(Runner.LocalPlayer);
        
        // 初始化角色化身
        InitializeAvatar(Role);
        
        // 通知房间管理服务
        RoomService.NotifyPlayerReady(Runner.SessionInfo.Name, Runner.LocalPlayer);
    }
    
    /// <summary>
    /// 网络同步更新(每帧调用)
    /// </summary>
    public override void FixedUpdateNetwork()
    {
        if (Runner.LocalPlayer == Object.InputAuthority)
        {
            // 本地玩家:采集VR设备数据并上传
            HeadPosition = VRDevice.GetHeadPosition();
            HeadRotation = VRDevice.GetHeadRotation();
            LeftHandPos = VRDevice.GetLeftHandPosition();
            RightHandPos = VRDevice.GetRightHandPosition();
        }
        else
        {
            // 远程玩家:更新远程化身
            UpdateRemoteAvatar(HeadPosition, HeadRotation, LeftHandPos, RightHandPos);
        }
    }
    
    /// <summary>
    /// 团队任务完成同步
    /// </summary>
    [Rpc(RpcSources.All, RpcTargets.All)]
    public void RPC_NotifyTaskProgress(string taskId, float progress)
    {
        // 所有客户端同步任务进度
        TaskUIController.UpdateProgress(taskId, progress);
        
        // 进度100%时通知X1编排引擎
        if (progress >= 1.0f)
        {
            OrchestratorClient.NotifyTaskCompleted(taskId);
        }
    }
}

5.4.3 房间管理与场次调度

场次调度流程:

1. 票务系统(S3)分配VR场次 → 通知房间管理服务
2. 4名用户到达VR工位 → 刷RFID/扫码确认身份
3. 房间管理服务创建Photon Fusion房间 → 分配角色
4. X1编排引擎推送对应任务剧本 → VR场景加载
5. 体验过程实时监控(时长/进度/异常)
6. 体验结束 → 场景退出 → 学习记录写入F4成长护照
7. 设备复位 → 等待下一场次

场次间隔: 3分钟(设备复位+消毒)
单场时长: 8-15分钟(按人群和路线适配)
日接待量: 单场景约120-160人/天(4座×8分钟×4-5场/小时×8小时)

房间管理服务API:

POST   /api/vr/room/create          创建VR房间(绑定场次+任务)
GET    /api/vr/room/{room_id}        房间状态
POST   /api/vr/room/{room_id}/join   用户加入房间(绑定角色)
POST   /api/vr/room/{room_id}/start  开始体验
GET    /api/vr/room/{room_id}/status 实时状态(进度/异常)
POST   /api/vr/room/{room_id}/end    结束体验
POST   /api/vr/room/{room_id}/reset  设备复位
GET    /api/vr/schedule/today        当日场次排期
POST   /api/vr/schedule/assign       票务系统分配场次

5.5 VR与F2情境任务联动

VR不是独立体验,而是F2情境任务的沉浸执行层。同一任务剧本在VR和非VR两种模式下运行,VR模式提供更强的沉浸感和空间感知。

F2情境任务剧场
    ├── 非VR模式: 多屏互动终端 + AI复盘
    └── VR模式: 沉浸场景 + 体感设备 + 多人协同 + AI复盘

共享层:
    - 同一任务定义(ScenarioTask数据模型)
    - 同一证据集(从知识图谱检索)
    - 同一历史事实揭示
    - 同一AI学习教练API复盘
    - 同一成长护照记录

联动流程:

1. X1编排引擎根据路线将用户分配到VR模式或非VR模式
   (VR模式: 路线包含VR节点 / 非VR模式: 路线不含VR节点)
2. VR场景加载时,从任务定义API拉取当前任务剧本
3. VR场景中嵌入证据查看点(3D文物+文献档案)
4. 团队在VR中讨论并做出决策(语音通话+手势交互)
5. 决策提交 → AI学习教练API复盘 → VR场景中展示历史对比
6. 退出VR → 现实连接问题 → 行动选择

5.6 AI NPC与数字人集成

5.6.1 VR内AI NPC

VR场景中的非玩家角色(NPC)由AI可信知识引擎驱动,可以回答用户问题、提供历史背景、引导任务。

/// <summary>
/// VR内AI NPC控制器:与AI可信馆员API集成
/// </summary>
public class VRNPCController : MonoBehaviour
{
    private AIBridge aiBridge;          // AI API通信桥
    private LipSync lipSync;            // 口型同步
    private VoicePlayer voicePlayer;    // 语音播放
    
    // NPC身份定义(从知识图谱加载)
    public string npcPersonId;          // 对应知识图谱中的Person节点
    public string npcEra;               // NPC所处历史时期
    
    /// <summary>
    /// 用户向NPC提问(语音输入)
    /// </summary>
    public async void OnUserQuestion(string question)
    {
        // 1. 调用AI可信馆员API
        var response = await aiBridge.AskLibrarian(new AskRequest
        {
            question = question,
            audience = CurrentAudience.Type,
            language = CurrentAudience.Language,
            context = new {
                current_artifact_id = CurrentArtifactId,
                current_zone = CurrentZoneId,
                npc_person_id = npcPersonId
            }
        });
        
        // 2. TTS语音合成
        AudioClip audioClip = await TTSService.Synthesize(
            response.answer, 
            CurrentAudience.Language
        );
        
        // 3. 口型同步播放
        lipSync.PlayWithAudio(audioClip);
        voicePlayer.Play(audioClip);
        
        // 4. 显示文字字幕(VR空间UI)
        VRSubtitleUI.Show(response.answer, response.sources);
        
        // 5. 显示追问建议
        VRFollowUpUI.Show(response.follow_up_questions);
    }
}

5.6.2 数字人技术方案

方案 技术栈 效果 适用场景
VR内NPC Unity内置角色 + AI API + TTS 风格化3D角色,实时口型同步 VR场景内交互
线下数字人导览 Unreal Engine 5 + MetaHuman 超写实数字人,大屏展示 馆内大屏导览
云端数字人 UE5 Pixel Streaming 云端渲染,浏览器观看 F5云展馆

TTS语音合成:

  • 中文普通话CosyVoice / VITS-zh(开源,支持私有化部署)
  • 粤语:基于VITS微调的粤语模型
  • 英文VITS-en / Edge TTS
  • 口型同步Oculus LipSync Unity插件(实时音频驱动BlendShape
  • 安全约束:NPC禁止模拟革命领袖发表新言论,仅复述已审核史料

5.7 VR设备远程管理与编排

5.7.1 设备管理架构

┌──────────────────────────────────────────────────────────────┐
│                VR设备运维管理平台                              │
├──────────────────────────────────────────────────────────────┤
│                                                              │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐          │
│  │ 设备监控面板  │  │ 场次调度面板  │  │ 内容管理面板  │          │
│  │ (Grafana)   │  │ (自研Web)   │  │ (自研Web)   │          │
│  └──────┬──────┘  └──────┬──────┘  └──────┬──────┘          │
│         │                │                │                  │
│  ┌──────┴────────────────┴────────────────┴──────┐          │
│  │              设备管理服务 (Spring Boot)          │          │
│  └──────┬────────────────┬────────────────┬──────┘          │
│         │                │                │                  │
│    ┌────┴────┐     ┌─────┴────┐     ┌─────┴────┐            │
│    │VR头显×N  │     │体感设备×N│     │渲染主机×N│            │
│    │(ADB/MDM)│     │(MQTT)   │     │(SSH)    │            │
│    └─────────┘     └─────────┘     └─────────┘            │
└──────────────────────────────────────────────────────────────┘

5.7.2 监控指标

监控对象 指标 告警阈值
VR头显 电量、温度、帧率 温度>65°C / 帧率<72fps
渲染主机 GPU利用率、显存、温度 GPU>95% / 显存>90% / 温度>85°C
体感座椅 连接状态、运动范围校准 断连 / 校准偏移>5°
触觉背心 蓝牙连接、电量 断连 / 电量<20%
网络延迟 Photon Fusion RTT RTT>50ms
场次状态 当前场次、进度、异常 异常停留>30秒

5.7.3 远程诊断与自动恢复

异常检测 → 自动诊断 → 分级处理:

Level 1 (轻微): 自动恢复
  - 帧率下降 → 降低渲染质量(LOD切换)
  - 网络抖动 → 增加插值缓冲
  - 蓝牙重连 → 自动重试

Level 2 (中度): 远程干预
  - 场景卡死 → 远程重启Unity应用
  - 体感设备异常 → 远程复位指令
  - 头显追踪丢失 → 提示用户重新佩戴

Level 3 (严重): 人工介入
  - 硬件故障 → 排队转非VR模式
  - 渲染主机宕机 → 切换备用主机
  - 安全事件 → 紧急停止所有设备

5.8 云端VR串流方案

为降低全国星火节点的硬件门槛,L2/L3节点可采用云端VR串流方案,无需本地高性能渲染主机。

5.8.1 串流架构

L2/L3节点 (轻量硬件)                    旗舰中心/区域云端 (GPU集群)
┌──────────────────┐                  ┌──────────────────────┐
│ VR头显(Pico/Quest)│                  │  云端渲染服务器        │
│   ↓ WiFi/5G       │  ←── 视频流 ──→  │  (NVIDIA RTX 4090)   │
│   ↓ 解码显示       │  ←── 音频流 ──→  │  Unity应用实例        │
│   ↓ 手柄/头显数据  │  ── 输入流 ──→  │  CloudXR/ALVR串流     │
│                   │                  │  编码H.265低延迟      │
└──────────────────┘                  └──────────────────────┘

5.8.2 串流技术选型

方案 延迟 优势 劣势 适用场景
CloudXR (NVIDIA) 15-30ms 官方优化,画质好 依赖NVIDIA生态 L3城市节点
ALVR (开源) 20-40ms 开源免费,跨平台 画质略逊 L2标准节点
本地渲染 <10ms 无网络延迟 需高性能主机 L4旗舰中心
WebXR 30-80ms 无需安装客户端 画质受限 F5云展馆轻量模式

5.8.3 节点VR部署方案

节点级别 VR方案 硬件需求 成本估算
L1微节点 不部署VR
L2标准节点 ALVR串流 + Pico头显 Pico头显×2 + 普通PC
L3城市节点 CloudXR串流 + Pico/Quest 头显×4 + 5G路由
L4旗舰中心 本地渲染 + 完整体感 RTX 4090主机×4 + 完整体感设备

5.9 VR内容生产管线

5.9.1 3D资产生产流程

历史考证与场景设计
  ↓ (党史专家+教育研究组审定)
概念美术设定
  ↓
3D建模 (Blender/Maya)
  ├── 地形: World Creator / Gaia (程序化地形)
  ├── 建筑: 传统建模 + 历史照片参考
  ├── 道具: 精细建模 + PBR材质
  ├── 角色: MetaHuman Creator / Character Creator
  └── 植被: SpeedTree (历史植被还原)
  ↓
UV展开与纹理绘制 (Substance Painter)
  ↓
动画与绑定 (Maya/Blender)
  ↓
Unity导入与场景搭建
  ↓
交互逻辑开发 (C#脚本)
  ↓
体感效果配置 (效果预设编辑器)
  ↓
内部测试 (功能+性能+安全)
  ↓
专家审核 (史实准确性+教育效果)
  ↓
发布 (版本化入库)

5.9.2 性能优化策略

优化项 目标 技术手段
帧率 稳定72fps (VR舒适标准) LOD分级、视锥剔除、遮挡剔除
渲染负载 GPU利用率<85% SRP Batcher、GPU Instancing
加载时间 场景切换<3秒 Addressables异步加载、资源预加载
内存 <12GB (Pico 4限制) 资源压缩、纹理流式加载
包体 单场景<2GB ASTC纹理压缩、音频压缩
网络带宽 多人同步<5Mbps 状态压缩、兴趣区域管理(AoI)

5.9.3 VR舒适度与安全

措施 说明
舒适度分级 每个VR场景标注舒适度等级(舒适/适中/激烈)
晕动症缓解 瞬移移动(Teleport)为默认,平滑移动可选
视觉舒适 固定参考帧(鼻部虚拟遮挡)、渐变过渡
时长控制 单次VR体验不超过15分钟
休息间隔 两场VR体验之间至少间隔30分钟
年龄限制 12岁以下不建议使用VR头显
安全区域 Lighthouse定位基站划定安全边界,越界自动暂停
紧急停止 手柄Home键一键退出,工作人员远程紧急停止
卫生消毒 一次性面罩+UV消毒柜,场次间隔3分钟消毒

5.10 VR体验排队与场次调度

5.10.1 排队调度算法

def schedule_vr_sessions(visitors, capacity=4, duration_min=8, reset_min=3):
    """
    VR场次调度算法
    
    visitors: 当前排队访客列表 [{user_id, audience_type, route_id, arrival_time}]
    capacity: 单场容量(4人)
    duration_min: 单场时长
    reset_min: 设备复位时间
    """
    cycle_time = duration_min + reset_min  # 单场周期11分钟
    
    # 1. 按路线分组:相同路线节点的访客优先同场
    groups = group_by_route(visitors)
    
    # 2. 按人群类型分组:相同人群类型优先同场(内容适配一致)
    groups = subgroup_by_audience(groups)
    
    # 3. 按到达时间排序
    for group in groups:
        group.sort(key=lambda v: v['arrival_time'])
    
    # 4. 贪心填充场次
    sessions = []
    for group in groups:
        while group:
            session_visitors = group[:capacity]
            group = group[capacity:]
            
            # 计算场次时间
            start_time = calculate_start_time(sessions, cycle_time)
            
            sessions.append({
                'visitors': session_visitors,
                'start_time': start_time,
                'end_time': start_time + timedelta(minutes=duration_min),
                'scene_id': get_scene_for_route(session_visitors[0]['route_id']),
                'task_id': get_task_for_route(session_visitors[0]['route_id'])
            })
    
    # 5. 客流高峰策略:开启备用VR工位
    if len(sessions) > threshold:
        activate_backup_station()
    
    return sessions

5.10.2 排队体验设计

排队等待期间不浪费用户时间,通过排队区屏幕提供:

  • 任务预习:展示即将进入的VR场景历史背景和任务问题
  • 角色介绍:展示分配到的角色和资源约束
  • 操作教学VR手柄操作和交互方式教学视频
  • 安全须知:VR舒适度等级、注意事项、紧急退出方法
  • 进度显示:当前排队位置和预计等待时间

六、X1/X2/X3公共平台技术实现

6.1 X1全场景体验编排引擎

核心数据流

事件源                          处理引擎                     输出目标
─────────                      ─────────                    ─────────
UWB位置流(10Hz)     ─┐
客流计数(Kafka)      ─┤→  Flink实时计算  →  编排决策  →  设备控制指令
设备状态(MQTT)       ─┤    (CEP复杂事件)    (规则+ML)    (WebSocket/MQTT)
用户路线(REST)       ─┤
任务状态(REST)       ─┘
// 当用户进入某区域且该区域客流低于阈值时,触发内容联动
DataStream<PositionEvent> positions = env
    .addSource(new KafkaSource<>("uwb-positions"));

Pattern<PositionEvent, ?> pattern = Pattern
    .<PositionEvent>begin("enter_zone")
    .where(evt -> evt.getZoneId().equals("zone_b"))
    .within(Time.seconds(5));

CEP.pattern(positions, pattern)
    .select((events) -> {
        PositionEvent evt = events.get("enter_zone");
        int zoneLoad = getZoneLoad(evt.getZoneId());
        if (zoneLoad < THRESHOLD) {
            triggerContentOrchestration(evt.getUserId(), evt.getZoneId());
        }
    });

6.2 X2成长护照与行动档案

跨系统数据同步

S3票务系统 ──┐
S4教研系统 ──┤
S6港澳专项 ──┤→  X2成长护照API  →  统一学习档案
S8数据中台 ──┤    (GraphQL API)     (PostgreSQL)
线下终端   ──┘

GraphQL API

type Query {
  passport(userId: ID!): GrowthPassport
  learningRecords(passportId: ID!, type: String): [LearningRecord]
  actionCommitments(passportId: ID!, status: String): [ActionCommitment]
}

type Mutation {
  createPassport(input: CreatePassportInput!): GrowthPassport
  recordLearning(input: RecordLearningInput!): LearningRecord
  chooseAction(input: ChooseActionInput!): ActionCommitment
  submitFeedback(commitmentId: ID!, phase: String!, content: String!): ActionCommitment
}

6.3 X3权威内容治理中心

内容审核工作流

内容创建/修改
    ↓
AI编审助手自动检查 (编审助手API)
  - 事实校验: 与知识图谱交叉验证
  - 来源检查: 是否标注史料来源
  - 合规检查: 政治安全规则引擎
  - 版权检查: 素材授权验证
    ↓
自动检查通过 → 编辑复审 (人工)
自动检查未通过 → 退回修改
    ↓
编辑复审通过 → 专家终审 (关键内容)
    ↓
专家终审通过 → 版本发布 (带版本号)
    ↓
发布到: 展陈系统 / 云展馆 / 课程平台 / 全国节点
    ↓
使用反馈收集 → 定期巡检 → 需要时触发修订

版本管理

CREATE TABLE content_versions (
    id              VARCHAR(64) PRIMARY KEY,
    component_id    VARCHAR(64) NOT NULL,
    version         INT NOT NULL,
    content_snapshot JSONB NOT NULL,     -- 完整内容快照
    change_log      TEXT,
    review_chain    JSONB NOT NULL,       -- 审核链路记录
    published_by    VARCHAR(64),
    published_at    TIMESTAMP,
    is_current      BOOLEAN DEFAULT false,
    UNIQUE(component_id, version)
);

七、数据架构

7.1 数据库分工

数据库 用途 数据示例
PostgreSQL 业务OLTP 用户、票务、课程、任务、护照、行动
Neo4j 知识图谱 事件、人物、文物、概念及关系
Milvus 向量检索 史料文档向量、语义搜索
ClickHouse 分析OLAP 客流统计、学习效果、运营报表
Redis 缓存 会话、热点数据、实时客流计数
MinIO 对象存储 3D模型、视频、图片、文档
Kafka 事件流 位置事件、设备状态、客流计数

7.2 数据流总览

┌─────────────────────────────────────────────────────────────┐
│                        数据源                                 │
│  票务 │ 客流IoT │ UWB定位 │ AI日志 │ 学习记录 │ 文物 │ 内容  │
└──────────────────────────┬──────────────────────────────────┘
                           │
                    Kafka消息总线
                           │
           ┌───────────────┼───────────────┐
           │               │               │
     ┌─────┴─────┐  ┌──────┴──────┐  ┌────┴──────┐
     │ PostgreSQL │  │ ClickHouse  │  │  Redis    │
     │ (实时业务) │  │ (分析聚合)  │  │ (实时缓存) │
     └───────────┘  └─────────────┘  └───────────┘
                           │
                    Flink ETL
                           │
                 ┌─────────┴─────────┐
                 │                   │
           ┌─────┴─────┐      ┌──────┴──────┐
           │ Superset   │      │ 风控引擎     │
           │ (可视化看板)│      │ (Drools规则) │
           └───────────┘      └─────────────┘

7.3 北极星指标计算

-- 有效学习与行动转化人次
SELECT
    COUNT(DISTINCT p.user_id) AS effective_transformation_count
FROM growth_passports p
JOIN learning_records lr1 ON p.id = lr1.passport_id
    AND lr1.event_type = 'route_completed'       -- 完成核心学习路径
JOIN learning_records lr2 ON p.id = lr2.passport_id
    AND lr2.event_type IN ('task_completed', 'understanding_expressed')  -- 理解验证
JOIN action_commitments ac ON p.id = ac.passport_id
    AND ac.status IN ('in_progress', 'completed')  -- 形成行动
JOIN learning_records lr3 ON p.id = lr3.passport_id
    AND lr3.event_type = 'feedback_submitted'     -- 产生反馈
WHERE p.created_at >= '2026-01-01';

八、安全与合规

8.1 网络安全架构

┌──────────────────────────────────────────────────────┐
│                    互联网                               │
│              WAF (Web应用防火墙)                        │
├──────────────────────────────────────────────────────┤
│                    DMZ区                                │
│         SLB (负载均衡) + API Gateway                   │
├──────────────────────────────────────────────────────┤
│                  应用区 (K8s)                           │
│    微服务集群 (Spring Cloud + 服务网格)                  │
├──────────────────────────────────────────────────────┤
│                  数据区 (隔离)                          │
│    PostgreSQL │ Neo4j │ Milvus │ MinIO                │
│    GPU推理集群                                          │
├──────────────────────────────────────────────────────┤
│                  设备区 (VLAN隔离)                      │
│    IoT/安防/VR/灯光音频 (独立VLAN)                      │
└──────────────────────────────────────────────────────┘

8.2 AI安全护栏技术实现

class AISafetyGuardrail:
    """AI安全护栏三层过滤"""

    def __init__(self):
        self.input_filter = InputFilter()      # 输入过滤
        self.fact_checker = FactChecker()       # 事实校验
        self.output_filter = OutputFilter()    # 输出过滤
        self.audit_logger = AuditLogger()      # 审计日志

    def process(self, user_input, generated_answer, sources):
        # 1. 输入安全检查
        input_result = self.input_filter.check(user_input)
        if not input_result.safe:
            return self.safety_fallback(input_result.reason)

        # 2. 事实校验: 与知识图谱比对关键事实
        fact_result = self.fact_checker.verify(
            generated_answer, sources, self.knowledge_graph
        )
        if fact_result.has_errors:
            return self.safety_fallback("事实校验未通过")

        # 3. 输出安全检查
        output_result = self.output_filter.check(generated_answer)
        if not output_result.safe:
            return self.safety_fallback(output_result.reason)

        # 4. 审计日志
        self.audit_logger.log(
            input=user_input,
            output=generated_answer,
            sources=sources,
            model_version=self.model_version,
            timestamp=datetime.now()
        )

        return generated_answer

8.3 数据隐私保护

数据类型 保护措施
用户身份信息 最小化采集,不采集与学习无关的信息
未成年人数据 监护人授权 + 最小化采集 + 不公开显示
港澳用户数据 自愿参与 + 匿名聚合 + 不做个人认同标签
人脸/情绪数据 不采集、不推断
AI交互日志 脱敏存储 + 仅用于质量优化 + 定期清理
位置数据 仅用于体验编排,不留存个人轨迹

九、最小可行原型技术实现

9.1 原型范围

按照创新升级方案第九章建议,首个原型为"从一件文物到一次现实行动"完整体验。

9.2 原型技术清单

最小原型 = 1件文物3D模型 + 1个情境任务 + 1个AI问答入口
         + 1个成长护照H5 + 1个行动选择页 + 1个30天回访推送
组件 技术方案 工程量估算
文物3D展示 Three.js + glTF模型 1件文物扫描+建模,2周
情境任务 H5互动页面 + 状态机 1个任务剧本+开发,3周
AI问答 Qwen2.5-14B + RAG + 安全护栏 模型部署+微调+API4周
成长护照 微信小程序 + PostgreSQL 前后端开发,2周
行动选择 小程序页面 + 数据库 1周
30天回访 XXL-Job定时 + 微信模板消息 1周
体验编排 简化版WebSocket + 状态同步 2周

9.3 原型部署方案

单服务器部署 (原型阶段):
  - 1台 GPU服务器 (2×A100 40G)
    → Qwen2.5-14B推理 + Milvus向量库
  - 1台 应用服务器 (16核/32G)
    → PostgreSQL + Redis + Spring Boot + Nginx
  - 1台 前端服务器 (4核/8G)
    → Three.js静态资源 + 小程序后端
  - 1台 互动终端 (触屏一体机)
    → 情境任务H5 + AI问答界面

9.4 原型验证指标

验证维度 指标 达标标准
AI可信度 回答来源覆盖率 ≥90%
AI安全 不当内容拦截率 100%
任务参与度 任务完成率 ≥70%
行动转化 行动选择率 ≥50%
回访参与 30天反馈率 ≥20%
用户体验 理解表达质量(专家评分) ≥3.5/5

十、技术风险与应对

风险 影响 应对措施
大模型推理延迟过高 体验卡顿 多级缓存 + 流式输出 + 轻量模型兜底
知识图谱构建周期长 内容不足影响上线 先建核心子图(延安十三年),逐步扩展
UWB定位精度不达标 编排误触发 部署密度优化 + 区域判定容错算法
港澳跨境网络不稳定 云展馆体验差 港澳CDN节点 + 轻量WebGL模式
VR设备故障率高 体验中断 冗余设备 + 远程诊断 + H5备选方案
内容审核瓶颈 发布延迟 AI初审自动化 + 并行审核流程
并发峰值过载 系统不可用 K8s弹性扩缩容 + 限流降级 + 离线兜底
全国节点运维复杂 复制质量参差 标准化部署脚本 + 远程监控 + 自动健康检查

十一、技术团队建议

11.1 核心团队配置

角色 人数 职责
AI工程师 3-4 大模型微调、RAG、安全护栏、知识图谱
后端工程师 4-5 微服务、API、数据库、消息队列
前端工程师 3-4 Web/小程序/互动终端
3D/XR工程师 2-3 Three.js、Unity、3D建模、数字人
数据工程师 2 数据管道、Flink、ClickHouse、指标计算
DevOps 2 K8s、CI/CD、监控、安全
内容工程师 2 内容组件化、审核工作流、版本管理
UI/UX设计师 2 交互设计、视觉设计、体验测试

11.2 外部协作

协作方 职责
党史专家组 史料审核、知识图谱校验、任务剧本审定
教育研究组 课程设计、学习效果评估方法
延安精神研究会 权威内容授权和编审
3D扫描团队 文物数字化采集
硬件集成商 VR/灯光/音频/IoT设备安装调试

十二、总结

本技术实现方案将创新升级方案中的"一核、双域、三引擎、四闭环、八旗舰"产品体系,转化为可落地的技术架构:

  • AI层Qwen2.5私有化部署 + LoRA微调 + RAG三级检索 + 安全护栏,确保可信、可溯源;
  • 数据层Neo4j知识图谱 + Milvus向量库 + PostgreSQL业务库 + ClickHouse分析库,支撑全场景数据需求;
  • 平台层X1体验编排(Flink CEP) + X2成长护照(GraphQL) + X3内容治理(版本化审核),三大公共平台贯穿所有产品;
  • 沉浸层Unity VR/XR + 体感设备联动 + Photon Fusion多人协同 + 云端串流,五大历史场景沉浸体验嵌入F1/F2产品;
  • 应用层:八个旗舰产品各自独立又共享平台能力,通过API和事件总线松耦合;
  • 基础设施:K8s容器化 + GPU推理集群 + 5G/IoT设备网络 + CDN全球加速;
  • 安全合规:三层AI安全护栏 + 数据最小化原则 + 全过程审计追溯。

建议从"一件文物到一次现实行动"最小原型开始,用7周时间验证完整链路,再逐步扩展为全量系统。