# LlamaIndex + LightRAG 数据治理知识库实施计划

> 状态：技术方案已确认，尚未进入代码实施。
>
> 目标：在不替换 DataOps 控制面、治理 Neo4j 和现有 PostgreSQL 的前提下，
> 交付权限安全、可追溯、可评测、可降级，并能随治理事实变化进行知识点级
> 增量更新的治理知识库。
>
> 2026-07-22 修订：将知识点版本、语义 Diff、依赖影响传播、增量索引、缓存失效
> 和原子发布纳入正式实施范围；不再把“对象级文档重建”视为动态更新的完整实现。

## 1. 交付结论

本计划采用：

- LlamaIndex：Flask 内部唯一 RAG 主框架；
- LightRAG：内部图增强检索侧车；
- PostgreSQL/pgvector：规范化文档、分块、向量和控制状态；
- 现有 Neo4j：治理对象与血缘源真相，只读检索；
- 独立 LightRAG Neo4j：可重建的抽取图；
- Qwen：embedding；
- 独立 reranker：候选精排；
- DeepSeek：最终问答。

知识动态更新采用：

- 稳定 `point_key`：标识跨版本不变的知识语义位置；
- `knowledge_points`：保存知识点版本和有效期；
- `knowledge_point_dependencies`：保存治理事实和确定性规则形成的依赖；
- `knowledge_change_sets`：记录一次变更的 Diff、影响范围、发布和回滚状态；
- 语义快照 + Diff：区分 `added`、`modified`、`deleted`、`unchanged`；
- 有边界的影响传播：只重建受影响的 chunk、embedding、LightRAG 投影和缓存；
- prepare/validate/activate：新版本校验通过后原子切换，失败时保留旧 active 版本。

不采用：

- Haystack 与 LlamaIndex 双框架；
- LightRAG WebUI 作为 DataOps 用户入口；
- LightRAG 直接生成最终用户答案；
- LightRAG 直接写入现有治理 Neo4j；
- 新增 Milvus、Elasticsearch、Qdrant 或 Redis 作为首期必需依赖。

## 2. 当前基线与必须补齐的缺口

### 已存在

- `deploy/docker/docker-compose.yml` 已使用 PostgreSQL 16 + pgvector 和 Neo4j 5。
- `20260716_40_governance_knowledge.py` 已创建文档、分块和同步任务表。
- `app/core/knowledge/document_builder.py` 已提供确定性 JSON 文档和基础脱敏。
- `app/services/embedding/qwen.py` 已提供 Qwen Embedding 客户端。
- `app/core/events/outbox.py` 已提供 Outbox、幂等消费和失败状态。
- `app/core/system/permissions.py` 已提供管理员、编辑者、查看者的服务端 RBAC。
- 前端 `/knowledge-base-product` 已保留“数据治理知识库”入口。

### 缺口

1. 当前文档是紧凑 JSON，固定按 1200 字符切分，可能切断字段和关系语义。
2. `governance_chunks` 没有词法索引、结构化 metadata、section path 和 token 数。
3. 没有向量索引 generation，模型切换无法安全影子重建。
4. 没有检索、重排、引用和回答实现。
5. 没有治理对象变更事件的完整生产者。
6. 当前 Outbox 是全局 claim 状态，不能假设同一个事件会被多个独立消费者依次
   处理。
7. Web 身份只有角色，没有持久化的用户—业务域授权。
8. 没有 LightRAG 投影状态、来源映射、删除补偿和隔离存储。
9. 没有黄金问题集、离线评测和发布门禁。
10. 没有稳定知识点模型，无法判断治理对象内部具体哪些事实发生变化。
11. 没有知识点依赖和影响传播，字段、标准、指标、血缘之间的联动只能全量重建或
    留下陈旧内容。
12. 没有 change set、缓存依赖和知识新鲜度契约，不能证明一次动态变更已经完整发布。

## 3. 实施原则

1. **源真相不变。** 治理对象在 Neo4j，身份/授权/索引控制状态在 PostgreSQL，
   LightRAG 只保存投影。
2. **先过滤，再召回，再复核。** 权限不依赖前端和 Prompt。
3. **最终回答只有一个出口。** DataOps Answer Synthesizer 负责 DeepSeek 和引用。
4. **旧索引持续可用。** 新版本或新模型失败不覆盖 active generation。
5. **外部组件可关闭。** 关闭 LightRAG 后仍有完整的标准检索和问答闭环。
6. **所有外部写入幂等。** 使用稳定对象 UID、版本、内容哈希和 generation。
7. **先评测后放量。** LightRAG 先影子运行，不因接入完成就默认进入正式答案。
8. **知识点是最小变更单元。** 对象和文档仍是来源及授权边界，但更新、影响分析、
   缓存失效和新鲜度判断下沉到稳定 `point_key`。
9. **变化先 Diff 再构建。** 相同知识点内容不重复 embedding；删除和权限收紧先使
   canonical 内容不可见，再异步清理外部投影。
10. **影响传播必须有界。** 依赖传播限定关系类型、最大 hop 和最大对象/知识点数；
    超过阈值时升级为新 generation 的影子重建。
11. **发布状态可证明。** 每次变化都形成 change set，只有 canonical 产物、权限和
    引用通过校验后才标记 active；LightRAG 等异步投影单独报告 ready/degraded，部分
    成功不能被报告为投影完成。

## 4. 运行时架构

```mermaid
flowchart TB
    subgraph Write["索引写链路"]
        SOURCE["Neo4j / PostgreSQL 治理对象"] --> EVENT["governance.* Outbox 事件"]
        EVENT --> SNAP["规范化语义快照"]
        SNAP --> DIFF["知识点级 Diff"]
        DIFF --> IMPACT["有界依赖影响传播"]
        IMPACT --> INDEXER["Knowledge Indexer"]
        INDEXER --> DOC["知识点 + 结构化分块"]
        DOC --> EMB["仅对变化内容生成 Qwen Embedding"]
        EMB --> CANON["Canonical Index\nPostgreSQL + pgvector"]
        CANON --> ACTIVATE["校验 + 原子切换"]
        ACTIVATE --> INVALIDATE["精准缓存失效"]
        CANON --> PROJ["knowledge_index_projections"]
        PROJ --> LRWORKER["LightRAG Projection Worker"]
        LRWORKER --> LRSVC["LightRAG Service"]
        LRSVC --> LRPG["LightRAG PostgreSQL"]
        LRSVC --> LRNEO["LightRAG Neo4j"]
    end

    subgraph Read["查询读链路"]
        API["/api/knowledge"] --> ACCESS["KnowledgeAccessContext"]
        ACCESS --> PIPE["LlamaIndex Retrieval Pipeline"]
        PIPE --> LEX["Lexical / Alias"]
        PIPE --> VEC["pgvector"]
        PIPE --> GRA["治理 Neo4j"]
        PIPE --> LRC["LightRAG Client"]
        LEX --> RRF["RRF"]
        VEC --> RRF
        GRA --> RRF
        LRC --> AUTHZ["Canonical Source Re-authorization"]
        RRF --> AUTHZ
        AUTHZ --> RERANK["Reranker"]
        RERANK --> QA["DeepSeek Answer Synthesizer"]
    end
```

写链路中的 canonical active 版本是查询可见性的唯一开关。LightRAG 投影可以在
canonical 发布后异步完成；但任何 LightRAG 上下文在进入答案前仍必须映射到当前
active 的 `point_key`、来源对象和版本。

## 5. 数据模型

### 5.1 新迁移

建议新增：

`migrations/versions/20260720_100_llamaindex_lightrag_knowledge.py`

- `revision = "20260720_100"`
- `down_revision = "20260719_90"`
- V100 是 Alembic revision，不是产品版本。

### 5.2 用户—业务域授权

新增 `user_business_domain_grants`：

