证据、记忆与来源撤销
长期记忆不是把模型说过的话存进数据库。每条记忆应带来源、租户、创建时间、有效期、验证状态和版本。用户偏好、任务事实、检索材料和工具观察用途不同,权限也不同。来源被撤销时,检索、缓存、摘要和模型上下文都要过滤,不能只在最终提示词里提醒模型忽略它。
第一个可运行实验:版本化记忆
保存为 memory.py,用 Python 3.12 运行。
python
records = [
{'key': 'language', 'value': '中文', 'source': 'user:1', 'version': 1, 'revoked': False},
{'key': 'language', 'value': 'English', 'source': 'user:2', 'version': 2, 'revoked': False},
]
def current(records, key, revoked_sources=set()):
valid = [r for r in records if r['key'] == key and not r['revoked']
and r['source'] not in revoked_sources]
return max(valid, key=lambda r: r['version']) if valid else None
assert current(records, 'language')['value'] == 'English'
assert current(records, 'language', {'user:2'})['value'] == '中文'
records[0]['revoked'] = True
assert current(records, 'language')['value'] == 'English'
records[1]['revoked'] = True
assert current(records, 'language') is None
print('memory provenance passed')冲突记忆不能让模型投票决定;应用应按版本、确认事件或业务来源规则选择。删除或撤销要有审计记录,缓存键也要包含记忆版本。多租户隔离应在查询层完成,不能依赖 prompt 中的“不要泄露别的租户”。
变体实验
让版本 2 来自模型而不是用户,要求它不能自动覆盖用户明确偏好。再撤销 user:1,确认旧版本不会因为排序而重新出现。
练习
- 为记忆增加
expires_at和verified_by字段。 - 设计“用户删除记忆”对向量索引、摘要缓存和审计记录的影响。
- 区分事实记忆、偏好记忆和任务状态的读取权限。