Skip to content

Latest commit

 

History

History
110 lines (83 loc) · 6.63 KB

File metadata and controls

110 lines (83 loc) · 6.63 KB

Agent Memory System — 代码审查报告

审查日期:2026-06-21
项目路径:/home/dirjaker/myprojects/agent_memory_system
审查范围:14 个 Python 源文件


🔴 致命问题

1. CORS 配置允许所有来源

  • 文件src/web/app.py 第 23 行
  • 问题allow_origins=["*"] 允许任意域名跨域请求。记忆系统可能存储敏感信息(对话历史、事实知识),CORS 全开意味着任何网站均可读取和修改记忆数据。
  • 修复建议:限制为实际前端域名。

2. 记忆存储/加载 API 无路径验证(路径穿越)

  • 文件src/web/app.py 第 158-168 行
  • 问题save_db(path)load_db(path) 直接将用户传入的 path 参数传给 sqlite3.connect(),无任何路径验证。攻击者可指定任意路径如 ../../etc/cron.d/backdoor 进行路径穿越攻击。
  • 修复建议:限制路径在预设目录下,使用 Path.resolve() 验证前缀;移除用户可指定路径的功能,使用服务端固定路径。

3. SQLite 多线程访问无锁保护

  • 文件src/persistence.py 第 69-71 行
  • 问题sqlite3.connect(db_path, check_same_thread=False) 允许多线程访问,但整个 MemoryRepository 类无任何锁机制。并发写入可能导致数据库损坏或数据不一致。
  • 修复建议:使用 threading.Lock 保护所有数据库操作;或使用连接池 + WAL 模式。

4. 服务绑定 0.0.0.0 且无认证

  • 文件src/web/app.py 第 173 行
  • 问题host="0.0.0.0" 暴露到所有网络接口,所有记忆操作端点无认证。
  • 修复建议:默认绑定 127.0.0.1;添加 API Key 认证。

🟡 警告问题

5. 重复类定义:EpisodicMemory 出现两处

  • 文件src/memory_store.py 第 332 行第 953 行
  • 问题memory_store.py 中定义了两个 EpisodicMemory 类——第一个基于 DialogueTurn(第 332 行),第二个基于 MemoryEntry(第 953 行)。Python 会使用后定义的类覆盖前者,但 MemoryManager 导入的是第一个版本(第 25 行),实际使用的是第二个版本。这种重复极易导致混淆和 bug。
  • 修复建议:合并为一个类或重命名区分;如果确实需要两种实现,使用不同的类名。

6. 重复类定义:MemoryEntry 出现两处

  • 文件src/memory_store.py 第 28 行src/persistence.py 第 16 行
  • 问题:两个不同的 MemoryEntry 类定义不同(一个用 dataclass,一个用普通 class),接口不兼容。__init__.py 导出的是 memory_store.py 中的版本。
  • 修复建议:统一为一个 MemoryEntry 类,persistence.py 应导入并使用 memory_store.py 中的定义。

7. memory_store.py 文件过大(1311 行)

  • 文件src/memory_store.py
  • 问题:单文件包含 MemoryEntrySensoryBufferShortTermStoreWorkingMemoryLongTermStoreDialogueTurnEpisodicMemory(两个版本)、FactSemanticMemory 等多个大类,远超合理文件大小。
  • 修复建议:按职责拆分为 sensory.pyshort_term.pyworking.pylong_term.pyepisodic.pysemantic.py 等模块。

8. sys.path 操作方式不规范

  • 文件src/web/app.py 第 10 行src/macos/app.py 第 12 行examples/*.py 等多处
  • 问题sys.path.insert(0, ...) 修改模块搜索路径。
  • 修复建议:使用 pyproject.toml + pip install -e .

9. SQLite 连接未在异常路径关闭

  • 文件src/memory_manager.py 第 501-539 行save_to_db 方法)
  • 问题save_to_db() 中手动创建 sqlite3.connect(),如果 cursor.execute()conn.commit() 抛出异常,conn.close() 不会被调用,导致连接泄漏。
  • 修复建议:使用 with 上下文管理器或 try/finally 确保连接关闭。

10. Deduplicator O(n²) 时间复杂度

  • 文件src/memory_consolidator.py 第 385-396 行
  • 问题deduplicate() 方法对所有记忆对计算相似度,时间复杂度 O(n²)。当记忆数量较大时(如 1000+),性能会严重下降。
  • 修复建议:使用 LSH(局部敏感哈希)或倒排索引减少比较次数;或添加数量上限。

11. compress_memory 先清空再写回,存在数据丢失风险

  • 文件src/memory_manager.py 第 321-327 行
  • 问题self.long_term.clear() 先清空所有长期记忆,再逐条写回压缩结果。如果写回过程中发生异常,所有长期记忆将丢失。
  • 修复建议:使用事务或先写入临时存储,成功后再替换。

🔵 建议

12. 向量存储使用 MD5 哈希生成伪向量

  • 文件src/vector_store.py 第 147 行
  • 问题_simple_embed() 使用 MD5 哈希生成"向量",没有实际语义信息,搜索结果质量极低。
  • 修复建议:文档中已标注应使用真实嵌入模型,建议在无嵌入模型时抛出异常而非返回无意义结果。

13. OpenAIEmbedding 未做重试和超时处理

  • 文件src/embedding.py 第 281-284 行
  • 问题:API 调用无重试机制、无超时设置、无错误处理。
  • 修复建议:添加 timeout 参数、指数退避重试、异常捕获和降级。

14. 缺少日志持久化

  • 问题:虽然各模块使用了 logging,但未配置日志处理器,默认不输出。
  • 修复建议:在入口点配置 logging.basicConfig() 或使用配置文件。

15. 缺少测试用例

  • 问题:14 个源文件无单元测试。
  • 修复建议:为核心记忆操作(存储、检索、整合、去重)添加 pytest 测试。

16. 依赖版本未锁定

  • 文件requirements.txt
  • 问题:使用 >= 范围指定版本。
  • 修复建议:使用锁定文件固定版本。

17. 海明距离计算限制了最大长度

  • 文件src/memory_consolidator.py 第 325-326 行
  • 问题_edit_distance_ratio() 将文本截断到 200 字符后计算,长文本的相似度可能不准确。
  • 修复建议:文档说明此限制;或使用分段计算再加权平均。

总结评分

维度 评分 说明
🔒 安全 3/10 路径穿越、CORS 全开、无认证、SQLite 无锁保护,安全风险最高
📊 质量 6/10 模块设计有深度,但文件过大、重复定义、连接泄漏影响质量
🏗️ 架构 7/10 六层记忆模型设计优秀,检索/整合/持久化链路完整,但重复类和大文件拖累架构分