# 认知图：入库与查询流水线

把认知图作为长期可推理的知识层，对接 LLM 完成入库与查询。两端结构对称——入库把自然语言压成节点 + 关系，查询把 query 压成关键节点集再回到节点 + 关系。

* **依赖**：unit / 节点 / 关系定义见 [认知图：以谓词作为概念](认知图：以谓词作为概念.md)；文本到 unit 图的构建过程见 [文本到认知图：图构建方法](文本到认知图：图构建方法.md)。本文档只规定向量化、查询路径与 LLM 节流策略。

* **与 [认知图 §六](认知图：以谓词作为概念.md) 查询的关系**：原 §六 描述"查询是纯图遍历、无在线 LLM"的极简路径；本文档允许 LLM 在线参与，并补缓存 / 明面关系优先等节流策略——是更完整的查询规范，覆盖原 §六。

***

## 一、核心思路

四条贯穿入库与查询的特性：

**对称性** —— 入库把输入 → unit 节点集 + 关系；查询把 query → 关键节点集 → 在图里展开。两端走同一套 LLM 抽取规则，向量化基于同一组节点，不在两侧各自再造一种表示。

**多层检索** —— 三层互补：向量做模糊入口（query 节点 → 库内候选节点）；定向遍历做精确扩展（沿明确关系收集相关 unit）；扩散查询做联想广度（沿全部关系按权重传播激活，模拟人脑联想记忆）。向量给入口，图给结构，扩散给广度。

**LLM 节流** —— 明面关系（图上可直接遍历的边、family 闭包、`同义` / `属于` / `的`）能解的不调 LLM；只有需要在多个候选间权衡、合成回答时才介入。重复决策走缓存。

**迭代终止** —— 查询是迭代过程：图扩展（定向 + 扩散）→ LLM 下钻判够 → 不够则触发新一轮扩展。下钻与扩散可来回多次。LLM 每一层判"够不够"，够了就总结返回。

***

## 二、入库流水线

```
原文 → LLM 抽取 → unit 集 + 图拓扑 → 节点向量化 → 持久化
```

### 1. LLM 抽取

按 [文本到认知图 §三](文本到认知图：图构建方法.md) 把原文压成 unit 集 + 入口节点 + 关系。允许两种激进度，按文体选：

* **摘要驱动**（论文 / 综述 / 技术文档）：剥叙述外壳、合并冗余事实，留事实骨架。
* **细节保留**（访谈 / 评论 / 用户输入）：保留量化 / 程度 / 置信度修饰行，叙述细节进 `()[模态]` / `()[置信度]` 等修饰位。

两者公共要求：**不存储原文形态的句子镜像**——即便细节保留模式也走 unit 结构，不退化为带索引的全文。

### 2. 节点向量化

对每个入口节点 `{X}` 计算嵌入向量，按节点 ID 索引。

* 派生 node `{MB}` 单独嵌入（不是 M 与 B 嵌入的拼接），它的语义在派生整体上。
* 谓词实例 `[P]` 不嵌入——语义由 family 基础成员承载，归一化后走 family 闭包匹配。
* `(X)` 不嵌入——不可查询节点不是检索入口。

### 3. 关系持久化

unit 集 ground truth 是 unit 文本（[认知图 §五](认知图：以谓词作为概念.md)）；反向索引（`subject_mentions` / `context_mentions` / `narrowed_by`）随入库自动更新。

向量层是反向索引的补充——不取代 `subject_mentions` 等符号索引，而是给"语义近似但字面不同"的 query 节点提供入口。

***

## 三、查询流水线

```
query → LLM 抽关键节点 → 向量比对 → 候选节点集
                                       ↓
                            ┌────────────────────┐
                            │ 图扩展 (无 LLM)     │
                            │   ├ 定向遍历       │
                            │   └ 扩散查询       │
                            └─────────┬──────────┘
                                      ↓
                            ┌────────────────────┐
                            │ LLM 分层下钻        │
                            │ 挑选 / 判够 / 选下跳│
                            └─────┬──────────┬───┘
                                  ↓够        ↓不够 / 漂移
                              总结返回    新种子 → 回图扩展
```

### 1. 关键节点抽取

把 query 当成一段输入，走与入库**同一套** LLM 抽取流程（[文本到认知图 §三 步骤 1–3](文本到认知图：图构建方法.md)），产出 query 节点集 + 关键谓词。

