SVO语义检索的系统化方案

SVO 语义检索的系统化方案

本方案描述的是检索架构。SVO 算子定义、原子分类、拓扑模型、可读性建议等基础规范见 SVO语义矢量算子手册.md;大脑记忆四大机制的生物学原型见 大脑记忆的核心机制.md。本文不重复上述内容,只在关键处回指。

立场:入库拆解、门控字段、边权分化、基础激活等全部是工程需要。表达层的算式只需满足手册的硬性约束(§1.1),工程层单向从合法算式中抽取所需字段。任何为让检索工作而反向约束表达的规则,都不应出现在手册或指令文档中


零、方案概要

一句话:检索 = 概念向量入口 + 类型化图扩散 + 门控与基础激活调节 + 能量阈值输出

四步对应大脑扩散激活大脑记忆的核心机制.md §四):

生物机制 工程实现
入口激活(线索点亮节点) 查询 → SVO 解析出概念簇 → 向量索引 top-K → 初始能量
沿边扩散(能量按边权流动) 类型化有向图上并行 BFS,边权按 : / > / 连词类分化
激活汇聚叠加(多线索交汇) 多源能量在公共邻居上求和;门控冲突乘惩罚;扇出归一化
阈值触发(累积高的浮现) threshold 过滤 + conclu / info / output 三层输出

为什么是扩散模型(这是整份方案的设计根基):

SVO 二元本体(SVO语义矢量算子手册.md §1.2)在图上的同构

属性和力在本体上是两类基本实体,在图上就是两类基本结构——向量空间主要承载属性(静态标签),图结构主要承载力(动态流向)。


一、相关性分层

检索相关性分六层,由图中不同机制承担。"每层一个专用索引"被扩散架构收敛为"一张图 + 一个向量索引 + 类型化边":

层级 含义 承担机制
L1 概念相关 词项语义相似("汽车"→"SUV") 概念向量索引(唯一入口)
L2 命题相关 主谓宾整体对齐 入口概念经槽位边 1 跳激活动作命题
L3 作用域相关 话题/身份/范围/句子级副词匹配 scope/sentence_mod 概念经修饰边激活命题
L4 推导相关 条件/让步/因果链前后件匹配 扩散至逻辑命题 + 沿逻辑前件边/后件边双向展开
L5 蕴含相关 否定/量词/模态区分 节点门控属性能量衰减(软约束)
L6 结构类比 骨架相同实体不同 扩散的自然副产物(同构命题图距近)

奥卡姆式收敛:L2–L6 全部交给同一张图的类型化扩散;只有 L1 保留独立的向量索引。相比"倒排索引 + 结构哈希 + 前后件向量 + …"的多索引方案,扩散模型用"图拓扑本身承载结构语义"替代了多数专用索引。


二、入库:从 SVO 表达式到类型化图谱

2.1 三类原子节点(长期记忆的分布式单元)

SVO 表达式不作为整体被索引。解析后分解为三类节点,对应大脑皮层的三种模式:

节点 SVO 形式 皮层类比
概念簇(concept) 红:苹果(前:负责人):Karpathy(AI:方面)显然 分布式表征的最小单元(类 V1–IT 的层次特征)
动作命题(action_proposition) S > V > O(含空补语/引用宾语) 一条"事件索引"——主谓宾是海马体打包的最小共激活单元
逻辑命题(logical_proposition) 前件 > 连词 > 后件 两条事件索引之间的"关系索引"

概念簇的 role(按手册 §1.2.1 的属性本体分类,入库自动判别):

role 用于按角色分流召回(§4.3),不改变图结构。

致使/条件/让步结构的嵌入命题(手册 §1.1-4)被显式封装为独立命题节点,> 连接词变为逻辑命题的 connector。例如:

论文 > 促使 > (Tishby > 认识到 > (理论 > (可能:涵盖) > (广泛:过程)))

入库为:

P1 = Tishby > 认识到 > P2             (action; object_ref=P2)
P2 = 理论 > (可能:涵盖) > (广泛:过程)   (action)
L1 = 论文 > 促使 > P1                 (logical; connector_class=致使; antecedent="论文", consequent=P1)

2.2 三类引用关系边(海马体索引的具象化)

