# AIP (Affective Interaction Programming) - 情感交互编程
基于情绪数据模型的AI决策与生成式用户交互系统。
## 项目概述
AIP是一个将用户情绪作为AI决策者直接优化目标的框架。系统不推荐内容,而是生成交互逻辑本身——将用户特质与实时行为情绪信号映射到参数化的交互机制。
### 核心组件
1. **EDM (Emotion Data Model)**: 情绪数据模型,从行为信号推断用户情绪状态
2. **Director**: 交互策略网络,基于情绪状态生成最优交互参数
---
## 技术架构
### 项目结构
```
aip/
├── Cargo.toml
├── src/
│ ├── lib.rs
│ ├── edm/
│ │ ├── mod.rs
│ │ ├── core.rs # EDM核心接口定义
│ │ ├── features.rs # 特征工程
│ │ └── roguelite/
│ │ ├── mod.rs
│ │ ├── core.rs # EDM Roguelite推理实现
│ │ └── training.rs # EDM Roguelite训练实现
│ ├── director/
│ │ ├── mod.rs
│ │ ├── core.rs # Director核心接口定义
│ │ └── roguelite/
│ │ ├── mod.rs
│ │ ├── core.rs # Director Roguelite推理实现
│ │ └── training.rs # Director Roguelite训练实现
│ └── utils/
│ ├── math.rs # 数学工具
│ └── tensor.rs # Tensor工具
└── papers/
└── 001.md # 论文文档
```
### Cargo Features
| `edm` | EDM核心接口 | - |
| `edm_roguelite` | EDM Roguelite推理 | `edm` |
| `edm_roguelite_training` | EDM Roguelite训练 | `edm_roguelite` |
| `director` | Director核心接口 | - |
| `director_roguelite` | Director Roguelite推理 | `director`, `edm_roguelite` |
| `director_roguelite_training` | Director Roguelite训练 | `director_roguelite` |
---
## EDM (情绪数据模型)
### 功能描述
从触屏动力学、按键熵与犹豫模式等行为信号推断用户的实时情绪状态(效价、唤醒、掌控感)。
### 核心接口 (src/edm/core.rs)
```rust
pub trait EmotionDataModel: Send + Sync {
fn infer(&self, features: &HashMap<u32, f32>) -> Result<EmotionState, EdmError>;
}
pub trait EmotionDataModelTrainer: Send + Sync {
fn train(&mut self, dataset: &TrainingDataset) -> Result<TrainingResult, EdmError>;
fn save(&self, path: &Path) -> Result<(), EdmError>;
fn load(&mut self, path: &Path) -> Result<(), EdmError>;
}
#[derive(Debug, Clone)]
pub struct EmotionState {
pub valence: f32, // 效价 [0, 1]
pub arousal: f32, // 唤醒 [0, 1]
pub dominance: f32, // 掌控感 [0, 1]
}
```
### 特征定义
| 0 | 点击频率 | 10秒 | 唤醒↑ |
| 1 | 滑动速度 | 每次滑动 | 唤醒↑ |
| 2 | 多点触控比例 | 10秒 | 唤醒↑ |
| 3 | 设备倾斜标准差 | 10秒 | 唤醒↑ |
| 4 | 重试延迟 | 每次失败 | 效价↓ |
| 5 | 暂停时长 | 每次暂停 | 效价↓ |
| 6 | 犹豫时间 | 10秒 | 效价↓ |
| 7 | 路径效率 | 10秒 | 掌控↑ |
| 8 | 取消率 | 10秒 | 掌控↓ |
| 9 | 完成率 | 10秒 | 掌控↑ |
| 10 | 平均压力 | 10秒 | 唤醒↑ |
| 11 | 压力标准差 | 10秒 | 唤醒↑ |
| 12 | 动作精度 | 10秒 | 掌控↑ |
| 13 | 平均反应时间 | 10秒 | 效价↓ |
| 14 | 反应时间标准差 | 10秒 | 效价↓ |
### 模型架构
```
输入 (15维特征 × 5步历史)
↓
1D卷积 (滤波器=32, 核=3)
↓
SE模块 (通道注意力)
↓
双向LSTM (64)
↓
自注意力层
↓
MLP (64→32→3)
↓
Sigmoid → [效价, 唤醒, 掌控感] ∈ [0,1]
```
### 损失函数
```
L = 0.4 · MSE(v) + 0.4 · MSE(a) + 0.2 · MSE(d) + 0.2 · (1 - CCC)
```
### 性能目标
| 效价 | ≥ 0.55 | ≤ 0.18 |
| 唤醒 | ≥ 0.60 | ≤ 0.16 |
| 掌控感 | ≥ 0.50 | ≤ 0.20 |
---
## Director (交互策略)
### 功能描述
基于用户特质、环境状态和实时情绪向量,输出连续的交互参数以优化复合奖励。
### 核心接口 (src/director/core.rs)
```rust
pub trait InteractionStrategy: Send + Sync {
fn decide(&self, state: &InteractionState) -> Result<InteractionParams, DirectorError>;
}
pub trait InteractionStrategyTrainer: Send + Sync {
fn train(&mut self, trajectories: &Vec<Trajectory>) -> Result<TrainingResult, DirectorError>;
fn save(&self, path: &Path) -> Result<(), DirectorError>;
fn load(&mut self, path: &Path) -> Result<(), DirectorError>;
}
#[derive(Debug, Clone)]
pub struct InteractionState {
pub user_traits: HashMap<u32, f32>, // 用户特质 (8维)
pub env_state: HashMap<u32, f32>, // 环境状态 (6维)
pub emotion: EmotionState, // 实时情绪 (3维)
pub emotion_stats: EmotionStats, // 情绪统计 (6维)
}
#[derive(Debug, Clone)]
pub struct InteractionParams {
pub intensity_factor: f32, // [0.5, 2.0]
pub feedback_intensity: f32, // [0.3, 1.5]
pub pace_speed: f32, // [0.6, 1.8]
pub reward_scarcity: f32, // [0.0, 1.0]
pub env_arousal: f32, // [0.3, 1.0]
pub rhythm_modulation: f32, // [0.8, 1.5]
pub challenge_curve: f32, // [-1.0, 1.0]
}
```
### 状态空间 (23维)
| 用户特质 | 8 | 年龄组、性别、自我报告风格、反应时间百分位等 |
| 环境状态 | 6 | 关卡、进度、资源、时间等 |
| 实时情绪 | 3 | 效价、唤醒、掌控感 |
| 情绪统计 | 6 | 过去30秒的均值和标准差 |
### 动作空间 (7维连续)
| 强度因子 | [0.5, 2.0] | 事件频率/密度的乘数 |
| 反馈强度 | [0.3, 1.5] | 触觉/视觉反馈的强度 |
| 节奏速度 | [0.6, 1.8] | 交互进程的速度 |
| 奖励稀缺度 | [0.0, 1.0] | 稀有奖励的概率 |
| 环境唤醒度 | [0.3, 1.0] | 背景刺激水平 |
| 节奏调节 | [0.8, 1.5] | 音频反馈的节奏/步调 |
| 挑战曲线 | [-1.0, 1.0] | 难度进展的陡峭程度 |
### 奖励函数
```
R = 0.4 · R_progress + 0.4 · R_emotion + 0.2 · R_retention
```
### 训练参数 (PPO)
| 学习率 | 3e-4 |
| 裁剪系数 | 0.2 |
| GAE λ | 0.95 |
| 熵系数 | 0.01 |
| 小批量大小 | 64 |
| 训练轮次 | 2000+ |
---
## 依赖库
- **Candle**: 最新版本,用于模型推理和训练
- **ndarray**: 数值计算
- **serde**: 序列化/反序列化
---
## 可验证任务清单
### Phase 1: 项目基础设施
> 预计完成标准: 编译通过 ✅
- [x] **T1.1** 初始化Rust项目,配置Cargo.toml
- 验证标准: `cargo build` 成功
- [x] **T1.2** 配置所有features依赖关系
- 验证标准: `cargo build --features edm_roguelite_training` 成功
- [x] **T1.3** 添加Candle依赖
- 验证标准: `cargo build` 包含candle依赖
- [x] **T1.4** 创建基础模块结构
- 验证标准: 所有mod.rs文件存在且可编译
### Phase 2: EDM核心实现
> 预计完成标准: 单元测试通过
- [x] **T2.1** 定义EDM核心trait (src/edm/core.rs)
- 验证标准: 编译通过,trait定义完整
- [x] **T2.2** 实现EmotionState结构体
- 验证标准: 包含valence, arousal, dominance字段
- [x] **T2.3** 实现特征工程模块 (src/edm/features.rs)
- 验证标准: 15维特征计算正确
- [x] **T2.4** 实现特征归一化 (z-score)
- 验证标准: 测试数据归一化结果正确
- [x] **T2.5** 编写EDM单元测试
- 验证标准: `cargo test --lib edm` 全部通过
### Phase 3: EDM Roguelite推理实现
> 预计完成标准: 推理测试通过
- [x] **T3.1** 实现1D卷积层 (Candle)
- 验证标准: 卷积输出维度正确
- [x] **T3.2** 实现SE注意力模块
- 验证标准: 通道注意力输出正确
- [x] **T3.3** 实现双向LSTM层
- 验证标准: 序列处理正确
- [x] **T3.4** 实现自注意力层
- 验证标准: 注意力权重计算正确
- [x] **T3.5** 实现MLP输出层
- 验证标准: 输出3维情绪向量
- [x] **T3.6** 实现模型加载/保存
- 验证标准: 模型权重正确保存和加载
- [x] **T3.7** 集成推理pipeline
- 验证标准: 给定输入特征,输出情绪状态
- [x] **T3.8** 编写推理测试
- 验证标准: `cargo test --features edm_roguelite` 通过
### Phase 4: EDM Roguelite训练实现
> 预计完成标准: 训练收敛
- [x] **T4.1** 实现MSE损失函数
- 验证标准: 损失计算正确
- [x] **T4.2** 实现CCC损失函数
- 验证标准: 一致性相关系数计算正确
- [x] **T4.3** 实现组合损失函数 (权重0.4/0.4/0.2/0.2)
- 验证标准: 损失计算符合论文定义
- [x] **T4.4** 实现训练数据加载器
- 验证标准: 支持SAM评分数据格式
- [x] **T4.5** 实现训练循环
- 验证标准: 支持mini-batch训练
- [x] **T4.6** 实现5折交叉验证
- 验证标准: 验证流程正确
- [ ] **T4.7** 训练并验证模型性能
- 验证标准: Pearson r ≥ 0.55 (效价)
- [x] **T4.8** 编写训练测试
- 验证标准: `cargo test --features edm_roguelite_training` 通过
### Phase 5: Director核心实现
> 预计完成标准: 单元测试通过
- [x] **T5.1** 定义Director核心trait (src/director/core.rs)
- 验证标准: 编译通过,trait定义完整
- [x] **T5.2** 实现InteractionState结构体
- 验证标准: 包含23维状态字段
- [x] **T5.3** 实现InteractionParams结构体
- 验证标准: 包含7维动作字段
- [x] **T5.4** 实现状态空间编码
- 验证标准: HashMap到Tensor转换正确
- [x] **T5.5** 编写Director单元测试
- 验证标准: `cargo test --lib director` 全部通过
### Phase 6: Director Roguelite推理实现
> 预计完成标准: 推理测试通过
- [x] **T6.1** 实现Actor网络 (策略网络)
- 验证标准: 输出7维连续动作
- [x] **T6.2** 实现Critic网络 (价值网络)
- 验证标准: 输出1维价值估计
- [x] **T6.3** 实现动作空间约束
- 验证标准: 输出在指定范围内
- [x] **T6.4** 实现模型加载/保存
- 验证标准: 模型权重正确保存和加载
- [x] **T6.5** 集成推理pipeline
- 验证标准: 给定状态,输出交互参数
- [x] **T6.6** 编写推理测试
- 验证标准: `cargo test --features director_roguelite` 通过
### Phase 7: Director Roguelite训练实现
> 预计完成标准: 训练收敛
- [x] **T7.1** 实现奖励函数计算
- 验证标准: 三项奖励正确组合
- [x] **T7.2** 实现GAE计算
- 验证标准: λ=0.95的GAE正确计算
- [x] **T7.3** 实现PPO裁剪目标函数
- 验证标准: ε=0.2裁剪正确
- [x] **T7.4** 实现熵正则化
- 验证标准: 熵系数0.01正确应用
- [x] **T7.5** 实现训练循环
- 验证标准: 支持mini-batch=64训练
- [x] **T7.6** 实现经验轨迹收集
- 验证标准: 支持分布式轨迹上传
- [ ] **T7.7** 训练并验证策略收敛
- 验证标准: 平均回报从0.32提升至0.78
- [x] **T7.8** 编写训练测试
- 验证标准: `cargo test --features director_roguelite_training` 通过
### Phase 8: 集成测试
> 预计完成标准: 端到端测试通过
- [x] **T8.1** EDM + Director集成测试
- 验证标准: 完整pipeline运行正确
- [x] **T8.2** 模拟玩家环境测试
- 验证标准: 模拟环境响应正确
- [x] **T8.3** 用户群体特化验证
- 验证标准: t-SNE可视化显示聚类分离
- [x] **T8.4** 消融实验验证
- 验证标准: 无情绪策略情绪波动性更高
- [x] **T8.5** 性能基准测试
- 验证标准: 推理延迟 < 10ms
### Phase 9: 文档与发布
> 预计完成标准: 文档完整
- [x] **T9.1** 编写API文档
- 验证标准: `cargo doc` 无警告
- [x] **T9.2** 编写使用示例
- 验证标准: 示例代码可运行
- [x] **T9.3** 编写性能基准文档
- 验证标准: 包含详细性能数据
---
## 验证命令汇总
```bash
# 基础编译
cargo build
# 完整编译 (所有features)
cargo build --all-features
# 全部测试
cargo test --all-features
# 文档生成
cargo doc --open
# 代码格式化
cargo fmt
# 静态检查
cargo clippy --all-features
```
---
## 参考文献
1. Barthet et al. (2024). Closing the Affective Loop via Experience-Driven Reinforcement Learning Designers.
2. Yannakakis & Togelius (2011). Experience-driven procedural content generation.
3. Schulman et al. (2017). Proximal policy optimization algorithms.
---
## 许可证
MIT License