| 字段 | 说明 |
|---|---|
| `user_id UUID` | FK `users.id` |
| `business_domain_uid UUID` | 稳定治理 UID |
| `grant_type VARCHAR(20)` | `read` / `manage` |
| `granted_by UUID` | 管理员 |
| `created_at TIMESTAMPTZ` | 授权时间 |

约束：

- 主键 `(user_id, business_domain_uid, grant_type)`；
- `admin` 可解析为 `*`，但不写伪造的全局业务域 UID；
- 删除用户时级联删除授权；
- 非管理员没有授权记录时返回空范围，而不是默认全量。

### 5.3 知识点、版本与有效期

新增 `knowledge_points`。一行表示一个知识点的一个版本，不把覆盖更新当作版本管理：

| 字段 | 说明 |
|---|---|
| `id UUID` | 知识点版本 ID |
| `point_key VARCHAR(500)` | 跨源版本稳定的语义位置标识 |
| `point_revision BIGINT` | 同一 `point_key` 内单调递增的知识点版本 |
| `source_type VARCHAR(50)` | `BusinessDomain` / `DataFlow` / `DataMeta` / `DataStandard` / `Label` |
| `source_uid UUID` | 来源治理对象稳定 UID |
| `source_revision BIGINT` | 来源对象单调版本 |
| `semantic_path VARCHAR(500)` | 对象内部字段或关系路径 |
| `content TEXT` | 脱敏、规范化后的知识内容 |
| `content_hash CHAR(64)` | 规范化内容 SHA-256 |
| `metadata JSONB` | 名称、关系端点、权限范围和 source locator |
| `status VARCHAR(20)` | `building` / `active` / `superseded` / `deleted` / `failed` |
| `valid_from/valid_to TIMESTAMPTZ` | 业务有效期；`valid_to` 可空 |
| `created_at/activated_at TIMESTAMPTZ` | 构建与发布时刻 |

约束和索引：

- `UNIQUE(point_key, point_revision)`；
- 对 `status='active'` 建部分唯一索引，保证同一 `point_key` 最多一个 active 版本；
- `(source_type, source_uid, source_revision)` 普通索引；
- `(content_hash)` 普通索引，用于复用未变化内容；
- 删除使用 `deleted` tombstone，审计保留期内不物理删除版本历史。

`source_revision` 表示来源对象版本，`point_revision` 表示知识点自身版本。一个对象
revision 可以同时改变多个 point；依赖传播只要求重建某个 point 的派生产物时，可以
保留其 point revision，并通过新的 chunk hash/generation 体现派生索引变化。

`point_key` 只由稳定 UID、固定语义路径和稳定关系类型构成，不包含显示名称、数组
下标、文本内容或内容哈希。例如：

```text
BusinessDomain/{domain_uid}/definition
DataFlow/{flow_uid}/owner
DataFlow/{flow_uid}/reads_from/{metadata_uid}
DataMeta/{table_uid}/fields/{field_uid}/definition
DataStandard/{standard_uid}/rules/{rule_uid}
```

如果源系统没有字段/规则的稳定 UID，必须先建立确定性 surrogate key 和迁移映射；
不得用列表位置生成 `point_key`，否则重排会被误判为批量删除与新增。

### 5.4 知识点依赖、Change Set 与缓存依赖

新增 `knowledge_point_dependencies`：

| 字段 | 说明 |
|---|---|
| `from_point_key` | 依赖发起方 |
| `to_point_key` | 被依赖知识点 |
| `relation_type` | `uses` / `defines` / `derived_from` / `governs` / `lineage` |
| `source` | `governance` / `deterministic_rule` |
| `generation` | 关系所属 generation |
| `status` | `active` / `superseded` / `deleted` |

约束：

- 主键 `(from_point_key, to_point_key, relation_type, source, generation)`；
- `governance` 和 `deterministic_rule` 可驱动正式影响传播；
- 传播规则必须配置关系白名单，禁止沿任意抽取边无限扩散。

LightRAG 模型抽取关系继续只保存在隔离的 LightRAG 图和投影诊断中，不写入
`knowledge_point_dependencies`。这样依赖传播的输入始终来自治理事实或确定性代码，
不会把模型推断边升级成 canonical 依赖。

新增 `knowledge_change_sets`：

| 字段 | 说明 |
|---|---|
| `id UUID` / `correlation_id UUID` | 变更和全链路追踪标识 |
| `source_type/source_uid/source_revision` | 来源对象与目标版本 |
| `change_type` | `create` / `update` / `delete` / `permission` / `rebuild` |
| `source_snapshot_hash` | 本次规范化快照哈希 |
| `added/modified/deleted_count` | 直接 Diff 统计 |
| `impacted_point_count` | 依赖传播后的影响数量 |
| `impact_truncated BOOLEAN` | 是否因边界升级为 generation 重建 |
| `status` | `pending` / `diffed` / `building` / `validating` / `canonical_active` / `projecting` / `complete` / `degraded` / `failed` / `rolled_back` |
| `target_generation` | 目标索引 generation |
| `last_error` | 脱敏错误与阶段 |
| `created_at/activated_at` | 生命周期 |

新增 `knowledge_change_items`，按 `change_set_id + point_key` 保存：

- `change_kind`：`added` / `modified` / `deleted` / `impacted`；
- old/new point version 和 content hash；
- 影响来源 `caused_by_point_key` 与传播 hop；
- canonical、embedding、cache、LightRAG 各阶段状态；
- 重试次数和脱敏错误。

新增 `knowledge_cache_dependencies`：

| 字段 | 说明 |
|---|---|
| `cache_key_hash` | 不记录原始查询文本的缓存键哈希 |
| `point_key` | 回答或检索结果依赖的知识点 |
| `point_revision` | 生成缓存时使用的知识点版本 |
| `generation` | 索引 generation |
| `expires_at` | 最大生存时间 |

任何 `modified`、`deleted`、权限收紧或 active generation 切换都按 `point_key`
删除相关缓存；依赖记录缺失时必须失效整个业务域缓存，不能继续返回无法证明新鲜度的
结果。

### 5.5 规范化分块

扩展 `governance_chunks`：

| 字段 | 说明 |
|---|---|
| `chunk_kind` | `summary`、`definition`、`field`、`relation`、`attachment` |
| `section_path` | 标题/字段路径 |
| `metadata JSONB` | 对象类型、别名、责任人、业务域、关系端点等 |
| `token_count` | 使用固定 tokenizer 计算 |
| `lexical_text` | 名称、编码、别名和正文的规范化检索文本 |
| `search_vector TSVECTOR` | PostgreSQL 词法索引 |
| `source_locator JSONB` | Neo4j UID、MinIO object key、页码/表格定位 |

索引：

- `GIN(search_vector)`；
- `GIN(metadata jsonb_path_ops)`；
- `(document_id, chunk_no)` 保留唯一；
- `document_id` 普通索引；
- 常用范围 `(chunk_kind)` 与文档上的
  `(business_domain_uid, object_type, status)` 联合索引。

首期中文精确检索不只依赖 PostgreSQL 自带分词：

- 对对象名、英文名、表名、字段名、编码和显式别名建立 normalized alias；
- 精确匹配、前缀匹配和 `pg_trgm` 召回独立计分；
- 语义召回由 pgvector 负责；
- 是否引入 `zhparser` 必须经过独立镜像、许可证和部署验证，不作为首期前置条件。

每个 chunk 新增：

- `primary_point_key`：该 chunk 的主要知识点；
- `point_keys JSONB`：chunk 覆盖的全部知识点；
- `point_set_hash`：知识点集合和版本哈希；
- `change_set_id`：生成本 chunk 的 change set。

同一知识点可以映射到多个 chunk，一个 chunk 也可以包含多个紧密相关知识点；但每个
chunk 必须能反查其知识点依赖，支持精准重建、缓存失效和引用新鲜度校验。

### 5.6 Embedding profile 与 generation

新增 `knowledge_embedding_profiles`：

