2026年9月24日 · 阅读 —

我把自己"蒸馏"成了一个可运行的 Skill:echo-me-skill 手记

Agent 与 SkillsAI 工程实践

我把自己”蒸馏”成了一个可运行的 Skill:echo-me-skill 手记

先说我在琢磨什么:一个人跟你说过的话、记的日记、拍过的照片里,到底藏了多少”他是谁”。我一直觉得这类东西不是玄学,是可结构化的——只是大多数”数字化自己”的做法,两头都踩空。

有一种是让模型”猜”你的性格,没有任何真实材料,生成出来的是个抄别人说话的人设;另一种是反过来,把你几十万条聊天记录原样倒进去,让模型在一大坨原生数据里自己找感觉。前者凭空捏,后者没结构。两个我都接受不了。

于是我把一个已经存在的开源项目 yourself-skill(作者 notdog1998)从架构层面全量重写了一遍,做成一个独立的 Skill 包,叫 echo-me-skill,开源在 xsoway/echo-me-skill。

为什么重写,而不是直接用

原项目把”把聊天记录转成自我”的雏形做出来了,是值得致敬的起点。但它在工程上有些薄弱:包结构不满足可安装的技能契约、品牌归属混淆、也没办法独立开源。直接拿来用,问题不在功能,而在”能不能被干净地分发、安装、验证”。

我要的不是一个我手动维护的文件夹,而是一个能放进别的 Agent 环境、能被机器校验、能持续进化的东西。所以代码、文案、示例全部重写,代码一个字节没抄原项目,只在 LICENSE 里如实保留了对它的衍生声明。

重写时我给自己立了三条线,后来也成了这个包的安全底线:

  1. 不臆造——生成的自我只能来自你提供的原材料或明说的信息,信息缺口就问,绝不编经历。
  2. 原材料不入库——聊天记录、照片、个人信息只落到本机 gitignored 的目录,一个字节都不进仓库。
  3. 验证诚实——结构校验通过只证明”包完整”,不等于”模型行为已验证”。

它是什么

把历史材料蒸馏成两层模型,而不是一个大而全的”关于我”文件:

  • Self Memory(自我记忆)——你知道什么、你是谁。经历、价值观、生活习惯、重要记忆、人际关系、成长轨迹。
  • Persona(人格)——你怎么回应。说话风格、情感模式、决策模式、人际行为,把”标签”翻译成具体行为规则。

再叠一层 Correction:你纠正它”这不对,我不会这样说”时,修正立即写入,优先级高于既有结论。意思是这面镜子不是一次成型就冻结,而是跟着你的变化持续维护。

判断时先过 Persona——决定”怎么回话”;再由 Self Memory 补充——决定”回得是否真实”。两层各司其职,拆开了才好更新、才好回滚。

为什么需要

多数”数字化自己”的尝试会掉进两个坑:要么凭空捏造一个人格,要么把原始聊天记录一股脑堆进去而毫无结构。本包为避开这两者而存在。

痛点常见做法echo-me-skill
没有真实材料 → 人格全靠编让模型”猜”你的性格绝不臆造:只基于你提供的原材料或明说的事实
原材料泄漏进仓库聊天记录被提交进 git原材料只落到 gitignored 的 .claude/skills/{slug}/memories/
单一大块、难进化一个”关于我”的文件两层模型(Self Memory + Persona)+ Correction 层,增量进化
打包不可测试复制粘贴的 skill 文件夹skill-spec 契约 + 校验器 + pytest + ruff

为什么要一个数字自我——保存”此刻的你”:从你说过的话里学会你怎么说话、在意什么,并在你变化时持续维护这面镜子。

核心概念

  • Self Memory(自我记忆) —— 你知道什么、你是谁:经历、价值观、生活习惯、重要记忆、人际关系、成长轨迹。
  • Persona(人格) —— 你怎么回应:说话风格、情感模式、决策模式、人际行为——把标签翻译成具体行为规则。
  • Correction 层 —— 你的对话纠正立即写入,优先级高于既有结论。
  • 两层模型 —— 先判 Persona(怎么回话),再由 Self Memory 补充(回得是否真实)。

仓库结构