原子之间通过 PropRef 引用关系相连,对应图中三类有权有向边:

ref_type 典型 SVO 形式 图中边类型 默认基础权重
slot S > V > O 的 S、O 槽位 槽位边 concept ⇄ action 0.8
utterance K > 表示 > (P)、认知指向类 言说引用边 action → action 0.5
modifier 显然 : (P)(AI:方面) : (P) 修饰边 scope/sent_mod → proposition 0.6
logical (P1) > 则 > (P2) 逻辑前件边 / 逻辑后件边 按连词类分化(§3.2)

边的方向 = 能量流动方向(与 > 本体定义一致):条件 → 结论、原因 → 结果、前件 → 后件、说话者 → 言说内容。

2.3 节点门控属性(软过滤调节器 = 神经调质)

门控对应神经调质(多巴胺/去甲肾上腺素/乙酰胆碱)——不改变拓扑,只调节能量传递

字段 取值 作用层
polarity +1 / −1 L5 否定
quantifier 所有 / 某 / 没有 / NULL L5 量词
modality 必须 / 可能 / NULL L5 模态
voice active / passive / NULL L2 语态一致性
connector_class 条件 / 让步 / 因果 / 推论 / 目的 / 致使 / 认知 / 比较 / 言说(仅逻辑命题) L4 连词类型

门控冲突惩罚:扩散时若源节点与目标节点的门控字段均非 NULL 且不相等,该条边传递的能量乘 gate_penalty(默认 0.1)。NULL 视为"未指定",不触发惩罚。

voice 字段的关键作用:把"被"从概念簇的修饰中抽离。A > 发布 > B(active)与 B > 被:发布(passive)应识别为同一事件的两种语态,入库管线自动抽取 voice=passive,而不是让"被"成为概念簇的一部分污染嵌入空间。

2.4 边权重:按类型与连词类分化

连词权重按类别而非按具体词(条件类涵盖"则/否则/除非/当/只有",作者写哪个都归同一类):

连词类 默认权重 代表词
因果类 0.80 导致、使得、造成、引起、以致
致使类 0.75 促使、迫使、让、令、使、催生
条件类 0.70 则、否则、除非、当、只有
推论类 0.70 因此、所以、从而、故而、进而
认知指向 0.60 表示、认为、知道、察觉、发现
言说引导 0.60 说、告知、声明、问、答
比较类 0.60 比、胜过、不如、堪比、逊于
目的类 0.50 以便、为了、旨在、力求
让步类 0.30 尽管、虽然、即使、纵然(反预期,能量传递弱)

归类由入库管线完成:作者按原句写任意连接词,管线查表归入九类之一。新词加入对应类别,不修改表达层规则

2.5 基础激活 B_i(ACT-R,使用频率与近因)

借鉴 ACT-R 的 Base-Level Activation(大脑记忆的核心机制.md §5.2),每个节点维护:

$$ B_i = \ln!\left(\sum_{k=1}^{n} t_k^{-d}\right) $$

其中 t_k 是节点第 k 次被命中时距今的秒数,d 默认 0.5。

最终节点能量(混合扩散能量 a_i 与基础激活 B_i):

E_i = a_i + α · softplus(B_i)        α = 0.1(默认)

α 不宜过大,否则热门节点永远被召回(priming 失控)。仅 conclu 排序用 E_i,扩散过程本身仍用 a_i,避免基础激活层层累乘。

2.6 源表达式索引(海马体快照)

每个原子节点都挂一个 source_expr_id,回指完整的 SVO 算式 + 自然语言原句 + 文档位置。这层对应海马体保留的"共激活指针"——多次命中时,大脑通过索引同步回放所有相关皮层。工程上用它做:


三、概念向量索引(唯一独立索引 = 分布式表征)

扩散起点。查询解析得到的每个概念簇,在此索引上取 top-K 作为图入口。

3.1 编码策略:两阶段

阶段一(零训练,立即可用):加性组合

v(concept) = v(核心词) + Σ α^depth · v(修饰词_i)
α = 0.8

深度按 SVO 绑定的嵌套层级定义:最外层核心词 depth=0,每多一层 : 深度 +1。

阶段二(微调,精度提升):BGE-base / Qwen3-Embedding 主干 + 按 role 训练 4 个 LoRA 适配器(entity/concept/scope/sentence_mod),不强行统一编码空间。