| 字段 | 说明 |
|---|---|
| `id UUID` | profile ID |
| `provider` | `qwen` |
| `model` | 模型名 |
| `dimension` | 首期固定 1024 |
| `distance` | `cosine` |
| `status` | `building`、`active`、`retired`、`failed` |
| `config_hash` | 不包含密钥的配置哈希 |
| `created_at/activated_at` | 生命周期 |

新增 `knowledge_chunk_embeddings`：

| 字段 | 说明 |
|---|---|
| `id UUID` | embedding ID |
| `chunk_id UUID` | FK `governance_chunks.id` |
| `profile_id UUID` | FK profile |
| `embedding vector(1024)` | 向量 |
| `embedding_hash` | 输入、模型和维度哈希 |
| `created_at` | 创建时间 |

约束和索引：

- `UNIQUE(chunk_id, profile_id)`；
- active profile 使用 HNSW cosine 索引；
- 小语料验收阶段保留 exact scan 基线；
- ANN 与业务域过滤组合必须测 Recall；必要时启用 pgvector iterative scan 或
  oversampling，不能只看延迟。

现有 `governance_chunks.embedding*` 字段首期保留兼容，不在同一迁移中删除。
完成双读、回填和切换后再单独下线。

维度变化不允许写入同一个 `vector(1024)` 表。必须建立新维度的 shadow 表和新
profile，完整重建并切换。

`knowledge_chunk_embeddings.embedding_hash` 必须包含规范化 chunk hash、模型、维度
和 tokenizer profile。知识点集合与内容均未变化时复用现有 embedding；只改变责任人
等独立知识点时，不重算无关 definition/relation chunk。

### 5.7 外部引擎投影

新增 `knowledge_index_projections`：

| 字段 | 说明 |
|---|---|
| `id UUID` | 投影记录 |
| `document_id UUID` | canonical document |
| `change_set_id UUID` | 触发投影的 change set |
| `engine` | `canonical_vector` / `lightrag` |
| `generation` | 索引 generation |
| `workspace` | 安全分区 |
| `external_document_id` | LightRAG 幂等文档 ID |
| `content_hash` | 投影输入哈希 |
| `status` | `pending`、`processing`、`ready`、`failed`、`deleting`、`deleted` |
| `attempts/available_at` | 有上限重试 |
| `last_error` | 脱敏错误 |
| `updated_at` | 健康与巡检 |

唯一键：

`(document_id, engine, generation, workspace)`

LightRAG `external_document_id` 固定使用：

`dataops:{object_type}:{object_uid}:v{object_version}:{content_hash前12位}`

对支持知识点级外部 ID 的适配层，首选：

`dataops:point:{point_key的SHA256前24位}:p{point_revision}:{content_hash前12位}`

如果 LightRAG 只能以文档为最小删除单位，则按“来源对象 + 业务域 + generation”维护
投影包：任一知识点变化时删除旧包并重插该对象的当前 active 知识点。该限制必须通过
K0 契约测试确认，不能假设底层支持不存在的局部更新语义。

### 5.8 查询审计与评测

新增：

- `knowledge_query_audits`
- `knowledge_evaluation_sets`
- `knowledge_evaluation_cases`
- `knowledge_evaluation_runs`
- `knowledge_evaluation_results`

查询审计默认只保存：

- query hash，不保存完整问题正文；
- 用户、角色、授权业务域摘要；
- 路由模式和各 Retriever 命中数量；
- 最终引用的 object UID/version；
- 最终引用的 `point_key`、point revision、source update time 和 index generation；
- 延迟、模型、token、降级状态和 correlation ID。

如需保存问题/答案样本，必须由管理员显式标记并进入有保留期限的评测集。

## 6. 规范化文档协议

替换紧凑 JSON + 固定字符切割，按对象类型使用确定性模板。

每个 canonical document 至少包含：

```yaml
object_type: DataFlow
object_uid: 019...
object_version: 7
object_name: 客户主数据同步
aliases:
  - customer_master_sync
business_domain_uid: 019...
owner: 数据治理组
source_updated_at: 2026-07-20T...
definitions:
  purpose: ...
  inputs: ...
  outputs: ...
relations:
  - type: READS_FROM
    target_uid: 019...
    target_name: 客户表
knowledge_points:
  - point_key: DataFlow/019.../purpose
    semantic_path: definitions/purpose
    content_hash: sha256:...
  - point_key: DataFlow/019.../reads_from/019...
    semantic_path: relations/READS_FROM/019...
    content_hash: sha256:...
permission_scope:
  business_domains:
    - 019...
```

构建规则：

1. 字段、关系和别名排序稳定；
2. 时间统一 UTC ISO-8601；
3. secret key 使用递归、大小写不敏感和模式匹配脱敏；
4. 每类对象使用黄金 fixture；
5. summary、definition、field 和 relation 分块不跨类型切断；
6. 超长字段在 token 边界切分并保留父标题和对象摘要；
7. 每个 chunk 都携带 object UID、version、domain、kind 和 source locator；
8. 每个知识点携带稳定 `point_key`、semantic path、content hash 和依赖端点；
9. 同一来源快照产生相同 document、point set 和 chunk hash；
10. 只改变字段顺序、JSON 键顺序或无语义格式时，Diff 必须为 `unchanged`；
11. 显示名称变化不改变已有 `point_key`，但名称知识点内容和依赖它的检索别名会更新；
12. point/chunk 的 permission scope 从 canonical 来源计算，不接受模型抽取值。

每类对象必须实现 `KnowledgePointBuilder`，输出排序稳定的：

```python
KnowledgeSnapshot(
    source_type=...,
    source_uid=...,
    source_revision=...,
    source_snapshot_hash=...,
    permission_scope=...,
    points=tuple[KnowledgePointDraft, ...],
    dependencies=tuple[KnowledgeDependencyDraft, ...],
)
```

Builder 是确定性领域代码，不使用 LLM 判断 point identity。LLM 只能在 LightRAG
投影中抽取辅助关系，不能生成 canonical `point_key`、权限或版本。

## 7. 同步与一致性

### 7.1 事件类型

治理写路径在同一业务事务中产生：

- `governance.business_domain.changed`
- `governance.dataflow.changed`
- `governance.metadata.changed`
- `governance.standard.changed`
- `governance.label.changed`
- `governance.object.deleted`

payload 只包含：

- object type/UID/version；
- source update time；
- correlation ID；
- 变更类型；
- 可选的 changed field/relationship hints，仅用于优化，不能作为完整 Diff 的事实源；
- 不包含完整附件或密钥。

事件处理规则：

- 以 `(source_type, source_uid, source_revision)` 幂等；
- revision 小于当前 active revision 的乱序事件记录为 stale 并跳过，不允许回退；
- revision 相同但 snapshot hash 不同视为源版本协议错误，进入人工检查；
- 事件 hint 与实际语义快照不一致时以重新读取的源快照为准。

### 7.2 单消费者协调

当前 Outbox 的 event status 是全局状态，不能让 canonical indexer 与 LightRAG
各自 claim 同一个事件。

首期采用：

1. `governance.*` 只注册一个 `KnowledgeIndexHandler`；
2. Handler 创建或恢复一个 `knowledge_change_sets`，执行快照、Diff、影响分析和
   canonical 发布；
3. 同一 PostgreSQL 事务写 change items、缓存失效任务和
   `knowledge_index_projections(status='pending')`；
4. 独立 LightRAG Projection Worker 只 claim projection 表；
5. 缓存失效 worker 只 claim cache invalidation 任务，删除操作和权限收紧使用高优先级；
6. 不把当前 Outbox 伪装成多订阅消息总线。

同一 `(source_type, source_uid)` 的 Diff 与 activate 必须串行。实现使用数据库行锁或
transaction-scoped advisory lock；锁内再次读取当前 active source revision，防止两个
worker 分别基于同一旧快照发布出相互覆盖的版本。不同来源对象可以并行处理。

未来若其他业务也需要 fan-out，再独立增加 `outbox_deliveries`，不在本阶段扩大。

### 7.3 语义快照与知识点 Diff

