DriftLedger/docs/账户分类模型测试.md
fengmengqi 6767dd538a feat: 领域/组件/服务三层目录重构 + 微信无障碍绕过方案 + 新 UI 组件体系 + 账本增删改增强
### 架构重构:三层分层目录化
  - 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及文本模型测试 / 账单元识别及账户分类设计 / 账户分类模型测试
2026-07-28 20:57:37 +08:00

11 KiB
Raw Blame History

硅基流动与智谱 AI 账单 OCR、JSON 提取及 AI 账户自动分类实测报告

本报告针对测试图片(20260725-142945.jpg 信用卡账单截图),对 硅基流动 (SiliconFlow)智谱 AI (BigModel.cn) 平台的视觉大模型、OCR 引擎、免费文本大模型及向量 Embedding 模型进行了全流程实测基准对比。


目录

  1. 测试结论与终极选型建议
  2. 实测性能对比总表
  3. 硅基流动 (SiliconFlow) 平台测试详解
  4. 智谱 AI (BigModel.cn) 平台测试详解
  5. 免费模型配额与 Rate Limits 规则
  6. DriftLedger (浮记) 架构与账户分配流程
  7. 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:3315Expenses: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-FlashGLM-4V-FlashAPI 均免费开放。
  • 并发控制:对高频连续调用设置了 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
  1. 账户隔离与语义增强 (离线缓存)
    • 将账户拆分为【资金空间 Assets/Liabilities】与【分类空间 Expenses/Income】。
    • 为账号补充别名描述(如 Liabilities:CreditCard:CMB:3315"招商银行 信用卡 尾号3315 掌上生活")。
  2. 构建向量索引:使用 BAAI/bge-m3 将所有账户转为向量缓存在本地内存/SQLite 中。
  3. 实时查询向量化:收到交易时,分别生成资金查询与分类查询,耗时约 150 毫秒。
  4. 双路余弦相似度检索:通过点积公式计算相似度,并提取最高分。
  5. 阈值判定与推荐:高分自动填充,低分弹出 Top 3 快捷芯片让用户点选。

三、 相关代码位置