训练对比对(阶段二):

3.2 按 role 分流召回

在一个大向量库中用 role metadata 过滤子集召回:

避免 (AI:方面) 作为 scope 被当成 AI 实体召回(它们表达不同的本体角色)。

3.3 属性 / 力双子空间(可选,阶段二上线)

手册 §1.2 的二元本体建议显式投影到两个子空间(同一主干 + 两个投影头):

两个子空间独立归一化,避免属性向量被力向量拉偏。


四、扩散激活检索流程

4.1 完整流程(与大脑四步严格对应)

查询(自然语言或 SVO 算式)
  │
  ① 入口激活 ─ SVO 解析 → 概念簇集合
  │   ├─ 解析成功:每个概念簇在向量索引取 top-K,初始 a_i = 余弦相似度
  │   └─ 解析失败:整句向量化作单入口,降级模式(保证服务可用)
  │
  ② 沿边扩散 ─ 并行 BFS,最多 max_hops 跳
  │   ├─ 每一跳按边权衰减
  │   ├─ 节点门控软过滤(冲突 × gate_penalty)
  │   ├─ 扇出归一化(fan effect 防 hub 吞能)
  │   └─ 全局距离衰减 global_decay
  │
  ③ 激活汇聚叠加 ─ 多源能量在公共邻居上求和
  │   └─ 噪声互相抵消、信号互相增强 = 模糊检索
  │
  ④ 阈值触发 ─ E_i = a_i + α·softplus(B_i) ≥ threshold
      ├─ conclu:按 source_expr 聚合能量,top-M 返回
      ├─ info:top-N 原子,带能量与命中路径
      └─ output:沿逻辑链前后展开至 logic_chain_max_depth

4.2 能量传播公式

每一跳:

a_j(t+1) = Σ_i [ a_i(t) · w_type(i→j) · gate(i,j) · fan_norm(i) ] · global_decay

其中:

可行性自检(这些常数必须满足能量能跨 2 跳存活):

初始能量 ≈ 0.9(cosine)
1 跳后 ≈ 0.9 × 0.8 × 1.0 × 0.7 ≈ 0.50   > threshold=0.05  ✓
2 跳后 ≈ 0.50 × 0.7 × 1.0 × 0.7 ≈ 0.25   > threshold       ✓
门控冲突 1 跳 ≈ 0.9 × 0.8 × 0.1 × 0.7 ≈ 0.05   勉强达阈   ✓(正符合"冲突项压到阈值附近"的设计)
让步类 1 跳 ≈ 0.9 × 0.3 × 1.0 × 0.7 ≈ 0.19     低但存活  ✓

最终排序能量(§2.5):E_i = a_i + 0.1 · softplus(B_i)

4.3 扇出归一化(fan effect)

ACT-R 的扇出效应:高出度节点("AI"、"机器学习"、"深度学习")的能量均摊到所有出边。

fan_norm(i) = 1/√fan_out(i) 仅当 fan_out(i) > fan_trigger=20 触发。低出度节点不惩罚,避免过早衰减冷门节点。

监控指标:top-20 最高出度节点在 conclu 占总能量比例应 < 30%,否则提高归一化强度或降低 fan_trigger

4.4 门控冲突的精细化(阶段二)

默认所有冲突乘同一个 gate_penalty=0.1。阶段二按冲突类型分化:

冲突类型 默认惩罚 理由
polarity 翻转(肯定 vs 否定) 0.05 最强信号,近乎反义
quantifier 不一致(所有 vs 某 vs 没有) 0.20 弱于极性但确实改变真值
modality 不一致(必须 vs 可能) 0.40 最弱,常表示近似信息
voice 不一致(active vs passive) 1.00 不扣分——同一事件的两种语态
connector_class 不一致 0.25 已由边权分化承担一部分