`KnowledgeIndexHandler` 对每个事件执行：

1. 在一致性读取边界内重新读取治理对象、稳定子对象 UID、关系和权限范围；
2. 使用对应 `KnowledgePointBuilder` 构建新 `KnowledgeSnapshot`；
3. 读取该对象当前 active point set；
4. 按 `point_key` 对比 old/new snapshot；
5. 写入 change set 和 change items；
6. 对 `unchanged` point 复用 active point/chunk/embedding；
7. 对 `added`、`modified`、`deleted` 进入影响分析。

Diff 判定：

| 情况 | change kind | 后续动作 |
|---|---|---|
| 新快照有、旧快照无 | `added` | 新建 point、chunk、embedding 和投影 |
| 两边都有、content/metadata/permission hash 变化 | `modified` | 建新版本，重建相关产物 |
| 旧快照有、新快照无 | `deleted` | 准备 tombstone，删除相关产物 |
| key 和所有语义 hash 相同 | `unchanged` | 复用，不调用 embedding |

权限 hash 单独比较。权限扩大按普通修改发布；权限收紧进入高优先级安全路径，不等待
LightRAG 或 embedding 完成后才禁止旧内容查询。

### 7.4 有界依赖影响传播

直接 Diff 完成后，从 `added`、`modified`、`deleted` point 沿
`knowledge_point_dependencies` 计算受影响集合：

1. 只沿配置白名单中的确定性关系传播；
2. 默认最大 hop 为 3，具体值由黄金用例调优；
3. 限制单 change set 最大知识点数和最大来源对象数；
4. 每个 `impacted` item 记录根因 point、关系路径和 hop；
5. 到达边界或发现循环时停止，不重复处理已访问 point；
6. 超过阈值将 `impact_truncated=true`，为相关业务域创建新 generation 影子重建，
   不发布不完整的局部结果。

`impacted` 只表示“需要重新验证或重建”，不表示依赖方的治理事实已经变化。对依赖方：

- 如果其 canonical 内容由该依赖确定性派生，重新读取依赖方来源并运行 point builder，
  再次计算实际 Diff；
- 如果只影响组合 chunk、检索别名、图路径或缓存，则保留 point revision，只重建对应
  派生产物；
- 禁止因为传播结果直接改写治理 Neo4j 或凭模型推断创建 canonical 事实。

首期传播规则至少覆盖：

- 字段定义/类型变化 → 引用字段的数据标准、DataFlow 输入输出说明；
- 数据标准规则变化 → 绑定该标准的元数据定义和检索别名；
- 血缘关系变化 → 对应 relation point、上下游 chunk 和图投影；
- 业务域归属变化 → 该对象全部 point 的 permission scope、缓存和 workspace 投影；
- 责任人变化 → owner point 和相关检索 chunk，不重建无关 definition/relation embedding。

### 7.5 增量构建、校验与原子发布

每个 change set 使用 `prepare -> validate -> activate`：

#### Prepare

1. 为 added/modified point 写 `building` 版本；
2. 为 deleted point 准备 tombstone；
3. 对 impacted point 重新验证 canonical 来源，只在实际 Diff 后创建新 point revision；
4. 只重建 point set、依赖集合或检索表现发生变化的 chunks；
5. 按 embedding hash 复用未变化向量，只批量生成缺失向量；
6. 准备新 canonical document、chunk、embedding 和依赖边；
7. 写 LightRAG 投影任务，但不把 projection ready 作为 canonical 可见性的前置条件。

#### Validate

至少检查：

- point key 唯一、source revision 单调、point set hash 可复现；
- 每个新 chunk 都能反查 active/building point 和 canonical source；
- embedding profile、维度和覆盖率正确；
- permission scope 来自服务端 canonical 来源；
- 删除/修改后不存在仍指向旧 point revision 的待发布引用；
- 影响传播未被静默截断；
- change item 各阶段状态完整。

#### Activate

在单个 PostgreSQL 事务中：

1. 将旧 active point/document/chunk 标记 `superseded` 或 `deleted`；
2. 将新 point/document/chunk 标记 `active`；
3. 更新 source active revision 和 point set hash；
4. 创建/确认缓存失效任务和 LightRAG projection；
5. 将 change set 标记 `canonical_active` 并提交；投影 worker 开始后转为 `projecting`，
   异步投影完成后转为 `complete`，超过重试或 SLA 时转为 `degraded`，但不回滚已正确
   发布的 canonical 版本。

Qwen、校验或事务失败时，旧 active 版本保持不变，building 产物可重试或清理。禁止
逐 point 提交后再补偿，因为这会暴露半新半旧的对象快照。

### 7.6 删除、权限收紧与紧急撤销

删除对象：

1. 在 canonical 事务中将对象及其 active points 发布为 tombstone，查询立即不可见；
2. 删除相关缓存依赖；
3. projection 进入 `deleting`；
4. LightRAG 按 point ID 或投影包 ID 删除；
5. 删除成功标记 `deleted`，失败有上限重试并告警；
6. 每日 audit 对孤儿 projection 重试或隔离。

权限收紧、敏感级别提升和业务域移出使用相同的高优先级撤销通道：先在 canonical
授权层拒绝访问并失效缓存，再异步修正 embedding metadata 和 LightRAG workspace。
紧急撤销 SLA 需要在 K1D 确认；在 SLA 未验证前不得声称外部投影已实现实时删除。

### 7.7 缓存失效与回答新鲜度

检索结果缓存和答案缓存都必须记录 `point_key + point revision + generation` 依赖。

- point modified/deleted：失效直接依赖缓存；
- 影响传播：失效所有 impacted point 缓存；
- permission change：按用户/角色/业务域安全范围失效；
- generation 切换：失效旧 generation 缓存；
- 依赖写入失败：回退为整个业务域缓存失效；
- 高风险治理内容可以配置最大允许陈旧时间，超时后不返回旧缓存。

首期若尚未实现跨 worker 的依赖失效广播，则关闭可跨请求复用的答案缓存；允许的短期
进程内缓存必须把 generation/point set hash 纳入键并使用保守 TTL。不能先上线不可
精准失效的长生命周期缓存，再依赖人工清理保证新鲜度。

回答和引用响应增加：

- `point_key`、`point_revision`；
- `source_updated_at`；
- `index_generation`；
- `freshness_status`：`fresh` / `updating` / `degraded`；
- 可选 `active_change_set_id`，仅管理员可见。

`fresh` 表示引用 point set 已对应最新成功处理的 source revision；`updating` 表示存在
更高 source revision 的未完成 change set，当前回答仍基于旧 active 快照；`degraded`
表示巡检发现 source/canonical/projection 不一致，或无法证明缓存依赖完整。

### 7.8 LightRAG 增量投影与 Generation 重建

LightRAG 的实际更新粒度由 K0 契约测试决定：

- 支持可靠 point/document delete：删除旧外部 ID，再插入新 active 内容；
- 只支持文档级删除：重建该对象投影包；
- 无法证明删除一致性：新建 workspace generation，影子构建、评测后整体切换；
- embedding、抽取模型、抽取 Prompt、实体关系 Schema 变化：强制新 generation；
- 影响传播超过阈值或跨业务域大规模重分区：强制新 generation。

新 workspace 激活前必须验证 active point 覆盖率、孤儿来源数、删除残留、权限分区和
黄金集结果。旧 workspace 保留到回滚窗口结束后再异步回收。

### 7.9 每日全量巡检

巡检比较：

- Neo4j/PostgreSQL 源对象 UID、版本和 source snapshot hash；
- canonical active document hash 和 point set hash；
- 每个 active point 的 source revision、content hash 和有效期；
- chunk 到 point 的映射完整性；
- active embedding profile 覆盖率和陈旧 embedding；
- LightRAG projection generation、hash、状态和孤儿外部 ID；
- deleted/superseded point 的残留 chunk、缓存和投影；
- 业务域授权与 point/document permission scope 的合法性；
- 长时间停留在 pending/building/validating 的 change set。

