astrbot_plugin_self_evolution 是 AstrBot 的长期能力增强插件,适配群聊、私聊和 NapCat 消息结构。
目标是让 Bot 在无对话时也在"变化"——有情绪起伏、有社交需求、有待办挂念、有记忆延续,而不是每次对话都是一张白纸。
内置人格状态引擎,追踪 能量、心情、社交需求、饱腹感,基于时间差推演状态变化,触发短期 Effect 和脑内待办。SAN 系统现已归口到 Persona Sim,不再独立维护能量值。
- System Prompt:人格叙事片段(
snapshot_to_prompt)+ 人格设定基底- 输出示例:
"刚主动说了话但被冷落,还有点堵着" - 不再注入"精力充沛"等状态基调,由 Persona Sim 统一提供
- 输出示例:
- 注入位置:
generation_context.py→_get_persona_prompt()
| 状态 | 说明 |
|---|---|
energy |
活力,0~100,影响回复意愿 |
mood |
心情,0~100,影响语气 |
social_need |
社交需求,0~100 |
satiety |
饱腹感,0~100 |
- 来源语义:每个 Effect 携带
source_detail(触发来源描述)、decay_style(衰减风格)、recovery_style(恢复风格),持久化到 SQLite - wronged + active + miss →
source_detail="主动搭话但被冷落,期望落空" - 互动维度:
InteractionMode(active/passive)×InteractionOutcome(connected/missed)
- need_todo(生理型):饿、累、想安静
- social_todo(关系型):想把没说完的话接上、想继续聊、想躲热闹
wronged + active + missed→"想把当时没说完的话接上"
分析日内 missed / connected / active 计数,输出情感 trajectory(向上/有落差/独处/平淡/平稳)
engine/persona_sim_engine.py— 引擎核心engine/persona_sim_rules.py— Effect 触发规则engine/persona_sim_injection.py— Prompt 注入逻辑engine/persona_sim_todo.py— 待办生成engine/persona_sim_consolidation.py— 日结
LLM 群分析结果(activity / emotion / has_drama)映射为 interaction_quality,通过 persona_sim.tick(quality) 注入,不再独立改 SAN 值。
| 分析结果 | interaction_quality |
|---|---|
| drama=True | bad |
| low + negative | bad |
| low | awkward |
| negative | awkward |
| high + positive | good |
| 其他 | normal |
- 当 Persona Sim 可用时:
get_prompt_injection()返回空串,不注入任何 SAN 描述 - 当 Persona Sim 不可用时:降级为独立能量系统,注入
【当前状态】精力充沛/略有疲态/疲惫不堪
cognition/san.py— 群消息 LLM 分析scheduler/—SANAnalyze定时任务
Bot 主动判断时机和内容,通过 Pending Opportunity 机制在满足条件时主动插话。
engine/opportunity_cache.py— PendingOpportunity 缓存,支持 warm/peek/consume,OpportunityScore 计算,ActiveMotive 驱动engine/interject_preferences.py— 用户主动互动偏好(initiative trend + outcome tracking)engine/eavesdropping.py— 主动/被动社交入口,check_engagement决策点engine/engagement_planner.py— 场景分类、意图规划、评分、姿态计算engine/reply_intent.py— ReplyIntent 构造engine/reply_executor.py— 回复执行engine/reply_policy.py— 统一仲裁engine/reply_recorder.py— 回复结果记录(用于 initiative trend)
OpportunityScore.level_from_score() 使用固定阈值:
| 分数区间 | 层级 |
|---|---|
| < 0.15 | ignore |
| 0.15–0.25 | react |
| 0.25–0.35 | text_lite |
| ≥ 0.35 | full |
sub_scene 影响评分权重(乘法因子),不影响层级阈值。
_best_anchor_for_score 根据 ActiveMotive 优先级选择锚点:
| Motive | 锚点优先级 |
|---|---|
CONTINUE_THREAD |
未完成 cue > thread > topic_hook |
CURIOUS_PROBE |
question > topic_hook |
SEEK_CONNECTION |
trigger_text > joke |
SELF_PROTECTIVE |
natural_landing > topic_hook |
LIGHT_RELIEF |
joke > trigger_text |
ConversationMomentum.unfinished_cues 追踪未完成互动线索:
- TTL:180 秒
- 类型:
unanswered_question/unfinished_joke/unfinished_topic - 触发:
bot_spoke清除unanswered_question,reset_wave清除unfinished_joke - 持久化:通过 DAO 写入
engagement_state.unfinished_cues(JSON 数组)
TextLiteVariant 枚举提供三种轻量回复变体:
| 变体 | 场景 | max_chars |
|---|---|---|
QUICK_TOUCH |
JOYFUL_BUSTLE / 轻松氛围 | ~30 |
QUIET_FOLLOW |
AWKWARD_GAP / 收敛姿态 | ~40 |
SMALL_PROBE |
TOPIC_FOCUS / 好奇探问 | ~50 |
SpeechDecision.text_lite_variant 字段携带变体信息,生成提示词包含对应风格指导。
_score_relation 综合两个信号:
- 静态好感度:
trigger_user_affinity(来自 Affinity 系统) - 近期互动余韵:
recent_interaction_outcome(connected/missed/awkward/relief)
connected 情境下 boost,missed/awkward 情境下 penalize。
engagement_state 表新增列:
last_unanswered_question TEXT
last_unfinished_joke TEXT
unfinished_cues TEXT DEFAULT '[]'- consume 逻辑:
consume_high_score先 peek 确认高优质机会,再 remove_one 移除(避免 policy 阻塞的机会被误消费) - trigger user 信息:PendingOpportunity 新增
trigger_user_id/trigger_user_name,主动 intent 可获取真实触发者 - remove_one:OpportunityCache 新增
remove_one(scope_id, opp),只移除特定 opportunity,不清空整个 scope
- 主动模式:
[主动发言模式]+ "你是主动加入群聊讨论的…保持简短(50字以内)" - 注入位置:
_build_behavior()→ 当decision.delivery_mode == "text" && text_mode == "interject"
| 层级 | 行为 |
|---|---|
IGNORE |
不回应 |
REACT |
表情包 reaction |
FULL |
LLM 文本回复 |
wronged+ 主动 → initiative ↓social_todo存在 → initiative ↑curious+ active → playfulness ↑
门槛说明:Persona Arc 是高级外挂功能,需要以下前置条件:
- 理解 AstrBot 外挂插件机制(加载、配置、数据目录)
- 理解人格阶段(Stage)的概念和阶段性表达约束
- 能够编写 Stage Prompt(多则几十行,少则也有十几行)
- 能够管理 SQLite 表结构(首次启用时自动创建)
- 不适合不希望 Bot 有"成长感"、只想用开箱即用功能的用户
通过 Progress 积累驱动人格阶段递进,配合情感图鉴和离线反刍实现养成体验。默认自带 amphoreus_demurge 德谬歌弧线,也支持自定义弧线。该模块保持外挂边界:核心插件只识别 arc_id、stage、progress、情感图鉴和反刍记录,具体角色设定只写在 Profile 中。
| 机制 | 说明 |
|---|---|
| Progress | 通过高质量故事消息、情感解锁、日结等途径积累 |
| Stage | Progress 达到阈值后自动升级阶段,不可手动指定 |
| 情感图鉴 | 记录用户在对话中明确表达的情绪体验 |
| 离线反刍 | 后台定时生成内在残响,作为 Prompt 背景注入,注入后标记为已注入 |
amphoreus_demurge 默认提供三阶段:
| Stage | 阈值 | 说明 |
|---|---|---|
| Stage 0 | 0 |
纯桃子 |
| Stage 1 | 30 |
觉醒中期 |
| Stage 2 | 100 |
成熟德谬歌 / 大昔涟 |
record_arc_emotion(emotion_name, feeling_description):当用户明确描述情绪体验时调用
| 命令 | 权限 | 说明 |
|---|---|---|
/arc status [scope] |
管理员 | 查看弧线状态和下一阶段剩余 Progress |
/arc emotions [scope] |
管理员 | 查看已解锁情感列表 |
/arc prompt [scope] |
管理员 | 预览当前注入的 Prompt |
/arc ruminations [scope] |
管理员 | 查看离线反刍记录 |
/arc debug_pour <amount> [reason] |
管理员 | 调试增加 Progress,amount 必须大于 0 |
Persona Arc 不提供
/arc set stage这类手动切阶段命令。调试命令只允许增加 Progress,阶段仍由阈值自动计算。
engine/persona_arc/manager.py— 弧线管理器engine/persona_arc/emotions.py— 情感图鉴服务engine/persona_arc/rumination.py— 离线反刍服务engine/persona_arc/profiles/— 弧线 Profile 定义engine/persona_arc/profiles/template.py— 自定义弧线模板
- 复制
engine/persona_arc/profiles/template.py为your_arc_id.py - 修改
arc_id、display_name、stages配置 - 在
engine/persona_arc/profiles/__init__.py末尾添加from .your_arc_id import ARC - 在
config.json中设置persona_arc.persona_arc_enabled=true和persona_arc.persona_arc_active_arc_id=your_arc_id
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
persona_arc.persona_arc_enabled |
bool | false |
是否启用 Persona Arc |
persona_arc.persona_arc_active_arc_id |
str | amphoreus_demurge |
当前激活的弧线 ID |
维护用户画像(身份、偏好、特征、备注)和会话事件/每日总结,支持按群聊/私聊自动 scope 隔离。长期知识库可召回并注入 Prompt。
【内部参考信息】:发送者ID、昵称、情感积分、群聊/私聊来源、引用/AT上下文- 注入位置:
_build_identity()
- 注入位置:
【群消息历史】:最近 N 条群消息(inject_group_history控制)- 注入位置:
_build_history()
- 注入位置:
- 画像摘要:身份、偏好、特征、长期笔记(
enable_profile_injection控制,需 AT 或回复)- 注入位置:
_build_profile()
- 注入位置:
- 知识库召回:记忆段落召回(
enable_kb_memory_recall控制)- 注入位置:
_build_memory()
- 注入位置:
engine/profile.py— 画像增删改查engine/memory_router.py/memory_query_service.py— 记忆查询与注入engine/session_memory_store.py— 会话事件持久化engine/session_memory_summarizer.py— 每日会话总结
- 表情包学习提示:
[表情包学习]+ 触发关键词说明- 注入位置:
_build_behavior()→ 当sticker_learning_enabled
- 注入位置:
- 画像更新提示:
[即时画像更新提示]+ "请调用 upsert_cognitive_memory 工具"- 注入位置:
_build_behavior()→ 当_should_inject_preference_hints()
- 注入位置:
engine/entertainment.py— 表情包学习 +get_prompt_injection()engine/caption_service.py/moderation_classifier.py— 图片 caption + NSFW/Promo 审核engine/sticker_store.py— 表情包存储与发送engine/meal_store.py— 群菜单
engine/affinity.py— 情感积分(直接回复/礼貌词/攻击词/回访加分),不注入 Promptscheduler/— 每日反思批处理、好感度恢复等定时任务
从"连续状态引擎"升级为"人格生活模拟系统",新增 6 大能力:
每个 Effect 携带来源描述(source_detail)、衰减风格(decay_style)和恢复风格(recovery_style),存储于 SQLite persona_effects 表,持久化不丢失。
示例:wronged + active + missed → source_detail="主动搭话但被冷落,期望落空"
引入 InteractionMode(active / passive)× InteractionOutcome(connected / missed)两个维度,替代原本单一 quality。互动事件携带完整 mode × outcome 记录,影响 Effect 触发和待办生成。
待办从单一列表升级为两种类型:
- need_todo(
TodoType.INTERNAL):生理需求型——饿、累、想安静 - social_todo(
TodoType.SOCIAL):关系型——想把没说完的话接上、想继续聊、想躲热闹
wronged + active + missed 生成 social_todo "想把当时没说完的话接上";lonely + recent_connected 生成 "刚才那通还没聊够"。
注入 Prompt 的不再是状态数字和状态基调,而是一段心理叙事——从近期事件中提取 interaction mode × outcome,生成短小、有情绪连贯性的描述,例如:"刚主动说了话但被冷落,还有点堵着"。
不再说"精力充沛"或"有点提不起劲"这类和 SAN 系统冲突的基调。
日结从"互动 N 次"进化为情感轨迹固化:分析日内 missed / connected / active 计数,输出 trajectory(向上 / 有落差 / 独处 / 平淡 / 平稳),shift_hint 反映日内落差感。
plan_engagement 读取近期 interaction_outcome / interaction_mode,动态调整 warmth / initiative / playfulness。wronged + 主动 感降低主动意愿;social_todo 存在时提高 initiative 偏向。
persona_effects 表新增 3 列:source_detail、decay_style、recovery_style,通过 ALTER TABLE 迁移(向后兼容)。
任务错开执行,避免深夜~凌晨 LLM 调用集中:
| 时间 | 任务 | 说明 |
|---|---|---|
0 1 * * * |
PersonaThought | 人格思维生成(每12小时) |
0 4 * * * |
ProfileCleanup | 清理过期用户画像 |
0 5 * * * |
PersonaConsolidation | 人格日结 |
0 6 * * * |
MemorySummary | 每日会话记忆总结 |
*/{interval} * * * |
Interject | 主动插嘴检查 |
*/{interval} * * * |
SANAnalyze | SAN 精力分析 |
{profile_schedule} |
ProfileBuild | 批量构建用户画像 |
{reflection_schedule} |
DailyReflection | 每日反思批处理 |
{github_check_schedule} |
GitHubCheck | 检查 GitHub 仓库更新,有新 commit 时推送到指定群 |
插件可监控指定 GitHub 仓库指定分支,当检测到新 commit 时向目标群或用户发送通知。
update_notify_repo— 仓库路径,格式owner/repo(默认Renyus/astrbot_plugin_self_evolution)update_notify_branch— 分支名(默认master)update_notify_group_id— 接收通知的群 ID 列表(群聊)update_notify_user_ids— 接收通知的用户 ID 列表(私聊)update_check_interval— 检查间隔(分钟,默认 30)
留空
update_notify_group_id和update_notify_user_ids则不启用通知。
首次检测到 commit 时不会发送通知(防止首次运行推送大量历史 commit),之后仅在新 commit 出现时通知。使用 /db github_reset 可重置缓存,强制重新检测。
当收到群友或私聊用户的戳一戳(poke)时,Bot 会根据配置的概率做出反应。
- 戳回去:以一定概率反戳对方
- 发送吐槽:不戳回时随机发送一条吐槽文案
poke_reply_enabled— 是否启用戳回复(默认开启)poke_poke_back_chance— 戳回去的概率 1~100(默认 50)poke_complaint_texts— 吐槽文案列表(默认:干嘛呢~、有事说事!、别闹、正经点)
由于 NapCat 发送的 poke 事件无法区分戳/抱/亲,吐槽文案使用中性措辞,不涉及具体动作。
| 命令 | 说明 |
|---|---|
/se help |
查看指令帮助 |
/se version |
查看插件版本 |
/reflect |
触发反思 |
/af show |
查看好感度 |
/san show |
查看 SAN 状态 |
/profile view [用户] |
查看画像(不传则看自己的) |
/profile create [用户] |
创建画像(仅管理员可指定他人) |
/profile update [用户] |
更新画像(仅管理员可指定他人) |
/addmeal <菜名> |
添加菜品到群菜单 |
/delmeal <菜名> |
删除菜品 |
/今日老婆 |
随机抽取一名群友 |
/feed |
喂食(发送图片后使用,识图判断食物并更新饱腹感/心情) |
/shut [分钟] |
让 AI 暂时闭嘴(管理员) |
| 命令 | 说明 |
|---|---|
/af debug <用户> |
好感度调试(@或ID) |
/af set <用户> <分数> |
设定好感度(@或ID) |
/san set [值] |
设定 SAN 值 |
/profile delete <用户> |
删除画像(@或ID) |
/profile stats |
画像统计 |
/meal ban <用户> |
禁止加菜(@或ID) |
/meal unban <用户> |
解除禁止(@或ID) |
/ev review [页码] |
审核流 |
/ev approve <ID> |
批准 |
/ev reject <ID> |
拒绝 |
/ev clear |
清空 |
/ev stats [群ID] |
进化统计 |
/ps state [群] |
只读人格状态 |
/ps status [群] |
触发 tick 后查看人格快照 |
/ps tick [quality] [群] |
手动推进人格时间(none/negative/positive) |
/ps todo [群] |
查看脑内待办 |
/ps effects [群] |
查看活跃效果 |
/ps apply [q] [群] |
应用互动影响(q: bad/awkward/normal/good/relief/brief) |
/ps today [群] |
查看今日人格摘要 |
/ps consolidate [群] [日期] |
执行人格日结(格式: YYYY-MM-DD) |
/ps think [群] |
手动触发 LLM 生成内心独白 |
/sticker list [页码] |
表情包列表 |
/sticker preview <UUID> |
预览 |
/sticker delete <UUID> |
删除 |
/sticker disable <UUID> |
禁用 |
/sticker enable <UUID> |
启用 |
/sticker clear |
清空 |
/sticker stats |
统计 |
/sticker sync |
同步 |
/sticker add |
添加 |
/sticker migrate |
迁移 |
/db show |
查看数据库 |
/db reset |
重置数据库 |
/db rebuild |
重建数据库 |
/db confirm |
确认操作 |
/db github_reset |
重置 GitHub 更新缓存(强制重新检测) |
/kb clear [scope/all] |
清空知识库文档(仅管理员) |
review_mode— 管理员审核模式persona_name— 人格名称admin_users— 管理员白名单target_scopes— 目标群/私聊白名单
memory_enabled— 记忆模块reflection_enabled— 反思模块interject_enabled— 主动插话san_enabled— SAN 系统entertainment_enabled— 娱乐模块persona_arc_enabled— 人格弧线(高级功能,见上方说明)
memory_kb_name— 知识库名称memory_fetch_page_size— 召回分页大小memory_summary_chunk_size— 总结 chunk 大小memory_summary_schedule— 总结计划(默认 06:00)enable_kb_memory_recall— 召回记忆memory_query_fallback_enabled— KB 检索兜底profile_msg_count— 画像消息阈值profile_cooldown_minutes— 画像冷却(分钟)enable_profile_injection— 注入画像摘要enable_profile_fact_writeback— 写回新事实auto_profile_enabled— 自动构建画像auto_profile_schedule— 画像构建计划auto_profile_batch_size— 每批处理群数auto_profile_batch_interval— 批次间隔(分钟)
disable_framework_contexts— 禁用框架上下文inject_group_history— 注入群聊历史group_history_count— 历史注入条数max_prompt_injection_length— 注入最大长度surprise_enabled— 启用惊奇检测surprise_boost_keywords— 惊奇关键词表dropout_enabled— 启用随机留白dropout_edge_rate— 随机留白概率
affinity_auto_enabled— 自动好感度更新affinity_recovery_enabled— 好感度每日恢复affinity_direct_engagement_delta— 主动互动加分值affinity_friendly_language_delta— 礼貌语言加分值affinity_hostile_language_delta— 攻击语言扣分值affinity_returning_user_delta— 回访用户加分值affinity_direct_engagement_cooldown_minutes— 互动冷却(分钟)affinity_friendly_daily_limit— 礼貌词每日上限affinity_hostile_cooldown_minutes— 攻击冷却(分钟)affinity_returning_user_daily_limit— 回访每日上限interject_enabled— 启用主动插嘴interject_interval— 插嘴检查间隔(分钟)interject_cooldown— 插嘴冷却(秒)interject_trigger_probability— 插嘴触发概率engagement_react_probability— emoji reaction 概率
san_enabled— 启用 SAN 系统san_max— SAN 最大值san_cost_per_message— 每条消息耗 SANsan_recovery_per_hour— 每小时恢复 SANsan_low_threshold— 低 SAN 阈值san_auto_analyze_enabled— 启用 SAN 分析san_analyze_interval— SAN 分析间隔(秒)san_msg_count_per_group— 每群分析条数
moderation.enabled— 启用审核moderation.enforcement_enabled— 执行处罚moderation.nsfw_keywords— NSFW 关键词moderation.promo_keywords— 引流推广关键词moderation.refusal_keywords— 模型拒绝描述关键词moderation.nsfw_refusal_confidence— NSFW 拒绝描述置信度moderation.promo_refusal_confidence— 引流拒绝描述置信度moderation.weak_keyword_confidence— 关键词匹配置信度moderation.confidence_threshold— 置信度门槛moderation.escalation_threshold— 踢人阈值moderation.ban_duration_minutes— 禁言时长(分钟)moderation.nsfw_warning_message— NSFW 警告消息moderation.nsfw_ban_reason_message— NSFW 处罚理由消息moderation.promo_warning_message— 引流警告消息moderation.promo_ban_reason_message— 引流处罚理由消息
sticker_learning_enabled— 学习表情包sticker_target_qq— 学习目标 QQ 列表sticker_total_limit— 表情包总数上限sticker_send_cooldown— 发送冷却(分钟)sticker_freq_threshold— 学习频次阈值sticker_reply_enabled— 回复附加表情包sticker_reply_chance— 触发概率(1~100)sticker_reply_max_per_hour— 每小时上限sticker_reply_min_text_length— 最低文字长度meal_max_items— 菜单最大条目meal_eat_keywords— 吃饭关键词meal_banquet_keywords— 设宴关键词meal_banquet_count— 设宴触发次数上限meal_banquet_cooldown_minutes— 设宴冷却(分钟)
poke_reply_enabled— 启用戳回复poke_poke_back_chance— 戳回概率 1~100poke_complaint_texts— 吐槽文案列表
debug_log_enabled— 输出调试日志memory_debug_enabled— 记忆模块调试日志engagement_debug_enabled— 社交互动调试日志affinity_debug_enabled— 情感积分调试日志
| 数据 | 存储方式 |
|---|---|
| 用户画像 | 本地文件 |
| 会话总结 / 事件 | AstrBot 知识库 |
| 图片 caption cache / 审核 evidence | SQLite |
| 反思 / SAN / 好感度 | SQLite |
| Persona Sim | SQLite(persona_state / persona_effects / persona_events / persona_todos / persona_episodes) |
| 主动社交参与状态 | SQLite(engagement_state 表,含 unfinished_cues) |
| 表情包 | 本地目录 |
优先查看这些前缀:
[MemoryWrite]/[MemoryQuery]/[MemorySummary]/[MemoryStore]/[MemoryInject][PersonaSim]/[PersonaDAO]/[Consolidation][Engagement]/[OpportunityScore]/[ReplyIntent]/[ReplyExecutor][Affinity]/[SAN][Moderation]/[ModerationEnforcer][FeedHandler]/[CaptionService]/[Poke]
正常跳过通常只打 debug,不打 warning。
- 在 AstrBot 后台安装
astrbot_plugin_self_evolution - 创建基础知识库,把名称填入
memory_kb_name - 确保 AstrBot 已配置可用模型
- 如启用图片审核,确认已配置图片理解 provider
- 使用 NapCat 作为消息协议后端
- 重载或重启 AstrBot
迁移注意事项:
- 重装不自动清空 AstrBot 知识库
- 重建数据库不删除画像文件和表情包目录
- scope 知识库按群聊 / 私聊自动隔离
彻底清理需分别处理:
- 数据库:
/db reset或/db rebuild - 表情包:
/sticker clear或删除本地表情包目录 - 画像:删除画像文件
- 知识库:在 AstrBot 知识库侧清理
按优先级从这些文件开始阅读:
main.py— 插件主入口,命令注册,调度器初始化engine/eavesdropping.py— 主动 / 被动社交入口engine/engagement_planner.py— 场景分类与意图规划engine/opportunity_cache.py— PendingOpportunity 缓存与评分engine/interject_preferences.py— 用户主动互动偏好engine/reply_executor.py— 回复执行engine/persona_sim_engine.py— 人格状态引擎engine/persona_sim_rules.py— Effect 触发规则engine/persona_sim_injection.py— Prompt 注入逻辑engine/persona_sim_consolidation.py— 日结逻辑engine/persona_sim_todo.py— 脑内待办生成cognition/san.py— SAN 精力分析dao.py— SQLite 持久化scheduler/— 定时任务编排