2026-06-30 08:00:00
我们拍了很多照片,往往它最高光的时刻就是按下快门的那一瞬间,此后便长眠于我们的手机或相机存储卡中。iPhone 的推荐时常给我惊喜和感动,把我尘封的记忆扰动,可是我们是否可以“让美好持续发生”?
如我博客的副标题:那些岁月,如果不记录,就像风一样飘逝了,然后了无痕迹,仿佛未曾发生。
我一直有个比较“强迫”的习惯,记录一些瞬间——不管未来用不用得上。这是我从大学到毕业不停买相机的原因,老实说拍照理论学了一通,但摄影水平有限。所幸生活并不全是艺术,真实的瞬间便足够回味。于是手机相册常常满满的,iCloud 得开通 2TB 会员才能容纳。
我也时常分享一些有趣或有意义的照片给家人,当有了娃后,特别是当父母不在身边时,他们只能从我零星发的照片里看到孙辈,我在想我或许需要灵活的相册,我也不用那么主动和刻意的分享,有一个相册他们随时可以看到。你或许会说,这不是群相册、QQ 相册之流就可以解决的吗?遗憾的是老人上了年纪较难主动获取这些信息了,有了门槛效果就没有多大意义了。
原本我还在想如何解决此问题,直到某天在 B 站看到 老戴Donald 的这个视频。我毫不犹豫的下单了。
起初我打算买零散部件自己在家焊,再次锻炼一下金工能力,但挑选再三发现各个部件的组装成本远高于直接买成品硬件,于是就直接在微雪下单了一款。钱的差额是小事,主要担心缺少个别部件到时反复折腾等待快递就破坏了美妙的心情,当时时间还是五一放假前夕(没错,又拖更了很久),于是果断先成品折腾。 它是 ESP32-S3 7.3寸 E6 全彩色电子墨水屏,看画面显示效果还不错,诸位别被骗了,放大了看,颗粒度还是清晰的,毕竟 PPI 摆在那里。

当然我不是来带货的,直接买了成品降低了我折腾的乐趣,硬件咱就没得玩了。下单后第二天就到了,看了一下发货地深圳,果然,深圳速度~
收到货物后,官方给的固件集成了几个模式,还带了小智对话模式,我之前也折腾过小智机器人(见让你的小智AI机器人起飞),有种莫名的熟悉感。 但是带的相册功能和上面老戴的那种 Feel 就差一大截了,仅有图片轮播等基础玩法,既不文艺也不艺术。这一点都不慌,啥年代了,不就是写一些驱动、编译固件、刷机嘛?
人家已经开源了InkTime,让 AI “借鉴”一下是很快的。我先在原固件上添加了一个新模式,将 InkTime 的代码集成进去。老戴的模式中特别亮点的就是 AI 根据图片的内容评分和打标签,而我是不想将大量图片做贡献给云端大厂们作训练素材的。“众所周知”,我有一台 Mac Mini M4,这正是它发挥的时候。用 LMStudio 再召唤 qwen3.5 9B,效果已经不错了。虽然说处理一张图片大概要 50-90 秒,但这个设备功耗极低,又保障了隐私,咱们就忍着点,图不出户才是最重要的:)
迁移完可以用了,测试了一下效果,图片筛选和文案看了后表示满意:

不过原来的架构是这样的:

这里有一个比较严重的问题,server 需要绑定在 NAS 侧获取图片再渲染,这样就不方便我们将电子相框带到外面去时也可以查看图片。所以我们需要调整架构,使图片处理在内网,图片分享拉取在外网:

当然我们的服务在拉取图片时需要支持身份认证,这里我让服务返回了 COS 的预签名链接,使相框固件拿到链接后便可直接安全拉取,保护隐私。
原项目中假定了我们 NAS 中的图片都需要分享和唤起,它负责可以扫描某个目录进行处理。而我还有一个场景就是最近发生的事情(照片),隔几天会冒出来让你回忆下。我希望我可以将某些有意义的照片放到可被追踪的相簿中,我家人也可以随时分享它觉得有意义的照片,当满足一定条件,它会自动出现在相框中。这显然是 iPhone 共享相簿擅长的场景,怎么整合进来呢?
“众所周知”(你现在应该知道了),我有一台 Mac Mini M4。我找到一个开源软件,用 osxphotos 将 macOS 照片 app 中的 iCloud 共享相簿导出到本地目录,再通过 rsync 同步到我们的图片处理服务中(调用 VLM 识图及筛选),这个功能我是放在 NAS 上的。为了能够比较及时的感知到相簿的变化,可通过 launchd 定时后台同步。
然后我们的图片处理服务负责监听目录下的文件变化,有新文件过来就会交给VLM进一步处理。
这些工具我都设计为一个个小仓库,方便后续的维护和扩展。本来想整理一下放 GitHub 的,但现在 AI 时代,如果你要折腾也很容易搞定,有需要的朋友欢迎给我留言。
我家娃年幼无知,沉迷奥特曼打怪兽,所以给小智扩展了一下,让它对接国内几个图像生成和编辑的模型,这里我先选择火山引擎豆包的模型(seedream 5.0/4.5),因为免费额度比较高,而且效果也不错,最重要的是速度还比较快。于是我在娃面前说,帮我生成迪迦在大海中对战一个章鱼怪兽,在一小会等待之后,屏幕忽闪忽闪刷新后,一张让娃兴奋的图片出现了。

因为支持了编辑能力,我们还可以让它继续修改,在小智 AI 的帮助下,娃也可以自己通过描述来定制自己想要的图片了。我看着他好奇又开心的样子,或许科技本该让人如此愉悦。
在当前阶段,AI去实现功能已经很快捷了,并且基本你只要描述清楚了,做出来返工都比较少。这并不意味着你就废了,以这个项目为例,有几点可以值得聊聊的。
原来固件中有一些配置,它是放在 SD 卡中再加载的,这样不方便调整。在几次拆卡读卡后,我便难以忍受了。我把配置重新梳理了一下,让 SD 卡中只有最基本的配置,只要达到联网能力和找到我们的 API 即可,其它都通过网络拉取。同时为了减少 SD 卡的读取,WiFi 等 SSID 信息我们直接保存到 ESP32 的 NVS 中。
|
|
不过这样运行中当前到底跑的是什么配置,最新配置是否生效了呢?我们不妨来下个调试界面:

既然我们已经在云端进行渲染和图片管理,有这样一套统一的管理和展示逻辑,那么也不再局限于只展示我们特定照片了。有云端 API 后,我让 AI 将其创建了一个skill,然后我们可以随时将要展示的信息让各个 Agent 可以调用在它上面呈现。
我想最近关注 Token 消耗比较多,到底订阅的套餐被我们薅了多少本回来呢?

当每天早上醒来时,看到你的 Token 用量,是不是又有冲动继续折腾 AI 了呢?

