返回博客

iPhone 照片留在本地,Comma 帮你找

模型也跑在本地。你用自然语言提问,Comma 从本地索引里把照片找出来。

开始使用阅读文档

在网上订租车,表格要填驾照号码和到期日,驾照却不在手边。你记得去年换新驾照时给它拍过照片,正反两面,可它们混在 iPhone 里几万张照片中间。你想用自然语言问 Comma,把这两张照片找出来。

这篇指南介绍一种搭法:先用本地模型给照片建一份索引,再让 Comma 去搜索它。这是在一台 Mac 上的示例配置,不是 Comma 的内置功能。

图库留在本地

Comma 不需要你照片的副本。最费力的工作,也就是读出每张图里的文字、把每张照片转成向量,都由本地模型完成。智能体拿到的是一次搜索的结果:几个照片 ID、它们的日期、图里识别出的文字,以及需要你挑选时的一张缩略图拼图。只有你最后挑中的照片,才会发到对话里。

照片同步本身走 iCloud;这里说的本地,指导出之后的识别、向量和索引。如果 Comma 用的是云端模型,这些搜索结果,以及你让它查看的图片,会发给你选择的模型服务商;像驾照这样的证件,识别出的文字里就有号码和住址。索引本身不会发往任何地方。Comma 本身是开源的,也可以部署在你自己的机器上。

搭建照片索引

索引接在照片原本就会走的路径后面,iPhone 上什么都不用改。

照片经 iCloud 照片从 iPhone 同步到 Mac 并导出;随后由本地模型生成缩略图、识别文字、算出两套画面向量,并建立全文索引 1 · 导到本地 iPhone 照常拍照 iCloud 照片 同步到 Mac Mac 上的“照片” 图库可以放在外置硬盘上 导出原图 记下拍摄时间和位置 2 · 用本地模型处理 缩略图 后面的步骤只读它 文字 Apple Vision 画面向量 Chinese-CLIP 画面向量 Qwen3-VL-Embedding 全文索引 SQLite 搜索时两套向量各自排名, 再把两份排名合并 照片经 iCloud 照片从 iPhone 同步到 Mac 并导出;随后由本地模型生成缩略图、识别文字、算出两套画面向量,并建立全文索引 1 · 导到本地 iPhone 照常拍照 iCloud 照片 同步到 Mac Mac 上的“照片” 图库可以放在外置硬盘上 导出原图 记下拍摄时间和位置 2 · 用本地模型处理 缩略图 后面的步骤只读它 文字 Apple Vision 画面向量 Chinese-CLIP 画面向量 Qwen3-VL-Embedding 全文索引 SQLite 搜索时两套向量各自排名, 再把两份排名合并
导出之后的步骤都在 Mac 上运行。

搭起来分三步:

  1. 把照片导到本地。 用 iCloud 照片把 iPhone 上的照片同步到 Mac,每天把新照片导出到一个文件夹。

  2. 用本地模型处理。 识别图里的文字,再用 Chinese-CLIP 和 Qwen3-VL-Embedding 把画面转成向量。

  3. 存进本地索引。 结果存进本地数据库,再配一条搜索命令。示例里这个命令叫 lpa。

搜索会返回什么

在本地,一次搜索就是一条命令。一次调用可以放进几种说法,模型只加载一次;智能体会把“去年”这样的说法换成一段日期范围。

sh
lpa search "driver license" "driver's license" "驾照" \
  --from 2025-01-01 --to 2026-01-01 --prefer text --json -n 9

每个结果都会标出它背后是哪种依据:

标记含义
文字命中每个词都在图里的文字中找到了。
可能画面看起来相似。相似的东西容易混淆。
低置信度只在没有更好的结果时才显示。

--prefer text 把文字命中排在前面,适合找证件、卡片和截图。--prefer picture 把画面相似的排在前面,适合找猫或海滩。几分钟内拍下、几乎一样的照片在列表里只占一个位置,其余的附在它下面。

Comma 对话:问海边民宿的 Wi-Fi 密码,Comma 从一张房间照片里的小卡片上读出网络名和密码,并发来这张照片。
文字命中:网络名和密码来自照片里卡片上的字。这张照片是为本例生成的。
Comma 对话:找猫趴在窗台上的照片,Comma 发来三张猫在窗台上的照片。
画面命中:这些照片里没有任何字写着“猫”或“窗台”,是画面向量找到了它们。

排在最前面的结果不确定时,智能体不会去猜。它会把候选的缩略图拼成一张带编号的图,最多九张,请你来挑。

带编号的 3×3 缩略图拼图:1 和 2 是示例驾照的正面和反面,3 和 4 是 Wi-Fi 卡片,其余是低置信度的候选。
拼图示意,驾照为示例证件。1、2 是文字命中的驾照正反面,3、4 画面像卡片,其余是低置信度的候选。回复“1 和 2”,智能体就发送驾照的正反两面。

两套向量的用法是在约 5 万张照片的完整图库上校准后定下的。单用 Qwen3-VL-Embedding 时,人工挑出的正确答案反而比单用 Chinese-CLIP 排得靠后;两份排名合并后,检查过的每一项都不比单用任何一个模型差。“可能”也要两个模型的相似度都过线才会标上,在一次测试查询里,标成“可能”的照片从 4,970 张降到 4 张。代价是一次搜索从约 3 秒变成 3.5–6 秒。

