fix: inject s09 memories as turn context

This commit is contained in:
Gui-Yue
2026-05-26 05:35:51 +00:00
parent 8a20e2566b
commit c396d59f03
3 changed files with 22 additions and 13 deletions

View File

@@ -23,7 +23,7 @@ LLM 没有持久状态,所有信息都在上下文窗口里。上下文满了
s08 的压缩管线保留,聚焦记忆。存储选文件系统:`.memory/` 目录下,每个记忆一个 `.md` 文件,带 YAML frontmatter`name` / `description` / `type`)。文件多了需要索引:`MEMORY.md` 一行一个链接,注入 SYSTEM。
关键设计:索引常驻 SYSTEM prompt可被 prompt cache 缓存),文件内容按需注入(按 filename/description 匹配当前对话,不破坏 cache。写入分两条路径:用户显式说"记住",或者每轮结束后后台提取。文件积累多了,定期整理去重。
关键设计:索引常驻 SYSTEM prompt可被 prompt cache 缓存),文件内容按需注入到当前 user turn(按 filename/description 匹配当前对话,不破坏 cache。写入由每轮结束后的提取器完成:用户显式说"记住"或表达稳定偏好时,提取器会保存为记忆。文件积累多了,定期整理去重。
四类记忆,各有用途:
@@ -78,7 +78,7 @@ def write_memory_file(name, mem_type, description, body):
**路径一:索引常驻 SYSTEM。** `build_system()` 每轮重建 SYSTEM 时读取 `MEMORY.md`把记忆清单注入。SYSTEM prompt 中的索引可以被 prompt cache 缓存,不需要每轮重新发送。
**路径二:相关记忆按需注入。** 每轮调用前,`load_memories()` 把最近对话和记忆目录name + description一起发给 LLM 做一次轻量 side-query选出相关的文件名再读文件内容注入上下文。最多 5 条,控制开销。
**路径二:相关记忆按需注入。** 每轮调用前,`load_memories()` 把最近对话和记忆目录name + description一起发给 LLM 做一次轻量 side-query选出相关的文件名再读文件内容临时注入到当前 user turn。最多 5 条,控制开销。
```python
def select_relevant_memories(messages, max_items=5):
@@ -93,7 +93,8 @@ def select_relevant_memories(messages, max_items=5):
"content": f"Select relevant memory indices. Return JSON array.\n\n"
f"Recent conversation:\n{recent}\n\nMemory catalog:\n{catalog}"}],
max_tokens=200)
indices = json.loads(re.search(r'\[.*?\]', response.content[0].text).group())
text = extract_text(response.content).strip()
indices = json.loads(re.search(r'\[.*?\]', text).group())
return [files[i]["filename"] for i in indices if 0 <= i < len(files)]
```
@@ -108,7 +109,7 @@ def select_relevant_memories(messages, max_items=5):
```python
# In agent_loop:
if response.stop_reason != "tool_use":
extract_memories(messages) # 从最近对话提取新记忆
extract_memories(pre_compress) # 从压缩前快照提取新记忆
consolidate_memories() # 检查是否需要整理
return
```