KM Pipeline 全流程文档 Knowledge Management · 知识图谱自动管理闭环

版本: v3 (2026-04-16) · 位置: ~/Desktop/skill-knowledge-base/ · git 仓库已就绪

目录
  1. 1. 系统概览
  2. 2. 核心组件
  3. 3. 数据流 · 三阶段管线
  4. 4. 模型选择依据(6 Agent 实测)
  5. 5. 关键参数
  6. 6. 三级退化链路
  7. 7. 已知问题与外部约束
  8. 8. 已修复的 3 个硬 Bug
  9. 9. 性能与成本
  10. 10. 运行方式
  11. 11. 后续优化方向

1. 系统概览

目标:把 Claude Code 的日常对话自动萃取成结构化知识,合并进 88 个 skill 的 *_knowledge.md,越用越聪明。

核心理念

架构图

┌─────────────────────────────────────────────────────────────────┐ │ Claude Code JSONL 日志 │ │ ~/.claude/projects/*/conversations/*.jsonl │ └────────────────────────────┬────────────────────────────────────┘ │ (增量切片,按 last_ts.txt) ▼ ┌────────────────┐ │ incremental │ │ .txt │ 大小 5K-500KB └────────┬───────┘ │ ▼ ┌───────────────────────────────────────────┐ │ S0 scripts/s0_filter.py (纯规则, 0 成本) │ │ · tool_use 参数精简 (-74%) │ │ · 代码块 >30 行截断 │ │ · 时间戳保留完整 (下游分批依赖) │ └────────────────────┬──────────────────────┘ │ 压缩 -25% ▼ ┌──────────────────────────────┐ │ 按 session 分批(MAX_BATCH=15K)│ │ 单 session 超 15K 按段落切子批 │ └──────────────┬───────────────┘ │ ▼ ┌──────────────────────────────────────────────┐ │ S1 语义过滤 (OpenRouter + system/user split) │ │ 主: anthropic/claude-haiku-4.5:nitro │ │ 兜底1: deepseek/deepseek-v3.2-exp:nitro │ │ 兜底2: claude -p sonnet (本地) │ └──────────────┬───────────────────────────────┘ │ 保留 10-30% 的技术段落 ▼ ┌──────────────────────────────────────────────┐ │ S2 结构化萃取 (Opus 4.6) │ │ 主: claude -p opus │ │ 兜底: anthropic/claude-opus-4-6 │ │ 输出: ADD/UPDATE/DELETE 条目(Pydantic 规范) │ └──────────────┬───────────────────────────────┘ │ ▼ ┌──────────────┐ │ changelog.md │ └──────┬───────┘ │ ▼ ┌──────────────────────────────────────┐ │ merge.sh (3 并发, 按 skill 分组) │ │ · 按 ALIAS 映射 + 文件存在性检查 │ │ · 不存在 → 自动转 NEW_SKILL 路径 │ │ · 合并 changelog 到 *_knowledge.md │ │ · 更新 GLOBAL_INDEX.md (全文覆写) │ └──────────────┬───────────────────────┘ │ ▼ ┌────────────────────┐ │ validate.sh │ → 54 PASS / 33 WARN / 4 FAIL └────────────────────┘ │ ▼ ┌────────────────────┐ │ git auto-commit │ └────────────────────┘

2. 核心组件

文件职责行数状态
scripts/run.sh一键入口:extract → merge → validate → commit~60稳定
scripts/extract.shS0+S1+S2 三阶段萃取,输出 changelog.md~430v3 优化
scripts/s0_filter.py规则过滤(tool/code/时间戳精简)~430新建
scripts/merge.sh按 skill 并发合并 + INDEX 写回 + git commit~240修3bug
scripts/validate.sh88 skill 的 knowledge.md 结构校验~150稳定
shared_schema.md17 实体 + 14 关系类型 + 决策树(S2/merge prompt 都引用)90稳定
GLOBAL_INDEX.md88 skill 的速查表(每次 merge 后重写)~400稳定
*_knowledge.md × 88每个 skill 的知识文件稳定
last_ts.txt增量游标(UTC ISO8601)1.gitignore 排除
changelog.mdS2 本轮产出暂存,merge 成功后清空动态通过 git 留痕

3. 数据流 · 三阶段管线

S0: 规则过滤 v3 新增

位置: scripts/s0_filter.py(extract.sh 调用)

成本: 0(纯 Python 规则)· 压缩率: 25-31%(对话型)/ 12% (纯讨论型)

压缩规则

  1. tool_use 参数精简(最大贡献,单行节省 65-74%)
    [tool:Read {"file_path": "/a/b/c.sh", "offset": 160, "limit": 20}]
      → [tool:Read c.sh:160-180]
    
    [tool:Grep {"pattern": "xxx", "path": "/long/path", "output_mode": "content"}]
      → [tool:Grep pattern='xxx' @path]
  2. 代码块截断:>30 行保留前 15 + 后 5,中间 ...(N 行略)...
  3. 时间戳保留完整血泪教训:早期精简成 [HH:MM:SS] 会破坏下游 session 分批 regex
  4. 未识别工具兜底: [tool:XXX keys=[a,b,c] 300B]

S1: 语义过滤 v3 重构

任务: 删除闲聊/元讨论,保留技术变更段落的完整原文(不做摘要)

prompt 结构: system(S1_SYSTEM 规则) + user(INDEX[:6000] + batch_text)

退化链路: 见 §6

prompt 要点(extract.sh S1_SYSTEM 常量)

规则:
1. 删除:闲聊、确认("好的""继续")、调试中间过程、重复描述
2. 保留:bug 发现/修复、配置变更、架构决策、新功能实现、踩坑记录
3. 保留原文!不要摘要、不要改写。加段落标注 --- [skill] [ADD/UPDATE] 标题 ---
4. 删除元讨论(知识库系统本身的讨论)
5. 保留时间戳 [2026-xx-xxTxx:xx:xx.xxxZ]
6. 不使用任何工具 · 直接输出纯文本

S2: 结构化萃取

任务: 读 S1 过滤结果 → 输出 ADD/UPDATE/DELETE 条目(参考 shared_schema.md

主模型: claude -p opus(本地)· 兜底: OpenRouter anthropic/claude-opus-4-6

规则: 同一变更只输出一条 · 必须含硬数据(端口/函数名/路径)· 不记录元讨论

changelog.md 条目格式

### 2026-04-16 skill-name ADD
- 变更描述(含硬数据)
- 源: session_xxx

### 2026-04-16 skill-name UPDATE
- 变更描述
- 源: session_xxx

merge.sh · 合并与索引

并发: MAX_PARALLEL=3(避免 claude -p 挤占)

  1. Step 1 分组: 把 changelog.md 按 skill 切分成 tmp/changelog_{skill}.txt,缺 knowledge.md 的走 tmp/newskill_{skill}.txt v3 修复 #1
  2. Step 2 合并: 每个 skill 并发跑 claude -p sonnet,将 changelog 合并到 knowledge.md(保留原结构)
  3. Step 3 NEW_SKILL 创建: 对新 skill 创建完整 knowledge.md(含 skill.md 元信息)
  4. Step 4 GLOBAL_INDEX 写回: prompt 要求输出完整新文件,shell 分 5 分支处理(NONE/合规 md/异常/登录/max turns) v3 修复 #3
  5. Step 5 清空 changelog + git commit: 只有 INDEX_UPDATED=1 才清空;异常时 changelog 保留 + .bak 备份

4. 模型选择依据(6 Agent 实测)

2026-04-16 并行起 6 个 subagent,在 3 个代表性 session(6K/27K/48K chars)上测 7 个 OpenRouter 模型。

模型914f3be2 (6K)b3493ded (27K)5baa4a1e (48K)保留率速度稳定评价
claude-haiku-4.5OK 10% / 5sOK 14% / 21s代理断10-14%最快2/3首选(删最干净)
deepseek-v3.2OK 23% / 20sOK 27% / 72sOK 38% / 227s23-38%3/3兜底(唯一全过)
claude-sonnet-4.5OK 26% / 9s26%1/3贵 8× 不推
gemini-2.5-flashOK 25% / 4sOK 61% / 31sOK 63% / 51s25→63%最快3/3大样本基本不删
minimax-m2.7OK 65% / 43sOK 55% / 91s55-65%2/3保留过多
qwen3-397bOK 14% / 97sOK 29% / 208s14-29%慢(thinking)2/3贵 + 93% reasoning
grok-4.20OK 23% / 3s23%1/3数据不足
关键决策:

5. 关键参数

参数位置理由
MAX_BATCH15000extract.sh Python实测 30K 仍被 Cloudflare RST,15K 是可靠安全区
call_openrouter_split retries2extract.sh L325RST 是硬拒绝不是抖动,重试 5 次浪费 77s
max_tokens16000call_openrouter_split大 session 过滤后仍可能 >8K tokens,避免 finish=length 截断
模型后缀:nitro两处OpenRouter 官方 feature,自动选最快 provider
MAX_PARALLEL3merge.sh避免 claude -p 挤占,平衡速度和成功率
增量阈值5000 Bextract.sh小于此值不触发 AI 萃取
S0 代码块阈值30 行s0_filter.py超过则保留前 15 + 后 5
shared_schemaINDEX[:6000]S1 prompt过长会影响 S1 过滤效率

6. 三级退化链路

S1 调用流程
  ├─ 主路径:    OpenRouter anthropic/claude-haiku-4.5:nitro  × retry=2
  │               ├─ 成功 → 进入 S2
  │               └─ 失败
  ├─ 兜底 1:    OpenRouter deepseek/deepseek-v3.2-exp:nitro × retry=2
  │               ├─ 成功 → 进入 S2
  │               └─ 失败
  └─ 兜底 2:    claude -p --model sonnet (本地)
                  └─ 成功 → 进入 S2(~100-200s/批)

S2 调用流程
  ├─ 主路径:    claude -p --model opus (本地)
  └─ 兜底:      OpenRouter anthropic/claude-opus-4-6
实测退化有效性(2026-04-16 15:00 端到端运行):

7. 已知问题与外部约束

7.1 OpenRouter / Cloudflare WAF 限制

现象: POST body > 30-100KB 概率性被断连(Empty reply from server / RemoteDisconnected

7.2 Message 结构敏感

把 prompt + 对话拼在单个 user message 里,OpenRouter WAF 命中 "超长 user message" 规则。拆成 system(prompt) + user(对话) 可绕过。

已抽出 call_openrouter_split(model, system_prompt, user_content, ...) 函数。

7.3 本地路由器 Clash fake-IP

路由器 192.168.31.1 跑 OpenWrt + Clash TUN 模式,openrouter.ai 被劫持解析到 198.18.13.4(TEST-NET-2 段)。TLS 握手 + 证书都 OK,但路由器代理对大 body 缓冲不够会断连。根本解: 路由器 Clash 加规则 openrouter.ai → DIRECT

7.4 claude -p SDK 慢

sonnet 直调 OpenRouter 9s 完成,同样请求经 claude -p 545s。瓶颈在 SDK / tool loop / stdin 处理,非模型本身。但 claude -p 是退化链路最后一环,慢但 100% 不走代理层。

7.5 minimax 输出在 reasoning 字段

推理模型 CoT bug: content=""reasoning 有内容。call_openrouter_split 已 fallback 到 reasoning。

8. 已修复的 3 个硬 Bug commit 125eb39

#问题根因修复
#1 km-pipeline skill 永久丢数据 merge.sh Step 2 [[ ! -f "$kg" ]] 跳过不存在的 {skill}_knowledge.md,changelog 里的条目被丢弃 判断提前到 Step 1 分组阶段,不存在自动走 tmp/newskill_{s}.txt 的 NEW_SKILL 创建路径
#3 GLOBAL_INDEX 不写回 Step 4 prompt 要求 AI 输出"需要改的行",AI 只生成建议文字不操作文件 prompt 改为输出完整新 GLOBAL_INDEX.md(或 NONE),shell 5 分支: 合规 md → .bak + 覆盖; NONE → 不动; 其他 → 保留 + WARN
#4 scripts/*.log 被 commit .gitignore 有规则但文件已 tracked git rm --cached 掉 extract.log/merge.log/last_ts.txt

未修复(判断不该修)

9. 性能与成本

9.1 一轮典型运行(2026-04-16 12:12 commit a81ae95)

阶段耗时产出
Extract (12 条知识 / 2 批)14m22schangelog 9442 B
Merge (3 skill)3m20saliyun / cpmiao-main / hivemux
INDEX 更新70sGLOBAL_INDEX.md
Validate5s79 PASS / 7 WARN / 4 FAIL
git commit<1s6 files, +141/-127
总计18m55scommit a81ae95

9.2 S0 压缩效果(3 样本实测)

样本原大小过滤后压缩率场景
session_914f3be26,5884,515-31%对话型
session_b3493ded27,49118,968-31%对话型
session_5baa4a1e48,00642,039-12%纯讨论
incremental.txt220,556166,295-25%混合

9.3 成本(单次 S1 过滤,估算)

模型48K 大 session月度估算(30 轮)
haiku-4.5:nitro~$0.005~$0.15
deepseek-v3.2:nitro~$0.009~$0.27
claude -p sonnetClaude Pro 包月0 增量
S2 opus包月0 增量

10. 运行方式

一键全流程

cd ~/Desktop/skill-knowledge-base
bash scripts/run.sh

# 等 run.log 出现 "===== 完成 (1135s, 12 条知识) ====="

独立步骤

# 只跑 extract
bash scripts/extract.sh

# 只跑 merge (MERGE_MODEL=sonnet 或 opus)
MERGE_MODEL=sonnet bash scripts/merge.sh

# 只跑 validate
bash scripts/validate.sh

重置状态(调试用)

# 清空日志和 changelog, 把 last_ts 回退 2 小时
> changelog.md
> scripts/extract.log
python3 -c "from datetime import datetime, timedelta, timezone
ts = datetime.now(timezone.utc) - timedelta(hours=2)
print(ts.strftime('%Y-%m-%dT%H:%M:%S.000Z'))" > last_ts.txt

观察

11. 后续优化方向

  1. 路由器 Clash 规则: 把 openrouter.ai / api.anthropic.com 加入 DIRECT,治本而非治标
  2. S0 tool 参数精简扩展: 当前覆盖 Read/Bash/Grep/Edit/Write/TaskCreate,可加更多工具
  3. S1 内容脱敏兜底: 敏感词(wx.config/sk-xxx/URL)触发 WAF 时做 placeholder 替换(仅异常路径)
  4. batch 并发: 目前 20 个 batch 串行跑,可并发 3 路让小 batch 填空档
  5. 增量游标粒度: 当前基于文件 mtime 的 last_ts,可改为 JSONL line cursor,更精确
  6. 知识图谱可视化: shared_schema 已定义 17 实体+14 关系,下游可构建查询 UI
  7. validate 自动修 WARN: 空章节类 WARN 可由 AI 自动补全(引用 skill.md)

附录:重要提交历史

commit时间内容
125eb392026-04-16 13:00修复一键流程 3 硬 bug(km-pipeline 丢数据 / INDEX 不写回 / log 进 git)
a81ae952026-04-16 12:12合并知识更新: aliyun, cpmiao-main, hivemux
14ad4c52026-04-16diff 服务换为 klaus (pip install klaus)
06a78622026-04-16一键流程就绪 (run.sh)
4f680652026-04-169 项 Schema 优化完成(shared_schema, validate.sh, ALIAS 映射等)
f7be0522026-04-16git 仓库初始化 (414 files, 64K lines)