这套示例跑在一台 16 GB 内存的 MacBook Air 上,Qwen3-VL-Embedding 用的是 2B。机器更好的话,可以换更大的千问模型:

  • 更大的向量模型。 把 Qwen3-VL-Embedding-2B 换成 Qwen3-VL-Embedding-8B。换了以后,所有照片的向量都要用新模型重算一遍。

  • 给照片写描述和标签。 另跑一个 Qwen3-VL-4B-Instruct 或 Qwen3-VL-8B-Instruct,给每张照片写一句描述、列几个标签,存进文字索引。比如在一台 24 GB 内存的 MacBook Pro 上,8B(8-bit 量化)就能跑。生成的标签适合粗筛,不保证准确。

英文怎么办。 Chinese-CLIP 主要用中文图文训练,英文查询它不可靠。另外两样不受影响:文字识别中英文都认,Qwen3-VL-Embedding 也支持多种语言。所以搜索时中英文说法一起放,就像前面那条命令,这一点可以写进 Skill。图库和提问以英文为主的话,也可以把 Chinese-CLIP 换成原版的 CLIP,换了同样要重算向量。

找家人和朋友

“照片”本来就会把同一个人的脸归到一起。索引直接用这份分组,自己不做人脸识别。

  1. 先认人。 第一次用时,智能体从这些分组里挑出几批照片,编上号问你这是谁。你回一句“3 号是妈妈”,它才记下。没确认过的分组,不会被当成任何人。

  2. 按人找。 之后提到名字,搜索只在这个人出现的照片里找。名字可以叠加:说两个人,就只返回两个人都在的照片,也就是你们的合照。

  3. 和别的条件一起用。 人名可以和画面、时间一起搜,比如“去年我和妈妈在海边的合照”:

sh
lpa search "beach" --person Me --person Mom \
  --from 2025-01-01 --to 2026-01-01 --prefer picture --json -n 9

名字没确认过,或者有两个人同名,搜索会直接说明,不会猜。认错了可以改,每次修改都能撤销。

视频怎么找

视频和照片分开搜。默认的搜索只查照片;比如你想找孩子生日吹蜡烛的那段视频,跟 Comma 说清楚要找视频,它会在搜索里加上 --source video:

sh
lpa search "blowing out candles" "birthday cake" --source video --json -n 9

背后分三步:

  1. 截画面。 视频本身不进模型。索引程序每 5 秒从视频里截一帧,每段最多 12 帧。

  2. 按画面搜。 截下来的画面和照片走同样的处理:识别文字、算两套向量。搜索比对的是这些画面,哪一帧对上了,整段视频就算找到,在结果里只占一条。

  3. 发视频。 你选定以后,智能体用 lpa video 把视频发过来。

Comma 对话:找在阳朔拍竹筏的视频,Comma 发来一段 12 秒的视频,几只竹筏正从小水坝上滑下来。
找视频:对上的画面都属于同一段视频,所以这段视频只算一条结果。

现在只看画面,不听声音,视频里说过的话还搜不到,视频里的人也还认不出来。截的帧数有上限,长视频里一闪而过的画面可能找不到。

LocalPhotoAgent 的结构

文中的 lpa 来自我们自己写的索引程序 LocalPhotoAgent,之后会开源。建索引的部分前面已经讲过,这里补两点:

  • 可以随时停下。 每张照片的每一步都单独记录,跑到一半停下,下次接着做;改了某项设置,只重跑受影响的那一步。处理时会看着内存、温度和磁盘空间,超了就先停下。

  • 给智能体几条命令。 lpa search 搜索,lpa sheet 生成拼图,lpa preview 发照片,lpa video 发视频。智能体查照片时按这个顺序调用:

Comma 智能体经 Connector 先运行 lpa search,不确定时运行 lpa sheet,再用 lpa preview 或 lpa video 发送;只有生成拼图和发送时才会读外置硬盘 Comma 智能体 经 Connector 运行命令 lpa search 搜索,只查数据库 lpa sheet 不确定时生成拼图 lpa preview / video 发照片或视频 外置硬盘 缩略图和原图, 只在生成拼图 或发送时读取 Comma 智能体经 Connector 先运行 lpa search,不确定时运行 lpa sheet,再用 lpa preview 或 lpa video 发送;只有生成拼图和发送时才会读外置硬盘 Comma 智能体 经 Connector 运行命令 lpa search 搜索,只查数据库 lpa sheet 不确定时生成拼图 lpa preview / video 发照片或视频 外置硬盘 缩略图和原图, 只在生成拼图 或发送时读取

连接 Comma

前提是 LocalPhotoAgent 已在 Mac 上跑通。接入分四步:

  1. 添加设备。 在 Comma 的设置 > 设备里点添加设备,拿到一条安装命令。

  2. 运行命令。 在放图库的那台 Mac 的终端里运行它,装上 Comma Connector。

  3. 打开权限。 新设备默认关闭,改成完全,智能体才能运行 lpa。

  4. 写一个 Skill。 告诉智能体先搜索、不确定时发拼图、你挑完再发照片。可以直接让 Comma“创建一个 Skill”。

之后就和平时聊天一样,直接问:“找一下我去年拍的驾照,正反两面都要。”

Comma 对话:找去年拍的驾照照片,正反两面,Comma 发来示例驾照的两张照片。
开头那个问题,找到了答案。驾照为示例证件。

信任与限制

索引只读取原图,从不移动、编辑或删除它们。搜索完全不碰外置硬盘;只有生成拼图或发送照片时才会读它。移动或删除照片不在这套配置的范围内;不过设成完全权限后,智能体能在这台 Mac 上执行的命令不只限于 lpa。

文字命中只说明找到了这些字,不代表就是你想要的那张照片。“可能”只是候选。Comma 把请求标为已完成时,请检查它发来的照片。

第一次试的时候,你可以这样说:“找出我去年拍的驾照照片。先给我看拼图,不要发送、移动或删除任何东西。”

Try Comma, Now.

开始使用