默认 report-only；只有显式 `--repair` 才修复派生数据差异，不删除源治理数据。
repair 必须创建独立 change set，保留修复前后审计记录。

## 8. LlamaIndex 主检索链路

### 8.1 代码边界

新增：

```text
app/core/knowledge/
├── access.py
├── contracts.py
├── document_builder.py
├── point_builder.py
├── chunking.py
├── diff.py
├── impact.py
├── publish.py
├── cache_invalidation.py
├── sync.py
├── audit.py
├── qa.py
├── evaluation.py
├── llamaindex/
│   ├── node_mapper.py
│   ├── vector_store.py
│   └── synthesizer.py
├── retrieval/
│   ├── lexical.py
│   ├── vector.py
│   ├── governance_graph.py
│   ├── fusion.py
│   ├── rerank.py
│   ├── router.py
│   └── pipeline.py
└── lightrag/
    ├── client.py
    ├── projection.py
    └── health.py
```

### 8.2 KnowledgeAccessContext

每次查询在 API 层构建不可变上下文：

```python
KnowledgeAccessContext(
    subject_id=...,
    roles=frozenset(...),
    permissions=frozenset(...),
    business_domain_uids=frozenset(...),
    correlation_id=...,
)
```

禁止 Retriever 自己从请求 JSON 接受任意业务域。客户端 filters 只能缩小服务端
已计算范围，不能扩大范围。

### 8.3 Retriever

#### ExactLexicalRetriever

用于：

- 表名、字段名、对象编码；
- 中文名、英文名和别名；
- 前缀和轻微拼写差异。

#### DataOpsVectorRetriever

- 查询 active profile；
- 在 SQL 中应用 active document、业务域和对象类型过滤；
- exact scan 和 HNSW 路径均可配置；
- 返回 canonical chunk ID、`point_keys`、point revisions 和 generation，不返回框架
  生成的临时 ID。

#### GovernanceGraphRetriever

只读查询现有 Neo4j：

- 上下游血缘；
- 业务域—DataFlow—元数据关系；
- 数据标准/标签关联；
- 限定最大 hop、最大节点和最大关系数量；
- 使用参数化 Cypher；
- 仅返回稳定 UID，不依赖 Neo4j internal ID。

#### LightRAGRetriever

- 只对允许 workspace 调用；
- 首期使用 `mix` 和 `only_need_context`；
- 强制超时、最大上下文和 circuit breaker；
- 把返回来源映射为当前 active canonical document/chunk/point；
- 映射失败的上下文丢弃并计数。

### 8.4 Query Router

首期使用可测试的确定性规则，不用 LLM 决定权限或任意路由。

| 模式 | 触发条件 | Retriever |
|---|---|---|
| `exact` | 编码、表名、字段名、显式引号 | lexical + vector |
| `semantic` | 定义、含义、用途、负责人 | lexical + vector |
| `relationship` | 上游、下游、依赖、关联、经过 | vector + governance graph |
| `global` | 整体、主要主题、跨域总结 | vector + LightRAG |
| `auto` | 服务端确定性分类 | 上述之一 |

用户可请求更窄模式，但不能强制访问未授权 LightRAG workspace。

### 8.5 融合和重排默认值

初始可调参数：

- lexical top 20；
- vector top 40；
- governance graph top 20；
- LightRAG context top 20；
- RRF `k=60`；
- RRF 后保留 30；
- reranker 后保留 8；
- 每对象最多 3 个 chunk；
- 最终 evidence token 预算 8,000。

这些只是起始配置，必须由黄金问题集调优，不能写死为“最佳参数”。

### 8.6 无答案与引用

回答必须满足：

- 至少一个通过授权和版本核验的来源；
- reranker/融合分数超过已校准阈值；
- 每个事实引用 `object_uid + object_version + point_key + point_revision + chunk_id`；
- 引用的 point、chunk 和 generation 在回答提交时仍为 active；
- 来源内容不足时明确返回“不足以回答”；
- 不允许模型生成不存在的引用。

## 9. LightRAG 侧车

### 9.1 部署

新增 Compose 服务：

- `lightrag`
- `lightrag-projector`
- `lightrag-neo4j`

存储：

- PostgreSQL：同一 PostgreSQL 集群内独立数据库 `dataops_lightrag` 和独立账号；
- Neo4j：本地使用独立 Community 容器与卷；
- 不使用 DataOps `public` schema；
- 不使用治理 Neo4j 凭据；
- 服务不暴露宿主机公网端口，只有后端/worker 内部网络可访问。

镜像和 Python 包必须固定版本或 digest。不得使用 floating `latest`。

### 9.2 Workspace 与权限

workspace 使用稳定安全分区：

`dataops-{tenant_or_global}-{business_domain_uid}-g{generation}`

首期如果没有 tenant，固定使用 `global`，但仍按业务域分区。

由于官方 LightRAG Server 的 workspace 是实例级配置，实施顺序为：

1. PoC 只选择一个非敏感业务域；
2. 验证共享服务是否能安全管理多个 workspace；
3. 若不能按请求硬隔离，使用 DataOps LightRAG Gateway 管理 workspace 实例，
   或按安全分区部署服务实例；
4. 在多业务域隔离验收前，禁止将混合权限语料放入一个正式 workspace。

### 9.3 模型配置

- embedding 与 DataOps active Qwen profile 保持同模型、同维度；
- extraction/query/final 模型分别配置；
- LightRAG final generation 对 DataOps 请求禁用，只返回 context；
- reranker 配置独立，失败可以由 DataOps 统一 reranker 补偿；
- 任何模型切换创建新 generation/workspace，全量重建后再切换。

### 9.4 接口适配

`LightRAGClient` 对上层暴露稳定接口：

```python
insert(document_contract, idempotency_key) -> ProjectionReceipt
delete(external_document_id, idempotency_key) -> DeleteReceipt
query_context(query, workspace, mode, limits) -> list[ExternalEvidence]
status(external_document_id) -> ProjectionStatus
health() -> DependencyHealth
```

`insert` 输入必须包含 active point keys/revisions，`delete` 必须返回可核验的删除回执。
如果官方接口无法证明旧内容已删除，client 将 projection 标记为 `unverified`，并触发
新 generation 重建或人工隔离，不能把 HTTP 2xx 直接等同于语义删除完成。

官方 REST 路径变化只影响 client，不进入领域代码和前端。

## 10. Knowledge API

新增蓝图：

`app/api/knowledge_base/`

注册前缀：

`/api/knowledge`

### 10.1 用户接口

| 方法 | 路径 | 权限 | 用途 |
|---|---|---|---|
| POST | `/search` | `governance:read` | 只检索，不生成 |
| POST | `/ask` | `governance:read` | 检索并生成有引用答案 |
| GET | `/sources/<uid>` | `governance:read` + domain | 查看 active 来源 |
| GET | `/sources/<uid>/versions/<version>` | 同上 | 查看指定引用版本 |
| GET | `/capabilities` | `governance:read` | 模型与降级状态 |

注意：当前全局权限策略会把普通 POST 视为编辑操作。必须为 `/search` 和 `/ask`
增加显式 read-only 分类，不能要求 viewer 拥有 `governance:edit`。

### 10.2 管理接口

新增权限：

`knowledge:manage`

仅 admin 默认拥有。

| 方法 | 路径 | 用途 |
|---|---|---|
| GET | `/admin/sync` | 同步、投影、失败和 lag |
| POST | `/admin/reindex` | 创建新 generation |
| POST | `/admin/retry-projection` | 重试指定失败投影 |
| POST | `/admin/audit` | 启动 report/repair |
| GET | `/admin/change-sets` | 查询知识点 Diff、影响范围和发布状态 |
| GET | `/admin/change-sets/<id>` | 查看 change items 和失败阶段 |
| POST | `/admin/change-sets/<id>/retry` | 从安全检查点重试失败变更 |
| POST | `/admin/change-sets/<id>/rollback` | 回退未完成或新激活的 change set |
| GET | `/admin/evaluations` | 评测运行与门禁结果 |

