### 架构重构:三层分层目录化 - domain 拆分为 8 个子目录(core/pipeline/rules/finance/stats/taxonomy/transaction/platform) - components 拆分为 6 个子目录(form/ui/layout/account/category/stats/transaction) - services 拆分为 5 个子目录(automation/data/ocr/security),accessibilityParser 从 automationPipeline 提取 - 新增 ruleConfig.ts — 规则配置唯一数据源(关键词/方向/OCR 模式),与业务逻辑解耦 ### 微信账单抓取:节点混淆绕过(核心突破) - BillingAccessibilityService 重命名为 SelectToSpeakService,完整伪装为系统服务 - 同时伪装包名+类名为 com.google.android.accessibility.selecttospeak,规避微信 8.0.52+ 白名单校验 - Config Plugin 重写:8 个 kt 文件整体复制+package 正则替换+Manifest/import 联动 - 支付宝/微信无障碍文本解析器全面增强(方向推断/账单分类提取/付款方式提取/容错) - 补充文档 accessibility-wechat-guide.md(伪装原理、踩坑全记录) ### 新 UI 组件体系 - Toast:全局轻量 toast(Context Provider + 入场动画 + 操作按钮 + 自动消失) - ErrorBoundary:React class 错误边界(降级 UI + 重试) - EmptyState / ConfirmDialog / SegmentedControl / Skeleton / TimePicker - BottomSheet 重写:SafeAreaProvider 修复、手势下滑关闭、键盘响应式避让 - FormModal 重构:拆出 FormFields 子组件(TextField/SelectField/DropdownField) - 新增 PeriodSwitcher、RangeStatsCard 独立组件 ### 新 Hooks & 工具 - useBottomInset — 统一底部安全区留白 - useKeyboardAvoiding — 键盘高度响应式 hook(替代 translateY 方案) - sanitize.ts — 日志脱敏工具提取 ### 账本增删改增强 - 写锁增加代际计数器(lockGeneration),reset 后旧链 pending 任务自动跳过 set - 新增 restoreTransaction — 撤销删除(重新追加 raw 文本到 mobile.bean) - 删除交易时清除去重缓存(buildTxKeyFromRaw 重建去重键),支持「删了重记」 - editTransaction/deleteTransaction 改用 dr-id 精确定位交易块(避免同名交易定位错误) - appendTransactionsBatch 改从存储直接读取,避免 zustand state 不一致 ### OCR 原生模块增强 - 异步 initEngine 增加 CountDownLatch 等待(最多 15s),解决竞态导致的「引擎未就绪」 - setModelDir 增加去重判断 + file:// 前缀剥离,避免冗余 reload - 推理链路增加分阶段耗时日志(det 推理/det 后处理/rec 识别) - 图片缩放策略重命名(scaleDownForOcr → capLongEdge) ### OCR 模型按需下载 - 移除了启动时自动下载 ~30MB OCR 模型的逻辑 - 改为首次使用 OCR 时才触发下载 ### 设置页重设计 - ScrollView → SectionList 分组卡片布局(iOS 风格分组圆角行+右侧箭头) - 移除 Card 组件包装,直接使用独立分组头+底部关于卡片 ### 首页优化 - ScrollView → FlatList(ListHeaderComponent 承载净资产卡片+待办条) - 日期/金额格式化增加 locale 感知(zh/en) ### 通知管道增强 - NotificationChannel MD5 去重改为批量淘汰(80% 阈值),替代逐个删除 - 增加 debug 日志输出(过滤原因/包名) ### ESLint - 新增 eslint.config.mjs(typescript-eslint + react-hooks + react-native 规则集) - package.json 新增 lint/lint:fix 脚本,引入 5 个 devDependencies ### 文档 - accessibility-wechat-guide.md — 微信无障碍伪装完整方案 - modal-keyboard-guide.md — 弹窗键盘避让方案 - ocr-pipeline-guide.md — OCR 三层层级管线 - OCR及文本模型测试 / 账单元识别及账户分类设计 / 账户分类模型测试
11 KiB
11 KiB
硅基流动与智谱 AI 账单 OCR、JSON 提取及 AI 账户自动分类实测报告
本报告针对测试图片(20260725-142945.jpg 信用卡账单截图),对 硅基流动 (SiliconFlow) 与 智谱 AI (BigModel.cn) 平台的视觉大模型、OCR 引擎、免费文本大模型及向量 Embedding 模型进行了全流程实测基准对比。
目录
- 测试结论与终极选型建议
- 实测性能对比总表
- 硅基流动 (SiliconFlow) 平台测试详解
- 智谱 AI (BigModel.cn) 平台测试详解
- 免费模型配额与 Rate Limits 规则
- DriftLedger (浮记) 架构与账户分配流程
- AI 账户自动分类实测 (免费 LLM vs 路径 B 向量检索)
一、 测试结论与终极选型建议
Tip
最佳单 API 识图直出方案:智谱
glm-4v-flash
- 耗时仅 3.22 秒,单次 API 请求即可直接输出包含商户、金额、日期、卡号、原币的完美 JSON,且 100% 免费。
Important
最佳双阶段识图流水线方案:硅基流动
DeepSeek-OCR+THUDM/GLM-4-9B-0414
- 总耗时仅 4.36 秒(阶段一 OCR 1.17s + 阶段二 文本提 JSON 3.19s),全免费,OCR 文字识别准确率 100%。
Note
最佳 AI 账户自动分类方案:智谱
glm-4-flash-250414(免费 LLM) / 硅基BAAI/bge-m3(向量路径 B)
- 免费 LLM 直选 (
glm-4-flash-250414):耗时仅 2.22 秒,100% 精确推导出Liabilities:CreditCard:CMB:3315与Expenses:Software:Subscription。- 向量路径 B (
bge-m3):耗时仅 0.32 秒 (320 毫秒),亚秒级定位匹配目标卡片。
二、 实测性能对比总表
测试图片:20260725-142945.jpg(招商银行信用卡消费通知,含商户 GOOGLE *ChatGPT,金额 ¥143.97,信用卡 3315,原币 21.19,时间 2026-07-23 00:00:00)。
| 阶段 / 任务 | 平台 | 模型 / 组合名称 | 架构类型 | 阶段耗时 | 总耗时 | 提取准确度与 JSON 质量 | 资费类型 |
|---|---|---|---|---|---|---|---|
| 识图 JSON 提取 | 智谱 AI | glm-4v-flash |
单阶段 VLM | - | 3.22s | 100% 完美 (提取极精准,结构清晰) | 100% 免费 |
| 识图 JSON 提取 | 硅基流动 | DeepSeek-OCR + GLM-4-9B-0414 |
双阶段流水线 | 1.17s + 3.19s | 4.36s | 100% 准确 (结构化规范,无幻觉) | 100% 免费 |
| 识图 JSON 提取 | 硅基流动 | DeepSeek-OCR + DeepSeek-V3 |
双阶段流水线 | 1.17s + 4.22s | 5.39s | 智能推导 (自动补全原币单位 USD) |
低成本 (~0.0008分/次) |
| 识图 JSON 提取 | 智谱 AI | glm-4.1v-thinking-flash |
思维链 VLM | - | 7.03s | 带有 <think> 推理链,易超长截断 |
100% 免费 |
| 账户智能分类 | 智谱 AI | glm-4-flash-250414 |
免费 LLM 分类 | - | 2.22s | 100% 精确 (同时给出资金与支出账户及理由) | 100% 免费 |
| 账户智能分类 | 硅基流动 | THUDM/GLM-4-9B-0414 |
免费 LLM 分类 | - | 3.45s | 100% 精确 | 100% 免费 |
| 账户智能分类 | 硅基流动 | BAAI/bge-m3 |
向量路径 B 检索 | - | 0.32s | 亚秒级最快 (Top 1 相似度 0.5662 精准命中) | 100% 免费 |
三、 硅基流动 (SiliconFlow) 平台测试详解
1. deepseek-ai/DeepSeek-OCR
- 定位:端到端纯文档/图片至 Markdown 识别模型。
- 优点:速度极快(1.17s ~ 1.48s),完美还原表格与富文本结构。
- 限制:不支持通用大语言模型的指令遵循(无法直接提示词输出 JSON,强制开启
json_object会陷入空格生成死循环)。
2. PaddlePaddle/PaddleOCR-VL-1.5
- 定位:带坐标识别的文档/版面分析大模型。
- 缺点:缺少张量并行加速,单次生成生成耗时高达 60~110 秒,输出结果混杂大量的点位 Token。
3. 双阶段流水线提取结果(实际返回 JSON)
{
"occurredAt": "2026-07-23 00:00:00",
"amount": 143.97,
"currency": "CNY",
"direction": "expense",
"counterparty": "GOOGLE *ChatGPT",
"memo": "信用卡尾号: 3315, 原币金额: 21.19 USD"
}
四、 智谱 AI (BigModel.cn) 平台测试详解
1. 智谱免费 Flash 模型分类与特性
glm-4v-flash:智谱基础免费视觉模型,实测表现最稳定、速度最快 (3.22s),原生支持json_object。glm-4.6v-flash:最新轻量多模态模型,支持原生工具调用(Tool Calling),但免费接口频控较严(并发时易触发 HTTP 429)。glm-4.1v-thinking-flash:具备 Thinking 思维链机制,回答前会在<think>中展开多步骤思考逻辑。glm-4-flash-250414:纯文本/代码轻量旗舰模型,适合放在双阶段流水线的 Stage 2 以及账户分类。CogView-3-Flash/CogVideoX-Flash:分别用于文生图与视频生成。
2. glm-4v-flash 实测输出数据
{
"occurredAt": "2026-07-23 00:00:00",
"amount": 143.97,
"currency": "CNY",
"direction": "expense",
"counterparty": "GOOGLE *ChatGPT",
"memo": {
"card_last_4_digits": "3315",
"original_amount": 21.19,
"country_or_region": "美国"
}
}
五、 免费模型配额与 Rate Limits 规则
1. 硅基流动 (SiliconFlow)
- 门槛:需完成账户实名认证。
- 配额:
- RPM (Requests Per Minute):100 ~ 1,000 RPM(中小模型 500~1000 RPM)。
- TPM (Tokens Per Minute):50,000 ~ 100,000 TPM。
- Pro/ 专线:带
Pro/前缀的模型(如Pro/deepseek-ai/DeepSeek-V3)为付费独占集群,无免费版的固定并发上限。
2. 智谱开放平台 (BigModel.cn)
- 免费规则:所有的 Flash 命名系列(
GLM-4-Flash、GLM-4V-Flash等)API 均免费开放。 - 并发控制:对高频连续调用设置了 RPM 阈值(触发时返回
HTTP 429 Too Many Requests),代码中需配置指数退避或 1~2 秒重试间隔。
六、 DriftLedger (浮记) 架构与账户分配流程
针对识别结果中“为什么只包含时间、金额、商户名,而没有 Beancount 账户”的说明:
1. 职责解耦设计
识图/OCR 模块只负责提取客观的原始交易事件 (ImportedEvent),定义于 types.ts。由于每个用户的 Beancount 账户名(如 Assets:招商银行:信用卡3315)是高度个性化的,模型无法预知用户本地账本结构。
2. 账本账户决定流程
账户映射是在 BillPipeline 责任链 中完成的:
[账单截图]
│
▼ 1. 图像解析 (AiVisionProcessor.ts)
[ImportedEvent] ─── (仅含时间、金额、商户 GOOGLE *ChatGPT、备注 3315)
│
▼ 2. 进入流水线 BillPipeline.process() ─── [billPipeline.ts]
├──> ① 转账识别 (recognizeTransfers)
├──> ② 批次去重与历史去重 (dedup)
└──> ③ 规则匹配与账户分类 (rules.ts)
├── 匹配商户/卡号 "3315" ──> 资金来源账户 (sourceAccount): Assets:招商银行:信用卡3315
└── 匹配商户 "GOOGLE *ChatGPT" ──> 支出分类账户 (categoryAccount): Expenses:订阅服务:AI
│
▼ 3. 输出标准交易草稿 (TransactionDraft)
[TransactionDraft] ─── (产生符合 Beancount 规范的两笔双式记账 Postings)
七、 AI 账户自动分类实测 (免费 LLM vs 路径 B 向量检索)
实测验证:能否利用 AI 模型根据用户本地的 Beancount 候选账户列表自动完成账户匹配?
1. 实测结果展示
路径 A:免费 LLM 直选(智谱 glm-4-flash-250414,耗时 2.22 秒)
传入 9 个 Beancount 候选账户 + 交易事实,模型 100% 精确返回:
{
"sourceAccount": "Liabilities:CreditCard:CMB:3315",
"categoryAccount": "Expenses:Software:Subscription",
"confidence": "high",
"reason": "交易备注说明信用卡尾号3315,且根据金额和商户判断为软件订阅支出"
}
路径 B:向量 Embedding 余弦相似度检索(硅基流动 BAAI/bge-m3,耗时 0.32 秒)
将交易文本与账户生成 1024 维向量进行余弦相似度计算,点积耗时 < 1ms:
- Top 1 命中:
Liabilities:CreditCard:CMB:3315(相似度 0.5662) - Top 2 命中:
Expenses:Shopping:Digital(相似度 0.5302)
2. 路径 B 的完整实现逻辑拆解
[导入交易 ImportedEvent]
商户: GOOGLE *ChatGPT | 备注: 信用卡尾号3315
│
├───> 资金搜索文本 ──> BAAI/bge-m3 ──> 向量对比 ──> 提取最高分: Liabilities:CreditCard:CMB:3315
│
└───> 分类搜索文本 ──> BAAI/bge-m3 ──> 向量对比 ──> 提取最高分: Expenses:Software:Subscription
- 账户隔离与语义增强 (离线缓存):
- 将账户拆分为【资金空间 Assets/Liabilities】与【分类空间 Expenses/Income】。
- 为账号补充别名描述(如
Liabilities:CreditCard:CMB:3315➔"招商银行 信用卡 尾号3315 掌上生活")。
- 构建向量索引:使用
BAAI/bge-m3将所有账户转为向量缓存在本地内存/SQLite 中。 - 实时查询向量化:收到交易时,分别生成资金查询与分类查询,耗时约 150 毫秒。
- 双路余弦相似度检索:通过点积公式计算相似度,并提取最高分。
- 阈值判定与推荐:高分自动填充,低分弹出 Top 3 快捷芯片让用户点选。
三、 相关代码位置
- 原始事件类型定义:src/domain/core/types.ts:L31-L38
- 账单流水线责任链:src/domain/pipeline/billPipeline.ts:L94-L180
- 规则分类与账户映射引擎:src/domain/rules/rules.ts:L1-L60
- AI 识图处理器服务:src/services/ocr/AiVisionProcessor.ts