Skip to content

集合:AI对话会话(ask_sessions)

字数
2567 字
阅读时间
12 分钟

1. 目的与使用场景

  • 记录用户与AI心理助理的完整对话会话,支持CBT认知行为疗法应用、风险评估和个性化推荐。由Ask心理助理功能、Dify工作流、埋点系统及心语精灵多Agent能力使用。
  • 维护与Dify Chatbot/Agent Service API的会话映射,支撑会话管理(列表、重命名、删除)、对话消息、语音/文字互转与文件附件能力。

枚举值

  • session_type: general(常规对话)、cbt_guided(CBT引导)、crisis_intervention(危机干预)、follow_up(跟进回访)
  • trigger_source: mood_checkin(情绪打卡触发)、journal_negative(负向随笔触发)、treehole_risk(树洞风险触发)、manual_trigger(手动触发)、scheduled_checkin(定时检查)
  • cbt_focus: cognitive_restructuring(认知重构)、behavioral_activation(行为激活)、emotion_regulation(情绪调节)、problem_solving(问题解决)
  • risk_level: L0(无风险)、L1(一般关注)、L2(需要关注)、L3(需要干预)、L4(紧急危机)
  • active_agent_key: cbt_specialist(CBT助手)、emotion_advisor(情绪顾问)、behavior_coach(行为导师)、crisis_interventionist(危机干预)、custom_role(自定义角色)
  • agent_origin: system_default(内置模板)、org_template(机构模板)、user_custom(用户自定义)

2. Schema 定义

字段类型必填默认值约束/校验说明隐私分级
_idstring-TCB 自动主键P2
_openidstring-TCB 自动用户 openidP2
user_id指针id-指向 users._id用户指针P2
dify_conversation_idstring-UUID,唯一索引与 Dify 会话 ID 对齐P1
session_titlestring-长度 ≤ 60展示名称,对应会话重命名P2
session_typestringgeneral枚举(general,cbt_guided,crisis_intervention,follow_up)会话类型P1
trigger_sourcestringmanual_trigger枚举(mood_checkin,journal_negative,treehole_risk,manual_trigger,scheduled_checkin)触发来源P1
active_agent_keystringcbt_specialist枚举(cbt_specialist,emotion_advisor,behavior_coach,crisis_interventionist,custom_role)当前 AgentP1
custom_agent_id指针id-指向 ask_agents._id自定义Agent引用P1
agent_originstringsystem_default枚举(system_default,org_template,user_custom)Agent来源P1
agent_snapshotobject-包含 name, persona, version, origin, dify_agent_idAgent 配置快照P2
conversation_variablesobject{}JSON Schema: key ≤ 30,值长度 ≤ 200Dify 会话变量/inputsP2
modality_flagsobject布尔键 text/audio/file会话是否包含语音或文件P1
voice_configobject-包含 tts_voice, stt_language, enable_tts语音配置快照P2
cbt_focusstring-枚举(cognitive_restructuring,behavioral_activation,emotion_regulation,problem_solving)CBT焦点领域P2
initial_risk_levelstringL0枚举(L0/L1/L2/L3/L4)初始风险评估P3
final_risk_levelstring-枚举(L0/L1/L2/L3/L4)最终风险评估P3
session_summarystring-长度 ≤ 1000会话摘要P2
key_insightsarray[]元素为 string关键洞察点P2
cbt_techniques_usedarray[]元素为 string应用的CBT技巧P2
generated_task_idsarray[]指向 tasks._id生成的任务IDP1
counselor_handoffobject-包含 handoff_reason, counselor_id, handoff_time转交辅导员信息P3
satisfaction_scorenumber-1-5满意度评分P2
follow_up_neededboolfalse-是否需要跟进P1
follow_up_atdate--跟进时间P1
message_countnumber0≥0消息数量P1
audio_message_countnumber0≥0语音消息数量P1
attachment_countnumber0≥0附件数量P1
duration_secondsnumber-≥0会话时长(秒)P1
intervention_triggeredboolfalse-是否触发干预P3
createdAtdate-服务端时间创建时间P1
updatedAtdate-服务端时间更新时间P1
endedAtdate--结束时间P1
is_deletedboolfalse-软删标记P2