### 10.3 响应契约

统一包含：

```json
{
  "query_id": "uuid",
  "mode": "relationship",
  "answer": "...",
  "answer_status": "grounded",
  "degraded_components": [],
  "citations": [
    {
      "object_uid": "uuid",
      "object_type": "DataFlow",
      "object_name": "客户同步",
      "object_version": 7,
      "point_key": "DataFlow/019.../purpose",
      "point_revision": 7,
      "chunk_id": "uuid",
      "section_path": "relations/READS_FROM",
      "source_updated_at": "2026-07-22T02:10:00Z",
      "index_generation": 3,
      "retrievers": ["vector", "governance_graph"],
      "score": 0.91
    }
  ],
  "freshness_status": "fresh"
}
```

## 11. 前端

修改：

- `frontend/src/views/knowledgeBaseProduct/index.vue`
- 新建 `frontend/src/api/governanceKnowledge.js`
- 新建 `frontend/src/views/knowledgeBaseProduct/components/`

首期页面：

1. 搜索/提问输入；
2. `auto / 精确 / 语义 / 关系 / 全局` 模式；
3. 对象类型和已授权业务域过滤；
4. 答案与逐条引用；
5. 点击引用回到治理对象；
6. 降级、无答案和索引更新时间；
7. 答案来源版本、更新时间和 freshness 状态；
8. 管理员 change set、知识点 Diff、同步状态、失败重试和评测结果。

前端不得：

- 直接访问 LightRAG；
- 自行决定用户业务域；
- 隐藏后仍调用无权限来源接口；
- 渲染模型返回的任意 HTML；
- 显示内部 Prompt、模型密钥或原始堆栈。

## 12. 配置与依赖

### 12.1 Python 依赖

将知识库依赖与核心依赖分组并锁定：

- `llama-index-core`
- PostgreSQL/Neo4j 所需的最小 LlamaIndex integration
- tokenizer
- reranker client

不安装 `llama-index` 全量 starter，避免引入未使用 provider。

实施前做 Python 3.11、SQLAlchemy 2.0、NumPy 和现有 OpenAI SDK 的兼容性
spike。通过后将精确版本写入锁定文件；不得仅使用宽松 `>=`。

LightRAG 保持独立镜像，不安装进 Flask backend，避免依赖冲突和扩大镜像。

### 12.2 配置项

新增但不提供生产默认密钥：

```text
KNOWLEDGE_ENABLED
KNOWLEDGE_ACTIVE_EMBEDDING_PROFILE
KNOWLEDGE_VECTOR_TOP_K
KNOWLEDGE_RRF_K
KNOWLEDGE_RERANK_TOP_K
KNOWLEDGE_EVIDENCE_TOKEN_BUDGET
KNOWLEDGE_IMPACT_MAX_HOPS
KNOWLEDGE_IMPACT_MAX_POINTS
KNOWLEDGE_IMPACT_MAX_OBJECTS
KNOWLEDGE_FULL_REBUILD_THRESHOLD
KNOWLEDGE_HIGH_RISK_MAX_STALENESS_SECONDS
KNOWLEDGE_CHANGESET_RETRY_LIMIT
KNOWLEDGE_LIGHTRAG_ENABLED
KNOWLEDGE_LIGHTRAG_SHADOW_ONLY
KNOWLEDGE_LIGHTRAG_BASE_URL
KNOWLEDGE_LIGHTRAG_API_KEY
KNOWLEDGE_LIGHTRAG_TIMEOUT_SECONDS
KNOWLEDGE_LIGHTRAG_CANARY_PERCENT
QWEN_EMBEDDING_BASE_URL
QWEN_EMBEDDING_API_KEY
QWEN_EMBEDDING_MODEL
QWEN_EMBEDDING_DIMENSION
RERANK_BASE_URL
RERANK_API_KEY
RERANK_MODEL
```

日志只能记录配置是否存在、模型名和配置哈希，不能记录密钥。

## 13. 可观测性与降级

### 指标

- canonical index backlog、失败数、最老事件年龄；
- change set pending/building/validating/failed 数、处理时延和最老年龄；
- 每次变更 added/modified/deleted/impacted point 数；
- impact propagation hop、截断次数和 generation 重建升级次数；
- embedding 复用率与因知识点变化实际重算的 chunk 数；
- 缓存精准失效数、业务域回退失效数和 stale cache 拒绝数；
- LightRAG projection pending/failed/lag；
- active 文档和 embedding 覆盖率；
- 各 Retriever latency、candidate count、empty rate；
- reranker latency 和降级次数；
- search/ask P50/P95/P99；
- no-answer rate；
- citation count 和 stale citation 拒绝数；
- point/chunk/source 版本映射失败数和 freshness 状态分布；
- LightRAG source mapping failure；
- 模型 token、费用和超时；
- ACL 拒绝与跨域候选丢弃数。

### 降级矩阵

| 故障 | 行为 |
|---|---|
| LightRAG 不可用 | 标准链路继续，标记 graph enhanced degraded |
| 治理 Neo4j 不可用 | lexical + vector |
| pgvector 不可用 | lexical；ask 默认不生成或明确证据不足 |
| reranker 不可用 | RRF 结果，降低置信度 |
| Qwen 不可用 | 停止新索引；旧 active index 可查 |
| DeepSeek 不可用 | search 可用；ask 返回来源和模型不可用状态 |
| 新 generation 构建失败 | 保留旧 active generation |

## 14. 评测与发布门禁

### 14.1 黄金问题集

首期 150–300 条，包含：

- 30% 对象名、表名、字段、编码和别名；
- 25% 定义、用途、责任人和数据标准；
- 25% 上下游、依赖和两至三跳关系；
- 10% 跨对象/全局主题；
- 10% 无答案、旧版本、删除对象、Prompt Injection 和跨域越权。

每条至少标注：

- 允许的业务域；
- 相关 object UID/version；
- 相关 chunk 或关系；
- 预期答案要点；
- 是否必须拒答。

### 14.2 对照组

固定比较：

1. lexical only；
2. pgvector only；
3. LlamaIndex standard；
4. LlamaIndex + governance graph；
5. LlamaIndex + governance graph + LightRAG。

### 14.3 门禁指标

初始验收目标：

- 精确对象 Recall@5 ≥ 0.98；
- 语义问题 Recall@10 ≥ 0.90；
- 多跳 source Recall@10 ≥ 0.80；
- Citation Precision ≥ 0.95；
- 权限负向用例泄漏 = 0；
- deleted/superseded 来源进入答案 = 0；
- 无答案问题拒答准确率 ≥ 0.90；
- search P95 ≤ 1.5 秒（不含外部模型生成）；
- LightRAG 故障时标准检索可用率 = 100%。

LightRAG 正式放量还必须满足：

- 多跳 Recall@10 相对
  `LlamaIndex + governance graph` 提升至少 10 个百分点；
- 精确问题 Recall@5 下降不超过 2 个百分点；
- P95、token 和索引成本在批准预算内；
- workspace 隔离和 canonical source re-authorization 全部通过。

### 14.4 动态更新专项评测

黄金集必须增加“变更前问题 + 变更操作 + 变更后预期”的时序用例，至少覆盖：

1. 修改字段定义，只更新对应 definition point 和确定性依赖；
2. 修改责任人，不重算无关 relation/definition embedding；
3. 新增/删除血缘边，二至三跳问题引用新关系且不再返回旧关系；
4. 数据标准变化，绑定对象和缓存按依赖传播更新；
5. 删除治理对象，canonical 立即不可见且 LightRAG 残留可检测；
6. 权限收紧，旧缓存和外部投影不能造成跨域泄漏；
7. 重复、乱序和并发事件最终收敛到最高合法 source revision；
8. Qwen、LightRAG、缓存 worker 或数据库事务失败时旧 active 版本持续可用；
9. 影响范围超过阈值时升级为 generation 重建，不发布截断的局部结果；
10. 新 generation 失败或效果退化时能够回滚。

