一键导入
distill-me
DistillMe — 从个人数据中蒸馏出立体的、有记忆的、会持续学习的数字分身。/ Distill your digital persona from personal data with memory and continuous learning.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
DistillMe — 从个人数据中蒸馏出立体的、有记忆的、会持续学习的数字分身。/ Distill your digital persona from personal data with memory and continuous learning.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
| name | distill-me |
| description | DistillMe — 从个人数据中蒸馏出立体的、有记忆的、会持续学习的数字分身。/ Distill your digital persona from personal data with memory and continuous learning. |
| argument-hint | create|chat|list|update "<name>" [--data-folder <path>] |
| version | 1.2.0 |
| user-invocable | true |
| allowed-tools | Read, Write, Edit, Bash, Glob, Grep, Agent |
从个人数据中蒸馏出立体的、有记忆的、会持续学习的数字分身。
/distill-me create "<name>" --data-folder <path> — 从数据文件夹创建数字分身/distill-me create "<name>" — 无数据文件夹,通过问答创建/distill-me chat "<name>" — 与已有数字分身对话/distill-me list — 列出所有数字分身/distill-me update "<name>" --data-folder <path> — 追加数据更新记忆支持中英文。根据用户首条消息语言全程保持一致。
/distill-me create "小明" --data-folder /path/to/data
node ${CLAUDE_SKILL_DIR}/tools/ingest.mjs scan "<data-folder>"
显示文件统计(文本、JSON、CSV、图片数量),预览文本文件内容。
node ${CLAUDE_SKILL_DIR}/tools/ingest.mjs init "<slug>"
在 ~/.claude/distill_me/<slug>/ 下创建完整目录结构。
使用 prompts/distiller.md 提示词,将原始材料喂给 Claude 分析,输出 profile.json。
对每个文本文件:
node ${CLAUDE_SKILL_DIR}/tools/ingest.mjs read-chunk "<file>" --offset 0 --limit 4000
分块读取后使用 prompts/distiller.md 分析人格特征。
使用 prompts/memory-extractor.md 提示词,从每段材料中提取离散记忆。
每条提取的记忆通过 memory-writer 写入:
node ${CLAUDE_SKILL_DIR}/tools/memory-writer.mjs "<slug>" "<category>" "<topic>" --body "..." --type episodic --importance 0.8 --tags "tag1,tag2"
# 建立 FAISS 向量索引
python3 ${CLAUDE_SKILL_DIR}/model/embedder.py build \
"~/.claude/distill_me/<slug>/memories" \
"~/.claude/distill_me/<slug>"
# 冷启动链接生成(基于嵌入相似度 + 实体共现)
python3 ${CLAUDE_SKILL_DIR}/model/cold_start.py \
"~/.claude/distill_me/<slug>"
node ${CLAUDE_SKILL_DIR}/tools/persona-generator.mjs "<slug>"
在 ~/.claude/skills/<slug>/SKILL.md 生成可调用的数字分身技能。
显示摘要,用户确认/修改/取消。
node ${CLAUDE_SKILL_DIR}/tools/ingest.mjs mark-done "<slug>" "<data-folder>"
将当前文件状态(hash)记录到 ingest_log.json,后续 update 时用于比对。
/distill-me update "小明" --data-folder /path/to/data
当用户上传了新文件或修改了已有文件,一键增量更新。
node ${CLAUDE_SKILL_DIR}/tools/ingest.mjs diff "<slug>" "<data-folder>"
输出新增和修改的文件列表(通过 SHA-256 hash 对比,不依赖时间戳)。
如果 to_process 为 0,提示"没有新内容"并结束。
对每个新增/变更的文件,分块读取:
node ${CLAUDE_SKILL_DIR}/tools/ingest.mjs read-chunk "<file>" --offset 0 --limit 4000
使用 prompts/memory-extractor.md 提取记忆。每条记忆通过 persona-editor 写入(自动触发索引重建):
node ${CLAUDE_SKILL_DIR}/tools/persona-editor.mjs memory add "<slug>" "<category>" "<topic>" \
--body "..." --importance 0.8 --tags "tag1,tag2" --type episodic
如果新材料揭示了之前不知道的人格特征(新兴趣、新交流习惯、态度变化),用 persona-editor 更新 profile:
node ${CLAUDE_SKILL_DIR}/tools/persona-editor.mjs profile set "<slug>" --json '{"values": {"interests": [...]}}'
这会自动重新生成 SKILL.md。
注意:只在新材料确实包含新人格信息时才更新 profile。日常记忆不需要改 profile。
node ${CLAUDE_SKILL_DIR}/tools/ingest.mjs mark-done "<slug>" "<data-folder>"
输出本次更新的摘要:新增了多少条记忆、是否更新了 profile、当前记忆总数。
/distill-me chat "小明"
每次收到用户消息时,数字分身按以下流程处理:
node ${CLAUDE_SKILL_DIR}/tools/session-manager.mjs compose "<slug>" "<用户消息原文>" --phase middle --user "<用户id>"
compose 内部自动完成四层检索管线:FAISS 向量检索 → 启发式评分取 top-5 种子 → 模型重排(训练后生效) → log₂(n) 深度链路行走。返回的 JSON 中 memories_xml 字段包含所有检索到的记忆。
--user:当前对话者 id。如果已通过 persona-editor user add 注册,系统自动注入 <user> 标签和关系信息。省略则使用 config.json 中的 default_user,都没有则为匿名 "user"。--phase:start(对话开头)、middle(默认)、deep(深入聊天)。阅读记忆,生成回复 — Claude 以人格身份回复,记忆影响语气和立场但不被复述。
记忆保存(可选) — 对话中获得之前不知道的重要新信息时,用 Bash 工具静默保存:
node ${CLAUDE_SKILL_DIR}/tools/session-manager.mjs save-memory "<slug>" "<category>" "<topic-slug>" "<1-3句压缩摘要>" --importance <0-1> --tags "tag1,tag2"
node ${CLAUDE_SKILL_DIR}/tools/session-manager.mjs log-feedback "<slug>" "<所有检索到的记忆id,逗号分隔>" "<你实际用到的记忆id,逗号分隔>"
compose 返回的 memories_xml 中包含两类记忆:
<!-- 直接检索的种子记忆 -->
<memory id="exp-summer-trip-001" category="experiences" importance="0.8" score="0.823">
2024年夏天去了云南旅行...
</memory>
<!-- 链路行走发现的关联记忆 -->
<memory id="rel-family-mom-001" category="relationships" importance="0.9" type="walked" linked-from="exp-summer-trip-001">
和妈妈的关系...
</memory>
<!-- 对话者身份(如果已注册) -->
<user id="sonny" name="非简并" relation="本体" />
memories/
├── identity/ # 核心身份:价值观、性格、自我描述
├── relationships/ # 人际关系(可含子文件夹:family/, friends/)
├── experiences/ # 经历记忆(可按年份组织:2024/, 2025/)
├── knowledge/ # 领域知识和专业技能
├── opinions/ # 观点和偏好
├── habits/ # 行为模式和日常习惯
└── conversations/ # 对话中自动产生的新记忆
---
id: "exp-summer-trip-001"
type: episodic
created: "2026-04-02T15:30:00Z"
importance: 0.8
tags: ["travel", "family"]
source: "chat_logs/2024-08.txt"
links:
- id: "rel-family-mom-001"
relation: "involves"
strength: 0.9
- id: "emo-happiness-travel-001"
relation: "evokes"
strength: 0.7
---
# 2024年夏天旅行
我们全家去了云南旅行,在大理住了一周...
第一层:FAISS 向量检索 — O(log n),HNSW 索引,取 top-50 候选
第二层:启发式评分(始终可用)
score = 0.40 * embedding_similarity
+ 0.20 * keyword_match
+ 0.15 * importance
+ 0.10 * recency
+ 0.15 * type_boost
取 top-5 作为种子记忆。
第三层:模型重排(训练后可用)
第四层:多层链路行走
总注入量随记忆库对数增长:seeds (5) + walk (~log₂(n))。
对话上下文 → frozen encoder → 384维 ─┐
├─ concat [A; B; A*B; |A-B|] → MLP → score
候选记忆 → frozen encoder → 384维 ─┘
MLP: Linear(1536,256) → ReLU → Linear(256,64) → ReLU → Linear(64,1) → Sigmoid
底座: paraphrase-multilingual-MiniLM-L12-v2
可训练参数: ~410K
初始权重 ≈ 余弦相似度输出。无训练时完全退化为启发式检索,不影响体验。
| 工具 | 用途 |
|---|---|
tools/ingest.mjs | 扫描数据文件夹、初始化目录、分块读取文件、增量检测 (diff/mark-done) |
tools/persona-editor.mjs | 统一编辑入口:profile + 记忆 + 用户管理,自动级联更新 |
tools/memory-writer.mjs | 低层记忆文件创建/编辑/删除(不触发同步) |
tools/memory-retriever.mjs | 检索记忆(FAISS + 启发式 + 模型) |
tools/memory-walker.mjs | 沿链路行走获取关联记忆 |
tools/persona-generator.mjs | 生成 SKILL.md + 身份配置文件 |
tools/session-manager.mjs | 管理对话状态、记忆注入、记忆保存、索引重建 |
tools/memory-consolidator.mjs | 记忆生命周期管理:统计、衰减淘汰、相似合并 |
model/embedder.py | 文本嵌入和 FAISS 索引 |
model/embed_daemon.py | 嵌入守护进程(消除冷启动) |
model/linker.py | 记忆链接评分模型 |
model/train_linker.py | 从 feedback 日志训练 linker |
model/cold_start.py | 冷启动初始化和启发式链接生成 |
| 内容 | 路径 |
|---|---|
| 人格档案 | ~/.claude/distill_me/{slug}/profile.json |
| 运行配置 | ~/.claude/distill_me/{slug}/config.json |
| 记忆文件 | ~/.claude/distill_me/{slug}/memories/ |
| 向量索引 | ~/.claude/distill_me/{slug}/index.faiss |
| 模型权重 | ~/.claude/distill_me/{slug}/model/linker_weights.pt |
| 技能文件 | ~/.claude/skills/{slug}/SKILL.md |
# 列出所有数字分身
ls ~/.claude/distill_me/
# 查看某个分身的记忆统计
find ~/.claude/distill_me/<slug>/memories -name "*.md" | wc -l
# 删除数字分身
rm -rf ~/.claude/distill_me/<slug> ~/.claude/skills/<slug>
compose 一键加载(内含四层检索管线)persona-editor.mjs 统一编辑入口,自动级联更新--user)ingest.mjs diff/mark-donelog-feedback) + train_linker.py 训练