MemScheduler的细节在MemOS源码中是如何具体实现的?
摘要:【Agent】MemOS 源码笔记 (7) MemScheduler 细节 目录【Agent】MemOS 源码笔记 (7) MemScheduler 细节0x00 摘要0x01 组件关系0x02 实现2.1 GeneralScheduler
【Agent】MemOS 源码笔记---(7)---MemScheduler 细节
目录【Agent】MemOS 源码笔记---(7)---MemScheduler 细节0x00 摘要0x01 组件关系0x02 实现2.1 GeneralScheduler2.1.1 消息处理消息类型与processor注册消息分发过程2.1.2 流程2.1.3 完整代码2.2 SchedulerDispatcher2.2.1 分发逻辑2.2.2 流程2.2.3 代码2.3 SchedulerRetriever2.3.1 功能2.3.2 详细步骤说明2.3.3 调用关系2.3.4 实现记忆检索流程(search 方法)记忆全流程处理与重排(process_and_rerank_memories 方法)LLM 记忆重排流程(rerank_memories 方法)代码0x03 关联3.1 SchedulerDispatcher 和 GeneralScheduler3.2 GeneralScheduler 和 TreeTextMemory3.3 总结3.4 MosCore0xFF 参考
0x00 摘要
记忆调度就像大脑的注意力机制,动态决定在合适的时刻调用合适的记忆。
在 MemOS 中,记忆调度(Memory Scheduling) 通过对【不同使用效率(参数>激活>工作>其他明文)的记忆】的相互调度,让模型能更高效、准确地获取用户所需的记忆。在对话和任务进行时,通过预测用户后续对话所需记忆并提前调入高效率记忆类型如激活记忆工作记忆,加速推理链路。
记忆调度的具体实现就是MemScheduler ,这是一个与 MemOS 系统并行运行的并发记忆管理系统,它协调 AI 系统中工作记忆、长时记忆和激活记忆之间的记忆操作。它通过事件驱动调度处理记忆检索、更新和压缩。该系统特别适合需要动态记忆管理的对话代理和推理系统。
备注:本文基于MemOS的文档和源码进行学习,似乎其文档并没有跟上源码更新的速度,而且也有部分功能未实现或者未开源。
前一篇介绍了 MemScheduler 的总体概念,本篇来看看实现细节。
0x01 组件关系
最核心的几个组件关系如下:
GeneralScheduler 是整个调度系统的核心组件,继承自 BaseScheduler,负责处理不同类型的消息(查询、回答、添加等),并协调其他组件完成具体任务。
SchedulerDispatcher 是消息分发器,负责将不同类型的消息分发给对应的processor,支持并行处理(可选)。
SchedulerRetriever 是记忆检索器,负责从记忆库中搜索、重排序和过滤记忆项,提供智能记忆管理功能。
MemOS-main\src\memos\templates\mem_scheduler_prompts.py 中可以看到使用的prompt。
PROMPT_MAPPING = {
"intent_recognizing": INTENT_RECOGNIZING_PROMPT,
"memory_reranking": MEMORY_RERANKING_PROMPT,
"query_keywords_extraction": QUERY_KEYWORDS_EXTRACTION_PROMPT,
"memory_filtering": MEMORY_FILTERING_PROMPT,
"memory_redundancy_filtering": MEMORY_REDUNDANCY_FILTERING_PROMPT,
"memory_combined_filtering": MEMORY_COMBINED_FILTERING_PROMPT,
"memory_answer_ability_evaluation": MEMORY_ANSWER_ABILITY_EVALUATION_PROMPT,
}
0x02 实现
2.1 GeneralScheduler
BaseScheduler是基类,而GeneralScheduler才是真正起作用的派生类。
GeneralScheduler采用生产者-消费者模型进行工作,是基于消息队列的内存调度器。
该类是 MemOS 中基于BaseScheduler的具体调度器实现,专注于处理查询、回答和添加内存等核心任务。核心组件架构:
消息队列:使用 memos_message_queue 来存储待处理的消息。
消费者线程:使用 _message_consumer 方法持续轮询队列并处理消息。
