Skip to content
DuskbitStudioPublic

About

~

Resources

Stars

3 stars

Watchers

0 watching

Forks

Repository files navigation

Mememio · 表情包语义检索

Mememio

不需要记得那张图叫什么、放在哪,只需要描述自己想说什么。

表情包存到几百张之后就进入一个尴尬状态:你知道自己有那张图,但找不到它。 相册按时间倒序、文件夹按来源、硬盘按文件名——而人真正找图的方式是从「我现在想表达什么」出发的:

  • 想发一个「可爱一点的滚」
  • 想发一个「看到逆天发言时用的」
  • 想发一个「礼貌但很阴阳怪气」

这些意图和文件名、上传时间之间没有任何关系。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 → :3000

CONFIG_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/ 是最高的约束层:代码与契约冲突改代码;契约要改,先走协作流程。其余文档都是派生的。

关于

邀请制部署:注册需要邀请码,第一个注册的账号自动成为管理员,之后的角色变更只能由管理员操作。

仓库目前没有附开源许可证文件,因此默认保留所有权利——选定许可证之前,请勿再分发或用于衍生项目。

About

~

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages