前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
返回 AI 情报前线
All News · 全部资讯9258
  • DeepSeek V4 Pro 0813发布:1M上下文+工具调用+Thinking模式
  • 研究揭示:AI Agent技能仅12%经过安全审计,覆盖83%安装量
  • MCP服务器多实例实战:15个Safari-MCP并发部署踩坑全记录
  • LangChain构建语音Agent:架构、流式与生产级模式
  • Hermes Soul:让Copilot外壳调用Agent工具链实现内联编辑
  • LLM幻觉深度解析:AI为何编造内容及工程应对策略
  • Playwright AI Agent:自主浏览器自动化的完整工程指南
  • 一致性≠正确性:企业AI需要持续评估的R.A.H.S.I.框架
  • LLM账单有两个杠杆,你们团队只拉了一个
  • SFT 中究竟什么被 token 化:chat template 底层机制详解
  • 社区平台工程指南:Feed不是查询
  • 发布MCP服务器前的安全检查清单
  • Agent工具调用劫持:注入模式与运行时防护
  • AI Agent成本预测:在用户点击运行前估算工作流开销
  • 为何 AI Agent 指令文件总在多台机器间漂移
  • AI 水印无法真正证明作者身份——而且这才是关键
  • 企业级 AI 编程 ROI 量化实践:LoongSuite-Pilot + SLS
  • AI Agent 缺控层:R.A.H.S.I. 框架解决生产级连续保障
  • Grok 4.6 发布:50 万上下文、xhigh 推理级,60 分跻身第一梯队
  • AI Agent 搜索落地指南:减少幻觉的四大实践
  • 截图搜索 App 实战架构:端侧 OCR + Gemini 分类
  • 幂等性:让发布 Agent 不怕中途被杀
  • AI Agent 安全:教程里不会教的防护层
  • 2026生产级AI Agent实战指南:评估体系、生产架构与竞争策略
  • 企业级多Agent架构设计:Agent Mesh实现跨框架互操作
  • 上下文工程:6 文件替代全量历史,Token 消耗降 84%、准确率升 39%
  • AI 编码 Agent 需要确定性验收边界
  • 批处理中的静默失败:十条日志全成功仅两条执行
  • Pest 5:用测试工作流重新定义 Agent 代码验证
  • AI Agent的记忆检索正常却答错了:信息过期的隐性陷阱
  • AI编程的质量瓶颈在于上下文,而非模型本身
  • 自进化AI Agent正在淘汰静态脚手架:2026技术架构解析
  • AMD收购Taalas:芯片级AI推理的时代来了
  • Embabel:JVM上的Spring之父新作,Kotlin编写的企业级Agent框架
  • 6000+评论揭示:Cursor是AI编程安全问题最多的工具
  • 2026年AI编程工具横评:9款主流Harness对比与模型选配指南
  • LTX-2:首个DiT架构音视频生成模型开源
  • 33个生产Agent运行经验:记忆持久化模式总结
  • VLM+DOM Diff实现低误报的UI回归测试
  • 新模型来了?先用自己仓库的历史 commit 跑一遍
  • 廉价新模型上线前,我用 2 小时金丝雀测试决定要不要切
  • 免费模型评测后再付费:AI 编程任务的评估工作流
  • Meta 30B本地Agent模型Mac实测对比
  • 用测试套件自动分流免费/付费模型的工作流
  • Switchyard:Rust 编写的 LLM 流量代理,支持 OpenAI/Anthropic 协议互转
  • RAGFlow v0.4:开源 RAG 引擎支持 DeepSeek v4 与多渠道聊天
  • 廉价模型优先、失败时升级:构建可审计的双层 LLM 流水线
  • Vercel实习生直参生产:CDN、v0、AI Gateway实战复盘
  • DeepSeek-V4-Pro 正式版:Agent 能力大幅提升,支持三档思考强度
  • 2026年Claude Code最佳替代工具横评
  • DeepSeek-V4-Pro 正式版发布:Agent 能力大幅提升,支持 Responses API
  • 已加载 51 / 9258
8.0
热点
AI SCORE
技术实践2026-08-13 14:13

截图搜索 App 实战架构:端侧 OCR + Gemini 分类

dev.to · AI#React Native#OCR#端侧AI
Editor brief · 编辑速览

作者完整拆解 Screenshot Vault 技术选型:ML Kit 端侧识别、Expo + SQLite 本地持久化、Gemini API 做分类摘要,隐私优先架构值得参考。

