Skip to content

图片改由 DeepSeek 切块读 - #106

Merged
JunieXD merged 1 commit into
mainfrom
images-by-deepseek
Nov 14, 2026
Merged

JunieXD merged 1 commit into
mainfrom
images-by-deepseek

Conversation

@JunieXD

@JunieXD JunieXD commented Nov 14, 2026

Copy link
Copy Markdown
Contributor

关联

Closes #105。设计和比较在 #104(总体设计 §5.2、§7.4、§8.6、§16),先合并 #104 再合并这个。

改了什么

#102 比较后定了图片改由 DeepSeek 切块读:9 张样本的关键信息认对 111/113,本地的 RapidOCR 是 94/113。

  • 切块(parse/image.py):图片和 PDF 里的扫描页切成每块不超过约 1300×1300 像素,尽量切在没有字的行。宽过 2048 像素的先缩小:大的扫描件和海报字照样看得清,也不会切出几十块,一次请求 15 张以上时 DeepSeek 只收每边 4096 像素以内的图。file_text 改成 file_parts,按阅读顺序返回文字和待读的图片
  • 读图(extraction/pictures.py):一张图的各块按顺序放在一次请求里,用抽取的同一个 DeepSeek 客户端。提示词和 写下图片改由 DeepSeek 读的比较和结论 #104 实验的一样,只是放进 instructions,标点照抽取的提示词改成半角(RUF001),并且总带着「几张图片是同一张长图切开的」这一句,这样前缀每次都一样
  • 读过的文件不重读(crawl/readings.py):同一张图每次读出的文字可能不一样,不然通知会被当成变了。读过的文件连同读出的文字按附件网址存在本机的 SQLite 里,再下载到一字节不差的文件,就用上次的文字;直接比较字节,不算哈希;30 天没用到的删掉。只存要 DeepSeek 读的文件
  • 出错和用量:DeepSeek 没读成的(接口出错、超时)抛 StepError,这条通知这一轮算没抓成,下一轮再抓;文件本身坏了的照旧记日志、文字留空。读图的用量记在附件上,和这条通知的抽取一起交(Extraction.usage),没走到抽取的只在每次调用的日志里
  • 依赖和镜像:删掉 RapidOCR 和 ONNX Runtime,连带 numpy、OpenCV、Shapely 等 15 个包;Pillow 改成直接依赖。原来只给识别测试用的字体文件也删了。镜像里给存储留好目录 /home/crawler/.cache/mouseclock,部署时在这里挂一个卷,Dockerfile 开头写了
  • 开发约定里模块的说明跟着改

怎么验证的

  • ./check.sh 通过:格式、lint、Pyright 严格模式、344 个测试
  • 新测试:程序画的长图切开后每块都在预算内、切口不落在字上;同一个网址的文件一字节不差时不再调模型,文件变了才重读;DeepSeek 返回 503 时这条通知失败;读图的用量排在抽取前面一起交;存的东西 30 天没用到就删
  • 真实接口:想用 实现图片附件的文字识别 #74 的图片走一遍,但这台机器下载 GitHub 附件时连不上存附件的服务器,所以改用系统字体画了一张 1080×4840 的模拟通知(30 组日期、时刻、网址和邮箱,日程里是全角冒号),用这次的 file_parts 和 ReadPicture 读一次:切成 4 块,210 项全对,全角冒号照原样,120 行不重不漏;输入 3326、输出 3300 token,9.3 秒,按高峰价约 0.005 美元
  • 镜像:本地完整构建没做成,卡在装 Chromium 那一步,这次没改它:从 Playwright 的服务器下载时 TLS 连接一再断开,试了三次。装依赖的两步都过了,镜像里已经没有 rapidocr 和 numpy。在构建阶段的镜像上照最后一段加了 crawler 用户和 mkdir,挂一个命名卷跑两次容器:第一次用 Readings 写进 /home/crawler/.cache/mouseclock/readings.sqlite3,换一个新容器能读回来

影响

  • 抓取节点:部署时要多挂一个卷,docker run ... -v <卷名>:/home/crawler/.cache/mouseclock;没挂也能跑,只是重建容器后每张图要再读一次。镜像和内存都小了,不再跑识别模型
  • 用量:读图算在抽取里,抓取看板上抽取的调用次数会多出读图的次数
  • 已知的限制:一次抽取最多交 100 条用量,一条通知的附件里要 DeepSeek 读的图片和扫描页超过 99 张时,这次交抽取会被网站拒绝,这一轮中断;下一轮图片都存着,不再调用,抽取能交上去,只是丢了这些读图的用量
  • 接口、MCP 工具、表结构都不变

本地的 RapidOCR 认不全图片里的截止时间和网址,#102 比较后改由 DeepSeek 切块读(#105)。

- 图片和 PDF 里的扫描页切成每块不超过约 1300×1300 像素,尽量切在没有字的行,一次请求按顺序送完;宽过 2048 像素的先缩小
- 同一张图每次读出的文字可能不一样,读过的文件按附件网址存在本机的 SQLite 里,再下载到一字节不差的文件就用上次的文字,不然通知会被当成变了;30 天没用到的删掉
- 读图的用量和这条通知的抽取一起交;DeepSeek 没读成的,这条通知这一轮算没抓成
- 删掉 RapidOCR 和 ONNX Runtime,连带 numpy、OpenCV 等 15 个包;Pillow 改成直接依赖。镜像里给存储留好目录,部署时挂一个卷
@JunieXD
JunieXD merged commit 428b638 into main Nov 14, 2026
2 checks passed
@JunieXD
JunieXD deleted the images-by-deepseek branch November 14, 2026 13:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[任务] 图片改由 DeepSeek 切块读

1 participant