TOOL / 颜文字 · 表达
颜文字大全
颜文字最难的从来不是"有没有",而是"这个心情用哪一个"。这个工具的做法是:按情境浏览解决"我知道我要什么",模糊搜索解决"我说不出我现在是什么心情"。
两种找法
按情境浏览 — 30 个分类,从「开心」「无语」「装死」到「假生气」「婉拒」,点开就有。分类和标签的匹配全在浏览器本地完成,零延迟。
用一句话搜 — 直接说你此刻的心情,比如:
- 想找个无语到不想说话的
- 被夸了一句得意到飞起
- 累到不想动只想躺着
- 同事让我帮忙但我真没时间
点一下建议词就能试。
模糊搜索是怎么做到的
每条颜文字在入库时都会把「分类 + 标签 + 自然语言描述」用 qwen/qwen3-embedding-8b 转成 4096 维向量。你输入一句话时,同样转成向量,再和全库算余弦相似度,取最接近的。
刻意不把颜文字本体喂进模型——(⊙_⊙) 这类字符基本是标点组合,混进去只会让「开心」和「难过」的向量互相干扰,污染语义。喂进去的是它的语言描述。
所以描述词写得具体很重要。工具里的描述不是"表示开心的表情"这种废话,而是「难题终于解决、拍着桌子说这事我能搞定」这种能让人不看颜文字也猜出语境的句子。
搜索是混合式的
一次搜索会并行走两条路:
| 通路 | 耗时 | 覆盖 |
|---|---|---|
| 本地过滤(分类 + 字面) | 0ms | 分类名、标签、描述里的原词 |
| 语义检索(向量) | 约 2-3s | 自然语言描述、心里的感觉 |
本地结果立刻出,语义结果在后面补上并标注「很接近 / 接近 / 有点像」。选了具体分类时不会混入语义结果——用户既然点了分类,要的就是那一类。
一些实现细节
- 向量存 BLOB 不存 JSON:4096 个 float 存成 JSON 约 100KB/条,float32 二进制约 16KB/条,差 6 倍以上
- 全库向量常驻内存:约 12.8MB,暴力算余弦 1-3ms,不需要向量数据库
- 连续输入的竞态:每次输入换令牌,让在途的语义请求作废,否则先发后到的结果会盖掉新结果
- 相似度分档展示:余弦相似度集中在 0.3~0.9,直接显示小数没意义,映射成三档
- 淘汰低分结果:低于阈值的不硬凑,宁可少给
隐私
- 分类浏览、字面搜索:完全在浏览器本地,不发任何请求
- 语义搜索:查询词会发到
api.oscarstudio.cn调 embedding 接口,仅用于本次相似度计算,不落库、不用于训练 - 颜文字库本身是全局只读数据,不区分用户
接口
免鉴权,供二次开发使用:
GET /api/kaomoji/categories 分类 + 数量
GET /api/kaomoji?category=&q=&limit= 本地检索
POST /api/kaomoji/semantic 语义检索(按 IP 限流 20 次/分钟)
DELETE /api/kaomoji/cache 灌数据后手动清缓存