Agent 实现方法论
From Scratch
学习地图
练习
术语表
← 返回首页
本章教程
本章练习
第 10 章测验
第 10 章测验
对应章节:持久层:会话与事件存储
共 8 题,答对率 ≥ 80% 即通过。请完成全部题目后点击「提交」。
Q1
为什么 Agent 需要持久层?
因为模型会遗忘太久远的对话,持久层可以帮模型扩展上下文窗口
因为对话与事件只存在进程内存里,进程一退出就全部丢失——断线即失忆,无法回放、无法多会话
因为持久层能把 token 费用降低到零
因为持久层能让模型输出更稳定的 JSON
Q2
关于「快照」与「事件溯源」两种存储模型,正确的理解是?
快照存的是「当前状态」,事件溯源存的是「导致当前状态的事件流」——事件日志是唯一事实源,当前状态可随时由事件回放重建
快照能记录任意历史细节,事件溯源只能记录最终结果
事件溯源不需要存储介质,所有数据都留在内存里
快照模式天然支持审计与历史分析,事件溯源不支持
Q3
事件日志的 append-only 语义是指?
只允许追加,绝不更新、绝不删除——每条事件都保留完整发生过程,回放与审计因此可靠
允许修改最近一条事件来修正写错的 payload
定期清空旧事件以节省磁盘空间
事件只能追加到会话开头,不能追加到末尾
Q4
关于 SQLite 的 WAL 模式与 synchronous=NORMAL,正确的理解是?
进程崩溃后已提交事务可能部分丢失,必须人工修复数据库
进程崩溃(如 SIGKILL)后,SQLite 在下次打开时自动恢复 WAL,已提交事务不丢;断电则是另一档更强的保证,可升级 synchronous=FULL
只有 synchronous=FULL(每个事务都 fsync 到磁盘)才支持崩溃恢复
WAL 模式不允许两个连接同时打开同一个数据库文件
Q5
事件表中的 event_id 为什么必须是全局单调递增的?
它由模型生成,用来标记事件的重要程度
它既是全局写入顺序,也是回放顺序——事件按 event_id 排序即可重建出准确历史,跨会话不重复
它只要求会话内单调,跨会话可以复用
它是随机生成的,只用于去重
Q6
关于投影表(messages / tool_calls)与事件日志的关系,正确的理解是?
投影表是独立的事实源,事件日志只是调试用的辅助记录
投影表由事件日志派生,并在同一事务里维护,读路径免回放;事件日志本身不可变,只有投影可被更新(如 tool_result 回填 result 列)
投影表与事件日志互不相关,允许不一致
投影表必须保存事件的完整 payload,否则无法回放
Q7
多会话隔离在数据库层面靠什么实现?
给不同会话建不同的数据库文件
所有表都带 session_id 外键,且按 (session_id, event_id) 建索引——任何查询都先过滤会话
给会话事件加密,只有本会话能解密
给不同会话的事件使用不同的编号段
Q8
为什么本章练习不直接在浏览器里连 SQLite,而是用纯内存结构模拟事件日志?
SQLite 需要商业授权,练习环境买不起许可证
浏览器判题沙箱没有 node:sqlite 等 node:* API;而本章练习的核心是事件日志的语义(追加、隔离、回放),纯内存结构 + 纯函数即可完整覆盖,SQL 语法在 demo 中完整呈现
SQLite 无法在 Node.js 中运行
SQLite 只能存字符串,存不了结构化事件
提交