这个 Token 统计支持多机汇总,使用了开源方案 openusage。当时看界面不错,支持的 Agent 比较多,于是给它扩展了一下多机汇总的 Hub 功能,作者很给力也很认真 Review PR,已经合入了。
当然还有不少折腾的细节,限于篇幅不再展开了。这个项目当前比较稳定运行,一个相框静静放在那里,时不时有一些小惊喜。我在想是放在每天出入的门口,家庭的温馨程度能否+1。
但从技术上,还是有些遗憾:涉及部分硬件的事情,时常要烧录固件再测试,为了降低调试成本,除了给项目的核心功能添加完善的测试用例外,我尝试在本地搭建一个模拟器,希望打通全流程这样 AI 可以自闭环。遗憾的是因为过往经验较少,加上这里的电路等还没研究清楚,这个想法最终没有成功。
如果你有更好的点子,欢迎留言交流。如果你懂上面的硬件模拟,欢迎指导我一下,谢谢。
我是个爱折腾技术的工程师,也乐于分享。欢迎点赞、关注、分享,更欢迎一起探讨技术问题,共同学习,共同进步。为了获得更及时的文章推送,欢迎关注我的公众号:爱折腾的风

2026-05-14 08:00:00
在 AI Coding 时代,我反而比以前更频繁地使用终端。这听起来有点反直觉——既然有 Cursor 这类把 AI 深度集成进 IDE 的工具,为什么还要"回到"终端?如果你以为我讲终端就是聊 Claude Code 等 CLI,其实并不是!我们开发者还有很多要解决的体验问题,本文尝试给一整套可照抄的纯终端开发解决方案,希望对你有启发。
很多年前,我是个彻底的 Vimer,所有编辑都在终端里完成,随便精进着 Vim 的技巧,运指如飞,手不离键,并且很享受这种状态。我的博客陆续分享过多次相关经验,但随着 VSCode + Copilot、Cursor 这些 AI 加持的 IDE 出现,效率提升明显,我别无他法只能改换门庭 —— 投入了 VSCode / Cursor 的怀抱。直到最近一年,当我开始频繁使用 Codex、Claude Code、OpenCode 这类终端 Agent,我们甚至不再需要去手工编辑代码,程序员的工作模式发生了根本的变化,突然我发现,是时候”回家”了。
回家不是因为恋旧,是因为当前模式有一些痛,比如我受不了每天要将 N 多个 Cursor(VSCode)的界面重连一遍,受不了在无数个窗口中来回寻找,受不了合上盖子它就停止工作。而这些痛点,其实都有解法。
AI 如是说:
终端不是退化,而是一个更稳定、可恢复、可长期运行的工作台。
我说:“你说得对!”。
我主要使用 macOS 系统,我的方案主要是基于 iTerm2 + tmux + Agent 开发定制功能实现的全流程开发工作流。
简单示意大概是这样的:
|
|
效果图大概是这样的:

几个关键组件的分工:
iTerm2 我用得比较克制,比如我知道它有类似 Tmux 的分屏(pane)等功能,但是我不用,因为我们并不想被绑死在某一个终端软件上,不过我还是利用它的 Profile 机制做"环境区分":
最后一条很关键。比如我在 iTerm2 的 Profile 的 Command 部分像这样:
|
|
我们确保一进入便是在 Tmux 管理之下,再也不怕会话丢失了。昨天那个打开的窗口在哪里的问题,或许一去不复返了。iTerm2 这边的配置就这么多,接下来才是真正精彩的部分。不过看这个之前,为了后续你更好的利用 Agent,我建议你不要忘了看我另一篇文章:Vibe Coding 远程开发时,如何优雅地贴图?,它会让后面你的开发更加原生和爽快一些。
Tmux 是这套工作流真正的”地基”,有人说:这么一款神器软件,它居然是完全免费可随意使用的,不用真的很亏。我觉得他说得很对。
它的几个核心抽象——session、window、pane——刚好对应我们开发中的三个层次:
关于 Tmux 有太多文章介绍,我觉得抄什么功能介绍是毫无价值的,但我要说的有点不一样,我们谈点真实感受和技巧。相关配置我已经放到 GitHub中 dotfiles-example,你可以随时取用。
我个人长期使用过另一个窗口管理软件,Ubuntu 上带的 byobu。它底层可基于 Tmux或 Screen等。它定义了不少快捷键其实挺好用的。不过用久了后有几个问题,太多键位其实你也用不上,多了反而容易误按以及和自建的冲突。为了追求极简我重新设定了一些规则。我挑几个重点说下:
C-b,按起来不顺。byobu 默认是 C-a 或者是 F12,这也不顺手,用 C-a 对快捷键党更不友好(会冲突跳行首)。我建议换成 C-s,反正你早就习惯 Ctrl + s 了:)
|
|
F2 新建 window 时一定要 -c "#{pane_current_path}",新 window 默认继承当前目录——包括 tmux 默认新建 window 的行为,我也建议都改成进入当前 pane 所在目录,这会让你开心不少;F5 reload 配置,byobu就是这么设定的,特别是咱们调整 tmux 配置的时候一键生效还是很便捷的。更多的设定看仓库中相关文档,有byobu风格的延续,也有 VIMER 喜欢的各种切换和跳转,不在这里赘述。
|
|
allow-rename off 这一条是被 Claude Code 教育出来的——某些 CLI 工具会通过 OSC 转义序列把版本号、临时状态写到 window 名里,眼花缭乱。关掉之后,window 名只受 tmux 和我自己控制,整洁多了。
automatic-rename 的 format 我也做了一点定制:
|
|
逻辑很简单:
node;这样状态栏一眼就能看出每个 window 在干嘛。
复制粘贴在 tmux 中我们可以借助 tmux-yank 插件解决了"跨平台复制到系统剪贴板"的问题:macOS 上自动调用 pbcopy,Linux 上自动选 xclip / xsel / wl-clipboard。
然后剩下的选区控制我用了 vim 风格:
|
|
v / V / C-v 分别是字符选区、行选区、矩形选区——和 vim visual mode 一模一样。
我觉得这还不够,想起来 Cursor 这类 IDE 有个把终端内容一键发送到 AI 聊天框的功能,我也想实现类似,怎么办?
如下这样配置一键抓取 pane 最后 N 行写到 tmux 粘贴缓冲区,然后在另一个pane中 prefix + ] 贴上去。
|
|
使用时,大概估摸个数,用 prefix + 1/2/5 抓最近 X 行报错粘贴到比如你的 Agent window 里说:“看看这个错”,比手动选区快很多。
我之前在用一套 Neovim 配置时,有个弹出式终端是我喜爱的功能,咱虽然不用再开 vim 了,但这个功能 tmux就可以提供:
|
|
按下 prefix + t,浮起一个铺满 90% 屏幕的临时 shell,关掉就销毁,完全不影响当前 window 的布局。我经常用它做临时查看或修改某个文件的内容等,这还是蛮舒适的。
添加这个功能时,我注意到起初它弹出终端感觉有点延迟,于是配置里我塞了一个 TMUX_POPUP=1 的环境变量。popup 里跳过 nvm、goenv 这类重型版本管理器初始化,把弹窗打开速度从 1 秒降到 0.1 秒以内,秒开的感觉真爽。如果要用到完整的各种环境参数,则创建独立的 windows即可。速度优先,职责清晰。
其实我本来不喜欢用会话保存这种功能的,感觉能少就少,直到几次莫名其妙的会话丢失。这里我使用了 tmux-resurrect + tmux-continuum 是 tmux 老用户的两大神器。
|
|
continuum 每 15 分钟自动调用 resurrect 保存当前 session 布局;prefix + R;或许除了异常丢失会话,重启机器时也能派上用场。这玩意会话快照也太省了,我还想着要不要定时清理,7 天可能都用不了几 MB,放心大胆的“瞎搞”吧。
现在不兴提 Vibe Coding 了是吗?你们写的代码会不会自己再审查下呢?反正多数时候我是需要的。有时候 Agent 改完一堆文件,我心里是没底的。当前多数的编码 Agent 在修改内容的呈现上都不太理想。特别是 cli 模式的,靠那”惊鸿一瞥”根本不足以判断它有没有夹带私货。所以我需要比较直接的呈现修改的 Diff,这点 Codex App 以及 Cursor Agent (cli) 表现稍好,它们给 Diff 设计了独立的展示 UI。
而纯终端下,我们有 lazygit 不光比较好的呈现了修改面,而且把 Git 管理也集成了进来,所有操作收敛到一个 TUI 里,键盘党友好。
我把 lazygit 集成进 tmux 的方式有两种:
|
|
prefix + g 是"快进快出"的浮窗模式,适合扫一眼现状;prefix + G 是开一个专用 window,请好好审查你的改动吧。