新增门禁指标：

- 知识点 Diff 准确率 = 1.00（黄金 fixture）；
- 删除/权限收紧后 canonical 不可见延迟满足批准的安全 SLA；
- unchanged point 的 embedding 重算率 = 0；
- change set 部分发布导致的混合版本命中 = 0；
- stale point/chunk/citation 进入答案 = 0；
- change set 最终收敛率 ≥ 0.999，失败项全部可观测、可重试或可回滚；
- 依赖传播漏更新 = 0（已声明规则的黄金用例）；
- LightRAG 删除残留必须被巡检发现，不能静默通过发布门禁。

## 15. 分阶段交付

```mermaid
flowchart LR
    K0["K0\n兼容性与评测基线"] --> K1A["K1A\n事件与授权"]
    K1A --> K1B["K1B\n知识点与版本"]
    K1B --> K1C["K1C\nDiff 与影响传播"]
    K1C --> K1D["K1D\n原子发布与新鲜度"]
    K1D --> K2["K2\nLlamaIndex 标准检索"]
    K2 --> K3["K3\nLightRAG 影子侧车"]
    K3 --> K4["K4\n融合问答与引用"]
    K4 --> K5["K5\n前端与运维"]
    K5 --> K6["K6\n评测、Canary 与发布"]
```

### K0：兼容性与评测基线

实施：

- 建立 30–50 条小型黄金集；
- 验证 LlamaIndex 最小依赖与 Python 3.11；
- 验证自定义 VectorStore/Retriever 可读取现有表；
- 验证 LightRAG REST、PostgreSQL 16.6+、Neo4j 和 1024 维 embedding；
- 验证 insert/query/delete、context source mapping 和 workspace 隔离；
- 验证 LightRAG 的真实最小删除粒度、删除回执、重复插入语义和孤儿内容发现方式；
- 用两个版本的 DataFlow fixture 验证 point/document external ID 更新策略。

退出门槛：

- 不需要第二套业务源表；
- LightRAG context 能映射回 DataOps stable source；
- 已明确 LightRAG 使用 point 级更新、对象投影包重建或 generation 重建中的哪一种；
- 依赖锁可重复安装；
- 无密钥进入镜像、日志或测试 fixture。

回滚：

- 删除 PoC 容器和测试数据库；
- 不改变当前生产路径。

### K1A：对象级事件、授权与快照边界

主要文件：

- V100 migration；
- `app/core/knowledge/access.py`
- `document_builder.py`
- `sync.py`
- governance 写路径 Outbox 事件。

测试：

- schema/migration；
- 每类对象 golden document；
- secret redaction；
- user-domain grants；
- source revision 单调性；
- duplicate/out-of-order/restart；
- 权限扩大与权限收紧事件。

退出门槛：

- 业务域为空时 fail closed；
- 每类首期治理对象均有同步事件和稳定 source revision；
- 事件能重新读取完整、一致的 canonical source snapshot；
- changed-field hint 不会代替实际快照比较；
- 权限收紧事件进入高优先级处理队列。

### K1B：知识点模型、稳定键与版本

主要文件：

- V100 中 `knowledge_points`、`knowledge_point_dependencies`、
  `knowledge_change_sets`、`knowledge_change_items`、`knowledge_cache_dependencies`；
- `app/core/knowledge/point_builder.py`
- `app/core/knowledge/contracts.py`
- `app/core/knowledge/chunking.py`

实施：

- 先支持 `BusinessDomain` 和 `DataFlow` 的 point builders；
- 为 DataMeta 字段、标准规则、标签和关系确认稳定子对象 UID；
- 定义 point → chunk 和 point → dependency 的确定性映射；
- 生成 point set hash、chunk point set hash 和 permission hash；
- 旧文档回填为初始 point generation，但不凭文本相似度猜测稳定 ID。

测试：

- stable `point_key` golden fixtures；
- 字段/关系重排不改变 point identity；
- 名称变化只修改预期 point；
- point/document/chunk hash 可重复；
- 同一 point 最多一个 active 版本；
- 模型抽取关系不能写入 canonical dependency source。

退出门槛：

- 五类首期治理对象均能产生稳定、可复现 point set；
- 每个 chunk 能反查来源 point 和版本；
- 权限和版本不由 LLM 决定；
- 初始回填有审计报告和可回滚 generation。

### K1C：语义 Diff 与有界影响传播

主要文件：

- `app/core/knowledge/diff.py`
- `app/core/knowledge/impact.py`
- `app/core/knowledge/sync.py`

实施：

- 按 `point_key` 计算 added/modified/deleted/unchanged；
- 记录 change set 和逐 point change items；
- 实现关系白名单、最大 hop、最大 point/object 数和循环检测；
- 超阈值自动升级为业务域 generation 重建；
- 只为 changed/impacted point 生成待构建 chunk 集合。

测试：

- 新增、修改、删除和无语义格式变化；
- 字段、标准、血缘、责任人和业务域变更；
- 多级依赖、环、孤儿依赖和超阈值传播；
- duplicate/out-of-order/concurrent events；
- 传播路径和根因审计可复现。

退出门槛：

- 黄金 fixture 的知识点 Diff 准确率为 1.00；
- 已声明传播规则不存在漏更新；
- unchanged point 不进入 embedding 队列；
- 影响被截断时不允许局部 change set 进入 `canonical_active`。

### K1D：增量构建、原子发布、缓存失效与审计

主要文件：

- `app/core/knowledge/publish.py`
- `app/core/knowledge/cache_invalidation.py`
- `app/core/knowledge/audit.py`
- Qwen embedding batch/reuse；
- projection 与 cache invalidation worker。

实施：

- prepare/validate/activate 状态机；
- unchanged embedding 复用和 changed chunk 批量生成；
- point/document/chunk 的事务级 active 切换；
- point dependency 精准缓存失效及业务域回退失效；
- 删除/权限收紧的紧急撤销路径；
- LightRAG 增量投影能力探测与 generation 重建策略；
- report-only audit、显式 repair 和 rollback。

测试：

- Qwen/事务/cache/LightRAG 任一步失败；
- 部分构建不可见和旧 active 持续可用；
- delete/permission 紧急撤销 SLA；
- stale cache、stale citation 和孤儿 projection；
- retry/restart/rollback；
- generation 切换和回退。

退出门槛：

- 不存在半新半旧的可查询对象快照；
- Qwen 失败不覆盖旧 active；
- 删除和权限收紧满足批准的 canonical 不可见 SLA；
- unchanged point embedding 重算率为 0；
- change set 可从任何失败阶段安全重试或回滚；
- 每日 audit 能发现 source/canonical/cache/LightRAG 差异。

### K2：LlamaIndex 标准检索

主要文件：

- `llamaindex/node_mapper.py`
- `llamaindex/vector_store.py`
- lexical/vector/governance graph/fusion/router/pipeline；
- `/api/knowledge/search`。

测试：

- metadata filter；
- active version；
- active point revision 和 generation 过滤；
- exact/vector/graph/RRF；
- Neo4j 和 pgvector 故障降级；
- viewer 的 POST search 仍按 read 权限；
- 负向跨域检索。

退出门槛：

- 不使用 LlamaIndex 默认持久化表；
- 返回稳定 UID/version/chunk；
- 返回稳定 point key/revision 和 freshness metadata；
- 标准链路达到 Recall 和延迟基线；
- search 不依赖 DeepSeek。

### K3：LightRAG 影子侧车

主要文件：

- Compose LightRAG 服务与独立存储；
- `lightrag/client.py`
- `lightrag/projection.py`
- projector command/service；
- projection admin 状态。

测试：

- insert/update/delete 幂等；
- point/object 投影包更新与删除残留检测；
- workspace 隔离；
- mapping failure 丢弃；
- LightRAG timeout/circuit breaker；
- generation 重建；
- change set 到 projection 的状态关联；
- 每日 audit 修复孤儿。

