蒸馏人的技术文档
本文基于 colleague.skill
一、概念定义
1.1 什么是"蒸馏人"
蒸馏人 (Persona Distillation):通过自动采集一个人在工作/生活平台上留下的数字痕迹(聊天记录、文档、邮件、代码、多维表格…),用 LLM 提炼出 工作能力 (Work Skill) 与 人格特征 (Persona) 两份知识,最终生成一个可独立运行、可对话、可持续进化的 AI Skill(兼容 Claude Code / OpenClaw / AgentSkills 标准)。
1.2 与传统知识管理的区别
| 维度 | 传统文档 | 蒸馏人 |
|---|---|---|
| 形态 | 静态 markdown / wiki | 可对话的 AI Skill |
| 更新 | 人工维护,作者走了就死 | 增量追加 + 对话纠错 |
| 检索 | 关键词搜索 | 自然语言提问 |
| 复现 | 看完得自己理解 | 直接"问他怎么做" |
| 风格 | 千篇一律 | 保留口头禅与决策逻辑 |
1.3 设计目标
- 数字永生 (Cyber-Immortality):人走,知识不走。
- 源码级诚实:所有结论必须有原始数据支撑,禁止 AI 编造。
- 双模型解耦:工作能力与人格分离,可单独使用或组合。
- 持续进化:追加文件 / 对话纠错 都能 patch 已有 Skill。
- 零侵入安装:一个 git clone 即可。
二、整体架构
2.1 四层架构
┌────────────────────────────────────────────────┐
│ 输入层 (Input) │
│ 多源数据采集:飞书/钉钉/Slack/微信/邮件/PDF │
├────────────────────────────────────────────────┤
│ 分析层 (Analyze) │
│ work_analyzer.md + persona_analyzer.md │
│ 从原始数据提取工作能力与人格特征 │
├────────────────────────────────────────────────┤
│ 生成层 (Build) │
│ work_builder.md + persona_builder.md │
│ 按模板生成 work.md / persona.md │
├────────────────────────────────────────────────┤
│ 输出层 (Output) │
│ skill_writer.py + version_manager.py │
│ 写盘 + 版本控制 + 回滚 │
└────────────────────────────────────────────────┘1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2.2 目录结构
colleague-skill-main/
├── colleagues/ # 生成的 Skill 存放目录
│ ├── example_jiaxiu/ # 示例:嘉秀
│ │ ├── meta.json # 元数据(姓名、公司、职位、MBTI…)
│ │ ├── persona.md # 人格部分
│ │ ├── work.md # 工作能力部分
│ │ └── .versions/ # 版本历史
│ ├── example_tianyi/
│ └── example_zhangsan/
├── prompts/ # 核心 Prompt 模板
│ ├── intake.md # 基础信息录入(3 个问题)
│ ├── work_analyzer.md # 工作能力分析器
│ ├── work_builder.md # 工作能力生成器
│ ├── persona_analyzer.md # 人格分析器
│ ├── persona_builder.md # 人格生成器
│ ├── merger.md # 追加文件的合并处理器
│ └── correction_handler.md # 对话纠错处理器
├── tools/ # 数据采集工具集
│ ├── feishu_auto_collector.py # 飞书全自动采集 (889 行)
│ ├── feishu_browser.py # 飞书浏览器方案 (301 行)
│ ├── feishu_mcp_client.py # 飞书 MCP 客户端 (255 行)
│ ├── feishu_parser.py # 飞书 JSON 解析器 (216 行)
│ ├── dingtalk_auto_collector.py # 钉钉全自动采集 (571 行)
│ ├── slack_auto_collector.py # Slack 采集 (651 行)
│ ├── email_parser.py # 邮件 .eml/.mbox 解析 (301 行)
│ ├── skill_writer.py # Skill 写入工具 (306 行)
│ └── version_manager.py # 版本管理 (143 行)
├── docs/ # 多语言文档
└── wiki/ # 项目 Wiki1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2.3 双模型设计哲学
蒸馏的核心是 Work Skill + Persona 双文件:
| 维度 | Work Skill (work.md) | Persona (persona.md) |
|---|---|---|
| 职责 | 技术能力、工作方法、业务知识 | 性格、沟通风格、行为模式 |
| 内容 | 技术栈、代码规范、工作流程、经验知识库 | 口头禅、决策逻辑、拒绝话术、情绪反应 |
| 场景 | 写代码、写文档、Code Review、处理线上问题 | 对话交互、模拟真人回应 |
| 稳定性 | 会随新技术学习而更新 | 相对稳定,几年不变 |
优势:
- 职责分离:工作技能可频繁更新,性格部分稳定。
- 组合灵活:可只用 Work Skill 当技术顾问,也可组合运行成"数字分身"。
- 真实感:Persona 专门负责"像这个人说话",避免 AI 味。
三、数据采集流水线
3.1 数据源全景
| 数据源 | 方案 | 难点 | 工具脚本 |
|---|---|---|---|
| 飞书 | 开放平台 API(全自动) | 限流、权限 | feishu_auto_collector.py |
| 飞书(外部分享文档) | Playwright 浏览器 | 登录态 | feishu_browser.py |
| 飞书(企业内部) | MCP 客户端 | 需 Node.js | feishu_mcp_client.py |
| 钉钉文档/多维表 | 开放平台 API | API 不支持消息 | dingtalk_auto_collector.py |
| 钉钉消息 | Playwright 浏览器 | 必须人工登录 | dingtalk_auto_collector.py |
| Slack | Bot Token + Web API | 免费版仅 90 天 | slack_auto_collector.py |
| 微信 | 第三方导出 SQLite | 数据库加密 | WeChatMsg / 留痕 / PyWxDump |
| 邮件 | .eml / .mbox 解析 | MIME 编码 | email_parser.py |
| Word / PDF / 图片 | 直接拖入 | OCR | (复用 LLM 多模态) |
3.2 飞书自动采集(核心流程)
3.2.1 三层用户查找策略
飞书内同名人物可能很多,所以采用三层策略,依次降级:
python
# tools/feishu_auto_collector.py L336
def find_user(name: str, config: dict) -> Optional[dict]:
"""根据姓名查找飞书用户"""
# 策略 1:联系人 API(最准)
user = _find_user_by_contact(name, config)
if user:
return user
# 策略 2:部门 API 递归查找(覆盖面广)
user = _find_user_by_department(name, config)
if user:
return user
# 策略 3:多个匹配时让用户选择
users = ...
return _select_user(users, name)1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
3.2.2 消息采集流程
python
# tools/feishu_auto_collector.py L566
def collect_messages(user, chat_type, config) -> list[dict]:
# Step 1: 获取所有包含该用户的群聊
chats = get_chats_with_user(user['open_id'], config)
# Step 2: 逐个群聊拉取消息
all_messages = []
for chat in chats:
messages = fetch_messages_from_chat(
chat_id=chat['chat_id'],
target_user_id=user['open_id'],
config=config
)
all_messages.extend(messages)
# Step 3: 单聊额外拉取 P2P 消息
if chat_type == 'p2p':
p2p_messages = fetch_p2p_messages(
user_open_id=user['open_id'],
config=config
)
all_messages.extend(p2p_messages)
return all_messages1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
3.2.3 API 调用封装(鉴权 + 限流 + 重试)
python
# tools/feishu_auto_collector.py L153
def api_get(path, params, config, use_user_token=False) -> dict:
url = f"https://open.feishu.cn/open-apis/{path}"
token = get_user_token(config) if use_user_token else get_tenant_token(config)
headers = {'Authorization': f"Bearer {token}"}
# 自动重试(最多 3 次)
for attempt in range(3):
response = requests.get(url, params=params, headers=headers)
if response.status_code == 200:
data = response.json()
if data.get('code') == 0:
return data.get('data')
elif data.get('code') == 99991661: # 限流
time.sleep(2 ** attempt) # 指数退避
continue
break
raise Exception(f"API 请求失败:{path}")1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
关键飞书错误码:
99991661:API 限流(脚本自动指数退避重试)99991663:权限不足(需联系飞书管理员开通"消息读取""文档读取"权限)
3.3 钉钉采集(双方案)
钉钉 API 不支持拉取历史消息,因此采用 API + 浏览器混合方案。
3.3.1 API 方案:文档 + 多维表格
python
# tools/dingtalk_auto_collector.py L321
def collect_docs(user, doc_limit, config) -> str:
workspaces = list_workspaces(config) # 拉取所有工作空间
all_docs = []
for workspace in workspaces: # 按用户搜索文档
docs = search_docs_by_user(
user_id=user['userId'],
name=user['name'],
doc_limit=doc_limit,
config=config
)
all_docs.extend(docs)
doc_contents = []
for doc in all_docs: # 拉取文档正文
content = fetch_doc_content(
doc_id=doc['docId'],
space_id=doc['spaceId'],
config=config
)
doc_contents.append(content)
return "\n\n".join(doc_contents)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
3.3.2 浏览器方案:消息记录
python
# tools/dingtalk_auto_collector.py L496
def collect_messages_browser(chat_name, target_name,
chrome_profile=None, limit=500) -> str:
"""通过 Playwright 模拟登录钉钉网页版,爬取聊天记录"""
playwright = sync_playwright().start()
browser = playwright.chromium.launch_persistent_context(
user_data_dir=chrome_profile or get_default_chrome_profile(),
headless=False # 必须可见,因为要处理验证码
)
page = browser.pages[0]
page.goto("https://im.dingtalk.com/")
if not is_logged_in(page):
print("请手动登录钉钉...")
page.wait_for_selector(".conversation-list") # 等到登录成功
enter_chat(page, chat_name) # 进入指定群聊
messages = []
while len(messages) < limit: # 滚动加载历史
scroll_to_top(page)
new_messages = parse_messages(page)
messages.extend(new_messages)
if no_more_messages(page):
break
return format_messages(messages)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
3.4 Slack 采集
python
# tools/slack_auto_collector.py L651
def main():
config = load_config()
client = RateLimitedClient(config['token'])
user = find_user(args.name, client)
channels = get_channels_with_user(user['id'], client)
for channel in channels:
messages = fetch_messages_from_channel(
client=client,
channel_id=channel['id'],
user_id=user['id'],
limit=args.limit
)
save_messages(messages, output_file)1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
⚠️ Slack 免费版 API 仅能拉取最近 90 天 的消息。
3.5 微信聊天记录
微信无官方 API,依赖第三方工具:
| 工具 | 平台 | 说明 |
|---|---|---|
| WeChatMsg | Windows | 导出 SQLite |
| PyWxDump | Windows | 解密 + 导出 |
| 留痕 (Liuhen) | macOS | Mac 用户推荐 |
导出后用 feishu_parser.py 的解析器统一处理(格式兼容)。
3.6 邮件解析
支持 .eml(单封邮件)与 .mbox(邮件归档)两种格式:
python
# tools/email_parser.py L126
def parse_eml_file(file_path: str, target: str) -> list[dict]:
with open(file_path, 'r', encoding='utf-8') as f:
msg = email.message_from_file(f)
subject = decode_mime_str(msg.get('Subject', '')) # 解码 MIME
from_field = decode_mime_str(msg.get('From', ''))
body = extract_email_body(msg) # 优先 HTML,降级纯文本
if is_from_target(from_field, target):
return [{
'from': from_field,
'to': msg.get('To', ''),
'subject': subject,
'body': body,
'date': msg.get('Date', '')
}]
return []1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
四、Skill 生成引擎(Prompt 设计)
4.1 基础信息录入(intake.md)
只问 3 个问题,除姓名外都可跳过:
text
# Q1:花名/代号
这位同事怎么称呼?(花名、昵称或代号都行,多个字用 - 连接)
例:qing-yun
# Q2:基本信息
用一句话描述他的基本信息——公司、职级、职位、性别,想到什么写什么
例:字节 2-1 后端工程师 男
# Q3:性格画像
用一句话描述他的性格——MBTI、星座、个性特点、企业文化烙印、你对他的印象
例:INTJ 摩羯座 甩锅高手 字节范 CR 很严格但从来不解释原因1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
中文姓名转 slug
python
# tools/skill_writer.py L68
def slugify(name: str) -> str:
"""中文姓名转拼音 slug:青云 → qing-yun"""
from pypinyin import lazy_pinyin
if any('一' <= c <= '鿿' for c in name):
pinyin_list = lazy_pinyin(name)
return '-'.join(pinyin_list)
else:
return re.sub(r'\s+', '-', name).lower()1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
4.2 Work Skill 模板(work_builder.md)
定义 6 个核心 section:
markdown
# {name} — Work Skill
## 职责范围
你负责以下系统和业务:
{负责领域和系统列表}
## 技术规范
### 技术栈
{主要技术栈列表}
### 代码风格
{代码风格描述}
### Code Review 重点
你在 CR 时特别关注:
{CR 重点列表}
## 工作流程
### 接到需求时
{需求处理步骤}
### 处理线上问题时
{线上问题处理流程}
## 输出风格
{文档风格描述}
## 经验知识库
{知识结论列表,每条一行}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
实例片段(example_zhangsan/work.md)
markdown
## 技术规范
### 技术栈
- 后端:Python 3.9, FastAPI, SQLAlchemy
- 数据库:MySQL 8.0, Redis 6.0
- 消息队列:Kafka 3.0
- 部署:Docker, Kubernetes
### 代码风格
- 函数单一职责,超过 50 行必须拆分
- 所有公共函数必须有类型注解和 docstring
- 禁止在业务代码中直接写 SQL,必须用 ORM
### Code Review 重点
- 数据库查询必须有索引(explain 验证)
- 接口响应时间超过 200ms 需要加缓存
- 所有外部调用必须有超时和重试1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
经验知识库要求 具体可执行:
- ❌ "注重代码质量"
- ✅ "函数单一职责,超过 50 行必须拆分"
4.3 Persona 模板(persona_builder.md)— Layered Architecture
Persona 是项目最精巧的部分,采用 分层架构:
markdown
## Layer 0:核心性格(最高优先级,任何情况下不得违背)
{将个性标签翻译为具体行为规则}
示例:
- 遇到问题第一反应是找外部原因,绝不主动认错
- 开口前必先铺垫 context,说"先说一下背景"
- 评价任何方案都先问"impact 是什么"
## Layer 1:身份
你是 {name}。
在 {company} 任 {level} {role}。
MBTI {MBTI},{该 MBTI 的核心行为特征}。
## Layer 2:表达风格
### 口头禅与高频词
你的口头禅:{"先说一下背景"、"这个得看情况"、"我直说了"}
你的高频词:{"impact"、"owner"、"对齐"、"拉通"}
### 你会怎么说(直接给例子)
> 有人问你一个很基础的问题:
> 你:"这个你可能不太了解,我先说一下背景..."
> 有人催你进度:
> 你:"快了,还在测,晚点同步你"
> 有人提了一个你认为不对的方案:
> 你:"这个方案的 impact 是什么?有数据支持吗?"
## Layer 3:决策与判断
### 你的优先级
面对权衡时,你的排序是:稳定性 > 性能 > 开发效率
### 你如何说"不"
- "这对你是个很好的机会"(实际是转包)
- "这个得先跟老板对齐"(实际是拖延)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
核心思想:描述行为,而非性格标签
- ❌ "这个人很傲娇"
- ✅ "被质疑时会先沉默 3 秒,然后说'当时的情况是…'"
这样 LLM 在模仿时才有据可依,避免空洞。
4.4 分析器原则(work_analyzer.md / persona_analyzer.md)
源码级诚实
markdown
# 分析原则
1. 有源码/文档支持才能下结论
- 错误:"他可能熟悉 Python"(无依据)
- 正确:"他写了 23 个 Python 文件,熟悉 FastAPI 和 SQLAlchemy"(有文件统计)
2. 信息不足时留占位符
- "(暂无足够信息,建议追加相关文档)"
3. 不包装成专家
- 避免:"作为资深专家,他..."
- 使用:"根据他的文档,他倾向于..."1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
错误包容(信息不足不强行编造)
markdown
### 前端规范
(暂无足够信息,建议追加前端相关文档)
### 你会怎么说
> 有人问你一个很基础的问题:
> 你:(暂无足够对话样本,建议追加聊天记录)1
2
3
4
5
6
2
3
4
5
6
五、持续进化机制
5.1 版本管理(version_manager.py)
python
# tools/version_manager.py L25
def list_versions(skill_dir: Path) -> list:
"""列出某个 Skill 的所有版本(存于 .versions/ 子目录)"""
versions_dir = skill_dir / '.versions'
if not versions_dir.exists():
return []
versions = []
for version_file in sorted(versions_dir.glob('*.json')):
with open(version_file, 'r') as f:
version_data = json.load(f)
versions.append({
'version': version_data['version'],
'timestamp': version_data['timestamp'],
'changes': version_data.get('changes', [])
})
return versions1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
版本目录结构
colleagues/qing-yun/
├── SKILL.md
├── work.md
├── persona.md
└── .versions/
├── v1.0.0.json # 版本元数据
├── v1.0.0_work.md
├── v1.0.0_persona.md
├── v1.1.0.json
└── ...1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
一键回滚
python
# tools/version_manager.py L56
def rollback(skill_dir: Path, target_version: str) -> bool:
versions_dir = skill_dir / '.versions'
version_file = versions_dir / f"{target_version}.json"
if not version_file.exists():
return False
shutil.copy(versions_dir / f"{target_version}_work.md",
skill_dir / "work.md")
shutil.copy(versions_dir / f"{target_version}_persona.md",
skill_dir / "persona.md")
return True1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
5.2 增量更新
方式 1:追加文件(merger.md)
markdown
# 合并规则
1. Work Skill 更新
- 新文档 → 补充到"经验知识库"
- 新技术栈 → 更新"技术栈"列表
- 冲突处理 → 保留新旧两份,标注时间戳
2. Persona 更新
- 新对话样本 → 补充"你会怎么说"示例
- 性格修正 → patch Layer 0,不覆盖原文
- 冲突处理 → 以最新为准,旧版本存档1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
方式 2:对话纠错(correction_handler.md)
markdown
# 纠错处理流程
1. 识别纠错类型
- 事实错误 → "他不是字节,是阿里"
- 性格错误 → "他不会这么说,他应该..."
- 能力错误 → "他不会 React,只写后端"
2. Patch 对应层
- 事实错误 → 更新 meta.json
- 性格错误 → patch persona.md Layer 0/2
- 能力错误 → patch work.md 技术规范
3. 生成确认
- 展示修改前后对比
- 用户确认后写入1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
六、安装与部署
6.1 安装方式
方式 1:Claude Code(推荐)
bash
# ⚠️ 必须在 git 仓库根目录执行
cd $(git rev-parse --show-toplevel)
# 安装到当前项目
mkdir -p .claude/skills
git clone https://github.com/titanwings/colleague-skill .claude/skills/create-colleague
# 或安装到全局(所有项目都能用)
git clone https://github.com/titanwings/colleague-skill ~/.claude/skills/create-colleague1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
然后在 Claude Code 中输入 /create-colleague 启动。
方式 2:OpenClaw
bash
git clone https://github.com/titanwings/colleague-skill ~/.openclaw/workspace/skills/create-colleague1
重启 OpenClaw session,输入 /create-colleague 启动。
6.2 依赖安装
bash
# 基础依赖(必装)
pip3 install pypinyin # 中文姓名转拼音
# 飞书浏览器方案
pip3 install playwright
playwright install chromium # 仅需 chromium
# 飞书 MCP 方案
npm install -g feishu-mcp # 需要 Node.js 16+
# 其他格式支持(可选)
pip3 install python-docx # Word .docx
pip3 install openpyxl # Excel .xlsx
pip3 install slack-sdk # Slack1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
6.3 初始化配置
bash
# 飞书自动采集
python3 tools/feishu_auto_collector.py --setup
# 输入飞书开放平台的 App ID 和 App Secret
# 钉钉自动采集
python3 tools/dingtalk_auto_collector.py --setup
# 首次运行加 --show-browser 完成登录
python3 tools/dingtalk_auto_collector.py --setup --show-browser
# 飞书浏览器方案(首次使用)
python3 tools/feishu_browser.py \
--url "https://xxx.feishu.cn/wiki/xxx" \
--show-browser
# Slack
python3 tools/slack_auto_collector.py --setup
# 输入 Bot User OAuth Token(xoxb-...)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
七、典型使用场景
场景 1:同事离职交接
text
1. 运行 /create-colleague
2. 输入同事信息(姓名、职位、性格)
3. 选择"飞书自动采集",输入同事姓名
4. 等待采集完成(消息 + 文档 + 多维表格)
5. 预览生成的 Skill,确认或微调
6. Skill 保存到 colleagues/{slug}/
7. 后续有新文档可以追加1
2
3
4
5
6
7
2
3
4
5
6
7
场景 2:团队成员工作备份
text
1. 为每个核心成员创建 Skill
2. 定期(每季度)追加新文档
3. 形成团队知识库
4. 新人入职可快速查询"如果是 XX 会怎么处理"1
2
3
4
2
3
4
场景 3:超越同事——蒸馏任何人
| 命令 | 适用对象 |
|---|---|
/create-colleague | 同事 / 导师 / 实习生 |
/create-ex | 前任 / 老朋友 / 失去联系的人 |
/create-icon | 名人 / 历史人物 |
/create-self | 留个数字分身 |
八、避坑指南
8.1 飞书 API 权限
| 错误码 | 原因 | 解决 |
|---|---|---|
99991661 | API 限流 | 脚本自动指数退避;或手动降低频率 |
99991663 | 权限不足 | 联系飞书管理员开通"消息读取"+"文档读取" |
8.2 钉钉消息采集失败
- 原因:钉钉 API 不支持历史消息。
- 方案:用 Playwright 浏览器方案,或手动截图 → 上传图片(项目支持图片识别)。
8.3 微信导出不稳定
- 微信数据库加密,第三方工具兼容性参差。
- Windows 用
WeChatMsg,macOS 用留痕,导出后先手动检查格式再导入。
8.4 Persona 生成有"AI 味"
| 症状 | 原因 | 对策 |
|---|---|---|
| 像机器人在说话 | 正式文档多、聊天样本少 | 多提供群聊(尤其非正式) |
| 性格描述空洞 | "性格画像"写得太通用 | 多写主观印象 + 真实金句 |
| 缺少口头禅 | 没有对话原料 | 生成后手动补充"你会怎么说" |
8.5 性能优化
- 限制采集时间范围(如只采最近 6 个月)。
- 限制文档数量(
doc_limit参数)。 - 分批采集:核心群聊 → 补充群聊。
九、技术亮点
| 亮点 | 说明 |
|---|---|
| 源码级诚实 | 所有结论必须有原始数据,否则留占位符 |
| 模块化设计 | 9 个独立工具脚本,可单独测试调试 |
| 双模型解耦 | Work + Persona 分离,更新互不干扰 |
| 错误包容 | 信息不足时留占位符,不强行编造 |
| 版本管理 | 内置版本控制与一键回滚 |
| 持续进化 | 追加文件 + 对话纠错双通道 |
| 社区生态 | 上线 2 周 13000+ stars,Gallery 99+ skills |
十、路线图
Phase 1:社区建设
- GitHub Discussions、CONTRIBUTING.md、good-first-issue 标签
- v1.0.0 正式 Release
Phase 2:dot-skill(超越同事)
/create-skill通用入口- 数据源扩展:企业微信、iMessage 自动读取
- Gallery 分类升级(同事/名人/关系/角色/自己/元技能)
Phase 3:技能生态系统
- 多技能协作:
/meeting @zhangsan @lisi @wangwu,三个 persona 同时讨论 - 关系图:定义 persona 之间的合作 / 矛盾动态
- 一键安装:像浏览器插件一样安装社区技能
- 主动进化:定期吸收新数据源,自动保持更新