UNPKG

modular-mcp-memory

Version:

模块化MCP记忆系统 v4.5.1 - 基于Zettelkasten记忆片段盒笔记法的精简记忆系统,包含性能优化、智能占位符功能、内容提取拆分功能和修复的展开功能

381 lines (289 loc) 11.9 kB
# Modular MCP Memory v4.4.0 基于 Zettelkasten 记忆片段盒笔记法的精简记忆系统,现已包含智能优化功能。 ## 🐛 v4.1.1 修复 - 🔧 **嵌套展开修复**: 修复了深度展开时 start/end 标记被错误展开的问题 -**稳定性提升**: 确保多层级引用场景下的正确展开行为 ## ✨ v4.1 新功能 - 🚀 **智能占位符**: setMemory 时自动为引用记忆片段创建占位文件 -**权重缓存**: 智能缓存权重计算结果,性能提升 60%+ - 📊 **优化算法**: 全新的权重计算和价值评估算法 - 🔄 **缓存失效**: 文件变更时自动清除相关缓存 ## 特性 - 🗂️ **记忆片段化管理**: 每个记忆单元作为独立的记忆片段 - 🔗 **智能引用**: 通过 `[[记忆片段名]]` 方式建立记忆片段间的链接 - 📖 **内容展开**: 支持递归展开引用内容 - ⚖️ **权重计算**: 基于引用关系计算记忆片段权重(新算法) - 🎯 **智能提示**: 根据权重提供相关记忆片段建议 - 🔧 **优化建议**: 使用 Sigmoid 函数识别低价值记忆片段 - 📁 **文件存储**: 使用文件系统存储,便于备份和迁移 - 🚀 **自动占位**: 引用不存在的记忆片段时自动创建占位符 ## 核心方法 ### 1. 获取文件内容 ```typescript // 普通获取 await manager.getMemory(fragmentName, 展开深度); // 获取带行号内容 await manager.getMemory(fragmentName, 展开深度, true); ``` ### 2. 创建/编辑文件内容 ```typescript await manager.setMemory(fragmentName, 内容); ``` ### 3. 删除文件内容 ```typescript await manager.deleteMemory(fragmentName); ``` ### 4. 重命名/合并文件内容 ```typescript await manager.renameMemory(旧文件名称, 新文件名称); ``` ### 5. 获取提示 ```typescript await manager.getMemoryHints(文件数量); ``` ### 6. 获取低价值片段建议(推荐) ```typescript await manager.getOptimizeSuggestions(优化参数, 最大文件数量); ``` ### 7. 获取孤立片段建议 ```typescript await manager.getIsolatedSuggestions(最大文件数量); ``` ### 8. 获取优化建议(已弃用) ```typescript await manager.getSuggestions(优化参数, 最大文件数量); ``` ## 🆕 v4.1 新功能详解 ### 智能占位符创建 当您在记忆片段中引用不存在的记忆片段时,系统会自动创建占位文件: ```typescript // 创建包含引用的记忆片段 await manager.setMemory('学习计划', '今天要学习 [[JavaScript基础]] 和 [[React框架]]'); // 系统自动创建 JavaScript基础.md 和 React框架.md 占位文件 // 每个占位文件包含基础模板内容 ``` ### 权重缓存优化 - **智能缓存**: 权重计算结果被缓存,避免重复计算 - **自动失效**: 文件修改时相关缓存自动清除 - **性能提升**: 缓存命中时性能提升 60%+ ### 新的权重算法 ``` 旧算法: 权重 = 引用数量 新算法: 权重 = 子记忆片段权重之和 + 引用数量 ``` ### 优化的价值计算 ``` 旧公式: 价值 = 权重 / 字符数 新公式: 价值 = Sigmoid(权重) / 字符数 ``` 使用 Sigmoid 函数使权重影响更加平滑和科学。 ## 安装 ```bash npm install modular-mcp-memory ``` ## 使用示例 ```typescript import { ZettelkastenManager } from 'modular-mcp-memory'; // 创建管理器实例 const manager = new ZettelkastenManager({ storageDir: './my-cards', autoCreateDir: true }); // 创建记忆片段 await manager.setMemory('AI基础', ` # AI基础知识 人工智能的核心概念包括: - [[机器学习]] - [[深度学习]] - [[自然语言处理]] `); // 获取记忆片段内容(展开引用) const content = await manager.getMemory('AI基础', 1); // 获取智能提示 const hints = await manager.getMemoryHints(5); console.log('推荐记忆片段:', hints.fragmentNames); ``` ## 记忆片段引用语法 ### 基本引用 使用 `[[记忆片段名]]` 引用其他记忆片段。 ### 子目录支持 记忆片段名称支持使用 `/` 来创建子目录结构: ```typescript // 创建子目录中的记忆片段 await manager.setMemory('编程/JavaScript', 'JavaScript 相关内容'); await manager.setMemory('编程/前端/React', 'React 框架内容'); // 引用子目录中的记忆片段 await manager.setMemory('学习计划', ` 我的学习计划: - [[编程/JavaScript]] - [[编程/前端/React]] `); ``` 支持的子目录功能: - ✅ 任意深度的子目录:`category/subcategory/topic` - ✅ 跨目录引用:根目录记忆片段可以引用子目录记忆片段 - ✅ 自动创建目录:保存记忆片段时自动创建必要的目录结构 - ✅ 重命名支持:重命名子目录记忆片段会自动更新所有引用 **注意事项:** - 记忆片段名不能以 `/` 开头 - 不支持相对路径操作(如 `../``./`- 目录分隔符使用 `/`(会自动适配操作系统) ### 内容展开标记格式 使用 `![[记忆片段名]]` 来展开引用记忆片段的内容。展开后的格式: ```markdown ![[记忆片段名]]start 记忆片段的实际内容 ![[记忆片段名]]end ``` ### 新内容展开标记格式(v4.4.0+) 从 v4.4.0 开始,系统使用新的内容展开标记格式: ```markdown <!-- fragment-start:记忆片段名 --> 记忆片段的实际内容 <!-- fragment-end:记忆片段名 --> ``` **优势:** - 更清晰的标记结构,避免与内容冲突 - 支持嵌套展开,不会相互干扰 - 更好的可读性和维护性 - 兼容 HTML 注释格式,在各种编辑器中都能正确显示 ## 权重计算算法 系统使用递归算法计算记忆片段权重: ```typescript // 当记忆片段有向外引用时 权重 = (引用记忆片段1权重 + 引用记忆片段2权重 + ... + 引用记忆片段n权重) / n // 当记忆片段没有向外引用时 权重 = 1 ``` ## 价值计算 记忆片段价值用于优化建议: ``` 价值 = 权重 / 字符数 ``` 价值越低的记忆片段可能需要优化(扩展内容或删除)。 ## 信息散度 信息散度是衡量记忆片段价值的新指标,它鼓励信息的单元化和网络化: ``` 信息散度 = 权重 / 字符数 ``` 与传统的价值计算相比,信息散度: - 更注重信息的密度而非绝对价值 - 鼓励创建精简而高价值的记忆片段 - 促进记忆片段间的网络连接 - 避免过度冗长的内容积累 低信息散度的记忆片段通常表示: - 内容过于冗长而信息密度低 - 缺乏足够的引用连接 - 可能需要精简或重新组织 ## 系统片段 系统片段是具有特殊只读特性的记忆片段,用于存储系统核心配置和功能: ### 特性 - **只读特性**: 系统片段不能被普通用户修改 - **自动识别**: 系统自动识别并保护系统片段 - **核心功能**: 用于存储系统级配置和功能 ### 判断方法 系统片段通过内容前缀识别: -`<!-- core memory -->` 开头的记忆片段被识别为系统片段 - 系统片段会被自动排除在优化建议之外 - 系统片段的修改需要特殊权限或方法 ### 示例 ```markdown <!-- core memory --> # 系统配置 这是系统核心配置,不能被普通用户修改。 ``` ## 弃用说明 ### getSuggestions 方法弃用原因 `getSuggestions` 方法已被弃用,原因如下: 1. **算法不够精确**: 使用 Sigmoid 函数计算价值,可能导致结果不够准确 2. **缺乏针对性**: 无法区分低价值和孤立片段的不同优化需求 3. **性能问题**: 计算复杂度较高,特别是在大型记忆库中 ### 推荐替代方案 建议使用以下两个专门的方法: #### 1. getOptimizeSuggestions 专注于识别低价值的记忆片段: - 使用信息散度计算,更加精确 - 专门针对内容密度低的片段 - 提供更准确的优化建议 #### 2. getIsolatedSuggestions 专注于识别孤立的记忆片段: - 识别没有反向链接的片段 - 帮助发现记忆网络中的断点 - 促进记忆片段间的连接 ### 迁移指南 ```typescript // 旧方法(已弃用) const suggestions = await manager.getSuggestions(0.1, 10); // 新方法(推荐) const lowValueSuggestions = await manager.getOptimizeSuggestions(0.1, 10); const isolatedSuggestions = await manager.getIsolatedSuggestions(10); ``` ## 开发 ```bash # 安装依赖 npm install # 运行演示 npm run demo # 运行测试 npm test # 构建 npm run build # 检查类型 npm run lint ``` ## API 文档 ### ZettelkastenManager #### 构造函数 ```typescript new ZettelkastenManager(config: ZettelkastenConfig) ``` #### 配置选项 ```typescript interface ZettelkastenConfig { storageDir: string; // 存储目录路径 encoding?: string; // 文件编码,默认 'utf-8' autoCreateDir?: boolean; // 是否自动创建目录,默认 true } ``` #### 方法 - `getMemory(fragmentName: string, expandDepth?: number, showLineNumbers?: boolean): Promise<string>` - `setMemory(fragmentName: string, content: string): Promise<void>` - `deleteMemory(fragmentName: string): Promise<void>` - `renameMemory(oldName: string, newName: string): Promise<void>` - `extractMemory(sourceFragmentName: string, targetFragmentName: string, range?: ExtractRange): Promise<void>` - `getMemoryHints(count: number): Promise<HintResult>` - `getOptimizeSuggestions(optimizationParam: number, maxFileCount: number): Promise<OptimizeSuggestionResult>` - `getIsolatedSuggestions(maxFileCount: number): Promise<IsolatedSuggestionResult>` - `getSuggestions(threshold: number, maxCount: number): Promise<SuggestionResult>` (已弃用) - `getStats(): Promise<Statistics>` - `getAllFragmentNames(): Promise<string[]>` - `insertLinkAt(sourceFragmentName: string, targetFragmentName: string, linePosition?: number, anchorText?: string): Promise<void>` - `getBacklinks(fragmentName: string): Promise<string[]>` - `clearCache(): void` ## 许可证 MIT License ## 更新日志 ### v4.4.0 - 🆕 **API重命名**: 所有方法统一使用 fragmentName 参数名,方法名更语义化 - 🆕 **新方法**: 添加 getOptimizeSuggestions 方法,使用信息散度计算低价值片段 - 🆕 **新方法**: 添加 getIsolatedSuggestions 方法,识别孤立记忆片段 - 🆕 **新展开格式**: 引入新的内容展开标记格式 `<!-- fragment-start:名称 -->` - 📊 **优化算法**: 引入信息散度概念,优化价值计算方式 - 🛡️ **系统片段**: 添加系统片段识别和保护机制 - 🔄 **弃用标记**: 标记 getSuggestions 方法为已弃用,推荐使用新方法 ### v4.1.1 - 🔧 **重要修复**: 修复嵌套展开时 start/end 标记被错误展开的问题 -**稳定性**: 确保多层级引用场景下的正确展开行为 - 🧪 **测试增强**: 添加了嵌套展开的专门测试用例 ### v4.1.0 - 🚀 **智能占位符**: setMemory 时自动为引用记忆片段创建占位文件 -**权重缓存**: 智能缓存权重计算结果,性能提升 60%+ - 📊 **优化算法**: 全新的权重计算和价值评估算法 - 🔄 **缓存失效**: 文件变更时自动清除相关缓存 ### v4.0.0 - 🎉 全新架构:基于 Zettelkasten 记忆片段盒笔记法 - 🚀 精简设计:移除复杂的搜索功能,专注于提示词驱动 - 💾 文件存储:使用文件系统替代数据库 - 🔗 智能引用:支持记忆片段间的链接和内容展开 - ⚖️ 权重系统:智能计算记忆片段重要性 - 🎯 优化建议:自动识别需要改进的记忆片段