Skip to content

消息、任务状态与可纠错记忆:练习答案 ​

参考实现 ​

在正文定义之后增加包装器并运行:

python
memories = [
    {"tenant": "a", "fact": "喜欢中文", "source": "user:7", "expires": 30, "verified": True},
    {"tenant": "a", "fact": "订单已退款", "source": "model:8", "expires": 30, "verified": False},
]
def context_for(tenant, now, limit=2):
    visible = [m for m in memories if m["tenant"] == tenant and m["verified"] and m["expires"] > now]
    return [{"fact": m["fact"], "source": m["source"]} for m in visible[:limit]]
def context_without_revoked(tenant, now, revoked):
    return [m for m in context_for(tenant, now) if m["source"] not in revoked]
assert context_without_revoked("a", 10, {"user:7"}) == []
assert len(context_without_revoked("a", 10, set())) == 1
print("revocation respected")

本题数据量小,包装器足够;生产应在检索和分页前过滤撤销来源,否则先截取再过滤可能遗漏后面的有效条目。

返回正文

深化页面练习解答 ​

任务状态机 ​

审批过期后进入 failed 或专门的 approval_expired,不能自动沿用旧授权。每次转移记录 actor、时间、run ID 和原因;服务重启后先查询工具状态,区分未执行、执行中未知和已完成。

证据与记忆 ​

expires_at 控制时间有效性,verified_by 记录确认来源。删除记忆要同步失效向量索引、摘要缓存和检索结果,并保留最小审计记录。事实、偏好和任务状态应按租户、用户和任务分别授权。

上下文压缩 ​

摘要至少保存来源 ID、创建时间、版本和不确定性。预算不足时可以转异步、缩小范围或切换较小模型,但不能静默丢弃权限撤销和工具结果配对。RAG 证据、用户偏好和任务状态的生命周期与权限不同,不应共用一个无类型记忆表。

用心记录每一步成长