状态:技术方案已确认,尚未进入代码实施。
目标:在不替换 DataOps 控制面、治理 Neo4j 和现有 PostgreSQL 的前提下, 交付权限安全、可追溯、可评测、可降级,并能随治理事实变化进行知识点级 增量更新的治理知识库。
2026-07-22 修订:将知识点版本、语义 Diff、依赖影响传播、增量索引、缓存失效 和原子发布纳入正式实施范围;不再把“对象级文档重建”视为动态更新的完整实现。
本计划采用:
知识动态更新采用:
point_key:标识跨版本不变的知识语义位置;knowledge_points:保存知识点版本和有效期;knowledge_point_dependencies:保存治理事实和确定性规则形成的依赖;knowledge_change_sets:记录一次变更的 Diff、影响范围、发布和回滚状态;added、modified、deleted、unchanged;不采用:
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 已保留“数据治理知识库”入口。governance_chunks 没有词法索引、结构化 metadata、section path 和 token 数。point_key。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、来源对象和版本。
建议新增:
migrations/versions/20260720_100_llamaindex_lightrag_knowledge.py
revision = "20260720_100"down_revision = "20260719_90"新增 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;新增 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、固定语义路径和稳定关系类型构成,不包含显示名称、数组
下标、文本内容或内容哈希。例如:
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,否则重排会被误判为批量删除与新增。
新增 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;caused_by_point_key 与传播 hop;新增 knowledge_cache_dependencies:
| 字段 | 说明 |
|---|---|
cache_key_hash |
不记录原始查询文本的缓存键哈希 |
point_key |
回答或检索结果依赖的知识点 |
point_revision |
生成缓存时使用的知识点版本 |
generation |
索引 generation |
expires_at |
最大生存时间 |
任何 modified、deleted、权限收紧或 active generation 切换都按 point_key
删除相关缓存;依赖记录缺失时必须失效整个业务域缓存,不能继续返回无法证明新鲜度的
结果。
扩展 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 自带分词:
pg_trgm 召回独立计分;zhparser 必须经过独立镜像、许可证和部署验证,不作为首期前置条件。每个 chunk 新增:
primary_point_key:该 chunk 的主要知识点;point_keys JSONB:chunk 覆盖的全部知识点;point_set_hash:知识点集合和版本哈希;change_set_id:生成本 chunk 的 change set。同一知识点可以映射到多个 chunk,一个 chunk 也可以包含多个紧密相关知识点;但每个 chunk 必须能反查其知识点依赖,支持精准重建、缓存失效和引用新鲜度校验。
新增 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);现有 governance_chunks.embedding* 字段首期保留兼容,不在同一迁移中删除。
完成双读、回填和切换后再单独下线。
维度变化不允许写入同一个 vector(1024) 表。必须建立新维度的 shadow 表和新
profile,完整重建并切换。
knowledge_chunk_embeddings.embedding_hash 必须包含规范化 chunk hash、模型、维度
和 tokenizer profile。知识点集合与内容均未变化时复用现有 embedding;只改变责任人
等独立知识点时,不重算无关 definition/relation chunk。
新增 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 契约测试确认,不能假设底层支持不存在的局部更新语义。
新增:
knowledge_query_auditsknowledge_evaluation_setsknowledge_evaluation_casesknowledge_evaluation_runsknowledge_evaluation_results查询审计默认只保存:
point_key、point revision、source update time 和 index generation;如需保存问题/答案样本,必须由管理员显式标记并进入有保留期限的评测集。
替换紧凑 JSON + 固定字符切割,按对象类型使用确定性模板。
每个 canonical document 至少包含:
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...
构建规则:
point_key、semantic path、content hash 和依赖端点;unchanged;point_key,但名称知识点内容和依赖它的检索别名会更新;每类对象必须实现 KnowledgePointBuilder,输出排序稳定的:
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、权限或版本。
治理写路径在同一业务事务中产生:
governance.business_domain.changedgovernance.dataflow.changedgovernance.metadata.changedgovernance.standard.changedgovernance.label.changedgovernance.object.deletedpayload 只包含:
事件处理规则:
(source_type, source_uid, source_revision) 幂等;当前 Outbox 的 event status 是全局状态,不能让 canonical indexer 与 LightRAG 各自 claim 同一个事件。
首期采用:
governance.* 只注册一个 KnowledgeIndexHandler;knowledge_change_sets,执行快照、Diff、影响分析和
canonical 发布;knowledge_index_projections(status='pending');同一 (source_type, source_uid) 的 Diff 与 activate 必须串行。实现使用数据库行锁或
transaction-scoped advisory lock;锁内再次读取当前 active source revision,防止两个
worker 分别基于同一旧快照发布出相互覆盖的版本。不同来源对象可以并行处理。
未来若其他业务也需要 fan-out,再独立增加 outbox_deliveries,不在本阶段扩大。
KnowledgeIndexHandler 对每个事件执行:
KnowledgePointBuilder 构建新 KnowledgeSnapshot;point_key 对比 old/new snapshot;unchanged point 复用 active point/chunk/embedding;added、modified、deleted 进入影响分析。Diff 判定:
| 情况 | change kind | 后续动作 |
|---|---|---|
| 新快照有、旧快照无 | added |
新建 point、chunk、embedding 和投影 |
| 两边都有、content/metadata/permission hash 变化 | modified |
建新版本,重建相关产物 |
| 旧快照有、新快照无 | deleted |
准备 tombstone,删除相关产物 |
| key 和所有语义 hash 相同 | unchanged |
复用,不调用 embedding |
权限 hash 单独比较。权限扩大按普通修改发布;权限收紧进入高优先级安全路径,不等待 LightRAG 或 embedding 完成后才禁止旧内容查询。
直接 Diff 完成后,从 added、modified、deleted point 沿
knowledge_point_dependencies 计算受影响集合:
impacted item 记录根因 point、关系路径和 hop;impact_truncated=true,为相关业务域创建新 generation 影子重建,
不发布不完整的局部结果。impacted 只表示“需要重新验证或重建”,不表示依赖方的治理事实已经变化。对依赖方:
首期传播规则至少覆盖:
每个 change set 使用 prepare -> validate -> activate:
building 版本;至少检查:
在单个 PostgreSQL 事务中:
superseded 或 deleted;active;canonical_active 并提交;投影 worker 开始后转为 projecting,
异步投影完成后转为 complete,超过重试或 SLA 时转为 degraded,但不回滚已正确
发布的 canonical 版本。Qwen、校验或事务失败时,旧 active 版本保持不变,building 产物可重试或清理。禁止 逐 point 提交后再补偿,因为这会暴露半新半旧的对象快照。
删除对象:
deleting;deleted,失败有上限重试并告警;权限收紧、敏感级别提升和业务域移出使用相同的高优先级撤销通道:先在 canonical 授权层拒绝访问并失效缓存,再异步修正 embedding metadata 和 LightRAG workspace。 紧急撤销 SLA 需要在 K1D 确认;在 SLA 未验证前不得声称外部投影已实现实时删除。
检索结果缓存和答案缓存都必须记录 point_key + point revision + 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 不一致,或无法证明缓存依赖完整。
LightRAG 的实际更新粒度由 K0 契约测试决定:
新 workspace 激活前必须验证 active point 覆盖率、孤儿来源数、删除残留、权限分区和 黄金集结果。旧 workspace 保留到回滚窗口结束后再异步回收。
巡检比较:
默认 report-only;只有显式 --repair 才修复派生数据差异,不删除源治理数据。
repair 必须创建独立 change set,保留修复前后审计记录。
新增:
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
每次查询在 API 层构建不可变上下文:
KnowledgeAccessContext(
subject_id=...,
roles=frozenset(...),
permissions=frozenset(...),
business_domain_uids=frozenset(...),
correlation_id=...,
)
禁止 Retriever 自己从请求 JSON 接受任意业务域。客户端 filters 只能缩小服务端 已计算范围,不能扩大范围。
用于:
point_keys、point revisions 和 generation,不返回框架
生成的临时 ID。只读查询现有 Neo4j:
mix 和 only_need_context;首期使用可测试的确定性规则,不用 LLM 决定权限或任意路由。
| 模式 | 触发条件 | Retriever |
|---|---|---|
exact |
编码、表名、字段名、显式引号 | lexical + vector |
semantic |
定义、含义、用途、负责人 | lexical + vector |
relationship |
上游、下游、依赖、关联、经过 | vector + governance graph |
global |
整体、主要主题、跨域总结 | vector + LightRAG |
auto |
服务端确定性分类 | 上述之一 |
用户可请求更窄模式,但不能强制访问未授权 LightRAG workspace。
初始可调参数:
k=60;这些只是起始配置,必须由黄金问题集调优,不能写死为“最佳参数”。
回答必须满足:
object_uid + object_version + point_key + point_revision + chunk_id;新增 Compose 服务:
lightraglightrag-projectorlightrag-neo4j存储:
dataops_lightrag 和独立账号;public schema;镜像和 Python 包必须固定版本或 digest。不得使用 floating latest。
workspace 使用稳定安全分区:
dataops-{tenant_or_global}-{business_domain_uid}-g{generation}
首期如果没有 tenant,固定使用 global,但仍按业务域分区。
由于官方 LightRAG Server 的 workspace 是实例级配置,实施顺序为:
LightRAGClient 对上层暴露稳定接口:
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,不进入领域代码和前端。
新增蓝图:
app/api/knowledge_base/
注册前缀:
/api/knowledge
| 方法 | 路径 | 权限 | 用途 |
|---|---|---|---|
| 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。
新增权限:
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 |
评测运行与门禁结果 |
统一包含:
{
"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"
}
修改:
frontend/src/views/knowledgeBaseProduct/index.vuefrontend/src/api/governanceKnowledge.jsfrontend/src/views/knowledgeBaseProduct/components/首期页面:
auto / 精确 / 语义 / 关系 / 全局 模式;前端不得:
将知识库依赖与核心依赖分组并锁定:
llama-index-core不安装 llama-index 全量 starter,避免引入未使用 provider。
实施前做 Python 3.11、SQLAlchemy 2.0、NumPy 和现有 OpenAI SDK 的兼容性
spike。通过后将精确版本写入锁定文件;不得仅使用宽松 >=。
LightRAG 保持独立镜像,不安装进 Flask backend,避免依赖冲突和扩大镜像。
新增但不提供生产默认密钥:
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
日志只能记录配置是否存在、模型名和配置哈希,不能记录密钥。
| 故障 | 行为 |
|---|---|
| LightRAG 不可用 | 标准链路继续,标记 graph enhanced degraded |
| 治理 Neo4j 不可用 | lexical + vector |
| pgvector 不可用 | lexical;ask 默认不生成或明确证据不足 |
| reranker 不可用 | RRF 结果,降低置信度 |
| Qwen 不可用 | 停止新索引;旧 active index 可查 |
| DeepSeek 不可用 | search 可用;ask 返回来源和模型不可用状态 |
| 新 generation 构建失败 | 保留旧 active generation |
首期 150–300 条,包含:
每条至少标注:
固定比较:
初始验收目标:
LightRAG 正式放量还必须满足:
LlamaIndex + governance graph 提升至少 10 个百分点;黄金集必须增加“变更前问题 + 变更操作 + 变更后预期”的时序用例,至少覆盖:
新增门禁指标:
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 与发布"]
实施:
退出门槛:
回滚:
主要文件:
app/core/knowledge/access.pydocument_builder.pysync.py测试:
退出门槛:
主要文件:
knowledge_points、knowledge_point_dependencies、
knowledge_change_sets、knowledge_change_items、knowledge_cache_dependencies;app/core/knowledge/point_builder.pyapp/core/knowledge/contracts.pyapp/core/knowledge/chunking.py实施:
BusinessDomain 和 DataFlow 的 point builders;测试:
point_key golden fixtures;退出门槛:
主要文件:
app/core/knowledge/diff.pyapp/core/knowledge/impact.pyapp/core/knowledge/sync.py实施:
point_key 计算 added/modified/deleted/unchanged;测试:
退出门槛:
canonical_active。主要文件:
app/core/knowledge/publish.pyapp/core/knowledge/cache_invalidation.pyapp/core/knowledge/audit.py实施:
测试:
退出门槛:
主要文件:
llamaindex/node_mapper.pyllamaindex/vector_store.py/api/knowledge/search。测试:
退出门槛:
主要文件:
lightrag/client.pylightrag/projection.py测试:
退出门槛:
shadow_only=true;主要文件:
/api/knowledge/ask;测试:
退出门槛:
实施:
退出门槛:
实施:
退出门槛:
docs/validation/knowledge-k6.md。新增建议:
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
验证分层:
| 风险 | 控制 |
|---|---|
| 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 |
只有同时满足以下条件才算知识库落地完成:
实施开始时不要先部署完整 LightRAG。首个切片固定为:
/search,引用返回 point revision 和 generation;这样可以先证明 DataOps 自身的知识身份、变化传播、发布一致性和检索基础正确,再 判断 LightRAG 的真实增益,避免把知识点错配、陈旧缓存、基础分块、授权或引用问题 误判为图算法问题。