生成模型和抽取配置以 官方文档 的最新发布版本为准。这页帮你看清两条路差在哪里,以及怎样核对证据链。
两条路先放在一起看
显式写入保存你已经确认要留的内容。抽取先保存 Source,而且可能不产生任何 Memory。
如果 Agent 已经得到明确指令“记住这条决策”,直接写下更简单。不要为了证据链好看,先人工造一条 Source 再绕回 Memory。
反过来,自动采集到的提示词通常只应该先成为 Source。要不要提炼成 Memory,是后面的判断。
先检查抽取能力
- 采集仍可成功;
- Source 会留在日志;
- 待处理 Source 窗口无法执行模型抽取;
- 先运行配置流程,再用
--env-file重启 Server。
flush_memory,不依赖定时任务。
完整证据链脚本
新建source_memory.py:
每一步看什么
采集
成功状态是 HTTP 202,响应包含:status="accepted";- 精确内容 SourceRef;
- Scope 内部的数字
position。
source_conflict。真正重试时,复用原来那份输入。
同标识改内容一定不能覆盖旧 Source,应返回 HTTP 409。
刷新
判断 Source 是否被消费,看:previous_cursor;current_cursor;processed_source_count;- 采集响应的
position。
idle 也可能正常。此时游标应已经到位。
Memory 证据链
不要只看搜索是否出现相似文本。查找entry.source_refs 是否包含采集响应的精确 SourceRef。
这才能证明当前 Memory 条目来自这条 Source。
抽取无变更
合法情况:验证向量,需要更严格的断言
如果capabilities.search_modes 包含 vector,可以额外请求:
- 响应
mode == "vector"; - 命中 Citation 指向刚才的关联 Source 的条目;
matched_by包含vector。
mode=None 都不能证明本次 Source 已建立向量投影。
显式 vector 请求在能力不可用时返回 HTTP 422,不会自动切成 FTS。
跨会话召回靠 Scope,不靠会话
脚本为了可重复测试使用随机 Scope。要验证跨会话:- 改成稳定值,例如
project:powercontext-101; - 第一次运行采集/刷新;
- 在新的 Python 进程或 Agent 会话中只运行搜索/准备;
- 两边连接同一个 Server,并使用完全相同的 Scope。
- Server URL;
- 数据库主目录/URL;
- 最终
scope_id; - 条目是否启用状态;
- 查询是否相关。
启用状态、停用状态与历史
抽取产生的条目与显式 Memory 使用同一生命周期:- 修订创建新条目版本;
- 停用将当前条目设为停用状态;
- 默认列出/搜索/PreparedContext 只使用启用状态内容;
include_inactive=True和精确读取保留审计历史。
失败排查
采集成功,刷新返回 503
检查生成能力和模型提供方凭证。Source 已经保存;修复配置后可以重试未消费窗口。刷新是已处理,却没有 linked 条目
这是允许的无变更。先看 Source 内容是否确实包含可复用决策,再检查生成输出和去重。游标一直追不上位置
查看就绪状态、生成诊断信息和调度器/刷新错误。不要把未处理窗口误报成已生成 Memory。搜索能命中,但证据链不对
你命中了同 Scope 中旧的相似 Memory。以source_refs 和精确条目 Citation 为准。
第二次采集变成冲突
同一source_id 的内容或元数据字节发生变化。为新事件使用新 ID;真正的重试则复用原输入。
怎么知道跑通了
这一页完成后,你应能证明:- 采集创建 Source,不会直接创建 Memory。
- 同样输入再发一次,位置不变。
- 刷新后,游标到达采集位置。
- 关联这条 Source 的条目,靠精确
source_refs认出来。 - 窗口已经处理完,也可以合法没有留下 Memory。
- 换一个进程再找,靠的是稳定 Scope。
- 停用后的条目退出默认召回,历史还在。
下一步
Handoff 闭环
准备就会写边界 Source。提交才留下里程碑。
卡住时先对排错
采集成功却搜不到 Memory,先打开排错。