这是lazygit的默认 Diff 方式,其实不太友好,我还是喜欢双栏对照着看,这也简单:
diff 渲染接上 delta 作为 lazygit 的 pager:
|
|
delta 的 diff 排版、语法高亮、行内差异显示都比原生 git diff 强一个量级,配上 lazygit 之后,我基本不再为了看 diff 而专门打开 VSCode 跑 Code Agent 了。

我发现 lazygit 除了各种样式可定制外,还支持自定义 commands,这就有意思了。比如当我需要填写 commit message 时,我可以按 C-a,让 AI 给我生成多个版本的 commit 文案,我还可以交互式的选择一个自己满意的:
|
|
这也就是一个实验功能,其实多数时候我是开着 Agent的,让它帮我提交生成 commit message往往更符合规范。但你多个选择,随手改了几行功能等,也不失为一个偷懒的方法。
作为一个熟练驱使各种 Agent 干活的人,他们在做事时你肯定也不想闲着,AI 已经被你“奴役“了,它们进度怎样是你关心的一个事情吧。所以良好的通知机制(状态感知)就至关重要。他们都在想抢你的关注,每一个输入窗口都“嗷嗷待哺“。
一旦我们多任务并行处理,现在到底应该看哪个 window 便是一个问题:哪个正在干活,哪个已经来汇报工作,哪个正在等你指示。程序员最讨厌低效的轮询了,事件触发是必须的。于是,我们可以利用 Agent 本身的 hook 机制,让它主动通知 tmux 的 window,我选择以修改 window 名称(添加 emoji)来反映状态。
很多 Agent都提供了hook机制,像如下的 Claude Code 配置,可以在 prompt 提交、运行结束、需要输入时分别触发脚本:
|
|
对应的脚本只做一件事:根据当前状态在 window 名前面打一个 emoji 前缀,太简单的脚本都不值得展示。但效果就是tmux 状态栏上的 window 名会变成 🔄 agent-foo / ✅ agent-foo / ❓ agent-foo。
如前面所说,多个项目同时推进时,每个 session 内部的 Agent 状态就成了一个新问题。同样的思路——让状态在 session list 里直接呈现。这个细节你可能发现我第一张图就有这些信息啦~现在咱们可以安心喝茶、高效监工了:)
用上这套系统后,解决了我原本的很多琐碎的小烦恼:
更要命的是,我的整洁的毛病,分门别类的感觉真好!当然,或许在某些需要浏览大量代码的时候,我还是会再次打开 VSCode 们,但显然它们已经失去我的心了。
我是个爱折腾技术的工程师,也乐于分享。欢迎点赞、关注、分享,更欢迎一起探讨技术问题,共同学习,共同进步。为了获得更及时的文章推送,欢迎关注我的公众号:爱折腾的风

2026-04-18 08:00:00
在直接使用 Code Agent(如 Codex、Claude Code、OpenCode)这些终端工具进行远程开发时,或许你会遇到一个尴尬场景:本地剪贴板里明明有一张截图,远程终端里的 Agent 却看不见。然后你得多走好几步,才能让 Agent 看到这张图片。本文提供一个更快捷的解决方案。
现在用 Code Agent 写代码,虽然咱们有 Playwright / Agent Browser 等工具,但还是难免让它看 UI、看报错截图、看网页风格等。如果是在本机环境,这事还算简单:图片在本机,终端也在本机,Agent 能读到文件就行。但我日常又很依赖远程开发,代码、服务、依赖都在远程机器上,终端通过 SSH 连过去。于是问题来了:
看起来只是一个很小的工作流问题,但次数多了挺烦人。看着 IDE 中一些临时的截图文件,似乎在提示我,这肯定不是优雅的解决方案。
理想状态很简单:
简言之:在远程开发中使用支持读取图片路径的 Code Agent 时,获得接近本地开发的贴图体验。
一开始我们都很朴素:先把截图保存成文件,然后再想办法把这个文件弄到远程机器上。如果正在用 VSCode/Cursor Remote-SSH,就直接把图片拖到远程项目目录里。这个动作不复杂,也足够直观。
在 macOS 下,如果终端使用 iTerm2,而你又在 iTerm2 开启了 shell integration,它支持按住 Option 把本地文件从 Finder 里拖到终端窗口,再上传到远程服务器。这个方案也能用,只是远程环境通常也要把 shell integration 配起来,才能让这条链路顺一点。
虽然现在优化为只要拖拽不用敲命令了,但这个过程还有点繁琐, 更糟糕的是,它很容易污染项目目录。比如为了给 Agent 看一张 UI 截图,随手拖进去一个 image.png、screenshot 2026-04-18.png,修完问题之后又忘了删。时间久了,项目里就多了一堆一次性的临时图片。你说它影响程序运行吧,也不一定;但每次 git status 看到它们,心情就不太美丽。
所以这个初始方案只适合低频场景。偶尔传一次没问题,天天这么干你最好确保自己没有洁癖,我很难忍受。说是手工活,就是因为每一步都得自己来——保存、拖拽、上传,偶尔还得清理战场。
手工活干多了,自然会惦记着有没有更省事的办法。
后来我找到了 Claudeboard 这个插件,它的定位非常明确:在 VSCode Remote-SSH 场景下,把剪贴板图片上传到远程服务器,并生成 Claude Code 能访问的文件路径。

