不需要记得那张图叫什么、放在哪,只需要描述自己想说什么。
表情包存到几百张之后就进入一个尴尬状态:你知道自己有那张图,但找不到它。 相册按时间倒序、文件夹按来源、硬盘按文件名——而人真正找图的方式是从「我现在想表达什么」出发的:
- 想发一个「可爱一点的滚」
- 想发一个「看到逆天发言时用的」
- 想发一个「礼貌但很阴阳怪气」
这些意图和文件名、上传时间之间没有任何关系。Mememio 在存储和意图之间补上了一层语义索引。
它不是一个图片管理系统,是一个语义索引系统,图片只是它的载荷。
导入 → 自动理解 → 语义搜索 → 一键使用
导入。 多选、拖文件夹、Ctrl+V、手机相册。去重发生在调 AI 之前,作用域是全局的——省的是你自己的钱,也保证共享库里同一张图不会出现两次。
自动理解。 入库时由多模态模型一次调用产出 OCR 原文、一句描述,以及从固定词表里选的五个语义维度:表情、情绪、语气、用途、场景——外加一组「主体与风格」标签和一维内容分级(分级模型只给初判,真正的主力是人工编辑)。前五个互相推导不出来——一张微笑角色配「你说得都对」,脸是笑的、情绪不是开心,语气是敷衍,用途是表面附和。AI 的开销只发生在入库,不发生在每次搜索,这是延迟和成本能同时压下来的原因。
搜索。 自然语言描述即可。三路召回(向量、OCR、标签)RRF 融合排序,结果顺序就是最终顺序,客户端不重排。
使用。 桌面静态图点击即复制,动图下载后拖进聊天窗口,手机走系统分享面板(动图也能发)。装到主屏之后是一个独立窗口的 PWA。全屏阅览里也有发送按钮和 Ctrl+C。
库是共享的,不是每人一个。 所有人的上传进同一个库、所有人都能搜到,编辑对全员开放,删除限上传者本人或管理员。这带来一个直接后果:你配的视觉模型会污染所有人的搜索结果,所以默认用部署方验证过的那套,要改得先翻开「高级选项」。
模型不锁定供应商。 用户填自己的 OpenAI 兼容供应商(视觉 / 用户级),Embedding 全站一份、由部署方配。因为系统不能假设模型任何能力,每个配置都配了「测试连接」:逐项列出探测到了什么,失败时原样展示上游返回——不是一个红绿灯。
MCP 是第二个对外接口。 只读的 /mcp 让 Claude、Cursor 或你自己的 IM 机器人用一句想表达的话检索这个库,拿到可直接交付的图片地址。令牌在设置页自助创建。
只有一个有状态组件。 Postgres 装元数据、向量、会话、队列;原图在 R2。没有 Redis、没有独立向量库、没有本地持久盘,容器随时可以重建。部署是一套 Docker Compose,单机上能与别的项目共存(命名全部由一个变量派生)。
2026-10-01 完成首次部署,前后端在真实环境跑通。
| 能用 | 说明 |
|---|---|
| 导入、去重、打标、搜索、浏览、发送 | 后端有自动化测试;前端不常驻测试,用脚本驱动真实 Chrome 做验收 |
| 我的配置与测试连接、运行参数、重建索引、重新打标 | 全站管理项在 /settings 里,对普通成员不显示 |
| MCP 接入 | 两端实现完成;外部客户端与 IM 渠道的验收还在进行 |
| PWA | 实现完成,真机安装尚未逐条验收 |
两件还没被证明的事:
- 评测集还没跑过。 词表、打标提示词、检索参数都还在边用边调,别把某一维当成已经验证过。
- 供应商全程用的是替身。 真实供应商的超时、限流、流式截断都还没试过。
这块的完整台账在当前任务,每一条都写着卡在哪、谁接手。
只列一件已经被明确推到后面的事——它是决定,不是遗漏。(原来并排的另一件「MCP 记录审计」2026-10-31 已提前开工,见当前任务。)
人物识别与分类。 想法是把同一个角色的图聚到一起。代码和它依赖的那部分设计都还在,但真实库上的实测推翻了假设:不同角色之间的向量相似度能到 0.90,同一个角色换画风反而掉到 0.56–0.80——相似度指向的是画风,不是人物。界面里的入口已撤、自动归类已停。要重启得先解决跨画风差异,技术路径、模型判定实验、约 200 张的试跑和对话模型单价四件事都还没定。
| 前端 | Vite + React + TypeScript SPA,Tailwind v4 + shadcn/ui |
| 后端 | Hono(Node),同域托管前端产物 + /api/v1 + /mcp |
| 数据 | PostgreSQL + pgvector + pg_trgm;队列用 Postgres 自身(SKIP LOCKED),不引入 Redis |
| 存储 | Cloudflare R2,前端预签名直传 |
| 图像 | ffmpeg 抽帧 + sharp + pHash 去重 |
| AI | 任意 OpenAI 兼容供应商 |
| 部署 | Docker Compose |
前后端同域、类型走 Hono RPC 直接共享,没有代码生成步骤。但类型只保证形状——权限、软删过滤、降级顺序这些含义靠契约和测试,不靠类型检查。
本地开发需要 Node 22+、Docker、ffmpeg:
cp .env.example .env # 填 DB_PASSWORD / SESSION_SECRET / CONFIG_ENC_KEY / R2_*
docker compose -f compose.yaml -f compose.dev.yaml up -d db
cd api && npm install && npm run migrate && npm run dev
cd web && npm install && npm run dev # :5173,proxy /api → :3000CONFIG_ENC_KEY 必须正好 32 字节,丢了等于所有用户的 API Key 永久解不开,要离线单独备份。完整变量清单见环境。
部署照部署手册 §9 走:反代接法、命令序列、首个管理员、R2 开通。
没有 AI key 也能跑——图片正常入库为待打标,搜索降级为 OCR + 标签。这是生产也要走的真实路径,不是开发便利。
| 想做什么 | 读 |
|---|---|
| 理解产品和明确不做什么 | 产品 |
| 看系统边界与数据流 | 架构 |
| 查跨端字段、接口、权限、错误 | SPEC 索引 |
| 知道某个设计为什么是这样 | 设计决策 |
| 把库接进 LLM 聊天或 IM 机器人 | MCP 接入 |
| 接着当前工作继续做 | 当前任务 |
| 以 AI 项目总管接手 | AGENTS.md |
工作区:api/(README)、web/(README)、shared/vocab/(词表)、spec/(契约主源)、docs/(背景与运行)。
spec/ 是最高的约束层:代码与契约冲突改代码;契约要改,先走协作流程。其余文档都是派生的。
邀请制部署:注册需要邀请码,第一个注册的账号自动成为管理员,之后的角色变更只能由管理员操作。
仓库目前没有附开源许可证文件,因此默认保留所有权利——选定许可证之前,请勿再分发或用于衍生项目。