审查日期:2026-06-21
项目路径:/home/dirjaker/myprojects/agent_memory_system
审查范围:14 个 Python 源文件
- 文件:
src/web/app.py第 23 行 - 问题:
allow_origins=["*"]允许任意域名跨域请求。记忆系统可能存储敏感信息(对话历史、事实知识),CORS 全开意味着任何网站均可读取和修改记忆数据。 - 修复建议:限制为实际前端域名。
- 文件:
src/web/app.py第 158-168 行 - 问题:
save_db(path)和load_db(path)直接将用户传入的path参数传给sqlite3.connect(),无任何路径验证。攻击者可指定任意路径如../../etc/cron.d/backdoor进行路径穿越攻击。 - 修复建议:限制路径在预设目录下,使用
Path.resolve()验证前缀;移除用户可指定路径的功能,使用服务端固定路径。
- 文件:
src/persistence.py第 69-71 行 - 问题:
sqlite3.connect(db_path, check_same_thread=False)允许多线程访问,但整个MemoryRepository类无任何锁机制。并发写入可能导致数据库损坏或数据不一致。 - 修复建议:使用
threading.Lock保护所有数据库操作;或使用连接池 + WAL 模式。
- 文件:
src/web/app.py第 173 行 - 问题:
host="0.0.0.0"暴露到所有网络接口,所有记忆操作端点无认证。 - 修复建议:默认绑定
127.0.0.1;添加 API Key 认证。
- 文件:
src/memory_store.py第 332 行 和 第 953 行 - 问题:
memory_store.py中定义了两个EpisodicMemory类——第一个基于DialogueTurn(第 332 行),第二个基于MemoryEntry(第 953 行)。Python 会使用后定义的类覆盖前者,但MemoryManager导入的是第一个版本(第 25 行),实际使用的是第二个版本。这种重复极易导致混淆和 bug。 - 修复建议:合并为一个类或重命名区分;如果确实需要两种实现,使用不同的类名。
- 文件:
src/memory_store.py第 28 行 和src/persistence.py第 16 行 - 问题:两个不同的
MemoryEntry类定义不同(一个用 dataclass,一个用普通 class),接口不兼容。__init__.py导出的是memory_store.py中的版本。 - 修复建议:统一为一个
MemoryEntry类,persistence.py应导入并使用memory_store.py中的定义。
- 文件:
src/memory_store.py - 问题:单文件包含
MemoryEntry、SensoryBuffer、ShortTermStore、WorkingMemory、LongTermStore、DialogueTurn、EpisodicMemory(两个版本)、Fact、SemanticMemory等多个大类,远超合理文件大小。 - 修复建议:按职责拆分为
sensory.py、short_term.py、working.py、long_term.py、episodic.py、semantic.py等模块。
- 文件:
src/web/app.py第 10 行,src/macos/app.py第 12 行,examples/*.py等多处 - 问题:
sys.path.insert(0, ...)修改模块搜索路径。 - 修复建议:使用
pyproject.toml+pip install -e .。
- 文件:
src/memory_manager.py第 501-539 行(save_to_db方法) - 问题:
save_to_db()中手动创建sqlite3.connect(),如果cursor.execute()或conn.commit()抛出异常,conn.close()不会被调用,导致连接泄漏。 - 修复建议:使用
with上下文管理器或try/finally确保连接关闭。
- 文件:
src/memory_consolidator.py第 385-396 行 - 问题:
deduplicate()方法对所有记忆对计算相似度,时间复杂度 O(n²)。当记忆数量较大时(如 1000+),性能会严重下降。 - 修复建议:使用 LSH(局部敏感哈希)或倒排索引减少比较次数;或添加数量上限。
- 文件:
src/memory_manager.py第 321-327 行 - 问题:
self.long_term.clear()先清空所有长期记忆,再逐条写回压缩结果。如果写回过程中发生异常,所有长期记忆将丢失。 - 修复建议:使用事务或先写入临时存储,成功后再替换。
- 文件:
src/vector_store.py第 147 行 - 问题:
_simple_embed()使用 MD5 哈希生成"向量",没有实际语义信息,搜索结果质量极低。 - 修复建议:文档中已标注应使用真实嵌入模型,建议在无嵌入模型时抛出异常而非返回无意义结果。
- 文件:
src/embedding.py第 281-284 行 - 问题:API 调用无重试机制、无超时设置、无错误处理。
- 修复建议:添加
timeout参数、指数退避重试、异常捕获和降级。
- 问题:虽然各模块使用了
logging,但未配置日志处理器,默认不输出。 - 修复建议:在入口点配置
logging.basicConfig()或使用配置文件。
- 问题:14 个源文件无单元测试。
- 修复建议:为核心记忆操作(存储、检索、整合、去重)添加 pytest 测试。
- 文件:
requirements.txt - 问题:使用
>=范围指定版本。 - 修复建议:使用锁定文件固定版本。
- 文件:
src/memory_consolidator.py第 325-326 行 - 问题:
_edit_distance_ratio()将文本截断到 200 字符后计算,长文本的相似度可能不准确。 - 修复建议:文档说明此限制;或使用分段计算再加权平均。
| 维度 | 评分 | 说明 |
|---|---|---|
| 🔒 安全 | 3/10 | 路径穿越、CORS 全开、无认证、SQLite 无锁保护,安全风险最高 |
| 📊 质量 | 6/10 | 模块设计有深度,但文件过大、重复定义、连接泄漏影响质量 |
| 🏗️ 架构 | 7/10 | 六层记忆模型设计优秀,检索/整合/持久化链路完整,但重复类和大文件拖累架构分 |