Skip to content

Latest commit

 

History

History
57 lines (42 loc) · 4.28 KB

File metadata and controls

57 lines (42 loc) · 4.28 KB

全局表情包库 (Memes)

Undefined 平台自 3.3.0 版本起内置了强大的全局表情包库功能。该功能能够自动捕捉聊天中的图片、进行多模态模型判定与解析、并将其向量化归档,从而赋予 AI 在后续对话中“信手拈来”发送表情包的能力。

工作原理与两阶段处理管线

此功能核心是一个无阻塞的异步多模态处理管线(MemeWorker):

  1. 自动提取与去重: 收到图片消息时,系统后台自动将其投入去重队列,通过内容哈希判定该图是否已经入库。

  2. 第一阶段 - 属性判定 (Judge): 提交给视觉模型(通过 judge_meme_image.txt 提示词)分析图片本质。如果图片只是普通的自拍、系统截图或者无法表现梗(Meme)的内容,流程将在此终止。 对于 GIF 动图,系统可根据配置(网格拼接或多张多帧)进行抽帧重组以提供更连贯的视觉上下文。若在此交互期间遇到暂时的网络错误或接口报错,处理管线会自动重试,确保判定过程的高可用性。

  3. 第二阶段 - 语义解析 (Describe): 对于被判定为表情包的图片,模型会进一步(通过 describe_meme_image.txt 提示词)提取:

    • 图片的关键视觉元素与构图。
    • 隐喻、情感与适合的回复语境。
    • 高质量的搜索标签(Tags)。 同样,该阶段依然享有自动重试逻辑保护,从而保障长流程分析和描述内容的成功入库。
  4. 向量化与持久化: 提取出的结构化文本与标签被存入 SQLite (MemeStore),并通过嵌入模型向量化后存入 ChromaDB (MemeVectorStore)。原图及其生成的预览图(如 GIF 抽帧)持久化存放至数据目录。

AI 如何使用表情包?

存储与索引完成后,AI Agent 会通过内置的 memes.* 系列工具使用表情包:

  • memes.search_memes:支持关键词检索(基于 SQLite)、语义检索(基于 ChromaDB 向量相似度)与混合检索(Hybrid)。AI 可借此根据当前对话的语境快速寻找最有梗的静态图或 GIF。
  • 发送机制:使用统一的图片 uid 进行索引。系统不仅提供了 memes.send_meme_by_uid 让 AI 一键发送表情包,还支持 AI 输出 <attachment uid="..."/> 统一资源标签指令进行图文混排;用户发来的图片在 AI 上下文中也使用同一格式,旧 <pic> / [图片 uid=...] 仅作为兼容格式保留。
  • 回复顺序:只有当本轮明确是纯表情包 / 纯反应图回复时,AI 才应先搜索并发送表情包。凡是需要文字承接、解释、答疑、推进任务或确认操作的场景,都必须先发送必要文字;轻松聊天、吐槽、附和、接梗、表达情绪、被拍一拍或被 @ 后的短回应等场景,文字发送成功后会更积极地在后续轮次补发一张独立表情包。严肃答疑、代码排查、长任务推进、隐私/安全拒绝或信息不足追问默认不补表情包,避免影响信息传递。

目录结构与配置

所有的持久化文件默认位于 data/memes/ 下:

  • blobs/:表情包原图文件。
  • previews/:表情包预览图文件。
  • memes.sqlite3:元数据及标签库。
  • chromadb/:向量化知识库。
  • queues/:异步任务队列缓存。

可通过 config.toml[memes] 块开启、关闭及调整此功能:

[memes]
enabled = true                  # 是否启用
query_default_mode = "hybrid"   # 默认搜索策略:keyword / semantic / hybrid
gif_analysis_mode = "grid"      # GIF 的多帧识别模式:grid(网格拼接)、multi(多张散图)、first_frame(仅首帧)
gif_analysis_frames = 6         # GIF 的抽帧数量

更多细节请查阅 配置文档

管理 API 集成

除了在聊天中自动捕获,你还可以通过前端 WebUI 或直接调用 Management API / Runtime API 对库内表情包进行增删改查。 包括:列出分页表情包库、删除、触发 reanalyze(重新判定解析)、reindex(强制重建向量缓存)。