数据流隐私上的设计
账单与 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 |
| 登录方式 | 手机号验证码 | 可关闭短信,改用用户名/邮箱与密码 |
共同点更重要:账本都以明文文本保存在实例磁盘上,平台都必须能读它;差别在于这份实例落在谁的机器上、由谁运维。
账单会被拿去训练吗
不会。代码里没有把账单或账本送去训练、微调或上传样本的路径;你会被收集的只有你主动提交的反馈(对回答的评分与评价),它保存在你自己的实例里,用途是产品改进而不是训练模型。
结语
与其承诺「我们绝对安全」,不如把选择权交给你:账本属于你,随时搬得走。