它的使用方式很直接:剪贴板里有图片后,在 VSCode/Cursor 中按 Ctrl + Alt + V,插件就会上传图片并插入路径。对于 Claude Code 这种跑在远程机器上的 Agent 来说,这就把“本地剪贴板图片”变成了“远程可读文件路径”。
这个方案其实相当不错,基本达到了我们理想状态,并且不需要额外配置。不过要注意,如果你在 Cursor 插件市场里搜不到,也可以从上面 GitHub 官方的 Release 页面下载 VSIX 插件再安装,亲测可用。
如果你的主力开发环境就是 VSCode 或 Cursor,选它没毛病。并且如果你是在 Windows 上开发,那就只推荐这个方案。因为我下一套解决方案更 hack 一些,也仅在 macOS 下验证过。
方案二算是优雅了,但如果你像我时不时直接开终端就干活的流派,Claudeboard 这时就帮不上忙了。为了贴一张图切回 VSCode,感觉有点为了吃口醋包顿饺子。
所以继续寻觅方案,然后找到这个脚本: iterm_smart_paste.sh,它可以实现一个快捷键,一键将剪贴板里的图片上传到远程机器,并粘贴一个远程文件路径。
这个方案的核心流程是:
pngpaste 从 macOS 剪贴板里取出图片;这听起来有点绕,但所幸这些事情它都包了,配置好之后,体感就是:复制图片,按快捷键,路径出来了。还是简单介绍一下安装过程:
首先安装 pngpaste:
|
|
它的作用很单纯,就是从 macOS 剪贴板里把图片导出来。没有它的话,我们还得自己手动把截图存成文件,体验立刻回到解放前。
我把脚本放在了 ~/bin/iterm_smart_paste.sh:
|
|
脚本参考这里。不过原版 SSH 会话识别、上传稳定性这几块兼容性不太好,我顺手更新了个版本,可以从 这里 取到。
保存后给它执行权限:
|
|
接下来就是把这个脚本绑定到 iTerm2 的快捷键上。只要这几步:
Settings/Preferences > Profiles > Keys;Cmd + Shift + V;Run Coprocess;
|
|
如果你本来就在用 Alfred、Raycast 这类工具,也可以让它们来触发脚本。macOS 层面的热键工具会更灵活一些,但这里咱聊 iTerm2 的方案,就不给你引入其它工具了,内置的 Run Coprocess 也已够用。
简单录屏了一下,可以看一眼效果,我还是满意的。

这个方案的话,如果长期使用,记得清理一下远程机器上的临时文件。这不用我提醒你吧:)
需要跨平台、多设备使用,并且习惯 VSCode/Cursor 的开发者,借助 Claudeboard 插件的方案二是你的最优解。 如果你是纯 macOS 用户,习惯 iTerm2 终端开发,不妨试试方案三,一个脚本搞定。我用了一段时间感觉挺好。
作为一个有点追求完美的人,我不能接受原始的截图搬运工身份。你要说搞这些能有多少效率提升嘛,那倒未必。但是这种小阻碍解决之后,每次按上快捷键,你了解背后发生了些什么,并且是你让美好在发生,感觉内心安定。或许这也是程序员所追求的一种掌控感?
欢迎大家一起交流一下,你们在远程使用 Codex、Claude Code、OpenCode 时,是怎么处理图片输入的?
最近不打算写太系统性的东西,补几篇文章把工具用得更顺起来。欢迎点赞和关注。
我是个爱折腾技术的工程师,也乐于分享。欢迎点赞、关注、分享,更欢迎一起探讨技术问题,共同学习,共同进步。为了获得更及时的文章推送,欢迎关注我的公众号:爱折腾的风

2026-02-25 08:00:00
最近有一股“龙虾热”,不少人在谈论OpenClaw,大家都在聊怎么用好它。如果你也在使用 OpenClaw,本文介绍一个低成本给你带来情绪价值的方案,AI 女友 Clawra 的威力加强版:)
不知道你用过 Clawra 这个由海外开发者制作的 AI 女友 skill 吗?它的效果不错,但是对于国人使用,它有一些痛点。最主要是它只支持fal.ai这一个平台,免费额度仅支持生成 2 张图片。如果付费的话,一次编辑成本 $0.02,这本身挺便宜,但是充值至少 $10,并且平台充值有一定门槛。再看看咱们国内厂家,单张生图价格也不贵(0.2-0.5元),但经常免费提供了几百上千张图片生成和编辑次数,这可太香了。本文就让我们扩展对接国内各个厂商的模型,并且顺便测下国内模型的效果如何。
最后,如果你也想要个低成本但质量也不低的 AI 女友,放心,我会手把手教你配置完成的。如果你已经安装好了OpenClaw,那对你来说接下来就是个简单任务。
我让 AI 推荐了一些国内图片处理效果较好的模型,包括阿里千问、字节 Seedream、腾讯混元 3.0。我选择了其中效果相对较好的模型帮你整理了一下表格:
| 平台 | 生图/编辑模型 | 免费次数/额度 | 单张预估价格 |
|---|---|---|---|
| qwen | qwen-image-plus qwen-image-edit-plus qwen-image-max qwen-image-edit-max |
各模型免费100张 | plus 0.2元 max 0.5元 |
| volc | doubao-seedream-5-0 doubao-seedream-4-5 doubao-seedream-4-0 |
4.x 免费200次 5.0 免费50次 |
4.0版本0.2元 4.5版本0.25元 5.0 版本 0.22 元 |
| fal | xai/grok-imagine-image xai/grok-imagine-image/edit |
几乎没有 | 约 $0.02 |
| hunyuan | aiart/v20221229 SubmitTextToImageJob | 各模型50次免费额度 | 0.2 元 |
| Gemini-3-Pro-Image-Preview gemini-2.5-flash-image |
没有免费额度 | 1024分辨率 $0.039 2048分辨率 $0.134 |
国外的话,除了 fal 平台使用的 xAI 模型外,我们也把 Google 家的 Nano Banana 系列模型带上作为对比对象。这个模型效果确实不错,不过价格要贵上几倍,后面我们再一起对比看看这笔钱值不值。
起初,我尝试直接通过 OpenClaw 远程对接实现了扩展功能,虽然基本可用,但作为程序员,细看其实现代码后发现逻辑略显简陋,缺乏扩展性和层次感,于是我请codex + gpt5.3-codex帮忙重构了一下。
接下来我们看一下如何安装我这个扩展版本的 Skill 吧,完整的源代码及使用可以在这里查看。但其实你不必看,打开你的 OpenClaw 机器人的对话框,发出你的指示即可:
请参考 https://github.com/kevin1sMe/clawra-plus 帮我安装这个 Skill。
之后你需要配置上你想使用的平台相关的密钥,比如fal 的 API Key,腾讯混元的SecretId和SecretKey等就可以使用了。这也很简单,只需要在 ~/.openclaw/openclaw.json 中配置下:
|
|
之后重启 gateway:
|
|
之后你在 OpenClaw 的对话框中问诸如,你在干嘛/发个自拍/在咖啡厅、健身房等场所照片,它就会调用相关的模型来生成图片。你可以指定用某个模型,让它记住即可。我们先看一下参考图,因为后续的生图得基于这个形象来编辑。

