# 功能决策记录（FDR）：AI随口记

## 1. 基本信息
- 记录编号：FDR-2026-03-AGENT-QUICK-NOTE
- 功能名称：AI 随口记（日程/任务自动识别与写入）
- 记录日期：2026-03-14
- 决策状态：已采纳
- 负责人：项目协作实现（你 + Codex）
- 关联模块：`/agent/chat`、Agent Graph、任务写库工具、Redis 会话缓存、Outbox 持久化链路

## 2. 背景与问题
- 业务背景：用户希望在聊天中“顺口一句”就能完成任务记录，例如“明天上午 9 点交实验报告”。
- 初始问题：
  - 仅关键词触发的分流策略存在误判，容易出现“该走随口记没走到 / 不该走却走到了”。
  - 多次模型调用（意图识别、时间归一化、优先级评估、润色回复）导致整体耗时偏长。
  - 曾出现“回复显示安排成功但数据库未写入”的一致性问题，影响用户信任。
  - 相对时间理解依赖当前时间上下文，未显式给模型当前时间时易解析失败或落空。
- 不做此决策的后果：用户体验不稳定、链路不可解释、面试叙述难以自洽（无法清晰说明可靠性与性能权衡）。

## 3. 决策目标
- 目标 1：让“聊天入口 + 任务执行”在用户视角尽量无感切换，减少误判与等待焦虑。
- 目标 2：保证写入成功才返回成功，避免“假成功”。
- 目标 3：在不破坏现有流式聊天主链路的前提下，提升随口记链路可维护性与可解释性。
- 非目标：本次不做多 Agent 并发编排、不做复杂工作流引擎分布式扩展。

## 4. 备选方案
### 方案 A：继续以关键词匹配为主分流
- 描述：命中词则进随口记，否则普通聊天。
- 优点：实现简单，速度快。
- 缺点：语义覆盖不足，边界表达极易误判；可维护性差（词库不断膨胀）。

### 方案 B：完全依赖 Graph 二次意图判断
- 描述：所有请求先入图，再判断是否是随口记。
- 优点：逻辑统一，准确性相对高。
- 缺点：普通聊天也要先走较重流程，体验退化，整体成本高。

### 方案 C（采纳）：模型控制码路由 + Graph 兜底 + 单请求聚合规划
- 描述：
  - 先用同模型做轻量路由（返回 `quick_note/chat` 控制码）；
  - 路由命中则走随口记快路径，跳过重复判定；
  - 路由失败或异常时回退到 Graph 兜底判定；
  - 随口记核心规划改为单请求聚合（时间、优先级、回复语气一次产出），减少多轮 LLM 往返。
- 优点：体验与鲁棒性平衡更好，误判可兜底，耗时可控。
- 缺点：需要更严格的超时与错误处理，提示词质量直接影响路由稳定性。

## 5. 最终决策
- 采纳方案：方案 C。
- 关键理由：
  - 兼顾速度（快路径）与可靠性（兜底路径）；
  - 明确“成功响应必须以真实写库成功为前提”；
  - 对现有项目侵入较小，保留后续扩展到完整 Agent 编排的空间。

## 6. 关键实现约束（本次落地口径）
- 路由层：
  - 由模型返回控制码判断走向（`quick_note` 或 `chat`）；
  - 路由失败时允许进入 Graph 兜底，不直接让请求失败。
- 执行层（随口记）：
  - 使用“单请求聚合规划”，将时间归一化、优先级评估、回复素材生成整合为一次模型调用；
  - 对时间字段执行本地校验，非法日期不写库，返回纠错信息；
  - 优先级保留本地兜底，避免因模型输出波动导致链路中断。
- 一致性层：
  - 数据库写入结果作为成功唯一依据，`task_id` 无效即判失败；
  - 修复“成功回复未写入 Redis 会话缓存”的问题，确保会话上下文与持久化语义一致。
- 交互层：
  - 在 OpenAI 兼容流式输出下，阶段提示暂伪装为“思考块”形态，保证现有调试工具可读；
  - 最终正文一次性输出，不做伪流式分片刷屏。

## 7. 与 Outbox 链路的协同决策
- 保持“后置写 Outbox”策略：聊天主响应优先，持久化异步化。
- 移除“首次同步投 Kafka”机制，避免把 Broker 投递耗时绑定到当前请求。
- 结论：当前请求仅承担必要同步成本（如 Redis 与写 Outbox 入库），Kafka 分发交由后台扫描器处理。

## 8. 风险与应对
- 风险 1：路由模型超时导致分流不稳定。
  - 应对：独立路由超时控制 + 失败回退 Graph 兜底，避免整链路崩溃。
- 风险 2：模型输出日期格式不规范导致脏数据。
  - 应对：Go 侧严格日期校验，校验失败直接返回用户修正，不写库。
- 风险 3：用户感知“等待无反馈”。
  - 应对：增加阶段状态提示（请求接收、意图分析、时间校验、写库中、写库完成）。

## 9. 验证与回滚
- 验证方式：
  - 正常样例：绝对时间、相对时间（依赖当前时间）均应正确入库；
  - 异常样例：非法日期必须失败且不写库；
  - 一致性样例：成功后 Redis 会话能看到助手反馈。
- 成功判定标准：
  - 不再出现“秒回成功但 DB 无记录”；
  - 路由失败时仍可由兜底链路完成任务；
  - 交互可见阶段反馈，用户等待感降低。
- 回滚方案：
  - 路由逻辑可回退到纯聊天 + 手动触发工具；
  - 保留 Graph 兜底能力，避免单点策略失效。

## 10. 后续优化项
- 增加路由与执行链路的结构化指标（命中率、误判率、平均耗时、P95/P99）。
- 对“随口记回复风格”做可配置化（幽默程度、长度、正式度）。
- 后续接前端时，将临时“思考块伪装”升级为正式阶段事件协议，避免兼容层长期存在。
- 当工具数量增长后，考虑从单技能图演进到可插拔技能编排目录（按技能隔离 prompt、schema、重试策略）。
