refactor: 消除重复代码并优化记忆系统结构
- 提取共享工具函数到 utils 模块 - 创建 utils/similarity.py: 统一余弦相似度计算 - 创建 utils/graph_expansion.py: 统一图扩展算法 - 删除重复实现 - manager.py: 删除 _cosine_similarity 和 _fast_cosine_similarity (60行) - tools/memory_tools.py: 删除 _expand_with_semantic_filter 和 _cosine_similarity (150行) - 清理废弃代码 - 删除 tools/memory_tools.py 中10行注释掉的旧代码 - 删除空的 retrieval/ 模块 - 净减少 ~150行重复代码 Co-authored-by: Windpicker-owo <221029311+Windpicker-owo@users.noreply.github.com>
This commit is contained in:
50
src/memory_graph/utils/similarity.py
Normal file
50
src/memory_graph/utils/similarity.py
Normal file
@@ -0,0 +1,50 @@
|
||||
"""
|
||||
相似度计算工具
|
||||
|
||||
提供统一的向量相似度计算函数
|
||||
"""
|
||||
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
if TYPE_CHECKING:
|
||||
import numpy as np
|
||||
|
||||
|
||||
def cosine_similarity(vec1: "np.ndarray", vec2: "np.ndarray") -> float:
|
||||
"""
|
||||
计算两个向量的余弦相似度
|
||||
|
||||
Args:
|
||||
vec1: 第一个向量
|
||||
vec2: 第二个向量
|
||||
|
||||
Returns:
|
||||
余弦相似度 (0.0-1.0)
|
||||
"""
|
||||
try:
|
||||
import numpy as np
|
||||
|
||||
# 确保是numpy数组
|
||||
if not isinstance(vec1, np.ndarray):
|
||||
vec1 = np.array(vec1)
|
||||
if not isinstance(vec2, np.ndarray):
|
||||
vec2 = np.array(vec2)
|
||||
|
||||
# 归一化
|
||||
vec1_norm = np.linalg.norm(vec1)
|
||||
vec2_norm = np.linalg.norm(vec2)
|
||||
|
||||
if vec1_norm == 0 or vec2_norm == 0:
|
||||
return 0.0
|
||||
|
||||
# 余弦相似度
|
||||
similarity = np.dot(vec1, vec2) / (vec1_norm * vec2_norm)
|
||||
|
||||
# 确保在 [0, 1] 范围内(处理浮点误差)
|
||||
return float(np.clip(similarity, 0.0, 1.0))
|
||||
|
||||
except Exception:
|
||||
return 0.0
|
||||
|
||||
|
||||
__all__ = ["cosine_similarity"]
|
||||
Reference in New Issue
Block a user