目标不是完整 unit 图——只取**能作为检索入口**的节点（即 `{X}`，不含 `(X)`）。

### 2. 向量比对

每个 query 节点对库内入口节点向量做 top-k 近邻 → **候选节点集**。

* 阈值过滤：余弦相似度低于阈值的候选丢弃，避免拉入语义不相关的节点。
* 谓词作为方向偏置：query 中归并到 family 基础成员的谓词，用于后续遍历的方向选择（不在向量层硬过滤）。

### 3. 图扩展（不调 LLM）

候选节点为种子，两种互补路径，按 query 类型选择或并用——明面关系直接消费，是 LLM 节流的主战场。

#### 3.1 定向遍历

适用于 query 谓词明确（"X 的因果链"、"谁认为 Y"），沿特定关系走精确路径：

* 沿 `subject_mentions` 取以候选为主体的 unit。
* 沿 `context_mentions` 取以候选为论元 / 修饰行值的 unit。
* 沿 `属于` 闭包传递（上位类断言下沉到子类）。
* 沿 `同义` 合并 ≡ 索引下的等价节点。
* 沿 `被取代` 链取末端（跳过被取代的旧 unit）。
* 沿 `narrowed_by` 取派生 node（基础 node 不继承派生 node 的具体断言）。

#### 3.2 扩散查询

适用于 query 意图模糊 / 需要广联想（综述类、对比类、"这个概念让你想到什么"），或定向遍历命中太少时作为补充。

从种子节点出发，沿全部关系按权重逐跳传播激活——**模拟人脑联想记忆**：cue 激活相关概念，相关概念再激活下一层，逐层衰减。

参数：

| 参数 | 含义 | 典型取值 |
| - | - | - |
| 初始能量 E₀ | 种子节点起始激活值，可按向量相似度加权 | 1.0 |
| 传导系数 τ(edge_type) | 边的"易联想度"——强关联边传更多能量 | `同义` ≈ 0.9 / `属于` ≈ 0.7 / `的` ≈ 0.5 / 内容 family ≈ 0.3 / `相关于` ≈ 0.2 |
| 衰减阈值 ε | 能量低于 ε 的节点不再向外传 | 0.05 |
| 最大跳数 K | 兜底，防发散 | 3–5 |

输出每个被激活节点的累积能量值，作为"联想强度"排名。能量值是排序权重，**不代表事实可信度**——事实由 unit 本身承载。

### 4. 分层下钻（LLM 介入）

扩展到的 unit 集合给 LLM，它做三件事：

* **挑选相关** —— 剔除虽连接但与 query 无关的 unit（如沿 `属于` 拉来的不相关上位事实，或扩散激活拉来的语义远点）。
* **判断够不够** —— 已收集 unit 是否足以回答 query。
* **决定下一跳** —— 不够则指明从哪些节点继续扩展，并指定走哪种扩展方式（定向遍历不够 → 触发扩散；扩散噪声多 → 切回定向）；若判定 query 真正关心的不是初始命中节点，触发方向漂移 → 重新走 §三.1 抽关键节点。

下钻与扩散**可来回多次**：下钻指出新种子 → 回到 §三.3（定向或扩散）→ 拿新结果再下钻。

两条收敛条件，任一成立即停止迭代：

1. **信息覆盖度** —— query 节点全部被命中节点 / 扩展节点覆盖；关键谓词在某条 unit 上落地。
2. **边际收益消失** —— 上一轮扩展带来的新 unit 中没有再回答 query 的内容。

兜底上限：最大下钻轮数 / 最大命中 unit 数。超过即停（防止开放式 query 不收敛）。

### 5. 总结返回

LLM 判 "信息足够" 后，基于命中 unit 集生成回答。**回答的事实基础限定在命中 unit 集**——不允许 LLM 用参数化知识补未在图里的事实，否则破坏图作为 ground truth 的地位。

***

## 四、LLM 节流

查询流水线的 LLM 调用集中在 §三.1（query → 关键节点）、§三.4（分层下钻）、§三.5（总结）。两条策略压缩调用量：

### 1. 走明面关系

能在符号图上直接遍历得到的事实，不让 LLM 复述：

