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

2879 lines
127 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 延安精神(大湾区)学习展示中心 — 技术实现方案
> 本文档将《终极目标导向创新升级方案》中的产品设计和系统架构,转化为可落地的技术架构、技术选型、数据模型和工程实施方案。
>
> 编制日期: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 查询接口
```cypher
// 示例:查询"大生产运动"关联的所有文物、人物和概念
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回答必须包含:
```json
{
"answer": "延安大生产运动始于1939年...",
"sources": [
{
"document": "《延安精神研究》第3卷",
"page": 45,
"excerpt": "1939年2月,毛泽东在延安干部生产动员大会上提出...",
"verified": true
}
],
"confidence": "high",
"uncertainty_note": null
}
```
当检索结果不足时,返回:
```json
{
"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临场改写历史,而是在已审核内容组件中进行安全编排。
#### 技术架构
```
┌────────────────────────────────────────────────────┐
│ 可信叙事引擎 │
├────────────────┬────────────────┬──────────────────┤
│ 内容组件仓库 │ 叙事编排引擎 │ 分层表达引擎 │
│ (已审核内容块) │ (路线生成器) │ (分众适配器) │
├────────────────┼────────────────┼──────────────────┤
│ 组件元数据: │ 编排规则: │ 适配规则: │
│ - 史料来源 │ - 人群→组件集 │ - 小学: 简化表述 │
│ - 适用人群 │ - 时长→节点数 │ - 中学: 因果逻辑 │
│ - 时长估算 │ - 客流→备选节点 │ - 干部: 理论深度 │
│ - 空间位置 │ - 教学目标→必选 │ - 港澳: 双语+轻量 │
│ - 版本号 │ 节点 │ │
└────────────────┴────────────────┴──────────────────┘
```
#### 内容组件数据模型
```sql
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()
);
```
#### 叙事路线生成算法
```python
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成长护照。
#### 数据模型
```sql
-- 成长护照主表
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节点 │ ... │
│ 微节点 │ │ 标准节点│ │ 城市节点│ │
└───────┘ └───────┘ └───────┘ │
```
#### 组件包格式
```json
{
"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追问(史料引用) │
│ - 资源约束 │ - 个人终端: 决策 │ - 证据使用分析 │
│ - 证据集 │ - 团队屏: 方案汇总│ - 现实连接问题 │
│ - 历史事实 │ │ │
│ - 评价维度 │ │ │
└────────────────┴────────────────┴────────────────────┘
```
#### 任务状态机
```python
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")
]
```
#### 任务定义数据模型
```sql
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报告生成 → 推送到团队终端 → 存入成长护照
```
#### 具体场景示例:南泥湾大生产任务剧本
```json
{
"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插件) │ (扫码→星图) │ (一物一课/短片) │
└────────────────┴────────────────┴────────────────────┘
```
#### 文物数据模型
```sql
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()
);
```
#### 关系星图前端实现
```javascript
// 使用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门户(繁体/英文) | 不依赖微信,支持港澳访问 |
#### 数据采集边界
```python
# 允许采集的数据
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天跟踪 │ - 成果墙展示 │
│ - 自定义行动 │ - 进展提醒 │ - 课程案例转化 │
│ - 团队行动创建 │ - 反馈表单 │ - 年度优秀评选 │
└────────────────┴────────────────┴────────────────────┘
```
#### 行动模板数据模型
```sql
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体验(排队预约)
│ └── 成长护照同步到个人手机
├── 内容更新: 每季度从旗舰中心同步新组件包
├── 本地内容提交: 本校优秀作品 → 旗舰中心审核 → 全国共享
└── 远程监控: 旗舰中心实时监控设备状态
```
#### 节点部署自动化
```yaml
# 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 场景管理器
```csharp
/// <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 体感联动控制
```csharp
/// <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多人同步
```csharp
/// <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可信知识引擎驱动,可以回答用户问题、提供历史背景、引导任务。
```csharp
/// <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 排队调度算法
```python
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) ─┘
```
#### Flink CEP规则示例
```java
// 当用户进入某区域且该区域客流低于阈值时,触发内容联动
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**
```graphql
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)
- 事实校验: 与知识图谱交叉验证
- 来源检查: 是否标注史料来源
- 合规检查: 政治安全规则引擎
- 版权检查: 素材授权验证
自动检查通过 → 编辑复审 (人工)
自动检查未通过 → 退回修改
编辑复审通过 → 专家终审 (关键内容)
专家终审通过 → 版本发布 (带版本号)
发布到: 展陈系统 / 云展馆 / 课程平台 / 全国节点
使用反馈收集 → 定期巡检 → 需要时触发修订
```
#### 版本管理
```sql
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 北极星指标计算
```sql
-- 有效学习与行动转化人次
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安全护栏技术实现
```python
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 + 安全护栏 | 模型部署+微调+API,4周 |
| 成长护照 | 微信小程序 + 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周时间验证完整链路,再逐步扩展为全量系统。