跳到主要内容

数据流隐私上的设计

账单与 Ledger 很敏感:它记录你消费的地点、时间、金额和对手方。这篇说明三件事——数据存在哪、什么时候会离开你的环境,以及围绕这些做了哪些取舍。

数据存在哪​

原始账单文件​

  • 走「解析」入口的文件不落存储:上传后读入内存直接解析,不创建文件记录,也就没有副本留存。
  • 走「文件管理」入口的文件会长期保存:存进对象存储(自托管默认 MinIO,官方实例为 OSS),文件名是内容哈希;它没有自动过期,需要你自己在文件管理里删除。想要「平台不留下原始文件」,就走解析入口。

账本​

  • 账本是实例磁盘上的纯文本 .bean 文件:main.bean 是入口,trans/ 是平台的解析产物。启用 Git 同步后,实例内还会多一份由你的仓库拉取而来的副本。
  • 平台必须能读它才算「替你干活」:Fava 报表直接读这份账本,Copilot 的查询也在服务端对它执行。因此这里不使用端到端加密——加密与「平台替你渲染、替你算」互斥。对冲它的是「可撤回」与「可自托管」,见末节。

助手会话​

  • 无论你选哪个模型,提问、回答,以及执行过的 BQL 与查询结果都会保存在实例数据库里(也就是你的对话历史)。换成本地 Ollama 只是不把内容发出去,不等于不在平台留痕。

什么时候数据会离开你的环境​

解析阶段​

  • 默认不出境:分类由本地 BERT(bert-base-chinese)推理完成,账单原文不发外部。
  • 例外一(你主动选择):在「输出配置 → Copilot」把解析模型设为 DeepSeek 后,才会发送一行派生字段与候选关键字;账单原文、账本都不发送:
类型:{交易类型} 商户:{对手方} 商品:{商品说明} 金额:{金额}元
  • 例外二(默认开启):条目审核去重判断「两条候选是不是同一笔」时会交给 LLM,发送条目对的摘要(日期、金额、收支方向、对方、商品,以及含账户名的账目文本)。但它只在两步筛选之后才出境:先用交易单号与日期做确定性判重,只有「同一天 + 金额接近」的条目对才成为候选;模型不可用时还会回退到确定性匹配。开关 ENTRY_REVIEW_DEDUP_ENABLED 是实例级的(默认开启,自托管可关闭),官方实例上的用户改不了。

分析阶段​

  • 送给模型的是账本上下文:账户目录、标签目录、账本里实际出现的账户(最多 80 个)与 BQL 用法说明——账本原文不上传;你在这一轮问到的查询,其结果也会随对话交给模型。
  • 模型三选一:平台额度(实例配置了平台密钥时才可用)、你自己的 endpoint 与密钥(BYOK)、本地 Ollama。
  • 只有「本地 Ollama + 自托管」这种组合,数据才完全不离开你的机器;BYOK 指向第三方服务时,上述账本上下文会发给那个第三方。
  • Copilot 与 MCP 对账本都是只读:可以查询、分析,不会改写你的账本。

关键设计取舍​

  • 默认本地 BERT 而非 LLM。 账单是敏感数据,用「够用就好」的小模型,避免把原文交给大模型。代价是语义泛化弱于 LLM,因此它只负责候选之间的取舍,不负责生成分类。条目审核去重是唯一的例外:它要判断语义重复,所以默认交给 LLM,也因此把含账户名的摘要送了出去。
  • 只发派生字段,不发原文。 用一行结构化文本替代账单原文,缩小暴露面。代价是模型看不到完整上下文——对「二选一」这个任务已经足够。
  • 环境可选择,但要说清边界。 与其承诺「我们绝对安全」,不如把选择权交给你:云端或本地、BYOK 或平台模型。但要记住:「本地 Ollama」只保证内容不发给模型服务,不保证平台不留痕(会话与查询结果仍在实例数据库里)。
  • 持有边界可撤回。 账本是全部记账事实的收敛物,与其要求你一开始就完全信任平台,不如让这份信任随时收得回。Git 取消同步 即清除实例内由 Git 同步引入的账本内容,回到未启用同步时的形态(同步配置本身不改动)。详见 配置 Git 同步。
  • 不加密,但给出口。 账本以明文文本存在实例磁盘上——这是刻意的:账本要能被读取才能被计算。我们不用「我们绝对安全」来兜底,而是给你两条退路:随时取消同步把持有撤回,或用 自托管 把这份持有搬回你自己的机器。

自托管与官方实例有什么不同​

差别不是「云端更危险」这类结论,而是由部署时的配置决定:

项官方托管实例自托管
原始账单文件存放对象存储(OSS)默认 MinIO(或本地/S3,由 STORAGE_TYPE 决定)
平台 LLM 额度实例配置了平台密钥,未填 BYOK 时可回退默认没有,需要自己填 endpoint 与密钥,或用本地 Ollama
登录方式手机号验证码可关闭短信,改用用户名/邮箱与密码

共同点更重要:账本都以明文文本保存在实例磁盘上,平台都必须能读它;差别在于这份实例落在谁的机器上、由谁运维。

账单会被拿去训练吗​

不会。代码里没有把账单或账本送去训练、微调或上传样本的路径;你会被收集的只有你主动提交的反馈(对回答的评分与评价),它保存在你自己的实例里,用途是产品改进而不是训练模型。

结语​

与其承诺「我们绝对安全」,不如把选择权交给你:账本属于你,随时搬得走。