| 任务 | 走明面关系 | 调 LLM 的场景 |
| - | - | - |
| 找以 X 为主体的所有事实 | `subject_mentions[X]` | / |
| 找 X 的派生 node | `narrowed_by[X]` | / |
| 找因果链下游 | 谓词 ∈ 导致 family，沿 (因→果) 主体遍历 | / |
| 联想相关节点（模糊 / 综述 query） | 扩散查询（§三.3.2） | 联想结果中筛掉远端噪声 |
| 合并语义近似的 query 节点 | `同义` 闭包 + ≡ 索引 | 向量空间命中但库内无 `同义` 主 unit 时，LLM 判 ≡ / ↔ |
| 取最新事实 | 沿 `被取代` ⇒ 链取末端 | / |
| 跨多 unit 综合回答 | / | 综合本身需要 LLM |
| query 节点对应库内哪个具体节点 | 向量 top-k | 多个候选难选时升级到 LLM 二选 |

### 2. 缓存

三层都可缓存，按缓存键复用：

* **query 节点抽取缓存** —— key = query 文本（normalize 后），value = 关键节点集 + 谓词。
* **向量近邻缓存** —— key = query 节点 ID，value = top-k 候选。
* **扩散结果缓存** —— key = (种子节点集, 参数集 τ/ε/K)，value = 激活节点列表 + 能量值。
* **分层下钻决策缓存** —— key = (已命中 unit 集签名, 当前 query)，value = 下一跳种子 / 停止信号。

缓存的代价是新事实入库 → 已缓存的"信息足够"判断可能过时。入库时按节点维护**失效集**——某节点入新 unit → 含该节点的缓存条目失效。

***

## 五、不变量

整个流水线必须满足：

1. **入库 - 查询节点表征同构**：入库与查询走同一套 LLM 抽取规则（[文本到认知图 §三](文本到认知图：图构建方法.md)），同一节点 ID 在两端指向同一向量、同一图位置。
2. **向量与扩散只决定排序，不决定事实**：候选节点 / 联想节点由向量相似度和扩散能量给出，事实由 unit 给出。不允许把向量相似度或扩散能量当作事实可信度——它们只是排序权重。
3. **回答的事实基础限定在命中 unit 集**：LLM 总结时不可引入未在图里的事实；缺失就报告"图中无此信息"。
4. **明面关系优先于 LLM 推理**：能在符号闭包内得到的关系不调 LLM；调 LLM 的位置是 §三.1 / §三.4 / §三.5，其余位置不调。
5. **缓存与失效成对**：每条缓存项必须有可识别的失效条件（依赖的节点 / unit 集变动），不能"只写入不失效"。
6. **不存储原文句子镜像**：入库丢叙述外壳，留事实节点；细节保留模式也走修饰行 / 派生 node，不退化为带索引全文。

违反任一条 → 流水线退化为普通 RAG（全文检索 + LLM 重读），失去认知图带来的可推理性。

***

## 六、trade-off

* **入库代价高于纯 RAG，查询代价高于纯图遍历** —— 入库多一道向量化，查询多两道 LLM（query 抽节点 + 分层下钻）。代价换两个收益：向量层让 query 不必字面匹配；分层下钻让大段事实合成做对。

* **向量层引入语义漂移风险** —— 余弦近邻可能拉入"看起来相关但不是同一概念"的节点（如"想象增强智能体" 与"想象力" 在向量空间近邻，但前者是具体架构、后者是通用能力）。靠 §三.4 的 LLM 挑选相关步骤兜底——这步删错节点比保留无关节点风险低。

* **扩散查询参数难调** —— 传导系数 τ 决定哪些关系"易联想"：调高了拉来太多噪声、远端节点全亮，调低了等同纯定向遍历、失去广度。需要按文档域校准（学术语料 `属于` / `导致` 传得更远；生活语料 `相关于` 权重应升）。联想性 query 下扩散可能激活近半张图，靠 K / ε / LLM 挑选三重兜底。

* **缓存让查询走捷径，也让设计错误持久化** —— 一次错判的"信息足够"被缓存后，重复 query 都拿到同样错的回答。失效条件设计是缓存层的核心难点。

* **分层下钻的终止靠 LLM 主观判断** —— 没有形式化的"收敛条件"。两条启发（覆盖度 + 边际收益）可缓解但消不掉。极端 query（开放式综述、对比类问题）下 LLM 可能反复扩展不收敛——靠最大跳数 / 最大命中数兜底。

* **明面关系覆盖度依赖入库质量** —— 若入库时谓词没归到 family 基础成员、派生 node 没正确声明，查询期的 `同义` / `属于` 闭包遍历就走不通，被迫退化到 LLM 判 ≡ / ↔。入库代价转嫁查询代价。