本地知识库(Knowledge Base)
把 ~/Documents/KnowledgeBase/ 当作"资料级"知识库,复刻商业知识库三步模型:
放入资料 → AI 逐篇蒸馏成检索笔记 → 提问时先检索笔记再作答/汇总。
零向量库、零外部服务:目录 + sha256 增量状态 + Markdown 笔记 + BM25 + 标签索引。
布局
~/Documents/KnowledgeBase/ 源资料(用户随意建目录;只读,绝不修改)
.kb/notes/<源相对路径>.md 逐篇蒸馏笔记(镜像源目录)
.kb/state.json 增量状态(只经 kb.py 读写)
CLI:python3 ~/.hermes/skills/note-taking/knowledge-base/scripts/kb.py <子命令>
(KB_ROOT 环境变量可重定向库根目录。)
| 子命令 | 作用 |
|---|---|
scan |
增量扫描:新增/变更(重蒸馏)/删除(连笔记一起删) |
todo [--cap N] |
待蒸馏清单(按加入时间升序) |
notepath REL |
源文件对应笔记的绝对路径 |
mark REL done|failed|pending [--title T] [--reason R] |
标记蒸馏结果 |
search QUERY [--top N] |
BM25 检索:已蒸馏笔记优先,未蒸馏文本原文兜底 |
tags |
全库 标签/实体/主题 聚合索引(含旧笔记缺字段警告) |
notes [--tag T] [--entity E] [--topic P] |
按标签/实体/主题列笔记,按资料日期升序(汇总入口);失效/冲突笔记带 ⚠/⚡ 标记 |
conflicts |
冲突标注对 + 已失效笔记清单(汇总前必查) |
status |
总览(含失败清单与知识一致性计数) |
SOP-A:维护(入库/蒸馏,cron 与手动通用)
- 用户放入新资料后(或收到"维护知识库"指令):跑
scan。 todo --cap 5取一批(每轮 ≤5 篇,控制 Token;失败的排最前重试)。- 对每篇:
- 通读原文(
KB_ROOT/<rel>);非文本/损坏/超大读不动 →mark REL failed --reason "..." - 先检索既有笔记(
search关键词 /notes --tag):发现与已有笔记说法冲突 → 新旧笔记互相写conflicts_with;发现新资料明确推翻旧结论 → 按硬规则做失效传播(改旧笔记) - 跨层互引:若主题在其他 skill/agentmemory 有配套条目(SOP、服务细节),笔记「细节补充」写明互引;本库存放依据与检索笔记,不复制 SOP 全文
- 按"蒸馏笔记规范 v2"写笔记到
notepath REL给出的路径 mark REL done --title "<短标题>"
- 通读原文(
- 全部处理完再跑
scan(同步状态)和status,报告新增/蒸馏/失败数。
蒸馏笔记规范 v2(为"检索 + 汇总"双目标设计)
笔记必须既是"能被独立检索命中的浓缩体",又是"能跨笔记聚合成时间线/专题的结构化单元":
---
source: <源相对路径>
distilled_by: <你的agent名>
distilled_at: <YYYY-MM-DD>
type: 检索笔记
topic: <主题域,单值:投资/技术/会议/产品/研究/生活/其他>
source_type: <群聊|研报|会议|文档|网页|论文|随手记|报告>
date: <资料所述/发布日期 YYYY-MM-DD,未知用 scan 加入日期>
tags: [<3~8个检索词,必须含:主称、别称、英文名/代码/型号>]
entities: [<关键主体:公司/人物/产品,可空>]
superseded_by: <可选:被哪份资料(源路径)推翻后填写>
conflicts_with: [<可选:与本库哪些笔记说法冲突,写对方源路径,双向互写>]
---
# 蒸馏笔记:<短标题>
**一句话**:<全文最核心结论,一句话>
## 事实与观点
- [YYYY-MM-DD] 事实:<精确数字/命令/结论,数字绝不改写>
- [YYYY-MM-DD] 观点(<谁>):<观点内容,标注是谁说的>
- [YYYY-MM-DD] 传闻/未验证:<...>(可信度低,须注明)
- [YYYY-MM-DD] 已失效(<失效日期>, 被<资料>推翻):<原内容>(保留在案,现行结论勿引用)
## 问答锚点
- 问:<用户可能的原话提问>?→ <直接可用的答案>
- 问:…?→ …(3~6 条,覆盖原文主要问题域)
## 关键词
<逗号分隔,含同义词/别称/中英文/缩写——这是弥补关键词检索同义缺口的关键行>
## 细节补充
<数据、命令、步骤、引用来源;没有就写来源与日期>
硬规则:
tags必须写"别称桥":正文说 CoWoS,tags 就要有「先进封装」;正文说 NVDA,tags 要有「英伟达」。同义改写检索全靠它。- 事实与观点分条标注日期与发言人;数字、日期、型号逐字保留,禁止四舍五入或改写。
- 失效传播(吸收 Lemmalog 撤回级联思想,手工版):新资料明确推翻旧笔记结论时——
- 旧笔记 frontmatter 加
superseded_by: <新资料源路径>; - 旧笔记被推翻的事实条目改写为
已失效(<日期>, 被<新资料>推翻): 原内容,不删除(历史演变要可追溯); - 新笔记正常蒸馏,新旧各自成立。
- 旧笔记 frontmatter 加
- 冲突标注(吸收 Lemmalog 矛盾候选思想):双方说法不同但都未被推翻(如群聊 vs 研报的口径差异)→ 两篇笔记 frontmatter 互相写
conflicts_with: [对方源路径],并在各自细节补充保留文字说明。 - 原文更新后状态自动回 pending,须重蒸馏(笔记直接覆写,frontmatter 的 distilled_at 更新)。
- 大文件(>100KB):优先蒸馏可检索的结论与问答锚点,细节注明"详见原文"。
- 来源自包含:微信文章、群聊、网页等链接易失效/被删。Agent 自己整理研究落库时,关键数据、命令、结论必须直接写进源文档,URL 仅作溯源,保证链接失效后资料仍有完整价值。
非文本资料
- PDF/Word:先用 Hermes
read_file(自动提取文本层)拿到文本再蒸馏。 - 扫描件/图片/无文本层:
mark REL failed --reason "无文本层,需 OCR",并在报告里建议用 PaddleOCR 处理后重放。
SOP-B:检索(聊天时自动参考)
- 用户提问涉及库里资料时,先
search "<提问关键词>" --top 8。 - 读命中的笔记(必要时顺着
source回读原文片段),把命中片段作为依据作答,并注明来源路径。 - 检索无命中 ≠ 没有答案:换标签查
tags/notes;再无 → 提示用户可把相关资料放入库中。 status可随时报家底(几篇、蒸馏进度、失败清单)。
SOP-C:汇总("把我发的资料整理一下")
- 先跑
conflicts拉全库冲突对与失效清单;用notes --tag <X>(或--entity/--topic)按主题拉出全部相关笔记(按资料日期升序)。 - 逐篇读"事实与观点"条目,合成时间线或专题摘要:
- 每条标注日期与来源类型(群聊/研报/会议…),观点注明是谁说的;
- 被 superseded 的失效事实不再作为现行结论,但可进"历史演变"叙述并标注失效;现行结论只用未失效事实;
- 数字逐字保留;
conflicts_with命中的说法并列展示并标注冲突,不擅自裁决; - 传闻与已验证事实分开,不混写。
- 结尾列来源文件清单(
.kb/notes/...↔ 源路径)。 - 用户要落盘时,把汇总写入源库(如
汇总/<主题>_截至<日期>.md)——它本身也是一份新资料,scan 后可再蒸馏成"二级笔记"。
自动维护
夜间 cron 任务 knowledge-base-nightly(每天 03:30,deliver local 静默):
scan → 按 SOP-A 蒸馏一批(≤5 篇,自动采用本文件的最新规范)→ status 简报。手动维护与它遵循同一 SOP。
与 Hermes 知识分层的关系
- 本库 = 资料级知识(文档、调研、报告原文+笔记)。
- 结论性约定 → memory;流程 SOP → skill;项目细节 → agentmemory;会话历史 → session_search。
- 同一知识不要重复存放:定了结论就只留约定,原始依据留本库。
验证
改动 kb.py 或 SOP 后必须端到端跑一遍:scan → todo → 按 v2 蒸馏 1 篇 → mark done →
search 命中且排序第一 → notes --tag 能聚合 → tags 索引正确 → conflicts 能枚举
(含至少一条冲突或失效验证)。检索或聚合不命中即视为不合格。压力测试用例记录见 agentmemory(沙箱 KB_ROOT 重定向法)。