4.5 默认参数(写入 config.yaml

activation:
  entry_top_k: 5              # 每入口概念召回候选数
  max_hops: 2                 # 最大扩散跳数
  global_decay: 0.7           # 每跳全局距离衰减
  threshold: 0.05             # 节点最低保留能量
  gate_penalty: 0.10          # 默认冲突惩罚(阶段一)
  fan_trigger: 20             # 出度超此值启用 fan 归一化
  fan_normalizer: sqrt        # sqrt / linear / none
  base_activation_alpha: 0.10 # 基础激活混合系数
  max_visited_nodes: 10000    # 防退化上限

edge_weight:
  slot: 0.80
  utterance: 0.50
  modifier: 0.60
  logical:
    因果: 0.80
    致使: 0.75
    条件: 0.70
    推论: 0.70
    认知: 0.60
    言说: 0.60
    比较: 0.60
    目的: 0.50
    让步: 0.30

output:
  conclu_top_m: 10            # 结论层表达式数
  info_top_n: 30              # 证据层原子数
  logic_chain_max_depth: 4    # 逻辑链展开深度

4.6 三层输出契约(向下兼容现有 BuildContextFragments

def SpreadingActivationSearch(query: str) -> tuple[str, str, str]:
    """返回 (conclu, info, output)"""

4.7 典型扩散场景

查询 扩散行为 结果
(模型>开源) > 则 > (?) 入口激活 模型开源 → 槽位边到命题 模型>开源 → 逻辑前件边 connector_class=条件 的后件能量最高
所有:学生 > 通过 > 考试 候选 某:学生 > 通过 > 考试 因 quantifier 冲突能量 × 0.2 量词匹配命题排前
现有:框架 > 适用 候选 现有:框架 > 不:适用 因 polarity 冲突 × 0.05 反义命题降至阈值以下
(AI:方面) : (K > 偏向 > X) scope 入口经修饰边激活命题;其他域命题拿不到此路径能量 域外相关命题降权
A 促使 B 认识到 C 类比 结构同构命题在图中拓扑接近,扩散自然汇聚 L6 类比无需专门结构哈希
谁说 AGI 还要十年 AGI十年之遥 入口 → 动作命题 → utterance 反向边 言说者节点浮现

五、数据模型

-- 概念簇(唯一向量索引)
CREATE TABLE concept (
  id BIGSERIAL PRIMARY KEY,
  canonical TEXT NOT NULL,                   -- (前:负责人):Karpathy
  core_word TEXT NOT NULL,                   -- Karpathy
  modifiers TEXT[] NOT NULL,                 -- [前, 负责人]
  role VARCHAR(16) NOT NULL,                 -- entity|concept|scope|sentence_mod
  vector VECTOR(768),
  base_activation FLOAT NOT NULL DEFAULT 0,  -- B_i
  last_hits_ts TIMESTAMPTZ[]                 -- 最近 N 次命中时戳(环形缓冲,计算 B_i 用)
);
CREATE INDEX idx_concept_role ON concept(role);

-- 动作命题(图节点)
CREATE TABLE action_proposition (
  id BIGSERIAL PRIMARY KEY,
  subject_id BIGINT REFERENCES concept(id),
  verb TEXT NOT NULL,
  object_id BIGINT REFERENCES concept(id),   -- NULL 时宾语是 PropRef
  object_ref BIGINT,                         -- PropRef 指向另一命题
  polarity SMALLINT NOT NULL DEFAULT 1,      -- 门控
  modality VARCHAR(16),                      -- 门控
  quantifier VARCHAR(16),                    -- 门控
  voice VARCHAR(8) DEFAULT 'active',         -- 门控:active/passive
  base_activation FLOAT NOT NULL DEFAULT 0,
  last_hits_ts TIMESTAMPTZ[],
  source_expr_id BIGINT NOT NULL
);

-- 逻辑命题(图节点)
CREATE TABLE logical_proposition (
  id BIGSERIAL PRIMARY KEY,
  antecedent_id BIGINT NOT NULL REFERENCES action_proposition(id),
  connector_raw TEXT NOT NULL,               -- 原句连接词(则/尽管/由于/从而迫使/...)
  connector_class VARCHAR(16) NOT NULL,      -- 九类之一:条件/让步/因果/推论/目的/致使/认知/比较/言说
  consequent_id BIGINT NOT NULL REFERENCES action_proposition(id),
  base_activation FLOAT NOT NULL DEFAULT 0,
  last_hits_ts TIMESTAMPTZ[],
  source_expr_id BIGINT NOT NULL
);
CREATE INDEX idx_logical_class ON logical_proposition(connector_class);

-- 引用关系(图边表;双向索引即邻接结构)
CREATE TABLE prop_ref (
  id BIGSERIAL PRIMARY KEY,
  source_type VARCHAR(16) NOT NULL,          -- action|logical|concept
  source_id BIGINT NOT NULL,
  target_type VARCHAR(16) NOT NULL,          -- action|logical|concept
  target_id BIGINT NOT NULL,
  ref_type VARCHAR(16) NOT NULL,             -- slot|utterance|modifier|logical_ante|logical_cons
  weight_override FLOAT                      -- 阶段三学习权重,NULL 用类型默认
);
CREATE INDEX idx_ref_target ON prop_ref(target_type, target_id, ref_type);
CREATE INDEX idx_ref_source ON prop_ref(source_type, source_id, ref_type);

-- 源表达式(conclu 聚合回溯 = 海马体快照)
CREATE TABLE source_expression (
  id BIGSERIAL PRIMARY KEY,
  canonical TEXT NOT NULL,                   -- SVO canonical
  natural TEXT NOT NULL,                     -- 自然语言原句
  doc_id BIGINT,
  line_no INT,
  base_activation FLOAT NOT NULL DEFAULT 0,
  last_hits_ts TIMESTAMPTZ[]
);

关键设计


六、记忆巩固:离线重放与再巩固

这一节是本方案相对旧版的核心增量——把大脑记忆"快照 → 回放 → 巩固"大脑记忆的核心机制.md §三、§5.4)显式搬入工程层。

6.1 海马体 ↔ 皮层:两层记忆组织

类比 CLS(Complementary Learning Systems, 大脑记忆的核心机制.md §5.4): 短期系统承担单次事件的快速记录,长期系统从反复回放中提取统计规律。

6.2 在线命中即重巩固(reconsolidation)

每次查询命中后,对命中的源表达式与其内部原子执行:

def on_hit(node, now):
    node.last_hits_ts.append(now)
    if len(node.last_hits_ts) > MAX_HITS_BUFFER:
        node.last_hits_ts.pop(0)
    node.base_activation = log_sum_power_decay(node.last_hits_ts, d=0.5)

效应:

6.3 离线巩固任务(类慢波睡眠)

定时任务(每日/每周)执行:

  1. 扫描高频共现边:过去 N 天查询中,哪两个节点经常同时被高能量激活 → 记录为候选赫布强化对。
  2. 赫布更新 weight_override
    Δw_ij = η · a_i · a_j · μ
    η = 0.01(学习率)
    μ ∈ [0.5, 2.0] 按情绪/显著性(见 §6.4)
    
  3. 突触稳态归一化:每个节点所有出边权重之和若超过 homeostasis_cap(默认 N × base_weight),整体等比缩放——防止某些节点所有出边无限增强。
  4. 提取规律到皮层层:如果 A → B → C 的路径在多次查询中都被高能量激活,可增加 A → C 的快捷边(学习到的规律性连接,阶段三才启用)。

这对应脑的慢波睡眠回放大脑记忆的核心机制.md §3.3, §6.2): Experience replay(RL)、多 epoch 训练都是对应的工程机制。