3. 索引与唯一约束

  • 唯一索引:dify_conversation_id
  • 单字段索引:user_idsession_typetrigger_sourceinitial_risk_levelfinal_risk_levelactive_agent_keycustom_agent_id
  • 复合索引:[user_id, updatedAt desc][trigger_source, createdAt desc][initial_risk_level, createdAt desc]
  • 时间范围索引:[createdAt desc, is_deleted]
  • 统计索引:[active_agent_key, createdAt desc][custom_agent_id, updatedAt desc] 支撑多Agent使用分析与自定义角色统计
  • 设计理由:用户会话历史查询;触发来源分析;风险级别筛查;Agent 切换统计;自定义角色活跃度;时间范围过滤;与 Dify 会话的幂等同步。

4. 访问控制(TCB 权限)

json
{
  "read": "_openid == auth.openid || auth.role in ['counselor','ops']",
  "write": "auth.role in ['dify_service','counselor','ops']"
}

Dify服务负责写入;用户可读取自身会话;辅导员在紧急情况下可访问。

5. 关系与级联

  • user_idusers
  • dify_conversation_id ↔ Dify /conversations API 响应 id
  • custom_agent_idask_agents
  • generated_task_idstasks
  • counselor_handoff.counselor_idusers(辅导员)
  • ask_messages 形成一对多关系
  • 删除策略:软删保留审计;删除时匿名化处理敏感内容;同步调用 Dify DELETE /conversations/{id} 作业由后台任务处理。

6. 数据生命周期与合规

  • 留存:常规对话保留6个月;危机干预会话保留2年用于专业评估
  • 匿名化:删除前对对话内容进行脱敏处理,保留CBT应用统计
  • 导出:用户可导出自身对话记录,需身份验证
  • 审计字段:createdAtupdatedAtendedAtintervention_triggered

7. API/云函数契约映射

| 接口/函数 | 读/写 | 使用字段 | 过滤条件 | 排序/分页 | 备注 | | /api/ask/sessions GET | 读 | session_type, trigger_source, session_summary, session_title, createdAt, satisfaction_score, modality_flags | user_id = auth.uid, is_deleted=false | createdAt desc, 分页 | 对话历史列表 | | /api/ask/sessions POST | 写 | session_type, trigger_source, initial_risk_level, dify_conversation_id, active_agent_key, custom_agent_id, agent_origin | _openid = auth.openid | - | 创建新会话并落地 Dify 映射 | | /api/ask/sessions/{id} PATCH | 写 | final_risk_level, session_summary, session_title, satisfaction_score, follow_up_needed, voice_config, custom_agent_id, agent_origin | _id 匹配 | - | 更新会话状态 | | /api/ask/sessions/{id}/modality PATCH | 写 | modality_flags, audio_message_count, attachment_count | _id 匹配 | - | 会话内语音/附件统计刷新 | | 云函数 difySessionManager | 写 | dify_conversation_id, conversation_variables, agent_snapshot, custom_agent_id | - | - | 管理会话变量写回 Dify /conversations | | Dify工作流 sessionManager | 写 | 所有字段 | - | - | 会话生命周期管理 | | Dify GET /conversations 同步任务 | 读 | dify_conversation_id, session_title, updatedAt | user_id, is_deleted=false | updatedAt desc | nightly 校准 Dify 名称、更新时间 | | 风险监控 riskMonitor | 读 | initial_risk_level, final_risk_level, intervention_triggered | 时间范围 | - | 风险会话统计 |

8. 示例文档(≥3条)

