加权图遍历算法 (Weighted Graph Traversal)
"Stop Vector Search, Start Graph Traversal."
传统的向量检索 (Vector Search) 只能找到“长得像”的片段,而加权图遍历 (Weighted Graph Traversal) 能找到“有关系”的逻辑链。
PeroCore 的核心记忆引擎基于 PEDSA (Parallel Energy-Decay Spreading Activation) 算法构建。这是一种加权图计算模型,旨在模拟关联检索过程。
1. 核心原理:PEDSA 算法
PEDSA 全称为 并行权重衰减传播 算法,由 PeroCore Team 自研。它是一个模拟权重在图中传播、衰减和汇聚的动力学系统。 v2 引入了 PPR 回家概率,进一步强化了图扩散对查询的主题相关性约束。
1.1 传播公式
在每一轮遍历(Step)中,节点 接收到的传播分值 由其所有上游邻居节点 传递而来:
其中:
- : 节点 在当前时刻的分数。
- : 节点 到节点 的连接权重,范围 。
- : 全局衰减系数(Decay Factor),通常取 。
- : PPR 回家概率(Teleport Alpha),默认 (不启用),推荐 。
- : 节点 的初始种子能量(非种子节点则为 0)。
1.2 关键特性
- 动态剪枝 (Dynamic Pruning): 为了在千万级节点中保持毫秒级响应,算法在每一步传播后,只保留分数最高的 Top-K(默认 10,000)个活跃节点继续下一轮传播。这有效抑制了“计算爆炸”,同时保留了最重要的信号。
- 权重衰减 (Weight Decay): 分数随着传播距离指数级衰减,确保只有紧密相关的概念被检索,避免无关联想。
- 并行计算 (Parallelization): 底层使用 Rust 的
rayon库实现无锁并行计算,充分利用多核 CPU 性能。 - PPR 回家概率 (Teleport) (v2 新增): 引入 PageRank 中的 “回家”弹动机制。在每步传播中,传播能量乘以
(1-α),并将种子节点的当前能量按α混合回初始値。当α=0时等价于原始 PEDSA;当α=0.15时扩散范围实现较弱的收敛,防止能量在大图谱中漂移到无关区域。
1.3 为什么不是 RAG?
传统的 RAG (Retrieval-Augmented Generation) 依赖于 Top-K 向量相似度搜索,存在以下缺陷:
- 孤岛效应: 只能找到字面或语义相似的片段,无法发现通过逻辑链条(A -> B -> C)连接的知识。
- 多跳性能崩塌: 执行多步推理时,延迟呈指数级增长。
- 超级节点困境: 难以处理像“我”、“是”这种高频连接的超级节点(Hubs)。
PEDSA 通过图结构和权重传播,天然解决了上述问题,实现了 O(1) 复杂度的多跳逻辑穿透。
2. 向量的生命周期 (Lifecycle of a Vector)
当用户输入一句话时,它在 PeroCore 记忆网络中的流程如下:
第一阶段:向量化 (Embedding)
- 输入: 用户说 "System, tell me about Apple."
- 处理: 文本被送入 Embedding 模型(如
all-MiniLM-L6-v2等本地模型)。 - 产物: 一个 384 维的高维浮点向量 。
第二阶段:锚点搜索 (Anchor Search)
- 动作: 引擎使用 SIMD 加速 的点积运算,计算 与现有记忆库中所有节点的相似度。
- 筛选: 选取相似度最高的 Top-N 个节点(例如 Top 10),作为“初始锚点”(Intent Anchors)。
- 意义: 这相当于找到了几个核心概念(如“苹果公司”、“乔布斯”、“水果”)。
第三阶段:图遍历 (Traversal)
- 动作: 初始锚点被赋予初始分数(如 1.0),开始向周围传播。
- Step 1: “苹果公司”关联到了“iPhone”、“MacBook”、“库克”。
- Step 2: “iPhone”进一步关联到了“iOS”、“智能手机”。
- 控制: 每一跳分数都会乘以衰减系数(Decay),且低于阈值的微弱信号会被丢弃。
第四阶段:汇聚 (Convergence)
- 动作: 经过数轮传播后,系统收集所有被命中的节点。
- 排序: 按最终累积传播分数降序排列。
- 结果: 最终提取出的不仅仅是包含“Apple”的句子,还可能包含“Steve Jobs”或“1984”,即使这些内容在原始输入中从未出现。这就是关联检索。
3. 核心库:pero-memory-core
我们将 PeroCore 的图遍历引擎封装为了独立的 Python 库 pero-memory-core,底层由 Rust 编写,兼具 Python 的易用性和 Rust 的极致性能。
3.1 安装
bash
pip install pero-memory-core3.2 快速上手示例
以下代码展示了如何初始化引擎、构建简单的关联网络并执行传播:
python
from pero_memory_core import CognitiveGraphEngine
# 1. 初始化引擎
engine = CognitiveGraphEngine(max_active_nodes=10000, max_fan_out=20)
# 2. 注入记忆 (源ID, 目标ID, 关联权重)
connections = [
(101, 102, 0.9), # "Apple" -> "Steve Jobs"
(102, 103, 0.85), # "Steve Jobs" -> "Pixar"
(103, 104, 0.7) # "Pixar" -> "Toy Story"
]
engine.batch_add_connections(connections)
# 3. 执行加权传播 (PEDSA + PPR)
results = engine.propagate_activation(
initial_scores={101: 1.0}, # 从 "Apple" 开始关联
steps=3,
decay=0.8,
teleport_alpha=0.15, # PPR 回家概率 (v2 新增, 默认 0.0)
)
# 4. 输出结果
print("关联结果 (按分数排序):")
for node_id, score in sorted(results.items(), key=lambda x: x[1], reverse=True):
print(f"节点 ID: {node_id}, 传播分数: {score:.4f}")3.3 性能指标
在百万级边(Edges)的测试环境下:
- 单步检索延迟: < 3ms
- 11步深层逻辑穿透: < 5ms
- 内存占用: 相比传统向量索引降低 70%
引擎已针对 AVX2/AVX-512 指令集进行优化,在现代 CPU 上可获得最佳性能。