6.4 情绪 / 显著性门控(可选)

不是所有命中都值得长期巩固。可引入 salience 信号作为神经调质 μ:

信号 μ 乘数 说明
用户显式反馈(点赞 / 采用) 2.0 最强显著性
LLM 生成时引用 1.5 下游任务确认有用
单次查询中能量异常高(> μ+2σ) 1.2 明确命中
普通命中 1.0 基线
疑似噪声召回(能量极低) 0.5 弱化,防止扩散噪声被固化

μ 对应多巴胺(预测奖赏)、去甲肾上腺素(惊讶)、乙酰胆碱(专注)的联合调节(大脑记忆的核心机制.md §2.3)。


七、核心挑战与对策

7.1 SVO 解析器稳定性(最大风险点)

扩散架构对解析器依赖比旧架构更重——解析结果直接决定入口概念集合。

行动指引

  1. 解析一致率基准:500 句自然语言 × 10 个人工改写(同语义),统计结构指纹一致率。
  2. 一致率门槛:< 85% 不得投入生产。
  3. 双轨降级:解析成功 → 多入口;解析失败 → 整句向量化单入口(§4.1)。
  4. 重点稳定"作用域 vs 条件"识别:中文"在 X 的情况下"歧义最高,必须用上下文特征分类,不能靠正则。
  5. 解析器版本化:每次解析器升级重建全量 concept 向量与 prop_ref;灰度期保留两份索引。