json
{
  "_id": "ask_session_001",
  "_openid": "oAbcd123",
  "user_id": "usr_001",
  "dify_conversation_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
  "session_title": "焦虑情绪梳理",
  "session_type": "cbt_guided",
  "trigger_source": "mood_checkin",
  "active_agent_key": "cbt_specialist",
  "agent_origin": "system_default",
  "agent_snapshot": {
    "name": "CBT助手",
    "persona": "认知行为疗法专家",
    "version": "2024.04",
    "origin": "system_default",
    "dify_agent_id": "agt_cbt_default"
  },
  "conversation_variables": {
    "mood": "anxious",
    "scene": "exam_preparation"
  },
  "modality_flags": {
    "text": true,
    "audio": true,
    "file": false
  },
  "voice_config": {
    "tts_voice": "calm_female_cn",
    "stt_language": "zh-CN",
    "enable_tts": true
  },
  "cbt_focus": "cognitive_restructuring",
  "initial_risk_level": "L2",
  "final_risk_level": "L1",
  "session_summary": "用户因学业压力产生焦虑,通过认知重构技巧识别了非理性信念,制定了行为实验计划",
  "key_insights": ["完美主义思维模式", "考试失败恐惧", "自我价值感低"],
  "cbt_techniques_used": ["证据检验", "替代思维生成", "行为实验设计"],
  "generated_task_ids": ["task_cbt_001", "task_cbt_002"],
  "audio_message_count": 3,
  "attachment_count": 0,
  "satisfaction_score": 4,
  "follow_up_needed": true,
  "follow_up_at": "2024-04-08T14:00:00Z",
  "message_count": 15,
  "duration_seconds": 480,
  "createdAt": "2024-04-06T10:30:00Z",
  "updatedAt": "2024-04-06T18:30:00Z",
  "endedAt": "2024-04-06T18:30:00Z"
}
{
  "_id": "ask_session_002",
  "_openid": "oAbcd456",
  "user_id": "usr_002",
  "dify_conversation_id": "6f7d9099-9ee9-4d9d-9cf1-0a0e2df4a001",
  "session_type": "crisis_intervention",
  "trigger_source": "journal_negative",
  "active_agent_key": "crisis_interventionist",
  "agent_origin": "system_default",
  "agent_snapshot": {
    "name": "危机干预",
    "persona": "紧急心理支持专家",
    "version": "2024.04",
    "origin": "system_default",
    "dify_agent_id": "agt_crisis_default"
  },
  "conversation_variables": {
    "riskFlag": "high",
    "autoEscalated": true
  },
  "modality_flags": {
    "text": true,
    "audio": false,
    "file": true
  },
  "attachment_count": 2,
  "initial_risk_level": "L3",
  "final_risk_level": "L2",
  "session_summary": "用户表达强烈的绝望情绪,进行了危机干预和资源推荐,已转交辅导员跟进",
  "key_insights": ["绝望感", "社交孤立", "无价值感"],
  "cbt_techniques_used": ["情绪稳定技巧", "安全规划", "社会支持激活"],
  "counselor_handoff": {
    "handoff_reason": "crisis_risk",
    "counselor_id": "counselor_001",
    "handoff_time": "2024-04-06T16:45:00Z"
  },
  "intervention_triggered": true,
  "message_count": 8,
  "duration_seconds": 320,
  "createdAt": "2024-04-06T16:20:00Z",
  "updatedAt": "2024-04-06T16:45:00Z",
  "endedAt": "2024-04-06T16:45:00Z"
}
{
  "_id": "ask_session_003",
  "_openid": "oAbcd789",
  "user_id": "usr_003",
  "dify_conversation_id": "b1dd8a56-847c-4a3f-bb0d-02e93d702010",
  "session_type": "general",
  "trigger_source": "manual_trigger",
  "active_agent_key": "custom_role",
  "custom_agent_id": "ask_agent_usr003_01",
  "agent_origin": "user_custom",
  "agent_snapshot": {
    "name": "暖心导师",
    "persona": "擅长睡眠卫生与自我关怀的导师",
    "version": "2024.05",
    "origin": "user_custom",
    "dify_agent_id": "agt_usr003_sleep"
  },
  "session_summary": "用户咨询睡眠问题,获得了睡眠卫生建议和放松技巧",
  "key_insights": ["入睡困难", "作息不规律"],
  "cbt_techniques_used": ["睡眠卫生教育", "放松训练"],
  "audio_message_count": 0,
  "attachment_count": 0,
  "satisfaction_score": 5,
  "message_count": 6,
  "duration_seconds": 180,
  "createdAt": "2024-04-05T22:15:00Z",
  "updatedAt": "2024-04-05T22:45:00Z",
  "endedAt": "2024-04-05T22:45:00Z"
}

