Files
MediaCrawler/mac-agent-os-main/90_archive/docs/AgentOS-知识管理系统说明文档.md
T
butubb 2112c1a870
Deploy VitePress site to Pages / build (push) Canceled after 0s
Deploy VitePress site to Pages / Deploy (push) Canceled after 0s
feat(monitor): 抖音 Web 接口客户端 —— 绕开爬虫子进程,直接发 HTTP
移植自 mac-agent-os 的 mediacrawler_adapter:不起子进程、不开页面,用浏览器里那份
登录态直接调抖音 Web 接口。产物键名照抄 store/douyin,所以 ingest 那条链路一个字不用改。

**目前能用的(真环境实测,非推断)**:

    profile/other : 200, 7075 字节  —— 博主主页指标(粉丝/获赞/作品数/昵称)
    aweme/detail  : 200, 45425 字节 —— 单条作品详情(含点赞/评论/收藏/分享)

**目前不能用的:作品列表 `aweme/post`。** 两个互相独立的原因:
  1. 这个接口被抖音单独升级成了真校验:不带 x-tt-argus 回 403「Uifid Not Found」,
     带上 dummy 值回 200 + **空 body**。也就是说「头在不在」骗得过,「真校验」过不了。
     同一套头打 profile/other 和 aweme/detail 都是通的 —— 抖音是挑着接口加保护的,
     挑中的恰好是「批量拉作品列表」这个最敏感的动作。
  2. 改走页面截获也不行:CDP 浏览器打开博主主页会落到「验证码中间页」(当天大量探测的
     代价,过几小时要重测)。

  所以现在的边界是:**已知作品的指标刷新能做,自动发现新作品做不了**。

**排查中控住变量后得到的两条事实**(都写进注释了):
  · `Accept` / `Accept-Language` / `Referer` 才是主页接口能返回真数据的原因 —— 只有
    UA+client hints+Cookie 时是 200 但仅 121 字节的空壳,补上这三个头变 7074 字节。
    (我先前猜的 sec-ch-ua 不是关键。)
  · 因此 UA 与 client hints 必须**成套地取自同一个浏览器**,所以 BrowserIdentity 一次
    从 CDP 取齐 cookie + UA + hints,而不是各自写死。

「200 + 空 body 必须当场报错」也是刻意写死的:放过去它会在下游变成「这个博主没作品」,
把一次失败伪装成一条正常结果 —— 爬虫那条路正是这么栽的,还被翻译成「账号被封」。

测试 +11:cookie 解析、请求头成套性(含 uifid 缺失/回退)、产物键名与 store 对齐、
以及 _get 的三条失败路径(空 body / 403 带网关原话 / 正常返回)。
2026-10-10 17:12:25 +08:00

