feat: add reviewed OCR and AI document workflow

This commit is contained in:
leefer
2026-08-01 15:59:28 +08:00
parent 3ef13b5674
commit a3203f95da
12 changed files with 1808 additions and 6 deletions
+12
View File
@@ -63,3 +63,15 @@
- 桌面底层桥接:保持少量 Rust 代码,不在其中堆积业务规则
当前仓库首先实现可运行的界面与纯领域逻辑;本地数据库、Tauri 容器和云端服务按阶段接入,不用模拟实现冒充生产能力。
## OCR 与 LLM 迁移边界
当前纯本地测试版通过 `providers` 适配层访问百度 OCR 和 OpenAI 兼容 LLM。`documents` 模块只依赖统一的识别与建议函数,不读取供应商密钥,也不拼装 HTTP 请求。这样迁移到服务端时,可将 `providers` 的实现移动到服务端,客户端改为调用小白记账版本化 API,票据复核页面与字段校验规则无需重写。
客户端与服务端分离后遵守以下边界:
- 供应商密钥只存在服务端密钥管理系统或受保护环境变量中。
- 客户端只持有用户登录后的短期会话凭据,不持有 OCR 或 LLM 密钥。
- 服务端按经营主体做鉴权、限流、调用审计和数据隔离。
- OCR 与 LLM 的响应都先经过服务端结构校验;客户端仍保留金额、日期和枚举白名单等确定性校验。
- AI 只生成建议,不能直接写入账簿、修改税额或代替人工确认。
+23
View File
@@ -0,0 +1,23 @@
# 本地 OCR 与 LLM 配置
## 文件用途
- `config/local.providers.example.toml` 是字段说明模板,可以提交到 Git,不含真实密钥。
- `config/local.providers.toml` 是本机实际配置,已被 `.gitignore` 排除,禁止提交或发送。
- 当前配置只服务于纯本地开发测试;票据中心会在本地读取配置并调用服务,正式客户端不会打包这份文件。
## 填写规则
百度 OCR 优先填写 `api_key``secret_key`,并保持 `auth_mode = "api_key_secret"`。程序接入后将自行获取短期 access token,不长期保存换取到的 token。只有在服务商明确仅提供现成 token 时,才填写 `access_token` 并把认证方式改为 `access_token`
LLM 需要填写 `base_url``api_key``model`。如果接口不是 OpenAI 兼容协议,先不要启用,接入时需要按服务商官方协议增加独立适配器。
首次填写时两个 `enabled` 都保持 `false`,逐项确认地址和密钥后再启用。不要在聊天、截图、报错信息、文档或 Git 提交中展示真实密钥。
应用只向百度 OCR 发送当前主动选择的图片;发票原图、OCR 原始响应、归一化字段、AI 原始响应和人工复核记录均写入本地 SQLCipher 加密账本。LLM 只接收归一化后的必要票据信息,不接收本地数据库或其他票据。
## 后续迁移原则
客户端/服务端版本中,百度 OCR 与 LLM 的供应商密钥只保存在服务端的密钥管理系统或受保护环境变量中。Windows 客户端不再保存这些密钥,只连接小白记账服务端,并使用用户登录后取得的短期会话凭据。
迁移时将保留统一的 OCR、LLM 适配器接口,因此业务功能不需要因密钥位置变化而重写;主要变化是把当前本地调用实现移动到服务端 API 后面。
+42
View File
@@ -0,0 +1,42 @@
# 智能票据闭环
## 当前能力
票据中心已经形成“主动上传 → 加密存档 → OCR 识别 → 字段核对 → AI 建议 → 人工确认”的本地闭环。发票与收付款流水是两类不同证据,因此人工确认票据不会自动生成收支流水,避免把“取得发票”误当成“已经付款”。后续应通过流水匹配或单独的凭证流程完成入账。
当前开放增值税发票图片,单张不超过 2.5 MB,支持 PNG、JPEG、BMP 和 WebP。文件按内容哈希去重,重复选择同一图片不会重复建档。
## 状态与数据
- `documents`:保存加密原图、内容哈希、文件类型和处理状态。
- `ocr_runs`:追加保存每次识别的供应商、耗时、状态,以及服务可解析时的原始响应。
- `document_extractions`:保存经过归一化的可编辑字段,金额统一使用整数分。
- `ai_runs`:追加保存模型调用状态、服务可解析时的原始响应、校验后的建议和置信度。
- `document_reviews`:追加保存每次人工确认时的字段快照与时间。
原始 OCR 结果不会因人工修改而被覆盖。失败调用同样留下审计状态,但日志和界面不显示供应商密钥。
## 安全阀
- 文件签名与大小在发出网络请求前校验。
- OCR 只发送用户当前主动选择的图片。
- LLM 只接收识别后的必要字段,不读取整本账簿。
- LLM 返回必须是结构化 JSON,并通过方向、分类白名单、金额一致性、日期和置信度校验。
- 任何解析或校验失败都只显示失败,不产生记账结果。
- AI 建议与人工确认是两个独立动作,AI 永远不能自动入账。
## 服务端迁移
正式客户端发布前,把 `providers` 中的供应商 HTTP 调用移至服务端。客户端保留上传、复核和状态展示,通过小白记账 API 获取识别结果与建议。服务端负责供应商密钥、租户隔离、限流、重试和调用成本审计。
## 回归检查
每次修改票据功能至少验证:
1. 不支持或超限文件在本地被拒绝。
2. 同一文件不会重复建档。
3. OCR 金额满足“不含税金额 + 税额 = 价税合计”的允许误差。
4. LLM 非 JSON、非法分类或金额不一致时不会产生建议。
5. 人工修改后保存的是新复核快照,OCR 原始结果仍可追溯。
6. 人工确认不会改变收支流水与税务计算结果。
7. 本机真实配置、测试票据和密钥不会进入 Git 或安装包。