vscode-templete/.claude/skills/auto-wiki-cn/references/ingest-protocol.md

274 lines
9.1 KiB
Markdown
Raw Permalink 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.

# Ingest 协议
> Ingest 不是追加文件,是编译——读旧、比新、改旧。
## 流程
```
1. 读取源文件
├─ 提取关键信息:实体、概念、数据、结论、时间
└─ 生成 source 摘要页sources/{date}-{slug}.md
2. 搜索已有 wiki
├─ 读 index.md 获取全部页面列表
├─ 识别与新信息相关的已有页面
└─ 读取这些页面的当前内容
3. 逐页比较新旧(核心步骤)——三种结果,必须选一个
├─ A) 强化:新信息与已有结论一致,提供额外佐证
│ → 在页面 sources 列表中加入新 source slug
│ → 如果 confidence 是 medium/low → 升为 high
│ → 正文不改或仅补充细节
│ → log: "reinforced: {page}"
├─ B) 更新:新信息明确推翻或修正已有结论(有更新数据/更权威来源)
│ → store.upsert_data() 写入新值(旧值自动进 history 表)
│ → 改写 Markdown 正文为新结论
│ → 更新 frontmatter 的 updated 日期和 sources 列表
│ → log: "updated: {page}, reason: {简述}"
└─ C) 冲突:新旧信息矛盾,但无法判断谁对(数据口径不同/来源同级)
→ 不改写,在页面中并列两种说法,标注各自来源
→ confidence → contested
→ log: "conflict: {page}, {说法A} vs {说法B}"
判定规则:新信息有更新日期或更权威来源 → B更新
两者同级、无法分优劣 → C冲突其余 → A强化
4. 结构化数据写入 data.db
├─ 数值数据 → store.upsert_data()(自动处理 history
├─ 关系 → store.add_relation()
└─ 页面元数据 → store.upsert_page()
5. 创建/更新 Markdown 页面
├─ 新实体/概念 → 按 wiki-format.md 创建页面frontmatter 只存元数据)
├─ 正文写叙事分析,引述数据结论但不重复具体数值
├─ 添加 wikilinks 到已有相关页面
└─ 在已有相关页面中也加上指向新页面的 wikilink
6. 更新 index.md
├─ 新页面加入对应分组
├─ 更新页面计数和 Last updated 日期
└─ 不修改已有条目的描述(除非页面标题变了)
7. 追加 log.md
├─ 记录本次 ingest 的所有操作
└─ 格式见 wiki-format.md
```
## 关键原则
**1. 改旧优先于建新**
搜索 wiki 后发现已有 `entities/alpha-corp.md`,新研报也提到该机构 → 更新已有页面,不要新建 `entities/alpha-corp-2.md`
**2. 不删除,只归档**
过时的结论不删除,移入 "## 历史" 段落。这样 wiki 保留了知识的演化痕迹。
```markdown
## 管理规模
截至 2025 年底,某机构管理规模达 XXX 亿元。(来源:[[2026-04-06-policy-doc]]
## 历史
- ~~管理规模约 XXX 亿元~~(来源:[[2024-12-annual-report]],已被更新数据替代)
```
**3. 冲突不调和**
两个来源说法矛盾时,不要编一个折中解释。并列呈现,标注来源,让用户或后续证据判断。
```markdown
## 市场份额
> ⚠️ contested — 两个来源数据不一致
- 据 [[2026-04-06-policy-doc]]:某机构市场份额约 15%
- 据 [[2025-annual-industry-report]]:某机构市场份额约 12%
差异可能来自统计口径不同(含/不含职业年金)。
```
**4. 一次 ingest 触及多个页面是正常的**
一篇研报可能涉及 5-10 个实体和概念。一次 ingest 更新 8 个页面是正常的。在 log 中完整记录。
**5. Source 页面是不可变的**
`sources/` 目录下的摘要页在创建后不再修改(除非发现摘要有错误)。它是原始材料的忠实记录。其他页面通过 `sources` frontmatter 字段引用它。
---
## Worked Example: 完整 Ingest 流程
> 以企业年金领域为例。实际执行时替换为用户的目标领域。
**场景**:用户 ingest 一篇政策文件到某领域 wiki。wiki 中已有相关实体页面。
### Step 1 — 读取源文件,生成 source 摘要页
新建 `sources/2026-04-06-hrss-policy.md`
```yaml
---
title: 人社部2025年度企业年金基金统计报告
type: source
created: 2026-04-06
updated: 2026-04-06
sources: []
confidence: high
source_type: 一手
source_origin: 人社部官网
source_date: 2025-12-31
---
```
正文写原文关键信息的忠实摘要。
### Step 2 — 搜索已有 wiki
读 index.md发现 `entities/alpha-corp.md` 与新文件相关。查询 data.db 中该页面的当前数据:
```python
store.query_data(page_slug="alpha-corp")
# → [{ field: "管理规模", value: 800, unit: "亿元", period: "2024-12", source_slug: "2024-12-annual-report" }]
```
### Step 3 — 比较新旧,判定结果
新文件说:"截至 2025 年底,某机构管理规模达 1200 亿元。"
判定新数据时点更新2025 vs 2024→ 选 **B) 更新**
Agent 执行两步操作:
**a) 结构化数据写入 data.db**(自动记录 history
```python
old = store.upsert_data("alpha-corp", "管理规模", 1200, "亿元", "2025-12", "2026-04-06-policy-doc")
# old = { value: 800, unit: "亿元", source_slug: "2024-12-annual-report" }
# → history 表自动写入旧值
store.add_relation("alpha-corp", "受托人市场格局", "part_of")
```
**b) 更新 Markdown 页面**frontmatter 只留元数据):
```yaml
---
title: Alpha Corp 养老金业务
type: entity
created: 2026-04-01
updated: 2026-04-06
sources: [2024-12-annual-report, 2026-04-06-policy-doc]
confidence: high
relations:
- target: 受托人市场格局
type: part_of
---
```
正文更新分析内容(引述数据结论,不写具体数值——数值在 data.db 中)。
### Step 4-7 — 新建页面、写 DB、更新 index、追加 log
新文件还提到"可携带企业年金"概念wiki 中不存在)→ 新建 `concepts/portable-annuity.md`
```yaml
---
title: 可携带企业年金
type: concept
created: 2026-04-06
updated: 2026-04-06
sources: [2026-04-06-hrss-policy]
confidence: medium # 仅单一来源首次提及
relations:
- target: 企业年金制度
type: part_of
---
```
log.md 追加:
```
## 2026-04-06 14:30 — ingest
- Source: 2026-04-06-policy-doc
- Updated: entities/alpha-corp (data.管理规模 800→1200亿)
- Created: concepts/portable-annuity
- Conflicts: none
```
---
## From-Lint 流程deep-dive 管道的 ingest 阶段)
当 ingest 由 deep-dive 管道触发时,输入不是用户提供的源文件,而是 lint Coverage 输出的缺口报告Gap Report
### 与标准 ingest 的区别
| 方面 | 标准 ingest | from-lint ingest |
|------|------------|------------------|
| 输入 | 用户提供的源文件 | Gap Report 中的缺口条目 |
| 来源获取 | 用户已提供 | Agent 通过搜索工具获取 |
| 批量操作 | 通常 1 个源文件 | 可能 N 个缺口,逐个处理 |
| 用户确认 | 不需要(用户已主动提供) | 需要(搜索前确认范围,搜索后确认质量) |
### 流程
```
输入Gap Report来自 lint Coverage
For each confirmed gap:
1. 制定搜索计划
├─ page_missing → 搜索该实体/概念的基本信息
├─ concept_missing → 搜索该术语的定义和解释
├─ data_missing → 搜索该指标的最新数据
├─ single_source → 搜索额外来源以交叉验证
└─ outdated → 搜索该指标/实体的最新信息
2. 执行搜索(需要搜索工具——主动模式)
├─ 使用 WebSearch / 搜索类 MCP 获取候选来源
├─ 搜索工具优先级:领域专业工具 > 通用搜索
├─ 按 source-validation.md 分级筛选
└─ 排除黑名单渠道,取 top 1-3 个可信来源
3. 展示搜索结果,请用户确认
├─ 展示每个来源的标题、URL、可信度分级
├─ 用户选择:接受 / 跳过 / 替换
└─ 搜索结果质量不够 → 标注"未能补全",跳过
4. 对确认的每个来源,执行标准 ingest 流程
├─ Step 1-7 与普通 ingest 完全一致
└─ source 摘要页额外记录 deep-dive 元数据(见 source-validation.md
```
### 防扩散机制
- 每个 gap 最多搜索 3 次换关键词。3 次搜不到可信来源 → 标注"未能补全"
- 单次 deep-dive 最多处理 10 个 gap可通过 `--max-gaps` 调整)
- 搜索到的来源如果引入了 wiki 中完全不存在的新实体,**不自动创建页面**——只填补已知缺口,不主动扩展 wiki 范围
- 所有搜索来源的 confidence 上限为 medium除非来源是一手/权威二手)
### 补全报告
```
## Deep-Dive 补全报告:{topic}
执行时间:{date}
### 已补全:{N} / {total} 个缺口
| # | Gap | Action | Source | Confidence |
|---|-----|--------|--------|------------|
| 1 | page_missing: portable-annuity | 新建页面 | [二手·权威] 财新报道 | medium |
| 2 | single_source: alpha-corp | 增加 1 个来源 | [二手] 行业研报 | medium |
### 未能补全:{M} 个缺口
| # | Gap | Reason |
|---|-----|--------|
| 3 | data_missing: beta-corp/市场份额 | 搜索 3 次未找到可信来源 |
### 建议
- beta-corp 市场份额数据建议用户手动提供行业报告
```