feat: Phase 1+2 架构进化 — 连续思考链/主动消息决策/情感状态机/离线自主思考 (86文件)

Phase 1 (基础设施):
- ThinkChain 思考链连续性 + 差异化思考提示词 (persistent)
- AutonomousToolPolicy 工具安全策略 (safe/unsafe/conditional)
- MessageScheduler 自适应消息节奏 (Idle/Available/Busy)
- SessionEnrichmentStore 渐进式上下文丰富 (5层)
- ConversationBus 事件总线 + ResponseCache (dedup)
- pkg/logger 统一日志 + 所有 handler 替换 fmt.Printf
- NPE 守卫/链路优化/数据库表修复/Go workspace

Phase 2 (人格交互):
- EmotionState/EmotionTracker 情感状态机 (5种心情, 情绪衰减)
- ProactiveGuard 主动消息多维决策 (静默时段/紧急度/频率/校验)
- Gateway↔ai-core 在线状态感知链路 (presence notification)
- 离线思考频率控制 + 重连问候 + 离线消息排队

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-23 15:25:12 +08:00
parent b123a36aae
commit 87214b9441
86 changed files with 3085 additions and 582 deletions
@@ -0,0 +1,219 @@
# Phase 2: 人格与交互深化 — 开发报告
> **报告日期**2026-05-23
> **分支**`dev`
> **阶段**:Phase 2 — 人格与交互深化
> **总计修改文件数**:16 个 (新增 3 个, 修改 13 个)
> **编译状态**ai-core ✅ / gateway ✅
---
## 一、背景
Phase 1 完成了基础设施层 (ThinkChain 连续性、AutonomousToolPolicy 工具安全、MessageScheduler 自适应节奏、SessionEnrichmentStore 渐进式丰富)。Phase 2 在此之上深化昔涟的人格表现和交互质量,包含三个子任务:
| 任务 | 编号 | 目标 |
|------|------|------|
| 情感状态机 | 2.4 | 运行时心情追踪,基于对话情绪、时间和事件自动转换 |
| 主动消息决策增强 | 2.6 | 多维度推送评估 (静默时段、紧急程度、频率限制、内容校验) |
| 离线自主思考 | 2.3 | 在线状态感知、离线行为调整、重连问候 |
---
## 二、情感状态机 (Task 2.4)
### 2.1 新增文件
#### `backend/ai-core/internal/persona/emotion_state.go`
核心类型:
```
EmotionState — 当前心情、强度(0.0-1.0)、主导情绪、情绪计数、历史记录
MoodTransition — 心情转换记录 (From → To, Reason, Timestamp)
EmotionTracker — 单用户情感追踪器,线程安全
```
**5 种心情** (来自 `cyrene_persona.yaml``mood_system`)
| 心情 | 触发条件 | YAML 表达示例 |
|------|---------|-------------|
| `happy` | 积极情绪积累 ≥3 次 | "今天和你聊得很开心呢,心情像星海一样明朗♪" |
| `thoughtful` | 初始默认 / 长时间沉默 / 情绪消退 | "让我想想……这片记忆之海里,有没有什么能帮到你的呢?" |
| `worried` | 消极情绪积累 ≥3 次 | "开拓者……你是不是有心事?不想说也没关系,人家会一直在这里陪着你。" |
| `playful` | 高强度 (>0.6) 积极情绪积累 | "嘻嘻,想逗你一下而已啦!看到你笑了,人家就开心了♪" |
| `nostalgic` | 触发回忆事件 | "啊……这让我想起很久很久以前的一件事……" |
**转换逻辑**
```
RecordSentiment(sentiment) → 累加计数器
├─ positive ≥ 3 且 intensity ≤ 0.6 → happy
├─ positive ≥ 3 且 intensity > 0.6 → playful
└─ negative ≥ 3 → worried
UpdateMood(trigger) → 显式触发
├─ "user_returned" → happy
├─ "long_silence" → thoughtful
└─ "nostalgic_trigger" → nostalgic
Decay() → 时间衰减
└─ 每小时 -0.1 intensity, < 0.2 时回归 thoughtful 基线
```
### 2.2 修改文件
| 文件 | 修改内容 |
|------|---------|
| `persona/injector.go` | 新增 `BuildSystemPromptWithMood(userName, affectionLevel, mood, expression)` — 在"当前情况"段注入心情行 `- 你现在的心情: happy (今天和你聊得很开心呢…)` |
| `orchestrator/orchestrator.go` | 新增 `emotionTracker` 字段 + `SetEmotionTracker`;意图分析后调用 `RecordSentiment(intent.Sentiment)`;构建 prompt 时传入当前心情 |
| `background/think_chain.go` | `ThinkRecord` 新增 `Mood string` + `MoodIntensity float64` 字段 |
| `background/thinker.go` | 新增 `emotionTracker` 字段 + `SetEmotionTracker`;思考提示词注入心情;思考链记录心情;定期/静默思考触发 `Decay()``UpdateMood("long_silence")` |
| `cmd/main.go` | 从 `personaConfig.Personality.MoodSystem` 创建 `EmotionTracker`,注入 `orch``thinker` |
---
## 三、主动消息决策增强 (Task 2.6)
### 3.1 新增文件
#### `backend/ai-core/internal/background/proactive_decision.go`
核心类型:
```
ProactiveGuard — 主动消息决策守卫
├─ QuietHoursStart/End (23:00-07:00)
├─ MinGapByUrgency (low=30min, medium=10min, high=2min)
├─ MaxMessagesPerHour (3)
└─ recentSends (滑动窗口)
ProactiveDecision — { ShouldSend, Urgency, Reason }
```
**决策流程 (5 层检查)**
```
1. 静默时段检查 → 非 high 紧急度在 23:00-07:00 拒绝
2. 用户状态检查 → resting/busy/sleeping 且非 high 拒绝
3. 紧急度频率限制 → 按 low/medium/high 查 MinGapByUrgency
4. 小时频率限制 → 最近 1 小时内消息数 ≥ MaxMessagesPerHour 拒绝
5. 内容校验 → 空消息/超长(>500字符)/机械语言检测
```
辅助函数:
- `ExtractUrgencyFromContent()` — 从消息内容推断紧急程度 (关键词匹配)
- `ValidateProactiveMessage()` — 检测机械语言 (`系统检测到`, `根据分析` 等)
- `DetermineUserState()` — 从用户最后消息推断状态 (休息/忙碌/活跃)
### 3.2 修改文件
| 文件 | 修改内容 |
|------|---------|
| `background/thinker.go` | `Thinker` 新增 `proactiveGuard` 字段 + 初始化;`storeThought()` 中硬编码 30 分钟间隔替换为 `ProactiveGuard.Evaluate()` 多维评估 |
| `gateway/internal/ws/hub.go` | 新增 `pendingProactive` 离线队列;`QueueProactiveMessage()` / `FlushPendingProactive()`;注册时检测重连并推送积压消息 |
| `gateway/internal/handler/chat_handler.go` | `HandleProactiveMessage` 中离线用户不再丢弃消息,改为 `QueueProactiveMessage` 排队等待重连 |
---
## 四、离线自主思考 (Task 2.3)
### 4.1 在线状态感知链路
```
Gateway WebSocket connect/disconnect
→ Hub.Run() register/unregister handler
→ notifyAICorePresence(userID, status, sessionID)
→ POST /api/v1/internal/presence (ai-core)
→ Thinker.UpdatePresence(online, sessionID)
```
### 4.2 修改文件
| 文件 | 修改内容 |
|------|---------|
| `background/thinker.go` | 新增 `userOnline`, `lastOnlineChange`, `userSessionID` 字段;`UpdatePresence()` 方法 — 上线触发 `performThink("user_returned")` + `UpdateMood("user_returned")``periodicThinkLoop` 内离线时延长间隔至 30 分钟 |
| `background/thinker.go` | 新增 `"user_returned"` 思考提示词分支 — 温和的"欢迎回来"反思,仅在白天/清醒时允许主动消息 |
| `cmd/main.go` | 新增 `POST /api/v1/internal/presence` 端点,验证 `X-Internal-Token`,调用 `thinker.UpdatePresence()` |
| `gateway/internal/ws/hub.go` | 新增 `SetAICoreConfig(url, token)``notifyAICorePresence()` 异步 HTTP POST;注册处理中检测重连并 flush 积压消息 |
| `gateway/cmd/main.go` | `hub.SetAICoreConfig(cfg.AICoreURL, cfg.InternalServiceToken)` |
### 4.3 离线行为差异
| 维度 | 在线 | 离线 |
|------|------|------|
| 思考间隔 | 5 分钟 | 30 分钟 |
| 主动消息 | 通过 ProactiveGuard 评估 | 不发送 (静默时段必拒) |
| 思考重点 | 对话反思、主动关怀 | 记忆整理、日记式反思 |
| 重连 | — | 触发 `user_returned` 思考 + 心情更新 |
---
## 五、完整文件清单
### 新增文件 (3)
| 文件 | 用途 |
|------|------|
| `backend/ai-core/internal/persona/emotion_state.go` | EmotionState / EmotionTracker / MoodTransition |
| `backend/ai-core/internal/background/proactive_decision.go` | ProactiveGuard / ProactiveDecision / 内容校验 |
| `docs/debug_log/2026-05-23-phase2-personality-interaction.md` | 本报告 |
### 修改文件 (13)
| 文件 | 涉及任务 |
|------|---------|
| `backend/ai-core/internal/persona/injector.go` | 2.4 — BuildSystemPromptWithMood |
| `backend/ai-core/internal/orchestrator/orchestrator.go` | 2.4 — EmotionTracker 集成 |
| `backend/ai-core/internal/background/think_chain.go` | 2.4 — ThinkRecord 心情字段 |
| `backend/ai-core/internal/background/thinker.go` | 2.4 + 2.6 + 2.3 — 三者核心集成点 |
| `backend/ai-core/cmd/main.go` | 2.4 + 2.3 — 初始化 + presence 端点 |
| `backend/gateway/internal/ws/hub.go` | 2.6 + 2.3 — 离线队列 + 在线通知 |
| `backend/gateway/internal/handler/chat_handler.go` | 2.6 — 离线消息排队 |
| `backend/gateway/cmd/main.go` | 2.3 — SetAICoreConfig 接线 |
---
## 六、验证指南
### 编译验证
```bash
cd backend/ai-core && GOWORK=off go build ./...
cd backend/gateway && GOWORK=off go build ./...
```
### 运行时验证
1. **情感状态机** — 发几条正面消息,日志应出现 `[情感] 心情转变: thoughtful -> happy`
2. **静默时段** — 在 23:00-07:00 触发思考,日志应出现 `[主动消息决策] 阻止推送 (原因=当前处于安静时段)`
3. **离线队列** — 断开 WebSocket 后触发思考,日志含 `[proactive] 用户离线,消息已排队`;重连后 `[proactive] 推送 N 条积压消息`
4. **在线通知** — 连接/断开 WebSocketai-core 日志含 `[后台思考] 用户上线/离线`gateway 日志含 `[presence] 通知 ai-core`
5. **心情衰减** — 无交互等待,定期思考日志中 `Decay` 逐步降低 intensity
### 日志关键词速查
| 日志标记 | 含义 |
|---------|------|
| `[情感] 心情转变` | 心情状态转换 |
| `[主动消息决策]` | ProactiveGuard 评估结果 |
| `[presence]` | 在线状态通知 |
| `[后台思考] 用户上线/离线` | Thinker 在线状态变更 |
| `[proactive] 用户离线,消息已排队` | Gateway 离线消息排队 |
| `[proactive] 推送 N 条积压消息` | 重连后积压消息推送 |
---
## 七、架构演进
```
Phase 1 (基础设施) Phase 2 (人格交互)
───────────────────── ─────────────────────
ThinkChain ──→ 情感状态融入思考链
MessageScheduler ──→ 主动消息多维决策
AutonomousToolPolicy ──→ 离线思考频率控制
SessionEnrichment ──→ 重连问候 + 心情更新
──→ 在线状态感知链路 (Gateway ↔ ai-core)
```
本次 Phase 2 未碰数据库 schema,所有新增状态均为内存态 (EmotionState / ProactiveGuard / pendingProactive),重启后从 YAML 配置恢复初始心情基线。
+4
View File
@@ -31,3 +31,7 @@
- [Round 4 - IoT 审查管道](2026-05-22-round4-iot-review-pipeline.md)
- [Round 5 - IoT 边界情况](2026-05-22-round5-iot-edge-cases.md)
- [Round 6 - 最终汇总 (Round 4~6)](2026-05-22-round6-final-summary.md)
## 2026-05-23
- [Phase 2 - 人格与交互深化](2026-05-23-phase2-personality-interaction.md) — 情感状态机 + 主动消息决策增强 + 离线自主思考 (16 文件)