跳到主要内容
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 灌数据后手动清缓存