722 lines
32 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# AgentOS 知识管理系统 —— 设计说明与操作指南
> **版本**:v1.0
> **最后更新**:2026-04-28
> **知识库路径**:`~/workbuddy-agent-os/agent-sync/03_knowledge/`(Obsidian Vault)
> **面向读者**:需要了解本系统设计思路、分类逻辑、目录结构、工作流程的协作者
---
## 一、系统定位与设计理念
### 1.1 这是什么?
AgentOS 知识管理系统是一套**自动化知识采集→分类→归档→检索**的完整解决方案。它不是一个简单的文件分类目录,而是一个具有以下特征的**智能知识加工流水线**:
| 特征 | 说明 |
|------|------|
| **自动采集** | 多平台信息源(B站/YouTube/小红书/抖音/RSS/网页)24h 自动抓取 |
| **智能分类** | 本地 LLM + 启发式规则自动判定知识的属性和领域 |
| **标准化归档** | 每条知识都有统一的 Frontmatter 元数据、唯一 ID、版本链 |
| **版本化管理** | 知识可进化(观点→事实、方法升级),旧版本自动保留 |
| **语义检索** | BM25 + 向量混合检索,用自然语言找到知识 |
| **双轨同步** | 坚果云实时同步 + Git 版本控制,跨设备安全可用 |
### 1.2 核心设计原则
1. **知识属性优先于内容类型**:不看"这是篇文章还是张图片",而看"这是事实、方法、还是观点"
2. **两级分类正交设计**:**nature(知识属性)** 决定"放在哪个层",**domain(领域)** 决定"属于哪个学科",两者互不干扰
3. **英文目录 + 中文映射**:目录名用英文(跨平台兼容、无乱码风险),通过配置文件提供中文别名
4. **收件箱缓冲机制**:新内容不直接归档,先进入收件箱缓冲,由定时任务统一提纯
5. **自动化优先**:每日凌晨自动完成:收集→汇聚→提纯→归档→更新统计,人工干预最少化
---
## 二、目录结构总览
```
03_knowledge/
├── 00_inbox/ # 📥 收件箱(缓冲区,所有新内容先进这里)
├── 01_daily/ # 📅 日记(每日记录、闪念笔记)
├── 10_concepts/ # 💡 概念层(原子概念、公理、知识卡片)
├── 20_methods/ # 🔧 方法层(教程、最佳实践、操作步骤)
├── 30_facts/ # 📋 事实层(客观事实、法规、数据)
├── 40_references/ # 📎 参考层(论文、文档、外部资料)
├── 50_resources/ # 🛠 资源层(视频笔记、阅读笔记、灵感素材等原始收集物)
├── 60_opinions/ # 💭 观点层(主观看法、引用、推测)
├── 90_archive/ # 🗄 归档层(已过时或废弃的知识)
├── 99_system/ # ⚙️ 系统层(模板、分类表、提示词——不是知识内容)
│ ├── templates/ # 知识卡片模板(4种)
│ ├── taxonomies/ # 分类配置(领域表 + 属性表 + 中文映射)
│ ├── prompts/ # LLM 分类提示词
│ └── timelines/ # 知识版本时间线图(自动生成)
├── README.md # 知识库首页(统计 + 导览)
└── CHANGELOG.md # 知识库变更日志
```
### 2.1 为什么这样分目录?
目录按**知识属性(nature)** 分层,每个数字前缀代表一个"知识层级":
| 目录 | 前缀 | 为什么设这个目录 | 里面放什么 |
|------|------|------------------|------------|
| `00_inbox` | 00 | **缓冲区**:新内容需要统一处理后才能精确分类,直接丢进来避免"不知道放哪"的决策负担 | 所有新采集/新收集的原始内容 |
| `01_daily` | 01 | **时间维度**:有些知识是"某天的记录",有强时间属性,不适合按属性分类 | 日记、闪念笔记、每日总结 |
| `10_concepts` | 10 | **知识原子**:概念是知识的"基本粒子",其他知识都建立在概念之上 | 概念定义、公理、术语解释 |
| `20_methods` | 30 | **怎么做的**:方法是"行动指南",与其他知识有本质区别——它是可执行的 | 教程、步骤、最佳实践、操作手册 |
| `30_facts` | 30 | **是什么**:事实是"世界的客观描述",可靠性最高 | 客观事实、法规制度、实验数据 |
| `40_references` | 40 | **别人说的**:参考资料不是你的知识,而是"外部信息的索引" | 论文链接、文档引用、网页存档 |
| `50_resources` | 50 | **原始素材**:这些是"未经加工的原材料",如视频笔记、截图、翻译等 | 视频笔记、阅读笔记、灵感素材、语音转写、字幕存档 |
| `60_opinions` | 60 | **我觉得**:观点不是事实,需要明确标注可信度,避免与事实混淆 | 个人见解、他人语录、未验证的推测 |
| `90_archive` | 90 | **过期的**:知识会过时(技术更新、事实变更),归档而非删除,保留历史可追溯 | 已被新知识替代的旧版本 |
| `99_system` | 99 | **系统本身**:模板和配置不属于知识内容,单独隔离 | 模板文件、分类配置、提示词 |
**关键洞察**:`50_resources/` 和 `99_system/` 虽然也在知识库目录下,但它们**不是知识内容本身**——resources 是原始素材(等待被提纯),system 是系统配置(不参与知识流转)。
---
## 三、知识属性分类(nature)
这是整个系统最核心的设计。每条知识都有一个 `nature` 字段,它决定了这条知识**存放在哪个目录**。
### 3.1 九种知识属性
| nature 值 | 中文名 | 一句话定义 | 目标目录 | 默认可信度 | 举例 |
|-----------|--------|------------|----------|-----------|------|
| `fact` | 事实 | 已验证的客观事实 | `30_facts/` | 1.0 | "Python 3.12 于 2023-10-2 发布" |
| `method` | 方法 | 可操作的步骤/教程 | `20_methods/` | 1.0 | "使用 Playwright 抓取 SPA 页面的 5 个步骤" |
| `concept` | 概念 | 原子概念、术语定义 | `10_concepts/` | 0.8 | "RAG:检索增强生成,是结合检索和生成的 AI 范式" |
| `axiom` | 公理 | 公认的基础原理 | `10_concepts/` | 1.0 | "欧几里得第五公设:过直线外一点有且仅有一条平行线" |
| `regulation` | 规章 | 法律/法规/制度 | `30_facts/` | 1.0 | "《个人信息保护法》2021年11月1日起施行" |
| `reference` | 参考 | 论文/文档/外部资料 | `40_references/` | 0.7 | "《Attention is All You Need》论文存档" |
| `data` | 数据 | 测试数据/基准结果 | `30_facts/` | 0.9 | "M1 Mac 运行 LLaMA-7B 推理速度:32 tokens/s" |
| `opinion` | 观点 | 主观看法/推测 | `60_opinions/` | 0.5 | "我认为 Agent 框架会比单体 LLM 更有前景" |
| `quote` | 引用 | 他人原话/语录 | `60_opinions/` | 0.6 | "Joel Spolsky: 'The best code is no code at all'" |
### 3.2 为什么分 9 种?
这是一个**粒度权衡**的结果:
- **太粗(比如只分"事实"和"非事实")**:`concept`(定义)和 `method`(步骤)混在一起,检索时无法区分"我想查某个概念"还是"我想找某个方法"
- **太细(比如分 20 种)**:分类成本太高,LLM 分类准确率下降,维护负担增加
- **9 种是平衡点**:覆盖了日常知识的所有主要类型,每种之间有清晰的判定边界
### 3.3 分类决策树
当 LLM 或人工需要判定一条内容属于哪个 nature 时,使用以下决策树:
```
这段内容是在描述"世界是什么样"还是在说"应该怎么做"?
│
├── "是什么" → 可能是 fact / opinion / quote / data / reference / axiom
│ │
│ ├── 有实验数据/论文支持?
│ │ ├─ 是 → fact(confidence: 0.8+)
│ │ └─ 否 ↓
│ │
│ ├── 是公认无需证明的原理?
│ │ ├─ 是 → axiom(confidence: 0.95+)
│ │ └─ 否 ↓
│ │
│ ├── 是作者的个人看法/推测?
│ │ ├─ 是 → opinion(confidence: 0.4-0.6)
│ │ └─ 否 ↓
│ │
│ ├── 是引用的他人原话?
│ │ ├─ 是 → quote(confidence: 标注来源可信度)
│ │ └─ 否 ↓
│ │
│ ├── 是外部资料的链接/存档?
│ │ ├─ 是 → reference(confidence: 0.7)
│ │ └─ 否 ↓
│ │
│ └── 是测试数据/基准结果?
│ ├─ 是 → data(confidence: 0.9)
│ └─ 否 → 默认 reference
│
└── "怎么做" → 可能是 method / regulation
│
├── 有法律/组织的强制力?
│ ├─ 是 → regulation(confidence: 1.0)
│ └─ 否 → method(confidence: 1.0)
```
### 3.4 属性变更规则
知识不是静态的,它的属性可能随着时间变化:
| 变化场景 | 处理方式 | 示例 |
|----------|----------|------|
| 观点被验证为事实 | `opinion` → `fact`,confidence 提升,文件移动到 `30_facts/` | "我推测 GPT-5 会在2025发布" → OpenAI 实际发布了 |
| 事实被推翻 | `fact` → `opinion`,confidence 降低,文件移动到 `60_opinions/` | "地球是平的" 被科学推翻 |
| 方法升级 | 保留旧版本文件,新建 v2 文件,通过 `related` 双向链接 | "部署方案 v1" → "部署方案 v2(Docker化)" |
| 知识过时 | 移动到 `90_archive/`,标记 `status: archived` | "Python 2.x 的字符串编码处理" |
> **注意**:所有属性变更都保留历史版本,不是直接覆盖。`previous_version` 和 `superseded_by` 字段构成版本链。
---
## 四、领域分类(domain)
领域分类解决的是"这条知识属于哪个学科/行业"的问题,与 nature 正交。
### 4.1 16 个一级领域
| 编号 | 英文目录名 | 中文名称 | 典型子领域 |
|------|-----------|----------|-----------|
| 01 | `cs` | 计算机科学 | 数据库、前端、后端、运维、安全 |
| 02 | `ai` | 人工智能 | NLP、CV、强化学习、RAG、Agent |
| 03 | `finance` | 金融 | 量化交易、价值投资、宏观经济 |
| 04 | `law` | 法律 | 民法、商法、知识产权 |
| 05 | `medicine` | 医学 | 中医、西医、营养学 |
| 06 | `physics` | 物理 | 量子力学、相对论、热力学 |
| 07 | `math` | 数学 | 线性代数、概率统计、微积分 |
| 08 | `psychology` | 心理学 | 认知心理学、社会心理学 |
| 09 | `philosophy` | 哲学 | 认识论、伦理学、美学 |
| 10 | `history` | 历史 | 中国史、世界史、科技史 |
| 11 | `engineering` | 工程 | 机械、电子、土木 |
| 12 | `design` | 设计 | UI/UX、平面设计、建筑设计 |
| 13 | `business` | 商业 | 创业、管理、营销、战略 |
| 14 | `personal-management` | 个人管理 | GTD、番茄工作法、精力管理 |
| 15 | `personal-insight` | 个人洞见 | 决策模型、价值观、反思 |
| 16 | `other` | 其他 | 暂未归类 |
### 4.2 领域 vs 属性:正交关系
一条知识的**最终存储位置**由两者共同决定:
```
物理路径 = 目标目录(由 nature 决定)+ 领域子目录(由 domain 决定)
```
**示例**:
| 知识标题 | nature | domain | 物理路径 |
|----------|--------|--------|----------|
| Transformer 架构解析 | concept | ai | `10_concepts/ai/transformer-架构解析.md` |
| macOS 终端快捷键 | method | cs | `20_methods/cs/macos-终端快捷键.md` |
| 2026年Q1 GDP 增速 5.4% | fact | finance | `30_facts/finance/2026q1-gdp.md` |
| 价值投资核心理念 | opinion | finance | `60_opinions/finance/价值投资核心理念.md` |
| GTD 工作流详解 | method | personal-management | `20_methods/personal-management/gdt-工作流.md` |
### 4.3 领域扩展规则
- 当 `other/` 类别下的文件数**超过总文件数的 5%** 时,系统会提示新增领域
- 新领域需同时定义:中文名称、英文目录名、说明、典型子领域
- 新增后需更新两个文件:`domains.md`(分类表)和 `folder-aliases.json`(中文映射)
---
## 五、知识卡片模板
每条归档的知识都是一个标准化的 Markdown 文件,使用对应的卡片模板。模板保证了知识的**结构一致性**,便于检索和版本管理。
### 5.1 为什么用 4 种模板而非 1 种?
不同属性的知识需要记录的信息完全不同:
| 属性 | 需要记录的关键信息 | 模板 |
|------|-------------------|------|
| 概念 | 定义、原理、与相关概念的区别 | `concept-card.md` |
| 方法 | 目标、前置条件、步骤、常见问题 | `method-card.md` |
| 事实 | 数据来源、事实内容表格、结论 | `fact-card.md` |
| 个人洞见 | 背景、核心观点、可复用原则、验证项 | `personal-insight-card.md` |
如果用一种"万能模板",要么字段太多(大量留空),要么字段太少(丢失关键信息)。
### 5.2 模板一:概念卡片(concept-card.md)
**适用**:`nature: concept` 和 `nature: axiom`
```yaml
---
id: KB-YYYYMMDD-NNN # 唯一标识符(自动生成)
title: "__概念名称__"
type: concept # 卡片类型
status: draft # 状态:draft/review/published/archived
nature: fact # 知识属性
domain: [计算机科学] # 领域(1-3个)
subdomain: [] # 子领域(可选)
tags: [__标签1__, __标签2__] # 检索标签
confidence: 0.8 # 可信度(0-1)
source: "" # 来源 URL
source_type: literature # 来源类型
date_created: __DATE__ # 创建日期
date_modified: __DATE__ # 最后修改日期
version: 1 # 版本号
aliases: [__别称__] # 别名(方便不同叫法都能找到)
keywords: [__关键词__] # 关键词(用于 BM25 检索)
summary: "__一句话摘要__" # 摘要(用于 L2 摘要层检索)
related: [] # 关联知识(双向链接)
previous_version: "" # 上一版本 KB-ID
superseded_by: "" # 被哪个版本替代
---
```
**正文结构**:
1. **一句话定义**:用最简洁的语言定义
2. **核心原理**:3-5 个要点
3. **与相关概念的区别**:对比表格(擅长/不擅长)
4. **主流选择/实现**:业界常见方案
5. **相关概念**:`[[双向链接]]`
**设计意图**:概念卡片的目标是"让读者 30 秒内理解一个概念"。一句话定义是核心,其余部分提供上下文。
### 5.3 模板二:方法卡片(method-card.md)
**适用**:`nature: method`
```yaml
---
id: KB-YYYYMMDD-NNN
title: "__方法/教程标题__"
type: method
status: published
nature: method
domain: [__领域__]
confidence: 1.0
source: "__来源__"
date_created: __DATE__
date_modified: __DATE__
version: 1
previous_version: ""
superseded_by: ""
---
```
**正文结构**:
1. **目标**:这个方法解决什么问题?
2. **前置条件**:需要什么才能执行
3. **步骤**:编号步骤 + 代码示例
4. **注意事项**:踩过的坑
5. **常见问题**:问题-原因-方案 三列表格
6. **历史版本**:变更记录
**设计意图**:方法卡片的目标是"让读者照着做就能成功"。步骤是核心,常见问题是防错保障。
### 5.4 模板三:事实卡片(fact-card.md)
**适用**:`nature: fact`、`nature: regulation`、`nature: data`
```yaml
---
id: KB-YYYYMMDD-NNN
title: "__事实标题__"
type: fact
status: published
nature: fact
domain: [__领域__]
confidence: 0.9
source: "__来源URL或出处__"
source_type: experiment|literature|official_doc|personal_exp
date_created: __DATE__
date_modified: __DATE__
version: 1
previous_version: ""
superseded_by: ""
---
```
**正文结构**:
1. **数据来源**:来源说明、测试环境、文献出处
2. **事实内容**:维度-值-备注 三列表格
3. **结论**:基于事实得出的结论
4. **历史版本**:变更记录
**设计意图**:事实卡片的目标是"可追溯、可验证"。`source` 和 `source_type` 是关键——没有来源的事实不可信。
### 5.5 模板四:个人洞见卡片(personal-insight-card.md)
**适用**:`nature: opinion`(特别是个人洞见类)
```yaml
---
id: KB-YYYYMMDD-NNN
title: "__个人洞见标题__"
type: concept
status: draft # 洞见默认 draft,需验证后才 published
nature: opinion
domain: [个人洞见]
tags: [__标签1__, __标签2__]
confidence: 0.6 # 洞见默认 0.6(不高不低)
source_type: personal_exp # 来源类型固定为个人经验
date_created: __DATE__
date_modified: __DATE__
version: 1
previous_version: ""
superseded_by: ""
---
```
**正文结构**:
1. **背景**:什么情境下产生的
2. **核心观点**:一句话概括
3. **详细思考**:推理过程
4. **可复用的原则**:抽象出来的通用规则
5. **相关经历**:案例支撑
6. **后续验证**:待验证项 checklist
**设计意图**:个人洞见是"最有价值但最不可靠"的知识类型。默认 `status: draft` 和 `confidence: 0.6`,通过"后续验证"机制逐步提升可信度。当验证通过后可升级为 `fact`。
---
## 六、Frontmatter 字段详解
所有知识卡片共享一套 Frontmatter 字段体系。以下是每个字段的含义和用途:
### 6.1 必填字段
| 字段 | 类型 | 说明 | 示例 |
|------|------|------|------|
| `id` | string | 唯一标识符,自动生成 | `KB-20260428-001` |
| `title` | string | 知识标题 | `"Transformer 架构详解"` |
| `type` | enum | 卡片类型(与模板对应) | `concept` / `method` / `fact` |
| `status` | enum | 生命周期状态 | `draft` / `review` / `published` / `archived` |
| `nature` | enum | 知识属性(9种) | `fact` / `method` / `concept` / ... |
| `domain` | list | 领域分类(1-3个) | `[人工智能, 计算机科学]` |
| `confidence` | float | 可信度(0-1) | `0.85` |
| `source` | string | 来源 URL 或出处 | `"https://arxiv.org/abs/1706.03762"` |
| `date_created` | date | 创建日期 | `2026-04-28` |
| `date_modified` | date | 最后修改日期 | `2026-04-28` |
| `version` | int | 版本号 | `1` |
### 6.2 可选字段
| 字段 | 类型 | 说明 | 示例 |
|------|------|------|------|
| `subdomain` | list | 子领域 | `[自然语言处理, 大模型]` |
| `tags` | list | 标签(用于检索) | `[transformer, attention, nlp]` |
| `author` | string | 作者 | `"Ashish Vaswani"` |
| `source_type` | enum | 来源类型 | `official_doc` / `literature` / `personal_exp` / `social_media` / `unknown` |
| `related` | list | 关联知识的 KB-ID | `["KB-20260425-003"]` |
| `previous_version` | string | 上一版本的 KB-ID | `KB-20260420-001` |
| `superseded_by` | string | 被哪个新版本替代 | `KB-20260428-002` |
| `aliases` | list | 别名/同义词 | `[Self-Attention, 自注意力机制]` |
| `keywords` | list | 关键词(BM25 检索用) | `[attention, self-attention, transformer]` |
| `summary` | string | 一句话摘要 | `"Transformer 是一种基于自注意力机制的序列建模架构"` |
### 6.3 可信度评分(confidence)
可信度不是"我信不信",而是**来源的客观可靠程度**:
| source_type | confidence | 说明 |
|-------------|-----------|------|
| `official_doc` | 0.9 | 官方文档、法律文本 |
| `literature` | 0.8 | 学术论文、经过同行评审 |
| `experiment` | 0.7 | 自己实验验证过 |
| `personal_exp` | 0.5 | 个人经验(可能有偏差) |
| `social_media` | 0.3 | 社交媒体(可靠性低) |
| `unknown` | 0.4 | 来源不明 |
**知识入库时的自动修正**:基础分 0.5,然后根据来源类型加减:
- 官方文档/学术论文:+0.3
- 知名技术博客/行业报告:+0.1
- 个人博客/论坛帖子:-0.1
- 未知来源/社交媒体:-0.3
---
## 七、知识生命周期
一条知识从"发现"到"归档"的完整生命周期:
```
┌──────────────────────────────────────────────────┐
│ 知识生命周期 │
└──────────────────────────────────────────────────┘
① 发现/采集 ② 汇聚 ③ 提纯/分类
┌───────────┐ ┌──────────┐ ┌───────────────┐
│ 多平台采集 │───原始──→│ 收件箱 │──标准──→│ 分类 + 模板化 │
│ B站/小红书 │ 内容 │ 00_inbox │ MD │ + ID 生成 │
│ RSS/网页 │ │ │ │ + 去重检查 │
└───────────┘ └──────────┘ └───────┬───────┘
│
┌─────────────────────────────────┤
│ │
▼ ▼
④ 归档入库 ⑤ 持续进化
┌──────────────┐ ┌──────────────────┐
│ 按nature分配 │ │ 属性变更 │
│ 到目标目录 │ │ opinion → fact │
│ + domain子目录│ │ method v1 → v2 │
│ + 更新统计 │ │ 过时 → archive │
└──────────────┘ └──────────────────┘
```
### 7.1 各阶段详情
#### 阶段①:自动采集
| 信息源 | 采集工具 | 保存位置 | 频率 |
|--------|----------|----------|------|
| B站/YouTube 订阅 | BiliNote | `50_resources/视频笔记/` | 每 30 分钟 |
| 小红书博主 | TikOmni | `50_resources/灵感素材/` | 每 2 小时 |
| 抖音账号 | TikOmni | `50_resources/灵感素材/` | 每 2 小时 |
| RSS 订阅源 | feedparser | `40_references/` | 每 15 分钟 |
| 指定网页 | Crawl4AI | `40_references/` | 每 1 小时 |
#### 阶段②:汇聚收件箱(collect_to_inbox 技能)
- **执行时间**:每日凌晨 2:30
- **做什么**:扫描 `50_resources/`、`20_methods/`、`40_references/`、`01_daily/` 等目录中的文件,提取主要内容生成标准化 MD,放入 `00_inbox/`
- **去重**:同名/同标题文件跳过,已标记 `collected: true` 的跳过
#### 阶段③:提纯分类(inbox_refine 技能)
- **执行时间**:每日凌晨 3:00
- **做什么**:
1. 读取 `00_inbox/` 所有文件
2. 用本地 LLM(oMLX + Qwen 模型)或启发式规则判定 nature + domain
3. 应用对应卡片模板
4. 生成唯一 ID(格式 `KB-YYYYMMDD-NNN`)
5. 去重检查(标题相似度 > 0.8 则合并)
6. 写入目标目录
7. 删除收件箱原文件
8. 更新首页统计和变更日志
#### 阶段④:归档入库
归档后的知识文件名格式:`{标题}.md`,存储在 `{nature对应目录}/{domain}/` 下。
#### 阶段⑤:持续进化
| 变化类型 | 触发条件 | 处理 |
|----------|----------|------|
| 属性变更 | 观点被验证/事实被推翻 | 更新 nature,移动文件,更新内链 |
| 版本升级 | 方法有更好的方案 | 保留旧版,新建 v2,双向链接 |
| 过期归档 | 180 天未更新的技术知识 | 标记 `archived`,移入 `90_archive/` |
| 知识修补 | 用户纠正 AI 输出 | 更新 confidence,记录修正日志 |
---
## 八、自动分类的实现机制
### 8.1 LLM 分类(主要方式)
使用本地 LLM(oMLX + Qwen2.5-VL-3B)调用以下提示词进行分类:
```
你是一个知识分类助手。请对以下内容进行分析,返回 JSON 格式。
输入:{{content}}
输出:
{
"domain": ["领域1", "领域2"], // 从16个领域中选择1-3个
"nature": "fact", // 从9种属性中选择
"confidence": 0.85, // 可信度评分
"tags": ["标签1", "标签2"], // 3-5个标签
"summary": "一句话摘要" // 60字以内
}
```
**降级机制**:当 LLM 不可用时,自动切换到基于关键词的启发式规则分类。
### 8.2 置信度阈值
- LLM 分类信心度 ≥ 0.4 → 采用 LLM 结果
- LLM 分类信心度 < 0.4 → 保留在 `00_inbox/`,标记 `#待分类`,等人工处理
### 8.3 去重策略
| 检测维度 | 阈值 | 处理 |
|----------|------|------|
| 标题完全一致 | 100% | 跳过,记录日志 |
| 标题相似度 | > 0.8 | 合并(补充细节到已有文件) |
| 内容完全一致 | 100% | 跳过 |
| 同一事实新旧矛盾 | — | 新事实覆盖,旧值写入 `previous_version` |
---
## 九、知识检索机制
### 9.1 检索分层
```
用户提问
↓
L1 关键词索引(BM25) ←── 快速粗筛
├─ 无匹配 → 返回"无相关记忆"
└─ 有匹配 ↓
L2 结构化摘要(SQLite facts.db) ←── 精确匹配
├─ 置信度 ≥ 0.7 → 返回摘要
└─ 置信度 < 0.7 → 截止,返回"无高置信结果"
↓
【不自动加载原文】
仅用户明确要求时 → L3 按行号加载原文片段
```
### 9.2 混合检索
- **BM25(关键词匹配)**:适合精确术语检索,如"RAG"、"transformer"
- **向量检索(ChromaDB + Qwen3-Embedding-0.6B)**:适合语义相似检索,如"怎么让 AI 记住之前说过的话"
- **RRF(倒数秩融合)**:将两路结果合并排序
### 9.3 检索不加载全文
这是关键设计——检索时只返回摘要和行号片段,不加载整个文件。原因:
1. **节省 token**:一个知识文件可能有几千字,但用户只需要其中的一个段落
2. **保护隐私**:L3 原文层不暴露给外部 API
3. **按需加载**:用户看到摘要后,觉得需要更多细节,再按行号加载指定片段
---
## 十、版本管理与时间线
### 10.1 三种变化类型
| 变化类型 | 举例 | 处理 |
|----------|------|------|
| **硬事实改变** | 服务器配置从 4C8G → 8C16G | 原地更新,旧值写入 `previous_version` |
| **软升级** | 方法 V1 → V2(V1 仍有参考价值) | 保留 V1 文件,新建 V2,通过 `related` 双向链接 |
| **观点→事实** | 推测经过验证变为可靠知识 | 更新 `nature`,提升 `confidence`,移动到对应目录 |
### 10.2 版本链
每条知识的 Frontmatter 中维护版本信息:
```yaml
version: 2
previous_version: KB-20260420-001 # 我是从哪个版本进化来的
superseded_by: "" # 我是否被新版本替代(空=当前有效)
```
当一条知识经过 **3 次以上重要更新**,系统自动在 `99_system/timelines/` 下生成 Mermaid 时间线图。
---
## 十一、中文映射机制
### 11.1 为什么用英文目录名?
- **跨平台兼容**:中文路径在 Windows/Git/NFS 等环境下容易出现编码问题
- **脚本友好**:Shell 脚本、Python 路径拼接不会因为中文出 bug
- **Git 友好**:避免提交时的文件名编码歧义
### 11.2 中文映射怎么工作?
`folder-aliases.json` 提供完整的目录中文映射:
```json
{
"knowledge": {
"00_inbox": "收件箱",
"10_concepts": "概念层",
"20_methods": "方法层",
"30_facts": "事实层",
...
},
"concepts_domains": {
"cs": "计算机科学",
"ai": "人工智能",
...
}
}
```
**使用场景**:
- LLM 分类时,输出中文领域名("人工智能"),系统查表得到英文目录名(`ai`),用于拼接物理路径
- 知识库首页展示时,读取映射表显示中文名称
- 日志和通知中显示中文名,方便阅读
---
## 十二、配置文件清单
知识管理系统的所有配置集中在 `99_system/` 目录下:
| 文件 | 路径 | 作用 |
|------|------|------|
| 领域分类表 | `99_system/taxonomies/domains.md` | 定义 16 个一级领域及其子领域 |
| 属性分类表 | `99_system/taxonomies/nature-types.md` | 定义 9 种 nature 类型 + 分类决策树 |
| 中文映射 | `99_system/taxonomies/folder-aliases.json` | 英文目录 ↔ 中文名映射(JSON) |
| 概念卡片模板 | `99_system/templates/concept-card.md` | 概念/公理知识模板 |
| 方法卡片模板 | `99_system/templates/method-card.md` | 方法/教程知识模板 |
| 事实卡片模板 | `99_system/templates/fact-card.md` | 事实/法规/数据知识模板 |
| 个人洞见模板 | `99_system/templates/personal-insight-card.md` | 个人见解/反思模板 |
| 分类提示词 | `99_system/prompts/classify-knowledge.md` | LLM 自动分类的 Prompt 模板 |
---
## 十三、自动化任务时间表
知识管理涉及的定时任务:
| 时间 | 任务 | 技能 | 说明 |
|------|------|------|------|
| 02:00 | 每日记忆提炼 | memory_manager | 提炼昨日对话为结构化记忆 |
| 02:30 | 收件箱汇聚 | collect_to_inbox | 扫描各目录 → 提取 → 放入 00_inbox |
| 03:00 | 收件箱提纯 | inbox_refine | 00_inbox → 分类 + 模板化 → 归档 |
| 23:00 | 采集日报汇总 | auto_collector | 汇总当日采集数据 |
---
## 十四、操作速查
### 14.1 手动操作命令
| 操作 | 说/触发词 | 系统行为 |
|------|-----------|----------|
| 入库知识 | "入库"、"保存知识" | 内容 → `00_inbox/` |
| 提纯收件箱 | "提纯"、"inbox refine" | `00_inbox/` → 分类归档 |
| 汇聚收件箱 | "归集"、"collect inbox" | 各目录 → `00_inbox/` |
| 知识检索 | "查知识库"、"知识检索" | L2 摘要检索 → 返回结果 |
| 重分类 | "知识重分类" | 更新 nature → 移动文件 |
| 备份知识库 | "知识备份" | 全量/增量备份 |
### 14.2 手动添加知识的步骤
1. 将内容保存到 `00_inbox/`(手动创建 .md 文件,或说"入库 xxx")
2. 系统会在下次提纯时(凌晨 3:00 或手动触发)自动分类
3. 分类后可在对应目录找到标准化知识卡片
### 14.3 直接归档(跳过收件箱)
对于已经有明确分类的知识,可以直接使用 `kb_manager` 的入库功能指定 nature 和 domain,跳过收件箱直接写入目标目录。
---
## 十五、知识库首页统计
知识库首页 `README.md` 自动维护统计信息:
```
| 英文目录 | 中文名称 | 文件数 | 最近更新 |
|----------|----------|--------|----------|
| 10_concepts | 概念层 | 1 | 2026-04-28 |
| 20_methods | 方法层 | 0 | — |
| 30_facts | 事实层 | 0 | — |
| ... | ... | ... | ... |
```
每次 inbox_refine 执行后自动刷新。
变更日志 `CHANGELOG.md` 记录每次归档操作:
```markdown
## 2026-04-28
### 归档
- [concept] 测试 LLM 分类器 → 10_concepts/ (KB-20260428-001)
```
---
## 十六、总结:知识管理系统的核心逻辑
```
┌─────────────────────────────────────────────────────────┐
│ 设计哲学 │
│ │
│ ① 知识是活的:可以进化、可以被修正、有过期时间 │
│ ② 分类是正交的:属性(nature)× 领域(domain) │
│ ③ 自动化优先:采集→汇聚→提纯→归档 全自动 │
│ ④ 可追溯性:每条知识都有来源、版本链、变更记录 │
│ ⑤ 可信度量化:不回避不确定性,用 confidence 评分表达 │
│ ⑥ 检索不加载:按需获取片段,节省 token │
└─────────────────────────────────────────────────────────┘
```
**一句话总结**:这是一个以 Obsidian Markdown 文件为基础、以 LLM 为分类引擎、以自动化任务为驱动、以版本化管理为保障的**全链路知识加工流水线**。