这是一个支持人物隔离、冲突检测、图增强检索的长短期记忆系统。
- 记忆提取:从当前对话中提取 episodic / attribute 记忆。
- 关键词标签:每条记忆自动生成 2~3 个关键词,便于后续检索。
- 人物隔离:按
Persona_ID分区存储和检索。 - 关系判断:识别
contradicts(矛盾)和refines(补充/演进)关系。 - 图增强检索:向量召回后做
k跳图扩展,生成上下文块。
pip install -r requirements.txtexport DASHSCOPE_API_KEY="你的Key"若未配置 Key,系统仍可运行,但会启用本地回退逻辑(效果不如线上模型)。
默认配置在:
memory_system/config/config.yamlmemory_system/config/config.py(社区构建参数)
可调参数包括:
retrieval.vector_top_n:向量召回数量retrieval.keyword_top_n:关键词向量召回数量retrieval.rerank_top_n:重排保留数量retrieval.vector_score_threshold:向量相似度阈值retrieval.rerank_score_threshold:rerank 分数阈值retrieval.graph_depth_k:图扩展深度storage.vector_store_file/storage.graph_store_file:持久化文件路径
社区相关参数在 memory_system/config/config.py 中维护:
rebuild_interval:每新增多少条记忆触发一次 Louvain 社区重建louvain_resolution:Louvain 分辨率louvain_seed:Louvain 随机种子max_hierarchy_layers:社区层级最大层数
社区结果会持久化到 graph_store.json 的图级元数据中(community_state),并包含每层社区的语义摘要(自底向上生成)。
入口文件:main.py
python3 main.py -h
python3 main.py process -h
python3 main.py retrieve -hpython3 main.py process \
--speaker Caroline \
--sentence "Last week I went to swim.And I met my best friend there" \
--history "Melanie: How are you?" \
--reference-time "2026-04-17, Monday"输出中你会看到:
extracted:提取出的结构化记忆processed[].new_memory:写入后的记忆节点processed[].new_memory.keywords:该记忆的 2~3 个关键词processed[].created_edges:新建关系边(若有)processed[].deduplicated:是否命中去重(若为true,本次不会重复写入)community_update:社区构建触发状态(是否触发、阈值、待触发计数、层级数量等)
支持三种检索模式(通过 --retrieval-mode 选择):
manual:手动指定--speaker(默认)all:不指定speaker,在全量人物记忆中检索auto:由大模型根据 query 和人物列表自动选择检索人物
python3 main.py retrieve \
--retrieval-mode manual \
--speaker Melanie \
--query "Where has Melanie camped?"python3 main.py retrieve \
--retrieval-mode all \
--query "Where has Melanie camped?"python3 main.py retrieve \
--retrieval-mode auto \
--query "Where has Melanie camped?"检索流程说明:
- 先按
retrieval.vector_top_n做文本向量召回; - 再按
retrieval.keyword_top_n做关键词向量召回; - 将两路召回结果混合去重后,再进入现有 rerank 与图扩散。
输出中你会看到:
retrieval_mode:当前检索模式selected_persona_ids:本次实际参与检索的人物列表seed_memory_ids:向量+重排得到的种子节点expanded_memory_ids:图扩展后的节点集合context_block:可直接拼接到 Prompt 的长期记忆文本块
python3 main.py process \
--speaker Caroline \
--sentence "I am married now." \
--history "Caroline: I am single." \
--reference-time "2026-04-15, Wednesday"该示例会触发关系判断流程,并在输出的 created_edges 中体现 contradicts 或 refines。
运行后会自动生成:
memory_system/data/storage/vector_store.jsonmemory_system/data/storage/graph_store.json
如果你已有 memory_system/data/storage 下的历史数据(旧数据没有 keywords 字段),可运行:
python3 backfill_keywords.py --storage-dir memory_system/data/storage该命令默认会输出进度(文件进度 + 节点 tqdm 进度条)。
可调节进度输出频率(默认每 500 条节点输出一次):
python3 backfill_keywords.py --storage-dir memory_system/data/storage --progress-interval 1000如需关闭进度输出:
python3 backfill_keywords.py --storage-dir memory_system/data/storage --no-progress如需更快且不消耗 API,可禁用 LLM:
python3 backfill_keywords.py --storage-dir memory_system/data/storage --disable-llm仅预览统计结果(不写回文件):
python3 backfill_keywords.py --storage-dir memory_system/data/storage --dry-run只处理指定文件(可重复 --file):
python3 backfill_keywords.py --file memory_system/data/storage/vector_store.jsonpython3 qa_with_llm.py --query "Where has Melanie camped?"