退出门槛：

- 默认 `shadow_only=true`；
- 不影响正式答案；
- 现有治理 Neo4j 没有 LightRAG 标签、索引或关系；
- 多跳评测数据完整；
- canonical change set 发布不依赖 LightRAG ready，且旧投影上下文无法通过来源复核。

### K4：融合问答与引用

主要文件：

- LightRAGRetriever；
- rerank；
- qa/synthesizer；
- `/api/knowledge/ask`；
- source/version API。

测试：

- context-only；
- canonical re-authorization；
- Prompt Injection；
- stale/deleted citations；
- point modified/impacted 后 stale citation 拒绝；
- no-answer；
- model timeout；
- citation fabrication rejection。

退出门槛：

- 最终答案只由 DataOps 生成；
- 每个引用能打开合法源对象；
- 每个引用能定位 active point revision 和 generation；
- 模型不可用时不伪造答案；
- 权限负向用例零泄漏。

### K5：前端与运维

实施：

- 搜索、问答、模式和过滤；
- 引用与回跳；
- 降级提示；
- 管理员同步/重试/评测；
- 管理员 change set、Diff、影响范围和 freshness 状态；
- system health 增加 knowledge 组件。

退出门槛：

- viewer/editor/admin 页面与 API 权限一致；
- 前端不直连 LightRAG；
- 无内部错误、密钥和 Prompt 暴露；
- 浏览器验收通过。

### K6：评测、Canary 与发布

实施：

- 扩展到 150–300 条黄金集；
- 保存各对照组结果；
- LightRAG 先按业务域和百分比 Canary；
- 观察 no-answer、投诉、延迟、成本和引用反馈；
- 达标后逐步关闭 shadow-only。

退出门槛：

- 全部质量和安全门禁通过；
- LightRAG 有明确收益；
- 关闭 LightRAG 的回滚演练通过；
- 新旧 generation 切换和回退通过；
- 动态更新专项门禁、紧急撤销 SLA 和缓存失效门禁通过；
- 形成 `docs/validation/knowledge-k6.md`。

## 16. 测试布局

新增建议：

```text
tests/knowledge/
├── test_access_context.py
├── test_document_builder.py
├── test_point_builder.py
├── test_chunking.py
├── test_knowledge_diff.py
├── test_impact_propagation.py
├── test_atomic_publish.py
├── test_cache_invalidation.py
├── test_sync.py
├── test_audit.py
├── test_lexical_retriever.py
├── test_vector_retriever.py
├── test_governance_graph_retriever.py
├── test_fusion.py
├── test_router.py
├── test_reranker.py
├── test_lightrag_client.py
├── test_lightrag_projection.py
├── test_qa.py
└── test_evaluation.py

tests/integration/
├── test_knowledge_pgvector.py
├── test_knowledge_neo4j.py
├── test_lightrag_contract.py
├── test_knowledge_outbox_projection.py
├── test_knowledge_dynamic_update.py
├── test_knowledge_generation_switch.py
├── test_knowledge_emergency_revoke.py
└── test_knowledge_degraded_modes.py

tests/e2e/
└── governance-knowledge.spec.js
```

验证分层：

- L1：纯单元和 golden fixtures；
- L2：迁移、权限、API 和适配器契约；
- L3：PostgreSQL + Neo4j + backend；
- L4：增加 LightRAG 与模型 mock；
- L5：有显式密钥时运行真实模型评测，不作为普通 CI 前置。

## 17. 风险与控制

| 风险 | 控制 |
|---|---|
| LlamaIndex 依赖膨胀/冲突 | 只装 core + 最小 integrations，精确锁版本 |
| LightRAG 升级破坏 API | client 适配层 + 契约测试 + 固定 digest |
| LightRAG 图污染治理图 | 独立 Neo4j 凭据、服务、卷/数据库 |
| 多业务域泄漏 | workspace 分区 + 查询前授权 + 来源重新授权 |
| ANN 过滤降低召回 | exact baseline、iterative scan/oversampling 和分域评测 |
| embedding 模型切换 | profile + shadow generation + 原子切换 |
| `point_key` 不稳定导致伪变化 | 稳定子对象 UID、golden fixtures、禁止名称/下标/hash 入键 |
| 依赖传播爆炸或形成环 | 关系白名单、visited set、hop/point/object 上限、升级 generation 重建 |
| 依赖规则漏更新 | 时序黄金集、change path 审计、每日 source/point/chunk 巡检 |
| 事件重复、乱序或并发 | source revision 单调、幂等 change set、同源对象串行激活 |
| 增量发布暴露混合版本 | prepare/validate/activate，事务级切换全部 point/document/chunk |
| 缓存保留旧知识或旧权限 | point dependency、权限范围失效、缺依赖时整域失效 |
| LightRAG 删除残留 | tombstone、projection 状态、每日 audit |
| LightRAG 不支持可靠局部删除 | 对象投影包重建或新 workspace generation 影子切换 |
| LLM 抽取产生错误关系 | LightRAG 图只作召回投影，最终证据回到 canonical source |
| Prompt Injection | evidence 隔离、系统指令、来源复核、负向测试 |
| 查询内容进入日志 | 默认只存 query hash 和来源 UID |
| 模型/侧车不可用 | 标准链路和 retrieval-only 降级 |
| Outbox 被误当多消费者 | 单 KnowledgeIndexHandler + projection queue |

## 18. 完成定义

只有同时满足以下条件才算知识库落地完成：

1. 五类治理对象都能生成稳定、可复现的知识点集合和依赖关系；
2. 新增、修改、删除和权限变化都形成可审计 change set，并正确区分
   added/modified/deleted/unchanged/impacted；
3. 已声明依赖规则能够有界传播，超过阈值时自动升级为 generation 重建而不是发布
   不完整结果；
4. unchanged point 不重复生成 embedding，changed/impacted point 只重建必要产物；
5. point/document/chunk/embedding 使用 prepare/validate/activate 原子切换，失败时旧
   active 版本持续可用；
6. 删除和权限收紧在批准 SLA 内使 canonical 内容不可见，缓存和 LightRAG 残留可
   检测、可清理；
7. 五类治理对象均可增量同步、删除、每日校验和安全回滚；
8. 新旧索引 generation 可影子构建、原子切换和回退；
9. viewer/editor/admin 与业务域授权均由服务端执行；
10. search、ask、source、change set 和 admin API 契约稳定；
11. 精确、语义、治理图、LightRAG、Diff、影响传播和缓存失效路径可观测；
12. LightRAG 下线不影响标准检索，且旧投影上下文不能绕过 canonical 复核；
13. 所有回答有合法 UID/version/point revision/generation 引用，或明确拒答；
14. 权限、Prompt Injection、stale/deleted、动态更新和模型失败测试通过；
15. 静态黄金集、时序变更黄金集、质量指标和性能门禁全部通过；
16. 前端、后端、迁移、worker、相关容器和浏览器验收留下验证记录。

## 19. 推荐的首个实现切片

实施开始时不要先部署完整 LightRAG。首个切片固定为：

1. V100 业务域授权、知识点/change set 表和 embedding profile；
2. DataFlow/BusinessDomain 两类规范化文档与稳定 point builders；
3. 用“修改 purpose、修改 owner、增删 READS_FROM、权限收紧、删除对象”验证
   Diff、影响传播、原子切换和缓存失效；
4. lexical + pgvector 的 LlamaIndex `/search`，引用返回 point revision 和 generation；
5. 30–50 条静态黄金集 + 10–20 条时序变更黄金集；
6. 单业务域 LightRAG shadow PoC，实测删除粒度和残留检测；
7. 达到动态更新、来源映射和权限门槛后再进入 K3。

这样可以先证明 DataOps 自身的知识身份、变化传播、发布一致性和检索基础正确，再
判断 LightRAG 的真实增益，避免把知识点错配、陈旧缓存、基础分块、授权或引用问题
误判为图算法问题。
