产品设计

Granola:让自己的重点进入 AI 会议笔记

Granola 是面向高频会议参与者的 AI 笔记工具。它将你随手写下的重点与会议转录结合,整理出可继续编辑、回查依据的记录。

先尝试拆解问题、设计和实现,再展开思路,检查状态、边界与取舍,并设计验证用例。思路提供分析路径,不给出完整实现。

01
代码思考进阶

合并引用高亮时,怎样保留每条依据的归属?

练习场景

为自己的会议笔记工具设计“查看依据”的数据处理模块。用户点击一条结论,需要看到它引用的转录片段。多条引用可能重叠,而同名文件也可能已经更新。你需要避免高亮错位,并保留每条引用原本支持哪项结论。

输入与术语

  1. 一份资料用 documentId + revisionId 共同标识;这个版本的文本不可变。调用方已把文本转换成 Unicode 码点数组,数组长度为 L,本题不做字符编码或分词。两版本即使文件名相同也不是同一份资料。
  2. 每条引用包含唯一 citationId、claimId、documentId、revisionId、start、end。[start, end) 表示包含 start、不包含 end 的连续片段;坐标必须是安全整数,满足 0 ≤ start < end ≤ L。同一条结论可以有多条引用。字段类型和 ID 非空性由调用方保证,你需校验引用 ID 唯一、指定资料版本存在及范围有效。
  3. 输入最多 100,000 条引用,所有资料版本均为已给定的只读数据。若任意引用无效,整批返回带引用位置与原因的错误,不能替换当前已显示的高亮。不涉及网络、多用户编辑或渲染代码。

需要完成的行为

  1. 成功时输出每个资料版本的高亮区间:重叠或首尾相接的引用合并,输出按起点升序;不同版本和不同文档绝不合并。
  2. 同时保留 citationId → claimId、版本、原始区间 的索引。高亮合并只改变视觉覆盖,不能把几个结论的证据来源合成一条、丢掉原范围。
  3. 如果只有新版本可用而引用指定旧版本,报告缺失版本,不把坐标自动套到新文本。

用这个输入手工推演

资料 D 的 v1 长度为 12,v2 长度为 15。v1 的引用分别为 c1→结论A [2,5)、c2→结论B [4,8)、c3→结论A [8,10);v2 另有 c4→结论A [2,5)。请先画出高亮,再说明点击 c2 应查到什么。最后把 c3 的 end 改为 13,推演失败时界面应保留什么。

需要交付什么

提出校验顺序、分组和索引结构、区间合并不变量,以及成功后一次替换显示结果的方法;给出上述输入与重复 ID、空输入、缺失旧版本的预期行为,并说明时间和额外空间复杂度。不写完整实现或逐行伪代码。

查看思路
  1. 先绑定准确版本,再解释坐标。 用文档与版本的组合键查长度,不按文件名寻找“最新版本”。保留输入位置以便报错;用集合发现重复 citationId。单条引用可同时存在多项错误,选择首错或列出全部都可以,但行为应固定。
  2. 验证和展示分两步。 在临时结果中检查完整批次;发现错误就返回,不修改现有显示。全部有效后才提交新高亮及对应引用索引,避免界面一半是旧依据、一半是新依据。
  3. 按版本分组排序,维护当前覆盖范围。 同组按起点排序;后续区间的起点不大于当前终点时属于同一连续覆盖,扩展终点取较大值。否则结束当前范围。原始引用另存,不从合并区间反推某一结论的证据。
  4. 分开验证覆盖与归属。 示例中 D/v1 覆盖为 [2,10),D/v2 为 [2,5);点击 c2 仍对应结论B的 v1 [4,8),不是整个合并范围。c3越界则整批拒绝,保留此前显示。重复ID拒绝;空输入是合法空覆盖;缺失v1不能借v2替代。
  5. 把规模说明完整。 设引用数 n、给定版本数 d;若版本表需本次建立,校验与建索引期望 O(d+n),排序最坏 O(n log n),扫描 O(n),额外空间 O(d+n)。若已提供可直接查找的只读版本表,不计其既有存储,则新增空间 O(n)。文本已是只读码点数组,本题不复制全文;复杂度不包含加载文本和页面渲染。 上述界采用 ID 哈希、相等比较和映射访问均按单位成本计的模型;若使用长度可变的字符串 ID,还应另计实际哈希与字符串比较的工作量。