7.2 编码器敏感度要求

向量层需区分:

注意:极性翻转、连词翻转主要由门控 + 边权分化承担,向量辅助。不要试图让向量承担全部语义区分——那是旧架构的技术债。

7.3 参数校准(扩散架构特有)

方法:阶段一 100 条 (query, expected) 标注 + 脚本化 grid search;阶段二 500+ 对监督学习。

7.4 Hub 能量流失

中心节点("AI"、"模型"、"深度学习")因入度/出度极高,容易吞掉全图能量或把能量分散到无关节点。

对策分层

  1. 扇出归一化(§4.3):已在公式内置
  2. 阶段二边权学习:度越高的节点,出边基础权重按 1/log(fan_out) 再衰减
  3. 阶段三 edge attention:用 GNN 学习上下文相关的边权

八、工程落地路径

8.1 基础设施选型

组件 选型 理由
概念向量索引 Qdrant / Milvus / MindStore 支持按 metadata(role)过滤
关系表 & 图边表 Postgres 外键一致,prop_ref 双向索引即邻接结构
内存图 numpy / scipy sparse 百万节点 ≈ 500 MB
编码器 BGE-base / Qwen3-Embedding + LoRA 中文效果好、微调成本低;复用本仓库已有 checkpoint
扩散算法 纯 Python 模块 无需新服务;热点可异步 C 扩展
离线巩固 Airflow / 定时脚本 每日/每周跑 §6.3

废弃基础设施(相对旧四层索引):

8.2 三阶段演进

阶段一 MVP(2–4 周)

阶段二 精度提升(1–2 月)

阶段三 持续优化

8.3 评估指标

SVO 固有指标: 角色准确率 / 极性准确率 / 量词一致率 / 作用域覆盖率 / 嵌套深度保持率 / 连词一致率 / 逻辑链完整率。

扩散架构新增指标

指标 定义 目标
扩散覆盖率 目标命题在 2 跳内被激活到的比例 > 90%
能量信噪比 top-K 结果能量均值 / 第 K+1 位能量 > 2.0
Hub 能量占比 top-20 最高出度节点能量 / 总能量 < 30%
门控过滤准确率 冲突门控命题被压至阈值以下的比例 > 85%
基础激活效应 priming 命中在同一会话内耗时下降比例 阶段二 > 20%
巩固稳定性 离线巩固前后 top-10 变化率 < 15%(避免震荡)

九、操作快查表

检索需求 扩散实现
含特定实体的表达式 实体词为入口概念激活
含特定话题 / 场景 scope 概念为入口 + 修饰边 1 跳
含句子级态度词("显然") sentence_mod 概念为入口
角色精确匹配动作命题 入口 + 槽位边 1 跳
结构类比动作命题 多入口扩散自然实现
语义模糊相似动作命题 入口 top-K + 扩散 2 跳
"如果 X 则…"推导 X 入口 → 激活逻辑命题 → 后件边,connector_class=条件 权重最高
"…导致 X"推导 X 入口反向沿前件边,connector_class=因果 权重最高
特定连词推导链 连词类别权重直接分化,无需额外过滤
避免召回反义命题 polarity 门控 × 0.05 衰减
避免召回不同连词 条件 0.7 vs 让步 0.3 的权重差异自动压制
追溯"谁说了这句话" 沿 utterance 反向边扩散
展开"他说了什么" 沿 utterance 正向边扩散
追溯推导前提 沿逻辑前件边反向 / output 层逻辑链补齐
展开推导后果 沿逻辑后件边正向扩散
热门词不要永远浮现 扇出归一化 + α 限制基础激活影响
频繁被查的信息优先 基础激活 B_i 上升 + α·softplus(B) 参与排序
区分同事件的主动/被动语态 voice 门控不扣分,聚合在同一命题

十、参考


Revision #1
Created 2026-05-29 11:07:32 UTC by Colin
Updated 2026-05-29 11:07:32 UTC by Colin