文章思维导图
Knowledge map
拖拽缩放
Full translation

完整中文译文

每个人的手机里都有一个装满 500 多张截图的文件夹,想在里面翻找三个月前的收据简直是大海捞针。我受够了这种事,于是做了一个 App 叫 Screenshot Vault——它能读取手机里每张截图中的文字,让你像用 Google 一样去搜索它们。

下面说说它是怎么实现的,以及几个我当初没料到会这么重要的设计决策。

技术栈

  • Expo (React Native) + Expo Router — 文件路由,EAS 做原生构建
  • @react-native-ml-kit/text-recognition — 基于 Google ML Kit 的设备端 OCR
  • expo-sqlite — 本地持久化
  • expo-media-library — 读取设备 Screenshots 相册
  • Gemini 3.6 Flash — 分类、标题、标签,通过一个轻量的 Next.js API Route 调用
  • Next.js + Vercel — 落地页 + 后端代理

决策一:OCR 完全在设备端完成

我的第一反应是把截图上传到服务器处理。后来认真想了想——一个典型的截图文件夹里有什么?银行 OTP 验证码、支付凭证、私人聊天记录、家庭地址。把这些上传到我控制的数据库里,既是我的负担,一旦泄露也是用户真实的风险。

Google ML Kit 的文字识别完全运行在设备上,免费,无需服务器往返。所以 OCR 在本地完成,唯一离开手机的东西是已经提取出的文字——发送给 Gemini 做轻量的分类调用,而不是图片本身。这样做还有一个好处:规模大了成本更低,因为不需要为图片存储和带宽付费。

决策二:不要让用户等待全量扫描

如果有人安装了 App 时已经有了 500 张旧截图,要在展示任何内容之前对它们全部跑 OCR + AI,这意味着首次启动要等 10-20 分钟。这种体验的结果只有一个:立刻卸载。

取而代之的是分阶段、可恢复的处理方式:

CREATE TABLE screenshots (
  id TEXT PRIMARY KEY,
  uri TEXT,
  text_content TEXT,
  category TEXT,
  ai_title TEXT,
  tags TEXT,
  ocr_done INTEGER DEFAULT 0,
  ai_done INTEGER DEFAULT 0,
  created_at INTEGER
);

展示策略:

  • SQLite 里有什么就展示什么——即时,零等待
  • 对发现的新截图只插入空行(缩略图立刻可见)
  • 后台任务:OCR 所有 ocr_done = 0 的记录,按最新优先
  • 后台任务:AI 分类所有 ocr_done = 1 且 ai_done = 0 的记录,按最新优先

如果 App 在扫描中途被关闭,下次启动时它会从标志位断点处继续——不会重复处理,不会丢失进度。这其实就是 Google Photos 用于"正在准备你的照片库"后台索引的同一套思路。

决策三:永远不要把 AI API Key 放在客户端

早期版本直接从 App 里调用 Gemini,Key 写在 env var 里。很快我就意识到:任何安装了 APK 的人都能把这个 Key 提取出来,然后在我的账号上疯狂消耗——以 EXPO_PUBLIC_ 开头的 env var 会直接打包进客户端,没有任何例外。

我把它迁移到落地页同一个 Vercel 项目里的一个 Next.js API Route 后面:

export async function POST(req: NextRequest) {
  const { text } = await req.json();
  const apiKey = process.env.GEMINI_API_KEY; // server-only, never shipped to client

  const res = await fetch(GEMINI_ENDPOINT, {
    method: 'POST',
    headers: { 'x-goog-api-key': apiKey },
    body: JSON.stringify({ /* prompt asking for category + title + tags in one call */ }),
  });
  // ...parse and return
}

一次调用返回 category + title + tags,而不是发三个独立请求——这在 Gemini 免费额度(很快就会触顶)上差异巨大。

目前还在早期,暂只支持 Android,小范围测试中,后续会扩大发布范围。如果你希望关注进展或等它 ready 了想试试:screenshot-vault-lac.vercel.app

很好奇有没有其他人做过类似的 AI 功能端侧 vs. 云端权衡——欢迎在评论区交流探讨。

Original source

本文由 AI 翻译整理自 dev.to · AI,原文版权归原作者所有。

阅读英文原文
上一篇
AI Agent 搜索落地指南:减少幻觉的四大实践
下一篇
幂等性:让发布 Agent 不怕中途被杀