🌸 缘·Bot 主动陪伴与自动化系统详细设计文档 (v1.4)
版本历史
| 版本 | 日期 | 修改内容 |
|---|---|---|
| v1.0 | 2026-05-17 | 初始详细设计,基于总体架构 v1.4 |
- 系统定位与目标
主动陪伴与自动化系统是 缘·Bot 的“生物钟与直觉”,它赋予 AI 角色主动发起交互的能力。与传统聊天机器人被动等待用户消息不同,本系统让缘·Bot 能够感知时间、事件和用户状态,在恰当的时机以自然、不打扰的方式主动接触用户,真正实现“陪伴”而非“应答”。
核心目标:
· 定时关怀:基于用户作息和重要日期,在恰当时刻主动发起问候与祝福。 · 事件驱动感知:监听外部事件(天气、节日)和内部状态(用户静默、情绪趋势),自动触发关心。 · 情境智能:结合记忆系统提供的用户画像和历史情绪模式,使主动交互高度个性化。 · 克制与尊重:提供精细的免打扰控制,确保主动行为不会演变为骚扰。 · 可靠调度:基于 Cron 和事件总线的混合架构,保证准时、高可用。
- 系统架构概览
┌────────────────────────────────────────────────────────────┐
│ 主动陪伴与自动化系统 │
├────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ 主动触发调度器 (Scheduler) │ │
│ │ · Cron 解析 · 任务注册 · 下一次执行时间计算 │ │
│ └──────────┬───────────────────────────┬───────────────┘ │
│ │ │ │
│ ┌──────────▼──────────┐ ┌─────────────▼───────────────┐ │
│ │ 定时任务引擎 │ │ 事件监听引擎 │ │
│ │ Cron Engine │ │ Event Engine │ │
│ │ (早安/晚安/提醒) │ │ (天气/静默/情绪) │ │
│ └──────────┬──────────┘ └─────────────┬───────────────┘ │
│ │ │ │
│ ┌──────────▼───────────────────────────▼───────────────┐ │
│ │ 主动交互策略决策器 (Strategy Decider) │ │
│ │ · 优先级排序 · 冲突检测 · 克制过滤 │ │
│ └──────────────────────┬───────────────────────────────┘ │
│ │ │
│ ┌──────────────────────▼───────────────────────────────┐ │
│ │ 主动消息生成与发送 │ │
│ │ · Prompt 构建 · 模型调用 · 通道适配器推送 │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ 统一主动服务 API (Proactive API) │ │
│ │ · schedule() · trigger_now() · get_pending() │ │
│ └──────────────────────────────────────────────────────┘ │
└────────────────────────────────────────────────────────────┘设计原则:
· 分离调度与决策:何时触发由调度器负责,触发后是否行动、说什么由策略决策器决定。 · 用户可控:所有主动行为均可通过用户配置文件精细调整,支持实时修改。 · 情境感知:每次触发前都会查询记忆系统,获取用户当前状态,避免不合时宜的打扰。 · 异步非阻塞:所有定时和事件处理在独立的后台线程/协程中运行,不影响正常对话。
- 核心模块设计
3.1 主动触发调度器
职责:管理系统内所有定时任务和事件监听器的注册、调度与生命周期。
核心组件:
· 任务注册表:内存中的任务列表,每个任务包含唯一 ID、Cron 表达式或事件类型、关联的用户列表、优先级。 · 调度循环:每秒检查一次,计算到期任务并提交给策略决策器。 · 热重载:当用户修改 configs/bot.yaml 中的主动交互设置时,无需重启即可更新调度。
任务数据结构:
@dataclass
class ScheduledTask:
task_id: str
task_type: str # "cron" 或 "event"
trigger: str # Cron 表达式或事件类型
target_users: List[str] # 目标用户 ID 列表,空表示全局
priority: int # 1-10,数字越大越优先
max_retries: int = 3
enabled: bool = True3.2 定时任务引擎
职责:管理与时间相关的主动交互,包括每日问候、重要日期提醒、定期关心。
支持的 Cron 触发类型:
任务类型 Cron 示例 说明 早安问候 0 7 30 * * * 根据用户本地时区的早晨时间 晚安问候 0 22 * * * 晚间入睡前 午餐/晚餐提醒 0 12,18 * * * 可选的用餐时间问候 重要日期提醒 0 9 17 5 * 每年 5 月 17 日(生日/纪念日) 定期情绪关心 0 10 * * 1 每周一上午,基于上周情绪趋势
动态时间调整:若用户配置了作息习惯(事实记忆中的 wake_up_time, sleep_time),系统会动态调整问候的 Cron 表达式,而非使用固定时间。
防止重复触发:每个任务执行后会在 Redis 中设置一个锁(如 proactive_lock:{task_id}:{user_id}:{date}),TTL 为 24 小时,确保同一天不会重复问候。
3.3 事件监听引擎
职责:监听外部和内部事件,在条件满足时触发主动交互。
事件类型:
事件类型 触发条件 数据来源 weather_change 用户所在地天气突变(降温>5°C、降雨概率>70%) 天气 API(通过 Tool 调用) user_silence 用户超过 N 小时未发送任何消息 接入系统提供的最后活跃时间 emotion_alert 记忆系统检测到用户连续 N 天情绪低落 记忆与情感系统的情绪趋势分析 festival 法定节假日或用户自定义节日 日历服务 system_event 系统启动、版本更新、维护通知 系统内部
事件监听流程:
- 引擎订阅内部事件总线(Redis Pub/Sub 或 RabbitMQ)。
- 当事件被发布时,引擎验证事件类型是否注册了主动交互任务。
- 若是,则封装为触发请求发给策略决策器。
天气事件特殊处理:事件引擎自身不直接查询天气,而是通过调用 get_weather Tool 定期(如每小时)获取所有活跃用户的所在地天气。若检测到异常,发布 weather_change 事件。
3.4 主动交互策略决策器
职责:这是系统的“大脑”,在收到触发信号后,综合各种因素决定是否行动、以何种方式行动。
决策流程:
- 检查用户在线状态:若用户当前正在活跃对话中,则推迟或取消问候。
- 克制策略过滤: · 检查当前时间是否在用户的 quiet_hours 内。 · 检查今日已对该用户发起的主动交互次数是否达上限。 · 检查全局主动交互频率设置。
- 优先级排序:若同时有多个任务针对同一用户,选择优先级最高的执行,其余排队。
- 情境查询:调用记忆系统获取该用户的当前情绪状态、最近对话摘要,用于个性化消息生成。
- 生成主动交互请求:构造 ProactiveTask 对象,提交给消息生成模块。
克制策略规则表:
策略项 配置参数 行为 免打扰时段 quiet_hours: ["23:00-07:00"] 此区间内所有非紧急消息延后到结束时刻 每日上限 max_proactive_per_day: 3 达到上限后,当日不再发送 频率控制 proactive_frequency: "medium" 高/中/低/仅事件驱动,影响问候密度 静默超时 silence_timeout_hours: 48 用户连续静默超过此时长才触发静默关心 事件开关 event_trigger_enabled: true 关闭后仅定时问候,不响应事件
3.5 主动消息生成与发送
职责:根据策略决策器的输出,生成个性化主动消息,并通过接入系统发送。
消息生成流程:
- 接收 ProactiveTask,其中包含任务类型、目标用户 ID、上下文提示。
- 构建特殊的 System Prompt,包含: · 角色人设(当前活跃人格)。 · 主动场景描述(如“现在是早上7:30,用户刚起床,请温柔地道早安”)。 · 从记忆系统获取的个性化信息(如“用户昨天提到今天有个重要会议,可以祝福他顺利”)。 · 克制提示(如“保持简短,不要连续追问”)。
- 调用 AIService.generate(),使用默认提供商和模型生成消息内容。
- 将生成的 BotResponse 通过接入系统的主动推送通道发送(发布到 yuanbot.outbound.{channel} 队列)。
消息生成模板(早安问候示例):
[主动场景:早安问候]
当前时间:{current_time}
用户名称:{user_name}
今日天气:{weather_summary}
用户今日安排:{today_events_from_memory}
请以{persona_style}的风格,生成一条早安问候。
要求:简短温暖,提及天气或用户可能关心的事,但不要像任务报告。
如果用户最近情绪低落,可以额外给予鼓励。失败重试机制:若消息发送失败(如通道不可用),记录日志并在 5 分钟后重试一次。若再次失败,则放弃本次主动交互,避免重复骚扰。
- 配置管理
4.1 用户级主动交互配置
每个用户拥有独立的主动交互偏好,存储在数据库的 user_proactive_settings 表中,可通过对话指令修改(如“以后早上不要给我发消息”)。
配置项:
{
"user_id": "u_abc123",
"proactive_greeting_enabled": true,
"proactive_frequency": "medium",
"quiet_hours": ["23:00-07:00"],
"max_proactive_per_day": 5,
"event_trigger_enabled": true,
"custom_wake_up_time": "07:30",
"custom_sleep_time": "23:00",
"important_dates": [
{"date": "05-17", "description": "生日"},
{"date": "03-21", "description": "入职纪念日"}
]
}4.2 全局配置
configs/bot.yaml 中的主动系统部分:
proactive:
enabled: true
scheduler:
timezone: "Asia/Shanghai"
check_interval_seconds: 30
greeting:
morning:
enabled: true
default_time: "08:00"
evening:
enabled: true
default_time: "22:30"
event_triggers:
weather_change: true
user_silence: true
silence_timeout_hours: 48
emotion_alert: true
emotion_low_days: 3
rate_limit:
max_proactive_per_user_per_day: 5
global_max_per_hour: 1000
message_generation:
max_tokens: 150
temperature: 0.8- 与外部系统的交互接口
5.1 与记忆系统交互
· 获取用户画像:MemoryAPI.get_user_profile(user_id) → 获取作息、偏好、重要日期。 · 获取情绪趋势:MemoryAPI.get_emotion_trend(user_id, days=7) → 判断是否需要情绪关心。 · 获取最近情景:MemoryAPI.retrieve_context(user_id, "最近生活") → 为消息提供个性化素材。
5.2 与接入与通信系统交互
· 主动推送:将生成的 BotResponse 通过 ChannelManager.push_to_user(user_id, response) 发送。 · 获取在线状态:Gateway.get_user_online_status(user_id) → 判断是否正在对话中。
5.3 与人格与行为决策系统交互
· 获取人设:PersonaLoader.get_active_persona(user_id) → 决定消息风格。 · 模型调用:直接使用 AIService.generate() 生成消息文本。
5.4 与能力系统交互(可选)
· 主动消息中可以附带工具调用建议(如“需要我给你设个提醒吗?”),但需克制使用。
- 关键流程详解
6.1 早安问候流程
1. 定时器触发 (08:00)
2. 调度器检索所有启用早安问候的用户列表
3. 对每个用户并发执行:
a. 检查在线状态 → 若活跃,跳过
b. 检查克制策略 → 若在免打扰时段或达上限,跳过
c. 获取记忆: 用户作息、今日日期是否有特殊事件、昨日情绪
d. 构建个性化 Prompt
e. 调用模型生成问候
f. 通过通道发送
g. 记录发送日志,增加计数器6.2 用户静默检测流程
1. 事件监听引擎每 10 分钟扫描一次所有用户的最后活跃时间
2. 若某用户距离最后活跃时间超过 silence_timeout_hours
3. 提交静默关心任务给策略决策器
4. 策略决策器:
a. 检查是否已在静默期内发送过关心(防止频繁打扰)
b. 检查用户是否设置了"免打扰"
c. 通过记忆获取用户可能静默的原因(出差、考试?)
d. 生成一条轻量、自然的问候(如"最近忙吗?想你了")
e. 发送- 扩展性设计
7.1 自定义触发器插件
开发者可按 Y.E.S. 规范开发自定义触发器,存于 configs/Plugins/proactive_triggers/。
插件结构:
yuanbot-trigger-weather/
├── manifest.json
├── trigger.py # 实现 ProactiveTrigger 接口
└── README.md接口:
class ProactiveTrigger(ABC):
@abstractmethod
def get_event_type(self) -> str:
pass
@abstractmethod
async def check(self, user_id: str) -> bool:
"""检查是否满足触发条件"""
pass
@abstractmethod
def get_priority(self) -> int:
pass7.2 主动消息模板市场
社区可贡献针对不同人设、不同场景的主动消息模板(如“傲娇型早安”),在扩展市场分发。
- 性能与可靠性
· 调度精度:基础调度循环每秒轮询,Cron 任务延迟 < 2 秒。 · 并发处理:用户检查、消息生成均为异步并发,支持数万用户规模。 · 持久化队列:若消息发送失败,任务存入 Redis 延迟队列,5 分钟后重试,最多 3 次。 · 监控:上报主动消息发送量、成功率、用户反馈(如用户回复“别发了”可自动降低频率)。
本详细设计完整定义了主动陪伴与自动化系统的内部机制,确保缘·Bot 能够以温柔、克制且高度个性化的方式,主动融入用户的数字生活。