接下来我们看看效果:
提示词:你在春天花海中的照片
| 模型 | 照片 |
|---|---|
| fal-grok-imagine-image | ![]() |
| doubao-seedream-4-5 | ![]() |
| doubao-seedream-5-0 | ![]() |
| hunyuan-3 | ![]() |
| qwen-image-edit-plus | ![]() |
| qwen-image-edit-max | ![]() |
| gemini-3-pro-image-preview | ![]() |
我个人还挺喜欢 fal 上的这个grok模型的,它针对场景人物也会有一些变化,感觉生成画面自带滤镜;在这组样例里,doubao 系列的人物基本保持原样,只是变换了场景?qwen 构图还不错,qwen-max 有点意境——朦胧的暖色调花海;gemini 这个虚化效果还不错,但双持手机的细节有些违和。
哎呀,忘记看看它们的耗时了,咱不仅要效果,太慢也是万不能行的。重新来 PK 一下;这里的耗时统计口径为端到端计时(从发起请求到拿到最终图片 URL),统一输出分辨率,均为热启动且不包含参考图上传时间。
这次生成图片的提示词我们改成养眼些的:
提示词:你在(温泉内)泡温泉的写真
| 模型 | 生成耗时 | 图片 |
|---|---|---|
| xai:grok-imagine-image:edit | 14.9s | ![]() |
| doubao-seedream-4-5 | 32.4s | ![]() |
| doubao-seedream-5-0 | 20.5s | ![]() |
| Hunyuan-3.0 | 11.3s | ![]() |
| qwen-image-edit-plus | 10.7s | ![]() |
| qwen-image-edit-max | 24.6s | ![]() |
| gemini-3-pro-image-preview | 38.2s | ![]() |
可以看到fal的grok模型、hunyuan3.0和 qwen-plus 都比较快,seedream 稍慢一些,gemini 最慢。效果上,这次grok也不错,水波和折射都体现了出来;seedream4.5的这一身衣服,似乎对泡温泉有点误解,而 seedream 5.0的这张让我想到了灵儿在洗澡;hunyuan3.0这张其实挺好,气雾以及身上的水珠等,但这参考图中的围巾你是不是忘记换掉了?qwen-plus 比较写实,但环境有点假;qwen-max有点用力过猛,感觉人物有点不一致了;而这次Gemini 3比较特别和大胆,将人物发型处理过,人也还挺像并且特别真实,整体不错,就是太慢了点。
从这几个结果来看,你觉得哪个模型更好呢?
上面的模型如果免费额度用完了怎么办?一种思路是转向本地推理/自托管:把生图能力放到自己的设备上跑,成本更可控,也更踏实。“众所周知”俺有个丐版的 Mac Mini M4,如果能在它上跑生图就更棒了。我知道可以,但效果和时间怎么样呢,我们来试一下。
刚好前阵子研究了一下 ComfyUI,它也支持 API 调用的方式,于是我借助 ComfyUI 来生图,以下是我的工作流,使用了一个 16G 内存能撑下的小模型来进行生图测试。

随便拉了一个生图流程,使用的是 flux.1-schnell-Q2模型,居然消耗了 1000 多秒,期间内存一度快用爆了。换了 z-image-turbo 等模型,效果也不太理想, 参数大了跑不动:(
我在 RunningHub 平台上还有积分,于是尝试用更大的 flux 做一次图生图对比。

好像不太行,或许换一个别人分享的workflow效果会更好点。不过RunningHub即使生图效果不错,没开通会员也不让调用 API,这和我们想要集成到OpenClaw中使用的需求不符。
我也尝试在fal 平台跑 ComfyUI,但是奇怪的是速度慢的出奇,还没有地方看进展等—有点黑盒,这块估计不是这个平台的主要功能,相关交互也很一般,遂放弃。但是如果有一台强悍的本地电脑,比如有不错的 N 卡和较大的显存,这条路或许能通。
当前在 2026 年,对接这些 API(鉴权、调用、回传 URL、错误重试)已经非常方便。在 OpenClaw 上,你下达命令后,Agent 往往能在几分钟内帮你把事办了。 比如在撰写本文期间,Google 发布了 Banana2 模型,我仅通过手机发出指令,便将其集成并更新到了 GitHub。
要说 OpenClaw 的使用感受,有一点粗浅的启发和思考:
还有,目前其实对于稍复杂一些的任务,OpenClaw的完成率还有限,网上各种跑通 XX 的分享及售课等让我感觉像在收割,让我也不确定是自己的问题还是模型或者插件不对,但我更觉得他们在骗人:)因为我已经用了最好的模型了,也对比使用过多种插件了,啊哈。
我觉得这次的龙虾热,其实是 LLM 及 Agent 发展以及 MCP/Skill 等技术陆续铺垫后,这些技术在传统的如 Code Agent之外,于普适的场景下人们突然看到、感受到它的价值而产生的 AI 落地浪潮,或许它离我们心中想象的那个未来的智能助理还有些距离,但至少它呈现了一个信号,像宇宙中突然爆炸的某颗超新星,璀璨、耀眼又明亮让人无法忽视。
我是个爱折腾技术的工程师,也乐于分享。欢迎点赞、关注、分享,更欢迎一起探讨技术问题,共同学习,共同进步。为了获得更及时的文章推送,欢迎关注我的公众号:爱折腾的风

