集合:微建议(suggestions)
字数
1161 字
阅读时间
6 分钟
1. 目的与使用场景
- 记录今天页 Top3 微建议及其生成上下文,支撑“一键生成任务”、建议刷新策略与依从性分析。由策略服务、
/api/micro-tips、suggestion_task_create埋点使用。
枚举值:
- category:
study(学习)、sleep(睡眠)、emotion(情绪)、relationship(关系)、health(健康)、other(其他) - source:
model(AI模型)、curated(人工精选)、manual(手动) - status:
active(活跃)、accepted(已接受)、skipped(已跳过)、expired(已过期)
2. Schema 定义
| 字段 | 类型 | 必填 | 默认值 | 约束/校验 | 说明 | 隐私分级 |
|---|---|---|---|---|---|---|
| _id | string | 是 | - | TCB 自动 | 主键 | P2 |
| user_id | 指针id | 是 | - | 指向 users._id | 用户 | P2 |
| session_id | string | 是 | - | 长度 ≤ 64 | 推荐会话标识 | P2 |
| title | string | 是 | - | 长度 1-80 | 建议标题 | P1 |
| description | string | 否 | - | 长度 ≤ 512 | 补充说明 | P1 |
| category | string | 是 | - | 枚举(study,sleep,emotion,relationship,health,other) | 建议分类 | P1 |
| priority_rank | number | 是 | 1 | 1-5 | 当前排序 | P1 |
| source | string | 是 | model | 枚举(model,curated,manual) | 建议来源 | P1 |
| feature_snapshot | object | 否 | - | 包含 mood_score, recent_tags | 生成特征 | P2 |
| task_template_id | string | 否 | - | 指向任务模板 | 生成任务模板 | P1 |
| status | string | 是 | active | 枚举(active,accepted,skipped,expired) | 状态 | P1 |
| accepted_task_id | 指针id | 否 | - | 指向 tasks._id | 接受后生成的任务 | P2 |
| refresh_count | number | 否 | 0 | ≥0 | 本会话刷新次数 | P1 |
| expired_at | date | 否 | - | - | 失效时间 | P1 |
| createdAt | date | 是 | - | 服务端时间 | 生成时间 | P1 |
| updatedAt | date | 是 | - | 服务端时间 | 更新时间 | P1 |
3. 索引与唯一约束
- 单字段索引:
user_id、session_id - 复合索引:
[user_id, createdAt desc]、[user_id, status, priority_rank] - 唯一性约束:
[user_id, session_id, priority_rank] - 设计理由:快速获取最近一次推荐;避免同一会话重复排序;依从性分析需按状态聚合。
4. 访问控制(TCB 权限)
json
{
"read": "user_id == auth.uid || auth.role in ['ops']",
"write": "auth.role in ['strategy_service','ops']"
}策略服务(云函数)负责写入;用户仅通过 API 读取,不直接写入。
- 关系与级联
user_id→usersaccepted_task_id→tasks- 删除策略:建议默认 7 天后自动软删;手动删除不影响已生成的任务。
- 反范式:
feature_snapshot存储生成上下文,供策略回溯。
- 数据生命周期与合规
- 留存:保留 90 天用于策略调优,其后仅保留匿名统计。
- 匿名化:脱敏
feature_snapshot中的具体标签;保留权重数据。 - 导出:仅对内部运营导出,需拥有 ops 角色。
- 审计字段:
createdAt、updatedAt、status、refresh_count。
API/云函数契约映射 | 接口/函数 | 读/写 | 使用字段 | 过滤条件 | 排序/分页 | 备注 | |
/api/micro-tips| 读 | title, description, category, priority_rank, status |user_id = auth.uid,status='active'|priority_rank asc| 今天页展示 | |/api/tasksPOST | 写 | accepted_task_id | - | - | 一键生成任务后更新 | | 策略服务generateSuggestions| 写 | user_id, session_id, title, category, priority_rank, feature_snapshot | - | - | 推荐生成 | | 埋点回溯函数suggestionAnalytics| 读 | status, accepted_task_id, refresh_count | 时间范围 | - | 依从性分析 |示例文档(≥3条)
json
{
"_id": "sg_001",
"user_id": "usr_001",
"session_id": "sess_20240406_1",
"title": "与室友约定安静时段",
"category": "relationship",
"priority_rank": 1,
"source": "model",
"feature_snapshot": {"mood_score": 45, "recent_tags": ["室友", "噪音"]},
"status": "accepted",
"accepted_task_id": "task_305",
"refresh_count": 0,
"createdAt": "2024-04-06T09:01:00Z",
"updatedAt": "2024-04-06T13:25:00Z"
}
{
"_id": "sg_002",
"user_id": "usr_001",
"session_id": "sess_20240406_1",
"title": "午间 10 分钟冥想",
"category": "emotion",
"priority_rank": 2,
"source": "model",
"status": "skipped",
"refresh_count": 1,
"createdAt": "2024-04-06T09:01:00Z",
"updatedAt": "2024-04-06T09:05:00Z"
}
{
"_id": "sg_101",
"user_id": "usr_002",
"session_id": "sess_20240405_night",
"title": "睡前写下三件感谢的事",
"category": "sleep",
"priority_rank": 1,
"source": "curated",
"status": "active",
"expired_at": "2024-04-07T23:00:00Z",
"createdAt": "2024-04-05T22:30:00Z",
"updatedAt": "2024-04-05T22:30:00Z"
}- 常用查询样例(≥3条)
javascript
// 获取最新一组建议
const latest = await db.collection('suggestions').where({
user_id: auth.uid,
status: 'active'
}).orderBy('createdAt', 'desc').limit(3).get();
// 查询接受率
const accepted = await db.collection('suggestions').where({
user_id: auth.uid,
status: 'accepted',
createdAt: db.command.gte(new Date(Date.now() - 30 * 86400000).toISOString())
}).count();
// 策略服务回溯某会话
const sessionTrace = await db.collection('suggestions').where({
session_id: sessionId
}).orderBy('priority_rank', 'asc').get();- 边界与错误码
- 重复会话写入:若 session+rank 已存在返回
E_SUGGESTION_DUP。 - 过期访问:调用
/api/micro-tips时如全部过期返回E_SUGGESTION_EXPIRED并提示刷新。 - 越权:非策略角色写入返回
E_FORBIDDEN。
- 变更影响评估
- 字段调整需同步策略服务 payload、今天页 UI、埋点
suggestion_task_create。 - 索引变更影响依从性报表与推荐性能监控。
- 假设与待确认
- 假设推荐会话由策略服务生成唯一 ID;待确认是否需要与埋点
suggestion_session_id打通。 - 待确认
feature_snapshot是否需要脱敏处理后再写入集合。