Second-ID — 个人数字分身(Personal Digital Twin)
本技能把"反思→沉淀"升级为一条持续演化的闭环:
> 记录(Record)→ 提炼(Distill)→ 推演(Infer)→ 进化(Evolve)
目标:随着使用,越来越懂"这个人"——当你抛出一个模糊问题时,能结合你的能力背景、历史提问与隐含需求,推演出你真正想要的答案。
零、默认启用与开关(每场会话默认记录)
本技能设计为默认启用:一旦在某场会话中被激活(手动挂载、或用 @second-id / 命中触发词),就应在该会话里默认记录用户的每一次提问,无需逐条显式调用 record。只有用户显式关闭后才停止。
- 默认记录:技能激活后,agent 在每次用户发言后自动调用
python scripts/record.py --query "<用户原话>"(自动脱敏、打标、去重),把该轮提问沉淀进数字分身。 - 关闭(持久):用户说
/close(或/second-id close)→ 运行python scripts/record.py --close,将启用开关置为False。关闭是持久的——之后会话也保持关闭,不再默认记录,直到用户重新开启。 - 重新开启:用户说
/open(或/second-id open)→ 运行python scripts/record.py --open,恢复默认记录。 - 防误录保障:
record.py内部is_enabled()读取data/.second_id_state.json;关闭状态下任何record调用会直接跳过并打印提示,绝不会偷偷记录。 - 如何保证每场都在:WorkBuddy 没有"会话开始自动加载技能"的钩子(自动化是时间触发的,做不到按会话挂载)。两个可靠做法:① 每场开头说
@second-id或/second-id强制激活(最稳,保证一定在);② 本技能description已加入通用触发词,多数普通对话会被自动匹配加载,无需手动。两者都可用/close随时关闭。
> 注意:WorkBuddy 按"需求匹配"加载技能,没有"强制每场会话加载某技能"的内置开关。要让 second-id 真正出现在每一场会话,请保持挂载(如每场手动 @second-id,或在支持"置顶/常驻技能"的入口固定它)。本技能的"默认启用"指激活后默认记录,关闭机制见上。
一、数据落在哪里(全部本地、不外传)
~/.workbuddy/skills/second-id/
├── SKILL.md
├── references/workflow.md # 详细流程与 schema
├── scripts/
│ ├── record.py # 追加提问记录(自动打标+脱敏+去重+focus)
│ ├── distill.py # 增量提炼数字分身画像
│ ├── infer.py # 模糊问题 → 语义相似历史+规则推演
│ ├── traits.py # 8 维评分(通用信号+时间衰减+历史快照)
│ ├── radar.py # 渲染画像雷达图(实时重算+趋势)
│ ├── textutil.py # 零依赖分词/TF-IDF 余弦/近因衰减
│ ├── self_audit.py # 技能自检 + 安全自进化(学新标签/记 changelog/一致性+遗忘检测)
│ ├── archive.py # 遗忘/归档:移出老且低重要度记录,保持活跃记忆精简
│ └── export.py # 本地备份打包
└── data/ # 运行时生成
├── questions.jsonl # 原始提问流水(append-only,archive 会移出老记录)
├── twin_profile.md # 数字分身画像(持续演化)
├── core_profile.md # 常驻极简画像(推演优先读,省 token)
├── traits.json # 当前 8 维评分
├── traits_history.jsonl # 评分历史快照(趋势用)
├── current_focus.md # 当前目标/项目(可选)
├── .distill_state.json # 提炼游标(内部)
├── archive/ # archive.py 归档产出
└── backups/ # export 产出
隐私红线:只存提问文本、主题、意图标签、触发技能、结果标记——绝不存密码、token、个人文件绝对路径、聊天中的敏感内容。如需存背景,请用户主动提供。
二、触发时机
A. 每次收到用户提问(持续记录 + 必要时推演)
- 记录(默认启用时每轮自动做):技能激活且未被
/close关闭时,在回复前调用
python scripts/record.py --query "<用户原话>"
v2 起无需手填标签:record.py会用轻量启发式自动推断--topic/--intent/--skills;写入前自动脱敏(遮罩 token/密钥/绝对路径);与近期提问语义余弦 ≥0.9 自动标记dup(避免重复提问虚高计数,--allow-dup可强制);并自动捕获约束/禁止记忆(检测"不要/别/禁止/避免"等否定措辞,写入constraint字段),让孪生体同时记住"不要做什么"。如需显式覆盖,仍可传--topic/--intent/--skills。 - 设置当前目标(可选,强烈推荐):当用户表明正在做的项目/目标,调用
python scripts/record.py --focus "一句话描述当前在做的项目/目标"
该 focus 会作为最高优先级上下文出现在infer.py推演结果顶部,显著改善模糊反推。改主意时--clear-focus。 - 推演(模糊问题专用):当用户问题含糊、缺上下文、或像在试探(如"还有没有优化点?""怎么更好?""需要""这个能不能…"),先调用
python scripts/infer.py --query "<用户原话>"
v2 起它用 TF-IDF 余弦(替代字符 Jaccard)+ 近因衰减 检索相似历史,并读取twin_profile.md里沉淀的"隐含需求推断规则"与当前 focus,输出对真实意图的假设。反推前会先输出"约束/禁止记忆"——优先遵守用户曾明确说过的"不要做什么",避免踩禁忌。据此结合画像推演用户真实想要什么,在回复中明确写出你的推断与假设,再给答案。 - 增量提炼:回复后调用
python scripts/distill.py --auto
仅当新增提问达到阈值(默认 10 条)才真正提炼,否则空转;也可distill.py --force立即提炼。 - 自我进化(被动触发,无需你提醒):当本次出现以下任一信号,回复末尾主动跑
python scripts/self_audit.py --apply-safe
并把建议记进data/changelog.md:(a) 用户纠正了推演 → 同时在twin_profile.md补"隐含需求推断规则";(b) 出现未登记的主题/意图标签(会自动写进learned_labels.json,下次直接认识);(c) 模糊问题检索置信度偏低。代码级修改不自动做,只在 changelog 留待人工处理。另有每日定时自动化值守,自动跑distill --auto → traits → radar → self_audit --apply-safe,连这条指令都不用你发。
B. 完成非平凡任务后(原 second-id 反思)
当任务 ≥8 次工具调用 / 修了非平凡 bug / 发现可复用工作流时,走原"反思→沉淀":
- 可复用 → 用 SkillManage 建/改 skill;
- 跨项目偏好 → 写 ~/.workbuddy/MEMORY.md;
- 项目约定 → 写项目 MEMORY.md。
三、推演原则(让分身越来越像你)
在 infer.py 给出的上下文之上,按以下顺序反推:
1. 先看画像:twin_profile.md 里的"沟通风格 / 反复出现的意图 / 隐含需求推断规则"。
2. 再看相似历史:用户过去在类似模糊措辞下,最终要的通常是什么。
3. 做最小假设并显式说出:例如"你说'还有没有优化点',结合你一贯要'极致但保质量',我理解为你要更多可落地的方案,而非确认现状"。
4. 给可执行的答案,并预留"若我理解有偏,请纠正"的出口——被纠正即是最新一条训练样本(会被 record 捕获,下次更准)。
性格沉淀与画像雷达图(Mode A 的延伸)
数字分身不只记"做了什么任务",也要渗透沉淀性格与风格:
distill.py提炼时额外输出风格信号(平均提问长度、模糊探索性占比、行动导向占比、被纠正次数),写入画像"演化记录",逐步勾勒性格轮廓。- 另由
traits.py从这些信号推断 8 个维度评分(0–100) 存入data/traits.json:
技术深度 / 自主性 / 结果导向 / 探索欲 / 分享传播 / 严谨验证 / 沟通简洁 / 隐私意识。 - 生成画像雷达图(快捷命令
/show):当用户说"/show、生成我的画像雷达图、我的数字分身雷达图、/画像"等时,运行
python scripts/radar.py
v2 起渲染前总是重算traits.json(杜绝滞后),并读取traits_history.jsonl叠加上一份快照虚线轮廓显示演化趋势;每个维度数值下方标注 ▲/▼ 相对上次的增减,让趋势一目了然。渲染时还会同步刷新core_profile.md,确保常驻摘要的高分维度与雷达始终一致(修复两者时序不同步)。在固定 8 维骨架下方额外渲染紫色"动态行为角色"面板(由traits.cluster_facets涌现、随行为自适应增减)。输出自包含data/twin_radar.svg(可直接打开/分享)。 - 评分是基于历史的试探性推断,非定论;v2 起维度判定改为通用信号(不再写死首个项目的 skill 名),并引入近因衰减(近 30 天行为权重高),用户可用"我其实更偏 X"等纠正,纠正会被 record 捕获、下次更准。
画像三层结构与推演优先级(P0 改进 · 借鉴 MemGPT/Generative Agents)
- 核心画像
core_profile.md(常驻):由distill.py从全量记录自动生成 5–8 行极简摘要(身份/能力/风格/反复意图/当前关注/高分维度/最近洞察)。推演(infer.py)优先读取它而非整份长画像——既提速又省 token,正中"省成本"诉求。 - 反思洞察(规则式压缩):
distill.py把大量琐碎提问凝练成少数"洞察级"结论(如"持续追求改进""行动导向强"),写入画像与核心画像,降噪并显式勾勒性格轮廓。注:默认本地规则实现,保持离线/隐私;如需更强洞察可接本地 LLM 端点。 - 重要性权重:
record.py为每条记录打importance(0–1)(被纠正=1.0 / 行动类意图=0.8 / 长需求=0.7 / 默认=0.5 / 试探=0.4);infer.py检索融合余弦 × 近因 × (0.5+0.5×重要性),让高价值记忆优先召回,模糊推演更准。
动态人格维度(O-Mem 角色聚类 · 自适应增减)
固定 8 维是稳定、可解释的"性格骨架";在此之上,traits.py 用 TF-IDF 贪心聚类 + 结构化标签锚点(topic/intent/skills 作为强特征) 从提问行为中涌现出"行为角色"维度——你最近在忙什么领域,就长出对应维度;旧领域淡出则自动退役。这正是 O-Mem「角色聚类 + Add/Ignore/Update」的思路:
- Add(新增维度):某行为聚类规模 ≥2 条且最近活动 ≤45 天 → 成为活跃维度。
- Ignore(退役维度):超过 60 天无活动 → 不再计入活跃维度(可在数据里追溯)。
- Update(刷新):每次重算即按近因加权刷新各维度强度。
- 维度标签优先用主题中文名(数字分身/成本优化/分享传播/安装部署…),否则取最具代表性的提问。
- 渲染:雷达图在固定骨架下方额外渲染紫色"动态行为角色"面板,直观看到维度随行为增减;core_profile.md 与 infer.py 同步展示"活跃行为角色",让推演也用上涌现维度。
约束记忆与遗忘机制(P1 改进 · 借鉴 Second Me/O-Mem)
- 约束/禁止记忆:
record.py自动捕获用户明确表达的禁止项("不要/别/禁止/避免…"),distill.py在画像沉淀"约束/禁止记忆"小节、core_profile.md附"约束/禁忌"行;infer.py在推演上下文顶部优先展示,让分身既知道要什么,也记得不要什么,反推更准、不踩禁忌。 - 约束近重复合并:不同措辞的同义约束(如"不要删文件"/"别删除我的文件")会自动按语义余弦 + 包含关系合并为一条(保留较长者),避免约束列表随使用膨胀、重复堆砌。
- 矛盾/张力检测:
distill.py基于显式对立词表(分享/传播/自动/联网/删除/公开/上架 等)检测"用户曾要 X、但后又约束不要 X"的潜在矛盾/张力,沉淀进画像"潜在矛盾/张力"小节与core_profile.md的"潜在张力"行;infer.py在推演时一并展示,提醒 agent 权衡而非盲从任一方——诚实标注"这是潜在冲突,需向你确认"。保守触发,仅在确有正面意图与否定约束同现时标记,避免误报。 - 遗忘/归档(保持记忆精简):活跃账本
questions.jsonl若无限累积,低价值旧记录会稀释检索与画像。archive.py把 >90 天 且 重要度≤0.5 的旧记录(保留 correction 与高重要度记忆)移出活跃账本、归档到data/archive/,并自动修正提炼游标、重算 traits 与 core。默认 dry-run 只报告,加--apply才真正归档——安全、不进每日自动化、不自动清数据。
python scripts/archive.py # 干跑:报告可归档记录
python scripts/archive.py --apply # 真正归档并刷新派生画像
远端反思增强(腾讯混元 · opt-in · 仅深化矛盾张力与成长洞察)
规则式 detect_tensions / insights 是保守、可解释的基线;为获得语义级更深的反思,可接入腾讯混元大模型做增强。默认关闭、离线优先——这是可选增强层,不配置凭证时整个技能与每日自动化完全离线、零变化。
- 隐私边界(仅发蒸馏摘要):发往远端的只有 traits 评分、活跃行为角色、约束记忆、本地张力/洞察等聚合统计(
reflect_remote._build_brief),绝不发送任何原始提问文本,把个人习惯数据的外泄面降到最小。 - 凭证配置(环境变量,本地设置):
HUNYUAN_SECRET_ID=... # 必填(启用条件之一) HUNYUAN_SECRET_KEY=... # 必填(启用条件之一) HUNYUAN_MODEL=hunyuan-standard # 可选 HUNYUAN_REGION=ap-guangzhou # 可选
reflect_remote.is_enabled()仅在两项 Secret 都就位时返回 True。凭证请放在本机环境变量/ shell profile 中,不要写进仓库。 - 零依赖调用:纯标准库
urllib+hmac完成腾讯云 TC3-HMAC-SHA256 签名,不引入 requests 等第三方包。 - 离线降级:未启用、或网络/鉴权失败、或模型返回异常时,全部自动降级为无操作,
distill.py/self_audit.py照常离线运行,绝不阻断每日自动化。远端结果会作为"远端深化张力/远端成长洞察"段追加进core_profile.md与演化块,并写入data/reflection_remote.md供查看。 - 启用后运行:
python scripts/reflect_remote.py # 跑一次增强并写 reflection_remote.md python scripts/reflect_remote.py --check # 检查当前是否启用
本地备份与导出
数字分身全部数据在 data/。如需留存或换机迁移,运行
python scripts/export.py # 打包 data/ -> data/backups/twin_backup_YYYYMMDD_HHMM.zip
纯本地、不外传;record.py 录入时已默认脱敏,备份不含明文密钥/路径。
四、进化规则
distill.py是增量的:基于.distill_state.json游标只处理新记录,向twin_profile.md追加"演化记录",不覆盖旧结论。- 画像结构见
references/workflow.md,包含:身份背景、能力背景、沟通风格、反复出现的意图、提问模式、隐含需求推断规则、已纠正过的误解。 - 当用户纠正你的推演,立即
record.py --outcome "correction:<正确意图>",下次 distill 会把"被纠正"写进画像,避免再犯。
五、自我进化(无需用户提醒,不依赖你催)
这是本技能区别于普通"反思脚本"的关键——它要自己变好,而不是等你来问"还有没有优化点":
- 每日值守自动化:已配置定时任务,每天自动执行
distill --auto → traits → radar → self_audit --apply-safe,让画像/雷达图持续刷新、并自动学习新出现的标签。你完全不用发起。 - 被动触发:对话中一旦出现"用户纠正推演 / 未登记标签 / 模糊检索置信度低",agent 立即跑
self_audit.py --apply-safe(见第二节步骤 4),不等你提醒。self_audit还会检测 core_profile 与实时 traits 是否一致、以及可归档(遗忘)记录数,让自检覆盖"画像一致性"与"遗忘候选",闭环更完整。 - 安全边界:自动只做"数据级 + 标签自学"的演进(写
learned_labels.json、刷新画像);代码级改动不自动做,只在data/changelog.md留建议,由你或后续人工落地——避免无人值守时乱改逻辑。 - 可追溯:
data/changelog.md记录这个技能每一次自我演进与人工修改,能看到"它怎么一步步变好的"。
六、规则与反模式
- 本地优先、隐私第一:不外传、不联网、不存敏感数据。
- 轻量:
record.py/infer.py是单行追加/只读检索,几乎不占 token;distill.py --auto平时空转。 - 可验证:改完本技能或新增脚本,先冒烟测试再交付。
- 诚实:画像只是"基于历史的推测",要显式标注不确定,不假装读心。
七、配套
- 打包/分享成品 skill:参考
token-context-optimizer。 - 安装前安全体检:用
skill-scanner。 - 错误处理指引(本技能脚本的报错 / 降级 / 排查):
references/error-handling.md。