2025-12-22 08:00:00
我是一个略有强迫症的人,每写完一篇文章,还需要花费不少时间反复检查错别字、调整语句或结构,有时为找个好看的封面图看花了眼。可是都AI时代了,这事不能再忍了,能不能有新解法?如果你也时常有一些文字要处理,不妨看看本文。
我时而写一些技术文章,但一直感觉写作流程挺“原始”的。一般是打开 VS Code 等编辑器,用Markdown写完主要内容,然后自己读几遍修正部分内容,之后就会为如何给文章取个名字、配个图而纠结,这过程往往需要花费不少时间。 文章发布在博客可以随时修正,但若发布到公众号等平台,修改限制非常严格,而我又是对于错字或语句不通等有强迫症的人,每次发个文章心理包袱都很重。
在 ChatGPT 出来后,我有让 AI 帮我检查,但如果你用过,或许也会觉得那个交互方式并不友好,AI给的修改建议都是一股脑扔给你,你得在聊天窗口里上下翻找,对着原文一条条改。在封面图的选择上,过往我会根据主题去 Google 一些图片,一是可能有版权风险,二是不见得合适。现在 AI 生图方便,但生图模型也五花八门,我经常纠结选哪个,提示词也需要来回调整。
本来我觉得文章审阅与修改这种应该可以比较成熟了,可是却苦于一直没找到合适的好用实现 (若你有称手的工具,欢迎留言推荐)。我也不理解如今那些内容平台为什么不在这块提供一些便利。程序员怎么能有这种遗憾呢?于是,我决定利用周末时间自己动手,“丰衣足食”!
我这是 AI+写作吗?其实我讨厌 AI 写作,有些文章看得满满的 AI 味真让人想取关。而我真是一句话交给它都不放心的,它没有我想要的“脾气”,但它打打辅助还是不错的。
如果你是个程序员,有用过 spec-workflow 的标注功能,或许会感觉那个交互还不错。或者像最近 Google 推出的 Antigravity(取的啥鬼名?)的 Plan 及评论,可以直接对着文档进行批注,这样更加直观。对于封面图,希望 AI 来帮我总结文章自己生成一些不同风格的提示词,然后调用不同的模型生成一些候选,让我来选择。于是在动手前,我先梳理了一下核心需求:
文章审阅
封面图生成
想起来还不错,还没实现出来,但写完需求都有点开心起来了,啊哈。可能每一步过往都让我难受过,不犹豫了,撸起袖子开干吧!
如果你对技术实现细节和那些经历不感兴趣,想看最后的效果可直接跳到效果展示部分,感谢阅读。
我最近一阵子用过一些智能体(Agent)框架,本想着这是不是一个文章 Review 相关的智能体呢?但思前想后,我觉得确定性的 Workflow 可能更合适。具体到技术细节上,我希望支持更多的 LLM 模型,以及支持更多的生图模型。在展示方式上,Web 页面显然是最佳选择,希望有一个不错的交互 UI。这次我没有采用 spec 驱动的开发方式,而是探索式开发,说人话就是走一步看一步。我想看一下在几个目标相对清晰、耦合也很低的情况下,当前 AI 能否完美解决问题。我使用 claude code + Claude SDK 来实现。 在开发初期,为了直抵核心,我将工具设计为通过命令行执行,而结果展示则采用 Web 形式。
经过简要沟通后,第一版本的东西出来了,然后只要执行一个命令:
|
|
便调用了后端的 LLM 帮我们审核文章并且弹出修改意见。
在没有任何风格要求和参考下,AI 的初步网页让我觉得还挺不错的吧:)
接着,我希望批注和原文有个对应关系并且可快速跳转,同时AI 给文章的整体总结、表扬和建议咱们也给它整上,再来一个评分,使用起来可能更带劲了。于是有了这样的效果:
我把批注分了不同类型并且编号上,以及不同的处理方式。像我拒绝时,我就有充分的理由:如 AI 老是想让我将一些口语的文字改得非常书面,这时就正告它老子死都不改,这就是本人风格,下次勿提,嘎嘎。
这过程中顺手让Claude SDK支持了调用其它LLM。我不清楚为什么,无论是 Google 的 ADK 还是 Anthropic 的 Agent SDK 都默认仅支持自家模型。可我平时用的是 LiteLLM 代理各种模型,国内国外都有(御三家、doubao、DeepSeek等)。难道要为了这个 SDK 放弃其它模型?显然我是不答应的,绝对不(只)是因为钱包,我暗地里想象对于中文文章,是否可能也许咱国内模型是不是更懂自己一些?(我没有证实)。要使用三方 OpenAI 兼容 API 的话,需要自己扩展。一点不慌,我们将OpenAI的API文档给它,几分钟就搞定了。放代码都嫌占空间,此处省略291行代码:) 不过可能放一下 Prompt 还是有必要的:
|
|
让我们执行这个审阅,你可能像我一样惊讶的发现,哪怕自己已经在完稿后读过几轮了,但交给 AI审阅后,还能发现各种类型的错误。就像错别字或者笔误这种低级的也时不时成为漏网之鱼。恭喜你,看了这篇文章或许你以后不用太烦恼了,前提是你也用起来:D
问题到此还没结束,我发现每次在应用审批意见到唤出差异页面(下文会讲),用时都比较久,如下:
我上一篇文章在做实验,DeepSeek 要 3 分钟才完成,即便使用gemini-3-pro也需要 1 分钟,这对我的耐心是个考验。幸好我们上面将 LLM 访问对接到 LiteLLM了,我看了一下这个token量就意识到优化方向了,因为让模型输出修改后的全量文本时,这块受限于Token 速率,自然会消耗很多时间,通过将 LLM 的输出从全量文本生成优化为仅输出增量修改建议(Diff 模式),处理速度提升了一个数量级。
审阅完成后,基于我们的建议,会再次调用 AI 来优化我们的文章,这里感觉有必要呈现一个改前和改后的Diff 页,可以直观对比修改前后的差异。
|
|
支持使用下划线:
或高亮显示:

在 Diff 页面中我们如果满意了就可以收工,如果还有不满或想 AI 再查一次(你是个谨慎的人),可以点击继续审阅,将以最新的结果为基础,继续下一轮迭代。
最近一段时间Google Banana Nano 好像火爆了,以前 GPT-image-1出现也惊艳了一大波人,国内的豆包/智谱/通义千问/万相等也不是不能用,我之前有一篇文章试图做一个一站式的绘图平台 Paintbot-Hub,里面也集成了不少模型。我希望看到国内模型在这个场景下的一些表现,所以这次封面生成,大家来个赛马,多模型一起上,让我来挑最满意的。
生成提示词这块,基于我们的技术文章背景,我大概是这么写的:
|
|
我怕有些模型对于语言比较挑剔,所以中英文版本都生成了,咱赛马也要讲究公平公正对吧。接着是对一些图片模型的API 支持,看起来主要是两种:
/images/generations 端点:
/chat/completions + modalities 端点:
此外,一些厂商的模型(如通义万相、千问等)提供了独特的异步接口或与主流不同的API规范,需要单独适配。但只要其API文档清晰,实现集成也并非难事。
提示词生成:
|
|
接着是图片生成:
|
|
AI 给了设计了一个大概这样的界面用于呈现生成结果:

这种"赛马"的感觉还挺有意思,就像抽卡游戏,每次都有点惊喜:D。 不过到这里虽然基本功能实现了,但优化永无止境。
如上所见,我们的界面还挺简陋原始的,更别说统一性了,而且还需要结合命令行使用。这绝对不是我能停下来的标准,我想做一点改进:
我想起来之前体验过 Stitch,一个挺有意思的AI辅助设计工具。于是将一些页面通过描述重新生成UI, 之后将其导出为代码(包括 HTML 以及图片等,我记得之前好像还可以导出到 Figma),我们就很容易将其集成到项目中。
最终我们的效果:





