pennywiseai-tracker
隐私优先的 AI 记账工具,银行短信自动解析,端侧 LLM 智能问答,全本地处理零上传
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
隐私优先的 AI 记账工具,银行短信自动解析,端侧 LLM 智能问答,全本地处理零上传
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
你有没有过这样的经历:每个月到月底,看着银行卡余额发愁,却完全想不起来钱都花哪儿去了?翻银行短信吧,几百条密密麻麻的文字塞满了验证码、动账通知、广告推送——真正有用的消费记录早就淹没在信息海洋里。
PennyWise AI 解决的就是这个问题。它不需要你手动录入,不需要注册账户,甚至不需要联网。你只需要给它一个 SMS 读取权限,它就会自动「监听」手机里的银行短信,把每一笔交易提取出来,整理成干净的财务时间线。这整个过程——包括 AI 理解和分类——全部在本地完成,不经过任何服务器。
这个项目由独立开发者 Sarim 于 2025 年 7 月发起,截至 2026 年中已收获近 500 颗 GitHub Stars,在 Google Play 和 F-Droid 双平台上架,是当前开源隐私记账领域中最活跃的项目之一。
PennyWise 的使用流程极为简洁,用户授权后无需任何手动操作:
第一步:授予 SMS 权限。应用申请 READ_SMS 和 RECEIVE_SMS 权限(仅读取,不发送),这是 Android 系统标准权限,用户在安装时即可看到授权提示。项目在 PRIVACY.md 中明确承诺:不会上传短信内容,所有数据存储在设备本地。
第二步:AI 实时解析。当银行发送交易通知短信时,Android 的 RECEIVE_SMS 广播触发解析流程。应用内置覆盖 16 个国家、90+ 家银行的解析规则——从印度的 HDFC、SBI、ICICI,到阿联酋的 FAB、Emirates NBD,再到泰国、尼泊尔、埃塞俄比亚等国的本地银行,都能准确识别金额、交易类型、商户和日期。解析完成后,数据存入本地 SQLite 数据库。
第三步:查看洞察。用户可以在 App 内查看预算进度、支出分类图表、订阅检测结果,也可以向设备上的 AI 助手提问,比如「我这个月在餐饮上花了多少钱」,完全不用离开应用。
PennyWise 的 AI 能力分为两层,各司其职。
第一层:规则引擎(Parser Core)
项目将核心解析逻辑抽取为独立模块 parser-core,采用 Kotlin 编写,发布为本地 Maven artifact(com.pennywiseai:parser-core:0.1.0-SNAPSHOT)。解析器基于正则表达式和关键词匹配,根据不同银行的 SMS 格式模板提取字段。每个银行格式作为一个 BankFormatProvider,注册到统一的解析入口。这种设计的好处是:新增一个国家的银行支持,只需新增一个格式解析文件,不需要改动核心代码。模块同时支持单元测试,保证解析准确率。
规则引擎同时驱动**智能规则(Smart Rules)**功能——用户可以配置条件-动作规则,例如「当金额大于 500 且账户为 HDFC 时,自动归类为'大额支出'」。规则支持 AND/OR 逻辑组合,条件字段涵盖金额、类型、商户、日期、星期、账户等多维度,执行动作包括设置分类、修改商户名、追加描述、阻止入库等。这套规则系统在本地 JSON 配置文件中存储,不暴露为 API 接口。
第二层:端侧 LLM 推理(On-Device AI)
对于需要自然语言理解的任务——比如用户向 AI 助手提问「我上个月的零食支出有什么规律」,PennyWise 使用 Google LiteRT-LM(原 TensorFlow Lite 的 LLM 扩展)在设备上运行推理。应用依赖库中引入了 libs.litertlm.android,这是 Google 在 2024-2025 年间推出的端侧大模型推理框架,支持在普通 Android 设备(不需要 Google Play 服务)上运行量化后的开源模型。根据 README 说明,当前使用的是 Qwen 2.5 模型——阿里的开源小模型家族,专门针对端侧推理优化过参数量。
这意味着 AI 助手的功能完全在本地运行:没有 API 调用、没有数据离开手机。对于有隐私洁癖的用户来说,这是一个强有力的承诺——即使你天天问 AI「我花了多少钱」,银行短信数据也从未离开过这部手机。
项目主体是一个标准 Android 应用,使用 Kotlin 2.0.21 开发,主要技术选型如下:
Jetpack Compose 作为 UI 框架,配合 Material 3 设计语言,支持动态主题(Material You)和深色模式。项目使用 kotlinx-serialization 处理 JSON 序列化,Ktor Client(Android 引擎)进行网络通信。依赖注入采用 Dagger Hilt,数据持久化使用 Room 数据库,异步任务通过 WorkManager 调度(用于定期同步和订阅检测)。
特别值得注意的是,项目使用了 Hilt WorkManager 集成(androidx.hilt:hilt-work),这说明应用大量使用后台任务:短信实时接收、新交易解析、订阅周期检测等,均通过 WorkManager 的 PeriodicWorkRequest 在后台执行,即使 App 被划掉也不影响。
此外,项目还包含一个 iOS 应用骨架(iosApp/ 目录),虽然目前代码量较少,但项目结构暗示了跨平台 Kotlin Multiplatform 的长期规划——Kotlin/Native 编译到 iOS 端,与 Android 共享解析逻辑。
除了 Android App,项目还包含一个 pennywise-web 子模块,提供可选的云端同步和 Web 界面。这是一个标准的 Kotlin/JVM 服务,使用 Ktor 3.2.3(JetBrains 出品的异步 Web 框架)+ Netty 作为 HTTP 引擎,搭配 Exposed ORM 操作 PostgreSQL 数据库。
后端提供以下功能:短信数据云同步(可选,用户主动开启)、Web 管理界面(HTML 模板渲染)、CORS 跨域支持。项目提供完整的 Dockerfile,采用多阶段构建:第一阶段用 Gradle 8.5 + JDK 21 构建 Kotlin 项目(包括编译 parser-core 发布到本地 Maven),第二阶段用 eclipse-temurin:21-jre-alpine 运行 uber JAR(通过 Gradle Shadow 插件打包所有依赖)。镜像仅约 200-300MB,部署极为轻量。
后端支持切换数据库:生产环境推荐 PostgreSQL,开发环境默认使用 H2 内存数据库(application.conf 中可配置),这使得本地调试和 CI 测试都非常便捷。
隐私是 PennyWise 的核心卖点,不只是营销话术,而是体现在代码结构里:
PennyWise 的 Android App 可直接从 GitHub Release、 Google Play 或 F-Droid 安装,安装包约 15-30MB,无需 Root 权限。对于有自托管需求的用户,后端服务可通过 Docker 部署:克隆仓库后进入 pennywise-web 目录,执行 docker build 即可构建镜像,然后 docker run -p 8080:8080 启动。数据库使用 PostgreSQL 时,通过环境变量配置连接字符串即可。
尽管项目设计优秀,仍有一些局限值得注意:
1. 银行覆盖依赖维护更新。90+ 银行的解析规则是项目的核心资产,但银行偶尔会改变短信格式——一旦某银行的格式更新,解析器就会失效,需要维护者及时推送新规则。印度市场银行格式维护相对完善,其他国家的银行覆盖质量参差不齐。
2. 端侧 LLM 能力有限。LiteRT-LM + Qwen 2.5 的组合适合简单问答和分类任务,但处理复杂语义(如「我和女朋友上个月吃饭花了多少钱」这类跨多维度推理)时,能力上限明显。用户期待接近 ChatGPT 的体验,但端侧小模型目前还达不到。
3. iOS 版本缺失。虽然仓库中有 iosApp/ 目录,但目前只是一个骨架,项目主 README 中也未提及 iOS 平台。对于 iPhone 用户,目前唯一的方案是使用 Web 版后端,体验远不如原生 App。
4. 订阅检测依赖规则匹配。自动订阅检测通过识别「每月」「recurring」等关键词触发,误报率在高噪音短信环境中不算低。用户仍需手动确认和修正。
PennyWise AI 是一款设计思路非常清晰的产品:用最少的用户交互(只授权一个权限),换取最大的自动化记账体验。端侧 LLM 的引入让它不只是「读短信记账」,而是能回答自然语言问题的智能财务助手,这在开源记账应用中属于独一份的差异化能力。
从工程角度,项目代码质量较高:Kotlin 多平台架构清晰,依赖注入、Hilt WorkManager、Room 数据库的组合是当前 Android 开发的最佳实践。后端 Ktor 服务轻量简洁,Docker 部署开箱即用。Parser Core 模块化设计也为未来扩展银行格式提供了良好的工程基础。
对于个人用户,PennyWise 是一个值得一试的隐私记账方案;对于开发者,它也是一个学习「如何在移动端运行 LLM + 如何设计隐私优先应用」的优质参考项目。