echo-me-skill/
├── AGENTS.md                 # 项目规则(继承工作区总纲)
├── CLAUDE.md                 # Claude Code 入口(回读父级规则)
├── LICENSE                   # MIT,含对 yourself-skill 的衍生声明
├── README.md                 # English
├── README.zh-CN.md           # 中文(本文件)
├── SKILL.md                  # 入口:frontmatter + 6 必需标题 + 硬约束
├── pyproject.toml            # uv / pytest / ruff 配置
├── .gitignore
├── agents/
│   └── openai.yaml           # 发现元数据(key 与目录名一致)
├── prompts/
│   ├── echo-me-skill.md      # 主执行规范(Step A–E、进化、管理)
│   └── self_analyzer / persona_analyzer / *_builder / merger / correction_handler / intake
├── evals/
│   ├── eval.yaml
│   └── cases/                # basic-success、edge-incomplete-input、edge-scope-boundary
├── scripts/
│   └── validate_skill_package.py   # 包结构校验
├── tools/                    # 解析器与管理器(可独立 CLI + 可导入)
│   ├── wechat_parser.py
│   ├── qq_parser.py
│   ├── social_parser.py
│   ├── photo_analyzer.py
│   ├── skill_writer.py
│   └── version_manager.py
├── references/
│   ├── package-contract.md
│   └── skill-up-integration.md
├── examples/
│   └── skill-package-tree.md
├── docs/
│   └── PRD.md
├── selves/                   # 中性示例自我(仅占位)
│   └── example_me/
└── tests/                    # pytest 单测

快速开始

环境要求:Python >=3.9,并安装 uv。

# 1. 安装依赖
uv sync --extra dev

# 2. 创建你的第一个自我(触发主流程)
#    按 SKILL.md / prompts/echo-me-skill.md 的 Step A–E 执行:
#    A) 信息录入  B) 原材料导入  C–E) 分析、预览、写盘
#    产出落在 ./.claude/skills/{slug}/,通过 /{slug} 触发词使用。

# 3. 校验包结构(本仓库自身不破坏契约)
python3 scripts/validate_skill_package.py .
# → PASS: echo-me-skill package contract

# 4. 跑测试与静态检查
uv run pytest -q       # → 24 passed
uv run ruff check tools tests scripts   # → All checks passed

功能与用法

创建

三步:信息录入(≤3 问)→ 原材料导入(可跳过)→ 分析、预览、写盘(通过解析器/管理器工具):

# 微信聊天记录                 QQ 聊天记录
python tools/wechat_parser.py --file chat.txt --target "我" --output /tmp/w.txt
python tools/qq_parser.py      --file chat.txt --target "我" --output /tmp/q.txt

# 照片元信息                    写盘创建自我
python tools/photo_analyzer.py --dir ./photos --output /tmp/p.txt
python tools/skill_writer.py --action create --slug {slug} \
  --base-dir ./.claude/skills --meta ./meta.json --self ./self.md --persona ./persona.md

创建后可通过 / 触发词使用:/{slug}(完整)、/{slug}-self(自我档案)、/{slug}-persona(仅人格)。

进化(增量追加)

  • 追加材料:先备份,读现有 self.md / persona.md,只合并增量(version_manager --action backup),绝不覆盖既有结论。
  • 对话纠正:你表示”这不对 / 我不会这样说”时,写入 Correction 层并立即重新 combine。

管理

命令动作
/list-echo列出全部自我
/echo-rollback {slug} {v}回滚到指定版本
/echo-rollback {slug}列出历史版本
/echo-delete {slug}`删除某个自我(需确认)

配置

项位置说明
项目元数据pyproject.tomlname、version、author、依赖
Skill 发现元数据agents/openai.yamlmetadata.key 必须与目录名一致
评测环境evals/eval.yaml静态结构评测(environment.type: none)
秘密/绝对路径扫描scripts/validate_skill_package.py由校验器完成

无运行时配置文件:Skill 按需读取用户意图与原材料;生成的自我落在 .claude/skills/{slug}/,由 skill_writer / version_manager 工具管理。

怎么跑起来

环境要 Python ≥3.9 和 uv:

uv sync --extra dev

创建自我的流程是 Step A–E:先录入基础信息(最多 3 问,代号必填)→ 导入原材料(可跳过)→ 分析 → 预览 → 写盘。示例命令:

# 微信/QQ 聊天记录解析
python tools/wechat_parser.py --file chat.txt --target "我" --output /tmp/w.txt
python tools/qq_parser.py      --file chat.txt --target "我" --output /tmp/q.txt

# 照片元信息 + 写盘创建
python tools/photo_analyzer.py --dir ./photos --output /tmp/p.txt
python tools/skill_writer.py --action create --slug {slug} --base-dir ./.claude/skills \
  --meta ./meta.json --self ./self.md --persona ./persona.md

产物落在 .claude/skills/{slug}/,用触发词使用:/{slug}(完整)、/{slug}-self(自我档案)、/{slug}-persona(仅人格)。追加材料只有增量合并,不覆盖已有结论;进化前先备份,随时能回滚、能删除。

现在到哪了

已经完成:独立品牌重写、skill-spec 契约 + 校验器 + pytest + ruff + uv、两层模型 + Correction、创建/进化/管理流程。仓库已经公开。

如果想要一个”被蒸馏那一刻的你”,可以从你自己的聊天记录、日记、照片里长出来。数据只留在你机器上,这句话我反复讲,是因为它是我重写这个项目的底线,不是宣传词。


项目地址:

数字自我 个人AI分身 Skill工程 开源 测试与验证 #skill #skill-create #蒸馏