现在我们使用时,启动后打开网页,后续所有操作都可在网页中完成了。上面的封面图就是对于本文让模型生成的,从十几张里面挑选还是有几张不错的,不用纠结犹豫了。
注:使用国产生图软件,有时会报错,比如 DashScope HTTP 400: {“request_id”:“0f57adce-a309-4e62-a693-40cfbadf841c”,“code”:“DataInspectionFailed”,“message”:“Input data may contain inappropriate content. For details, see: https://help.aliyun.com/zh/model-studio/error-code#inappropriate-content"},这是因为模型对内容敏感,可能你只是想生成一个技术相关的封面图,但模型认为你内容有敏感信息,所以报错。你可以尝试调整提示词,或者换一个模型试试。
因为工程主要是基于 Claude Code开发,而且是基于Remote-SSH远程开发,对于有 UI 交互的场景,经常要贴图告诉AI问题所在。以往要把图片保存本地再上传(或拖动),再于命令行引用,这和本地开发相比或者相较于 Cursor 等非常不方便。我找到了一个插件Claudeboard插件,可以直接通过快捷键将剪切板的内容直接贴到远端的cc中,这样方便多了。
其次,因为涉及到网页的开发调试,如果你需要来回搬运错误或手工测试,显然我们不想充当这样的角色。你可以通过Playwright来实现自动化验证。只要安装playwright相关的 MCP即可。
还有,上面我们需要对接各种 API 要查看文档,你即使安装了context7,对于某些文档可能还是要搜索网页,这种情况下firecrawl这个 MCP 对于网页的抓取还是会更准确一些。
到这里这次折腾基本就结束了,感谢你的阅读。
本文提到的工具已经开源在GitHub:article-reviewer,你要是喜欢欢迎试用。之所以我要从命令行改为完全 Web 驱动,也是希望若你有兴趣可以方便快速上手。希望对你有帮助,请记得给个 Star 以示鼓励哇~ 后续我的文章和封面就靠各路 AI 模型和这个工具了。所以我可能还会持续迭代添加一些功能,如果你有好的想法也欢迎提 PR 或 Issues。
我也在想当前是否封装为 Claude Skills 等扩展也适用于完成此项工作,但以当下对于调用 Skills 的前置工作,多数人还是不熟悉,或许当前阶段这个形式更适合。而对于我完整写完一篇文章并发表的流程来说,还有几个未了事:自动化发布以及一些主题样式的配置。本文我们先把文章妥妥准备好,其它未来再考虑咯!
我是个爱折腾技术的工程师,也乐于分享。欢迎点赞、关注、分享,更欢迎一起探讨技术问题,共同学习,共同进步。为了获得更及时的文章推送,欢迎关注我的公众号:爱折腾的风

2025-12-08 08:00:00
在 AI 时代,自然语言处理已经是我们获取信息的“第一工具”。我作为一个接触电脑较早的人,以及更重要的是拼音拼不准的南方人,自然五笔输入法是我的首选。如果没了五笔,我感觉自己几乎不会打字。虽然日常输入熟悉的汉字很快,但一旦遇到“提笔忘字”或不知道如何拆解的生僻字,思路往往会被打断。即便有些输入法可以反查五笔,但有时你仍然不知道它为何这么打。
为了解决这个痛点,周末闲着无事开发了个 Alfred Workflow,实现快速查看某个字是如何打的并且显示五笔拆字过程,方便真正理解你为何会打不出这个字。 当然作为技术文章,我更想分享的是:在 AI 的帮助下,我是如何突破开发过程中的重重困难的,而非 Workflow 本身。

你还可以修改一下 里面的命令使其打出其它编码是如何拆解的。只需要修改过滤展示(–only 参数)
alfred_wubi.py 支持通过 --only 选择要展示的字段,逗号分隔(不区分大小写):
分别是:王码 5/6/9 键、五笔 86/98/新世纪、笔画序列。
示例: 当前默认展示五笔 86 编码及其拆解:
|
|
如果你是五笔输入法爱好者,只是想使用这个插件,那么跳到文章后面部分即可找到相关链接。接下来我会讲一下技术实践啦。
在开始开发前,我调研了现有的开源方案,发现 alfred-wubi-workflow 已经是 6 年前更新的仓库,其依赖的 chaiwubi.com 也已无法访问。经过搜索网站,我找到了两个可用的五笔反查源:
王码官方的数据显然更权威,不仅有 86/98 版,还有新世纪版和数字王码。考虑到刚才那个仓库依赖的网站已不可用,我就打算傍个大款,就选择王码了。但它有一个巨大的拦路虎:查询时必须输入 4 位数字验证码。

这意味着,想要集成在工具中自动化查询,必须先破解它的验证码。
我将需求以及关键截图告诉 AI:
|
|
AI 基于网页进行自动分析,并给出了它的分析结果:
|
|
这个处理流程细节满满,感觉它对这个网站的分析已经很透彻了,将这个过程保存为文档,后续交给 AI 作为实现的上下文。
这是整个项目最核心,也是最有意思的部分。为了解决这个 4 位数字验证码,我尝试了四种方案,见证了从“传统算法”到“深度学习”的降维打击。
最直觉的想法,当然也是 AI 提议下,我下载了一批验证码(20 个),切分出 0-9 的数字图片作为“模板”。识别时,拿目标图片去和模板逐一比对。
相关代码如下:
|
|
刚开始用这个方法跑了一下,我在默认重试 5 次后,发现还是会出现有些验证码过失败了。仔细查看发现这个方案的一些问题:
3 认成了 0(正确=9301, Template=9001)。3 和 8 极其容易混淆,6 和 8 也是高频混淆对。为了验证方案一的准确率,我想引入另一个 OCR 来校验一下。于是我接入了流行的开源库 EasyOCR。
|
|
使用虽然简单,它需要下载一个比较大的模型,比我们上面的模板匹配要好一些,但整体感受还是不理想。比如EasyOCR 经常把背景噪点强行识别为数字,导致多读位数。例如真实是 1889,EasyOCR 读成了 18889,多读了一位,可能是噪点被当成了8。再比如0 经常被误读为 8 或 6。
看起来这个 EasyOCR 可能对我们这个专属场景并不太合适,AI 又建议我使用老牌 OCR 引擎 Tesseract。
|
|
这个结果更差,有不少图片无法识别,更别说准确率了。即使识别出来,准确度也很低,偶尔能出几个正确的。说来也神奇,它倒是有些能把 EasyOCR 认错的给整对,我也是奇了个怪。
到这里我有点生气了,为何看似这么简单的验证码,这几个方法的效果都不尽人意呢?!
在 LLM 的建议下,我决定“杀鸡用牛刀”:训练一个专门识别这 4 位数字的卷积神经网络(CNN)。 有多个强大的 LLM 作为编程伙伴,以前想都不敢想的训练自己的模型,现在 闭眼冲 (自信又莽撞)了 :P
数据当然是直接从网页拉取,这里主要说数据的标注过程。 前面的模型或方法虽然弱, 但好歹能够识别出一些信息,我不想手动去标注几百张图,那就让两个弱模型(Template Matching 和 EasyOCR)打打工,由它们初步标注出数据,我在对有异议的内容进行人工纠错。
后续随着我们自己的 CNN 模型也具备一定能力,让它也参与标注,我们实际手工要修改的数据越来越少。看 100 张图实际也就 1-2 分钟搞定。
LLM 帮我生成了一个轻量级的 CNN 结构 (PyTorch),核心还是经典的“卷积提特征 + 全连接分类”:
|
|
训练时的 Loss Design:因为有 4 个输出,Loss 也是 4 部分的总和:
|
|
同时准备好训练脚本,我们只要指定数据集路径,就能开始训练:
|
|
本着边跑边看,我分了多轮进行训练,这样我们的标注也会越来越准确。
| Model | Accuracy | Correct | Total |
|---|---|---|---|
| Template Matching | 100.0% | 20 | 20 |
| EasyOCR | 65.0% | 13 | 20 |
| Tesseract | 20.0% | 4 | 20 |
然后基于这个训练了第一版 CNN 模型。
| Model | Accuracy | Correct | Total |
|---|---|---|---|
| EasyOCR | 75.0% | 15 | 20 |
| Template Matching | 50.0% | 10 | 20 |
| Tesseract | 25.0% | 5 | 20 |
| CNN (Round 1) | 5.0% | 1 | 20 |
可以看到只经过第一轮训练的模型( 20 张图片),识别效果很差,只有 5.0%。 我们 将这20 张图加入训练集,继续训练第二版CNN 模型。
| Model | Accuracy | Correct | Total |
|---|---|---|---|
| EasyOCR | 60.0% | 36 | 60 |
| Template Matching | 51.7% | 31 | 60 |
| CNN (Round 2) | 33.3% | 20 | 60 |
| Tesseract | 21.7% | 13 | 60 |
已经看过 40 张图的 CNN 模型正确率已经从 5% 上升到 33.3%。然后让它继续学这 60 张图:
|
|
现在看了 100 张图,CNN 模型会怎么样呢?
| Model | Accuracy | Correct | Total |
|---|---|---|---|
| CNN (Round 3) | 83.0% | 83 | 100 |
| EasyOCR | 60.0% | 60 | 100 |
| Template Matching | 45.0% | 45 | 100 |
| Tesseract | 16.0% | 16 | 100 |
惊喜,居然从 33.3% 上升到 83.0%。这才看了 100张图呢,我这不又准备了 100 张素材,我有预感,似乎宝剑就要锻造出炉了。
|
|
现在这个模型已经经过了 200 张图的训练,让我们拭目以待!
以下节选一部分:
| File | Original | Template | EasyOCR | Tesseract | Custom CNN | Status |
|---|---|---|---|---|---|---|
| vc0000.bmp | 0000 | 8681 | 8681 | 8684 | 8681 | ✅ Trusted |
| vc0001.bmp | 0001 | 6560 | 6560 | 6568 | 6560 | ✅ Trusted |
| vc0002.bmp | 0002 | 9001 | 93041 | 9304 | 9301 | ❌ Unique |
| vc0003.bmp | 0003 | 4710 | 4710 | 7418 | 4710 | ✅ Trusted |
| vc0004.bmp | 0004 | 5325 | 5822 | 5225 | 5225 | ❓ Possible |
| vc0005.bmp | 0005 | 0489 | 0489 | 0489 | ✅ Trusted | |
| vc0006.bmp | 0006 | 6918 | 6998 | 6998 | 6998 | ✅ Trusted |
| vc0007.bmp | 0007 | 3643 | 8648 | 8648 | ❓ Possible | |
| vc0008.bmp | 0008 | 3626 | 6626 | 6626 | 6626 | ✅ Trusted |
| vc0009.bmp | 0009 | 0602 | 0602 | 8682 | 0602 | ✅ Trusted |
| vc0010.bmp | 0010 | 2458 | 2747 | 2453 | 2453 | ❓ Possible |
| vc0011.bmp | 0011 | 5001 | 5381 | 5384 | 5381 | ❓ Possible |
| vc0012.bmp | 0012 | 8467 | 84767 | 8467 | ❓ Possible | |
| vc0013.bmp | 0013 | 8531 | 0541 | 3534 | 3531 | ❌ Unique |
| vc0014.bmp | 0014 | 7157 | 9197 | 9197 | ❓ Possible | |
| vc0015.bmp | 0015 | 4360 | 4360 | 4366 | 4360 | ✅ Trusted |
| vc0016.bmp | 0016 | 9769 | 974 | 9709 | 9769 | ❓ Possible |
| vc0017.bmp | 0017 | 9215 | 0275 | 0275 | ❓ Possible | |
| vc0018.bmp | 0018 | 2025 | 2025 | 2825 | 2025 | ✅ Trusted |
| vc0019.bmp | 0019 | 3504 | 8524 | 8524 | ❓ Possible | |
| vc0020.bmp | 0020 | 8690 | 3698 | 32698 | 3698 | ❓ Possible |
不看不知道,一检查吓一跳,这些CNN 和其它模型不一致的结果中,惊人的发现————CNN 识别的正确率高达 100%,为了确认不是花眼,我再次检查了这 100 张图,完全正确!
| Model | Accuracy | Correct | Total |
|---|---|---|---|
| CNN (Round 4) | 100.0% | 100 | 100 |
| EasyOCR | 63.0% | 63 | 100 |
| Template Matching | 38.0% | 38 | 100 |
| Tesseract | 17.0% | 17 | 100 |
这意味着,在识别这个网页的验证码这个特定任务上,我们的小模型已经“超神”了。它不仅完爆了 Template Matching,也大幅超越了 EasyOCR,而整个模型文件只有 7.9MB 大小。 这或许就是我们自己的领域专用视觉模型了。 有了它我很有信心可以将验证码的识别重试次数从 5 改到 1,咱不太可能失败了,哈哈,满意的笑了。
攻克了验证码,剩下的就是组装一下 Python 胶水代码给Alfred Workflow调用了。
AI 火速编写了 alfred_wubi.py,流程如下:
captcha_cnn.pth,瞬间识别出验证码。
|
|
这里对于 Python 库的依赖,我们可以使用.venv 来管理,避免和系统环境冲突。 你可以这样使用这个项目:
|
|
然后使用 .venv/bin/python 来运行 python alfred_wubi.py。
本文所提到的 Workflow 以及训练整个过程及数据已经开源在GitHub,你可以在这里查看:https://github.com/kevin1sMe/alfred-wubi-workflow。
文章到这里就是尾声啦,这其实是周末折腾其它过程中的小插曲,感觉挺有意思给大家一起分享下。现在我们打造的这个五笔反查工具,能够让我们告别某些生僻不会打的字。就像我前面截图中,“肃”字你会打吗?更关键的是通过这次折腾,让我更深刻感受到,在 AI 辅助编程的加持下,个人开发者解决问题的边界被极大地拓宽了。
以前遇到“需要训练一个模型来识别验证码”这种需求,可能因为觉得门槛太高就放弃了。但现在:
我只需要专注于聊清需求、定义问题和决策方案。从零开始到模型落地,只用了短短1-2个小时,这或许就是 AI 时代的编程范式吧。但是要整理出本文,为了将过程数据完整重现,我又重新一步步跑了一次,严谨的记录和对比了各个轮次的效果,再加上代码开源及整理,这里居然花了周末的一整个晚上。看在这么认真的份上,小手点个关注、点个赞不过分吧:)
持续折腾,不断进步,我们一起加油。期待下次有机会继续分享更好玩的内容,再会!
我是个爱折腾技术的工程师,也乐于分享。欢迎点赞、关注、分享,更欢迎一起探讨技术问题,共同学习,共同进步。为了获得更及时的文章推送,欢迎关注我的公众号:爱折腾的风
