• 请不要在回答技术问题时复制粘贴 AI 生成的内容
MaskerPRC
V2EX  ›  程序员

给几百 G 的本地截图做一个能搜内容的引擎,我踩过的坑

  •  
  •   MaskerPRC · 2 days ago · 1858 views

    最近做了个小工具:把我攒了几年、按字节算快 1T 的电脑截图(微信聊天截图、网页截图、报错截图、PPT 截图……)做成一个能直接搜内容的引擎。比如搜「上次那个 nginx 502 的报错」,直接把当时那张截图翻出来。

    功能听起来不新鲜,但自己动手做一遍,坑比想象的多。这里把踩过的坑记录一下,给同样有这个需求的朋友参考。

    坑一:OCR 不是「接个库」那么简单

    一开始想当然:截图 → OCR → 存文本 → 搜,完事。实际:

    • 中文截图里夹杂的英文报错、路径、代码,混排识别率惨不忍睹。纯中文 OCR 库对 Error: EACCES: permission denied '/var/log/...' 这种行基本全军覆没;
    • 后来换成多模型互补:通用 OCR 打底,对识别置信度低的行再走一次视觉模型重读,准确率才到了能用的水平;
    • 坐标信息别丢——OCR 返回的文字块位置留着,后面高亮定位全靠它。

    坑二:索引体积失控

    几个月的截图,全量向量化之后索引文件比截图本体还大。两件事必须做:

    • 切分粒度:按文字块切,不要按整张图切。一张 1080p 截图 OCR 出来可能有 40 个块,大部分是时间戳、水印、无关 UI 文字——先过一遍规则过滤(正则 + 长度 + 位置),能砍掉六成索引量;
    • 分层检索:先文本关键词粗筛( SQLite FTS5 就够),命中候选再走向量精排。别一上来就全库 ANN 搜,慢且贵。

    坑三:查询理解是最容易被忽略的一环

    用户搜「那个 502 」,你拿什么去向量库里匹配?查询改写这层一定要做:

    • 把口语查询改写成「可能出现在截图里的文字形态」(比如把「报错」扩写成 error / failed / 错误);
    • 时间限定词(「上个月」「上周」)单独解析出来,转成过滤条件,别混进向量里。

    效果

    现在 300+ 天的截图,一次搜索 1 秒内出结果,准确率主观评价八成以上。最大的收益是「再也不用翻聊天记录找那张图了」。

    最后

    这个项目的启发是:RAG 这套东西落到个人小工具上,工程量最大的不是向量检索本身,而是数据清洗和查询理解——七成时间花在了这两块。

    代码还在整理,如果大家有兴趣,后续开源出来。也欢迎交流你们做本地内容检索的思路。

    18 replies    2026-09-13 18:37:47 +08:00
    stonesirsir
        1
    stonesirsir  
       2 days ago via Android
    先期待一下
    zq11211277
        2
    zq11211277  
       2 days ago
    支持 感觉这个很有用

    以后我们可以 1 分钟电脑截屏保存一次,然后利用楼主这个引擎进行回忆
    wises
        3
    wises  
       2 days ago
    期待开源...
    gswgudujian
        4
    gswgudujian  
       2 days ago
    期待开源...
    Orangeee
        5
    Orangeee  
       2 days ago
    👍多谢分享
    crackhopper
        6
    crackhopper  
       2 days ago
    6 ,应该直接卖钱,订阅。
    HeyWeGo
        7
    HeyWeGo  
       2 days ago via Android
    手机里的搜索图片里内容原理是不是类似
    homcrazy1
        8
    homcrazy1  
       2 days ago
    不错哦,别了一些灵感
    paradoxs
        9
    paradoxs  
       2 days ago
    应该是有一些办法可以减少索引量的,百度网盘,onedrive 之类的,很早之前就可以实现对截图中的文字实现 OCR
    needpp
        10
    needpp  
       2 days ago
    牛,期待开源
    babyedi31996
        11
    babyedi31996  
       2 days ago
    这……immich 不就是有这功能吗
    MaskerPRC
        12
    MaskerPRC  
    OP
       1 day ago
    云端做 OCR 的那些(网盘、相册类)思路确实类似,都是「图片 → 文字 → 建索引」。不过我最后选本地自建,主要是两个现实原因:

    一是隐私和范围。云端方案只能扫「传上去的」,我这堆截图里不少是工作相关的(配置、代码片段、聊天记录截屏),不太想整包交给云。本地跑 OCR 虽然慢点,但几百 G 的历史截图一次索引完,之后查询都在自己机器上。

    二是查询这一环。识别出文字只是一半,真正的难点是我记不清原话——只能描述「那个带 redis 配置的报错截图」。所以后端对查询做了不少容错(同义改写、拼音、部分匹配),这部分反而是比 OCR 更花时间的坑。

    7 楼问的手机相册搜索,原理确实是一个路子,只不过人家是在端侧跑的小模型,精度和吞吐都是另一个量级的取舍了。
    MaskerPRC
        13
    MaskerPRC  
    OP
       1 day ago
    更新:没想到这么多朋友感兴趣,坦白说下——这就是我们在做的产品,叫快咔截图,官网 kuaika.app ,上面说的这套引擎就是它的核心。目前可以下载用了,Windows / macOS 都有。帖子里踩的坑基本都还在持续优化(尤其是查询理解和多语言混排这两块),大家用了有任何问题直接在这里回或者私信我,都欢迎。开源的事我们在认真考虑,有进展会第一时间在这个帖子里更新。
    morota
        14
    morota  
       17h 28m ago   ❤️ 1
    @MaskerPRC
    点击下载就报错

    <Error>
    <Code>NoSuchKey</Code>
    <Message>The specified key does not exist.</Message>
    <RequestId>6AA6085A98945C3636A33ADF</RequestId>
    <HostId>jieshi-self-system.oss-cn-beijing.aliyuncs.com</HostId>
    <Key>deploy-artifacts/kuaika/20260910-094058-5de5/pc/快咔-Setup-0.0.41.exe</Key>
    <EC>0026-00000001</EC>
    <RecommendDoc>https://api.aliyun.com/troubleshoot?q=0026-00000001</RecommendDoc>
    </Error>
    Gitss
        15
    Gitss  
       11h 53m ago via Android
    能上到 nas 上吗,容器镜像
    Gitss
        16
    Gitss  
       11h 50m ago via Android
    一般 nas 用户存储的图片很多,现在图片用的 mt 相册方案,虽然 immich 也有 ocr 识别
    MaskerPRC
        17
    MaskerPRC  
    OP
       9h 13m ago
    @morota 现在应该好了
    MaskerPRC
        18
    MaskerPRC  
    OP
       9h 12m ago
    @zq11211277 https://www.kuaika.app/ 最新版本可以下载了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   881 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 50ms · UTC 19:50 · PVG 03:50 · LAX 12:50 · JFK 15:50
    ♥ Do have faith in what you're doing.