
HH:MM - 自动捕获【免费下载链接】hello-agents 《从零开始构建智能体》——从零开始的智能体原理与实践教程项目地址: https://gitcode.com/GitHub_Trending/he/hello-agents[preference] 用户喜欢简洁的回复风格其中 [category] 标签会被 get_category_stats()[capture.py](https://link.gitcode.com/i/a7be6584b309a5199003227c4e91c05e)以正则 \[category\] 统计用于向 Agent 报告各类记忆的数量分布。 ### 长期记忆可读可写的 MEMORY.md WorkspaceManager 对长期记忆提供了通用的 load_config(MEMORY) / save_config(MEMORY, content) 读写接口[manager.py](https://link.gitcode.com/i/98e2f633e3cdbed16dbe22baa2583a1c)。save_config 还有一个细节当保存的文件名是 IDENTITY 时会触发 _check_and_delete_bootstrap()——身份一旦确定BOOTSTRAP.md 引导文件即被删除Agent 从入职状态进入正式运行状态。 ### 记忆的过期清理 每日记忆若无限堆积会拖累检索效率。cleanup_old_memories(days30)[manager.py](https://link.gitcode.com/i/b91a4ed3747029630adac14f4ef4fcc7)会删除超过保留天数默认 30 天的日期格式文件且会跳过无法解析为 YYYY-MM-DD 的文件名避免误删会话总结等文件。这保证了每日记忆只保留一个滚动窗口而长期记忆 MEMORY.md 则常驻工作空间成为跨会话的稳定知识库。 ## 三、自动记忆捕获MemoryCaptureManager 的触发规则与分类 长期记忆的信息来源是每日记忆而每日记忆的写入很大程度上由 [src/memory/capture.py](https://link.gitcode.com/i/4f0fb59fa246f1d116d2d2f588cca992) 中的 MemoryCaptureManager 自动完成。它的工作方式是**规则驱动的自动捕获**对话结束后分析文本命中触发规则的信息自动落盘。 ### 触发规则一览 MEMORY_TRIGGERS[capture.py](https://link.gitcode.com/i/4f0fb59fa246f1d116d2d2f588cca992#L10-L25)定义了一组中英文正则 分类的映射是捕获的判据 | 触发模式正则 | 分类 | 覆盖场景 | | --- | --- | --- | | 记住\|记下\|remember\|keep in mind | fact | 用户明确要求记住 | | 我喜欢\|我偏好\|prefer\|like\|love\|hate\|讨厌\|不喜欢 | preference | 偏好表达 | | 决定了\|decision\|用这个\|选定\|确定用\|就用 | decision | 决策记录 | | \\d{10,}\|\d{3,4}[-\s]?\d{7,8} | entity | 电话号码 | | [\w.-][\w.-]\.\w | entity | 邮箱地址 | | 我的\w是\|is my\|我的电话\|我的邮箱\|我的地址\|我的名字 | entity | 实体信息 | | 事实上\|实际上\|the fact is\|it turns out | fact | 事实陈述 | 全部正则使用 re.IGNORECASE 编译[capture.py](https://link.gitcode.com/i/4f0fb59fa246f1d116d2d2f588cca992#L55-L58)因此中英文表达均能命中。CATEGORY_KEYWORDS 则提供了各分类更宽泛的关键词集合供统计与辅助分类使用。 ### 捕获主流程 capture(text)[capture.py](https://link.gitcode.com/i/4f0fb59fa246f1d116d2d2f588cca992#L60-L106)的执行链路清晰可读 1. _split_sentences()按中英文句号、问号、感叹号及换行将文本切分为句子[capture.py](https://link.gitcode.com/i/4f0fb59fa246f1d116d2d2f588cca992#L162-L174) 2. 过滤过短句子长度 5 视为噪声 3. _match_trigger()逐条匹配编译后的触发规则返回首个命中的分类[capture.py](https://link.gitcode.com/i/4f0fb59fa246f1d116d2d2f588cca992#L176-L188) 4. _extract_memory()清理句子——移除 用户/我/assistant: 等前缀、剥掉引号、为偏好类内容补上用户主语使记忆以客观第三人称表述[capture.py](https://link.gitcode.com/i/4f0fb59fa246f1d116d2d2f588cca992#L190-L219) 5. 会话内去重seen_contents 集合 跨文件去重调用 workspace.check_duplicate_memory(content, threshold0.7) 6. 为每条记忆附加 timestamp 后返回。 capture_and_store(text, date)[capture.py](https://link.gitcode.com/i/4f0fb59fa246f1d116d2d2f588cca992#L121-L145)在捕获后直接调用 workspace.append_classified_memory() 落盘并打印失败告警。由于捕获逻辑是 CPU 密集型正则匹配项目提供了 acapture / acapture_and_store 两个异步包装通过 loop.run_in_executor 放进线程池执行[capture.py](https://link.gitcode.com/i/4f0fb59fa246f1d116d2d2f588cca992#L108-L159)。 analyze_conversation(messages)[capture.py](https://link.gitcode.com/i/4f0fb59fa246f1d116d2d2f588cca992#L221-L241)则批量遍历对话消息仅对 role user 的内容调用 capture用于在会话结束后做整体扫描。 ### 去重机制防止记忆膨胀 WorkspaceManager.check_duplicate_memory(content, threshold0.7)[manager.py](https://link.gitcode.com/i/9c269f09144f777f6994e065141232bd)是记忆质量的关键防线 - _extract_keywords() 用正则提取两字以上的中文词和三字母以上的英文词并过滤一张包含的、了、是、喜欢、记住、用户等的中文停用词表[manager.py](https://link.gitcode.com/i/f22bf3baefd162ae362856a8f86cacf7) - _calculate_overlap() 计算关键词在目标文本中的命中比例[manager.py](https://link.gitcode.com/i/3294d5b3edac9cc25db05f3a58fec8a7) - 依次与今日记忆、长期记忆 MEMORY.md、最近 2 天的每日记忆比对任一命中率 ≥ 0.7 即判定为重复并跳过写入。 这套关键词重叠近似去重不需要引入向量模型成本极低适合作为轻量级 Agent 的默认方案需要更精准语义去重时可在 threshold 与关键词提取策略上扩展。 ## 四、记忆的读取与写入MemoryTool 六个子工具 Agent 访问记忆的统一入口是 [src/tools/builtin/memory.py](https://link.gitcode.com/i/fc9e8c48faf051f9de7a2cfaeab595a2) 中的 MemoryTool。它被标记为 expandableTrue[memory.py](https://link.gitcode.com/i/fc9e8c48faf051f9de7a2cfaeab595a2#L26-L30)可展开为六个子工具供 Agent 在推理中按需调用 | 子工具 | 作用 | 底层实现 | | --- | --- | --- | | memory_search | 按关键词搜索历史记忆返回带行号的上下文 | search_memory_enhanced默认 3 行上下文 | | memory_get | 读取指定记忆文件或行范围如 10-20、15 | read_memory_lines | | memory_add | 添加内容到今日记忆可选 category 分类标签 | append_classified_memory / append_to_daily_memory | | memory_update_longterm | 向长期记忆 MEMORY.md 追加新增小节 | load_config save_config | | memory_list | 列出所有记忆文件按长期/每日分组并显示大小 | list_memory_files | | memory_cleanup | 清理超过 N 天默认 30的过期每日记忆 | cleanup_old_memories | 几个值得注意的实现细节 - memory_get 默认读取**今天的日记**YYYY-MM-DD.md并自动补全 .md 后缀若文件不存在会返回可用文件清单引导 Agent 纠错[memory.py](https://link.gitcode.com/i/fc9e8c48faf051f9de7a2cfaeab595a2#L102-L153) - memory_update_longterm[memory.py](https://link.gitcode.com/i/fc9e8c48faf051f9de7a2cfaeab595a2#L172-L182)采用追加不覆盖策略将新内容以 ## 新增 小节追加到 MEMORY.md 末尾这与模板精心策划的定位一致——Agent 可以在复盘时手动整理、合并这些新增小节 - memory_search 的搜索结果格式化输出包含**来源文件 行号区间 代码块**如 **MEMORY.md** (行 3-6): ...让 Agent 在长上下文中也能快速定位记忆出处[memory.py](https://link.gitcode.com/i/fc9e8c48faf051f9de7a2cfaeab595a2#L48-L89)。 WorkspaceManager 为 memory_search 提供的 search_memory_enhanced[manager.py](https://link.gitcode.com/i/cd2cb68e16c1128668ef4542025db0f3)会同时检索长期记忆 MEMORY.md 与 memory/ 目录下的每日记忆并将命中的行连同前后 context_lines 行合并为连续区间返回——这正是带上下文的记忆检索能力的来源。 ## 五、记忆沉淀会话总结与上下文压缩前的 Memory Flush 长期记忆的素材除了自动捕获还来自两个记忆沉淀环节会话结束时的总结以及上下文压缩前的抢救。 ### SessionSummarizer把对话提炼为结构化总结 [src/memory/session_summarizer.py](https://link.gitcode.com/i/3ced8c9059a59cb1778638babc394592) 中的 SessionSummarizer 负责在创建新会话时总结旧会话。summarize_session(messages, last_n10) 的执行流程 1. _extract_excerpt() 只保留 user / assistant 消息单条超 500 字符截断取最后 last_n 轮[session_summarizer.py](https://link.gitcode.com/i/3ced8c9059a59cb1778638babc394592#L80-L109) 2. _generate_slug() 让 LLM 生成 3-5 个英文单词的描述性 slug若未配置 LLM则退化为 _generate_simple_slug()——统计词频、剔除停用词、取 Top3 关键词拼成 slug[session_summarizer.py](https://link.gitcode.com/i/3ced8c9059a59cb1778638babc394592#L111-L308) 3. _generate_summary() 让 LLM 按固定结构输出总结**主题一句话 关键点3-5 条 待办**并加上含 date 与 type: session-summary 的 YAML 头无 LLM 时退化为对话节选格式[session_summarizer.py](https://link.gitcode.com/i/3ced8c9059a59cb1778638babc394592#L310-L384) 4. 以 YYYY-MM-DD-slug.md 命名经 workspace.save_session_summary() 保存到 memory 目录[manager.py](https://link.gitcode.com/i/8f6e65cfb2650174ebf7194e473a5622)。 WorkspaceManager.list_session_summaries()[manager.py](https://link.gitcode.com/i/26ef3e7c3c08217c5abf028df07cb576)通过文件名正则区分会话总结YYYY-MM-DD-slug.md与纯日期命名的每日记忆避免混用。 ### MemoryFlushManager压缩前抢救高价值记忆 上下文窗口总有耗尽的时候压缩前的最后一道防线是 [src/memory/memory_flush.py](https://link.gitcode.com/i/406ff02588c3f7b35dfa8d370953e852) 中的 MemoryFlushManager。它通过四个可配置参数控制触发时机[memory_flush.py](https://link.gitcode.com/i/406ff02588c3f7b35dfa8d370953e852#L14-L32) | 参数 | 默认值 | 含义 | | --- | --- | --- | | context_window | 128000 | 上下文窗口总大小token | | compression_threshold | 0.8 | 压缩阈值比例即窗口 80% 时触发压缩 | | soft_threshold_tokens | 4000 | 软阈值token在压缩点之前提前触发 flush | | enabled | True | 是否启用 flush | should_trigger_flush(current_tokens) 计算触发点context_window × compression_threshold − soft_threshold_tokens默认 128000 × 0.8 − 4000 98400当当前 token 数达到该值且本会话尚未触发过时返回 True[memory_flush.py](https://link.gitcode.com/i/406ff02588c3f7b35dfa8d370953e852#L37-L59)。每会话只触发一次的 _flush_triggered 标志避免反复打断reset() 在新会话时复位。 触发后get_flush_prompt()[memory_flush.py](https://link.gitcode.com/i/406ff02588c3f7b35dfa8d370953e852#L61-L77)返回一段静默回合提示词引导 Agent 在压缩前执行两个动作 - 用 memory_add 将重要事实、决策、用户偏好保存到 memory/{today}.md今日记忆 - 用 memory_update_longterm 将需要跨会话保留的信息写入长期记忆。 如果 Agent 判断没有值得保存的内容则回复 [SILENT]由 is_silent_response() 识别后不向用户展示[memory_flush.py](https://link.gitcode.com/i/406ff02588c3f7b35dfa8d370953e852#L79-L88)。这套机制把上下文即将丢失的被动损失转化为主动沉淀记忆的触发点。 ## 六、记忆生命周期全景与维护建议 综合以上模块HelloClaw 的记忆体系可以归纳为一条完整生命周期对话进行中 │ MemoryCaptureManager 实时规则捕获preference/decision/entity/fact ▼ 每日记忆 memory/YYYY-MM-DD.md带 [category] 标签滚动保留 30 天 │ ① SessionSummarizer 会话总结 → YYYY-MM-DD-slug.md │ ② Agent 按 MEMORY.md 模板规则定期复盘每日文件 ▼ 长期记忆 MEMORY.md精心策划、主会话专属、跨会话常驻 ▲ MemoryFlushManager上下文压缩前静默回合memory_add / memory_update_longterm 抢救【免费下载链接】hello-agents 《从零开始构建智能体》——从零开始的智能体原理与实践教程项目地址: https://gitcode.com/GitHub_Trending/he/hello-agents创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考