9. 常用查询样例(≥3条)

javascript
// 用户的最近对话会话(含 Dify 映射)
const recentSessions = await db.collection('ask_sessions')
  .where({ user_id: auth.uid, is_deleted: false })
  .orderBy('updatedAt', 'desc')
  .limit(10)
  .field({ session_title: true, dify_conversation_id: true, modality_flags: true, active_agent_key: true })
  .get();

// 风险会话统计
const riskSessions = await db.collection('ask_sessions')
  .where({
    initial_risk_level: db.command.in(['L3', 'L4']),
    createdAt: db.command.gte(new Date(Date.now() - 30 * 86400000).toISOString())
  })
  .count();

// CBT技术应用统计
const cbtStats = await db.collection('ask_sessions')
  .where({
    session_type: 'cbt_guided',
    createdAt: db.command.gte(new Date(Date.now() - 7 * 86400000).toISOString())
  })
  .field({ cbt_techniques_used: true, satisfaction_score: true })
  .get();

// 语音能力启用的会话,用于同步语音转写配置
const voiceEnabledSessions = await db.collection('ask_sessions')
  .where({ 'voice_config.enable_tts': true, is_deleted: false })
  .field({ dify_conversation_id: true, voice_config: true })
  .get();

// 自定义 Agent 会话,用于构建个性化 Agent 列表
const customAgentSessions = await db.collection('ask_sessions')
  .where({ custom_agent_id: db.command.exists(true), is_deleted: false })
  .field({ custom_agent_id: true, agent_snapshot: true, user_id: true })
  .get();

// 需要跟进的会话
const followUpSessions = await db.collection('ask_sessions')
  .where({
    follow_up_needed: true,
    follow_up_at: db.command.lte(new Date().toISOString())
  })
  .get();

10. 边界与错误码

  • 超长会话:消息数量超过100条返回 E_SESSION_TOO_LONG
  • 风险升级:L3/L4级别自动触发辅导员通知流程
  • 并发会话:同一用户同时存在活跃会话返回 E_SESSION_ACTIVE_EXISTS
  • Dify映射:缺失 dify_conversation_id 或远端不存在返回 E_DIFY_SESSION_NOT_FOUND
  • 语音配置:语音互转功能未启用但收到语音统计更新返回 E_SESSION_VOICE_DISABLED
  • 附件统计:文件计数与消息实际附件不一致返回 E_SESSION_FILE_MISMATCH
  • 自定义 Agent:custom_agent_id 不存在或归属不匹配返回 E_SESSION_AGENT_INVALID
  • 越权:非授权访问危机干预会话返回 E_FORBIDDEN

11. 变更影响评估

  • 字段变更需同步Dify工作流payload、Ask心理助理UI、埋点 ask_session_start/end
  • 索引调整影响会话历史查询性能和风险监控响应时间
  • 新增CBT焦点领域需要更新AI模型知识库
  • custom_agent_id 依赖 ask_agents 集合,需保持版本快照一致,更新需触发会话重放校验

12. 假设与待确认

  • 假设会话与Dify工作流的 dify_conversation_id 已唯一映射;待确认历史数据回填策略
  • 待确认危机干预会话的辅导员通知机制和响应SLA
  • 待确认CBT技巧的标准化分类和效果评估指标
  • 待确认自定义角色(custom_role)Agent的配置存储结构与版本管理策略
  • 待确认机构模板(org_template)的跨组织共享及权限边界
  • 待确认用户自定义Agent的审核流程与风控要求

贡献者

The avatar of contributor named as Cai Hongyu Cai Hongyu

文件历史

撰写