Skip to content

创意实验室(Labs)

侧边栏「实验室」Tab,集合了一组好玩、可截图分享的小工具。和"分析"路线不同,这一组以"卡片化、像 Spotify Wrapped 一样" 为目标——v0.2.0 一次新增 5 个,v0.2.x 又陆续加到 12+ 个。

每个 Lab 都支持白底分享图导出,footer 自带 welink.click + 当前日期。

入口

侧边栏 → 实验室 → 顶部 Tab:

v0.2.0 首发 5 个

  • 🧬 聊天 DNA
  • ✨ 高光瞬间
  • 💭 灵魂提问
  • 🌌 平行宇宙
  • 🪐 关系星图

v0.2.x 增量

  • 💬 群金句榜
  • 📈 我的语言进化史
  • 🌏 聊天地图
  • 💌 人情债(承诺与邀约)
  • ❄️ 断联预警
  • 📖 群聊 Wrapped
  • 👻 这句话谁说过(反向语义搜索)
  • 🎭 AI 虚拟群聊
  • 📊 群语料 ROI 诊断

早先版本里的 AI 群聊模拟 仍在群聊详情里,不在实验室 Tab 内。区别于实验室里的「AI 虚拟群聊」——前者基于真实群现学现卖,后者由用户拉任意联系人组虚拟群、用每个人的"分身画像"扮演。

1. 聊天 DNA

类似 Spotify Wrapped 的年度个人卡:

  • 总消息数 / 我发的占比 / 最常聊的人 Top 5
  • 活跃时段(凌晨派?深夜派?)
  • 最爱用的 emoji 与开场白
  • 最长一句话 + 最长单日消息数
  • 最早开始聊的人("你们已经聊了 N 年")
  • 平均回复时延中位数

纯统计,不调 LLM——零 token 成本,离线也能出。

接口:GET /api/me/dna(10 分钟缓存,?refresh=1 强制重算;Reinitialize 切换时间范围后旧缓存自动失效)。

2. 高光瞬间

AI 从你和某位联系人的全部聊天记录里,挑出 5–8 段最有故事感的对话片段:表白、争吵、深夜聊人生、第一次见面、相互坦白、玩笑回忆 ……

每段配一张可截图的卡片,自带 LLM 生成的标题("那次差点崩掉的电话")和情绪标签。可分享。

接口:POST /api/contacts/highlights,body:{username, count?}

3. 灵魂提问机

AI 出 5 道只有你们俩才答得上的默契测试题——基于你们真实聊过的内容,比如:

  • "TA 最常吃的早餐是?"
  • "你们第一次见面在哪?"
  • "TA 提过最喜欢的电影是?"

每题 4 个选项,翻面看答案。可截图给对方做。

接口:POST /api/contacts/soul-quiz,body:{username}

4. 平行宇宙对话

选一个联系人 + 输入一个"如果……"场景,AI 用 TA 的人设引擎生成一段虚构对话,SSE 流式逐字展开

  • 如果我们五年前就认识
  • 如果我们是同事
  • 如果我现在跟 TA 求婚
  • 如果我们一起去东京旅行
  • 如果我们重新认识一次

复用 AI 群聊模拟 的 persona 引擎,单人版。

接口:POST /api/ai/parallel-chat,body:{username, scenario, turns?, sample_count?, profile_id?},返回 SSE 流。

5. 关系星图

把所有联系人按"共同群聊"聚拢成一张力导向图——同一个圈子的人会自动靠拢成簇。让你一眼看出社交圈层结构。

实现说明:自写的 mini force-directed layout,零新增依赖(不引 d3-force / vis.js)。节点统一主题绿,圈层差异通过位置体现而非颜色。

接口:GET /api/me/relation-graph

6. 群金句榜(v0.2.x 新增)

挑一个群,看哪些消息真正变成了梗 / 名场面

实现思路:扫描该群所有「引用回复」消息(WeChat 数据库里 local_type=49 且 message XML 含 <refermsg>),从 XML 解析出 <svrid> / <chatusr> / <content>,按"原始消息"做聚合,按被引用次数排出 Top 10。一条消息被群友翻牌越多次 → 越是金句。

  • 零 LLM:纯 SQL + regex,扫到瞬出,无 token 成本
  • 去重靠 svrid:同一条原文不同人回复合并计数
  • 过滤反直觉刷榜:自己 quote 自己不计;只被引用过 1 次的不上榜
  • 截断 60k 条:再活跃的群也只看最近窗口,避免 OOM
  • 白底分享卡:Hero(群名 + 三个统计数字)+ Top 10 列表,每条带原文 / 发言人 / 日期 / 引用次数 / 翻牌人 Top 3

接口:GET /api/groups/golden-quotes?room=xxx@chatroom&limit=10,10 分钟缓存。

7. 我的语言进化史(v0.2.x 新增)

把"我"发的所有文本消息按年聚合,画 4 条说话风格的演变曲线:

  • 句长(avg_chars):每条消息平均字数
  • emoji 浓度(emoji_per_100):每 100 条消息的 emoji 数
  • 英文夹杂率(english_pct):含 ASCII 字母的消息占比
  • 日均产量(msgs_per_day):活跃日的平均发言数

这是 /api/me/dna 单时间快照的"时间序列版"——能直接看出"我自己"在 2018→2026 这八年里说话风格的漂移:从"长句+少emoji"变成"短句+表情包"?还是反过来?

每年另外保留:

  • 那年最常用的开场白 Top 1 + 出现次数
  • 那年说过最长的一句话(≤600 字过滤掉粘贴块,前端再截断到 240 字)
  • 那年活跃天数 / 累计发言数 / 累计字数

实现:扫前 80 个最活跃私聊(每人最多 5000 条)的 type=1 文本消息,按 Date 字段前 4 字符抽年份分桶。少于 50 条的年份不出卡(统计太抖)。零 LLM、本地缓存 2h,?refresh=1 强制重算。

接口:GET /api/me/language-evolution

8. 聊天地图(v0.2.x 新增)

把"我"和私聊里所有提到的地名捞出来:中国直辖市 / 主要城市 / 国内景点 / 港澳台 / 海外城市 / 国家。看你聊起最多的地方是哪些,以及最常和谁聊起。

  • 零 LLM:内置约 200 条地名词典,子串匹配,扫秒级出
  • 零新增依赖:bubble cloud 用纯 CSS flex 包圆形 div,无 d3 / leaflet
  • 同消息内同名只计 1 次:避免"上海上海上海"刷榜
  • 6 类 tier 着色:一线 / 城市 / 景点 / 海外 / 国家 / 港澳台
  • Top 联系人:每个地名展示 Top 3 最常和你聊起它的联系人

UI 三层:

  1. 数字总览(提到的地方 / 被提及次数 / 扫描消息数)
  2. bubble cloud:气泡按提及次数 log 压缩缩放,色标 tier
  3. Top N 列表:横向进度条 + Top 3 同行者(含头像)

实现:扫前 80 个最活跃私聊(每人最多 5000 条 type=1 文本)的所有消息,对每条做 200 次子串扫描(Go 的 strings.Contains 快到忽略不计)。词典在 backend/chat_geography.go 内置,覆盖:6 个直辖市/超大 + ~50 国内城市 + ~25 国内景点 + 8 港澳台 + ~80 海外城市 + ~50 国家。

接口:GET /api/me/chat-geography[?limit=30][&refresh=1],2h 缓存。

9. 人情债(承诺与邀约挖掘,v0.2.x 新增)

挑一位联系人,AI 把"答应了但没做"的承诺 / 邀约挖出来——下次约饭、改天找时间、我寄给你、等我回国请你吃……看看 TA 欠你的 vs 你欠 TA 的。

实现思路是两段式:

  1. regex 高 recall 预筛:对全部文本消息跑一组宽口径正则(答应|承诺|改天|下次|等我|约你|请你|寄你|送你|欠你|欠我|别忘|记得|明天|下周|周末…),把所有嫌疑句捞出来
  2. LLM 精筛 + 结构化抽取:对每个命中点扩成「前 2 条 + 后 5 条」上下文窗口,重叠合并后送给 LLM。模型负责剔除寒暄 / 已兑现 / 抽象客套,把真正的承诺写成结构化 JSON:方向(i_owe / they_owe / mutual)/ 类别(聚餐 / 见面 / 寄送 / 借还 / 通话 / 旅行邀约 / 答复 / 其他)/ 目标日期 / 原文引用 / 当时日期 / 置信度

为什么不直接把所有消息扔给 LLM:

  • 大部分对话与承诺无关,全量送会爆 token 又稀释信号
  • regex 把候选窗口缩到几十个,LLM 输入控制在 ~20k tokens 内,单次调用搞定

UI 三档过滤(TA 欠我 / 双方约定 / 我欠 TA),每条卡片显示原文气泡 + 时间表达徽章。可一键导出白底分享卡——别 PR 主页给 TA。

接口:POST /api/contacts/promise-debts,body:{ username, profile_id?, msg_limit? }。10-25 秒返回(依 LLM)。

10. 断联预警(v0.2.x 新增)

聊天 DNA 是庆祝长期连接,断联预警是反过来——提醒你正在消失中的连接

扫所有私聊(总消息 ≥ 50 条)的最后一条消息时间,按静默天数 ≥ 30 排出 Top 30,并给出三档分级人数 + 三张"之最"高亮卡:

  • 静默最久的高频好友:聊得多但安静最久的那位
  • 历史聊得最多但已断联:曾经的话题伙伴
  • 认识最久且当前断联:从最早就在你聊天列表里、现在不说话的人

三档分级:30-89 天 / 90-179 天 / 180+ 天,分别拿颜色标。

零 LLM、10 分钟缓存、?refresh=1 强制重算。导出长图分享。

接口:GET /api/me/drift

11. 群聊 Wrapped(v0.2.x 新增)

类似 AI 群年报,但对当前筛选的时间范围做纯统计快照(不要求按整年),用作群画像顶部 Hero 卡:

  • Top 3 发言成员 + 占比
  • 消息类型分布(文本 / 图片 / 红包 / 转账 / 引用…)
  • 最忙一天 + 那天消息数
  • 被引用最多的原文 Top 3(结合金句榜的引用聚合)

零 LLM、10 分钟缓存、可截图。区别于 /api/groups/year-review 那个要按 year 锁年份且会调 LLM 写叙事。

接口:GET /api/groups/wrapped?room=xxx@chatroom

12. 这句话谁说过(反向语义搜索,v0.2.x 新增)

输入一句话,跨全库找出最像这句话的历史消息,按"说话人"聚合返回。回答的不是「在哪条消息里找到这个词」,而是「这句话最像 X、Y、Z 说过的话」。

实现思路:复用已有的 vec_messages 向量索引(不新建表):

  1. 一次性 embed 用户输入的 query
  2. 跨所有已建索引的 contact(按 msg_count 降序扫描,高频先扫体感更快)
  3. 按 contact 聚合命中点,每人最多保留 Top 5(避免一个高频联系人霸榜)
  4. 相似度 < 0.35 视为噪声丢弃;最多扫 800 个 contact 兜底

Query 参数支持:topK(默认 20)/ min_msgs(默认 50)/ days(默认 365)/ include_groups(默认仅私聊)/ include_self(默认排除"我")。

接口:GET /api/me/echo?q=...

13. AI 虚拟群聊(v0.2.x 新增)

挑任意 2-8 位联系人放进一个虚拟群聊——这些人现实里可能从没在同一个群说过话,但你想看看「如果他们认识,会聊什么?」

风格来源优先级:

  1. 已训练的分身画像clone_profiles.prompt)—— 最准
  2. 私聊样例兜底——未训练分身时从对方最近 30 条消息抽

支持:

  • 批量 N 轮:一次调用让 LLM 生成 2-15 句、自选发言顺序
  • TTS 气泡:单条消息可点气泡里的喇叭朗读,复用 Podcast 的 TTS 代理
  • 持久化会话:聊到一半关掉标签页不丢,下次打开继续
  • 导出分享图:带主题绿配色的虚拟群对话长图

接口:

  • POST /api/ai/virtual-group/chat(SSE 流式生成下一句或下 N 句)
  • GET/POST/DELETE /api/ai/virtual-group/sessions[/:id](会话 CRUD)

区别于群聊详情里的 AI 群聊模拟:那个基于真实群的真实成员现学现卖;这个用每个人的"分身画像",成员可以来自完全不同的群甚至从未在一起聊过。

14. 群语料 ROI 诊断(v0.2.x 新增)

针对每个群算"我看 / 我说"的性价比:

  • 我在这个群"看了多少字"(被动接收)
  • 我在这个群"说了多少字"(主动贡献)
  • 每天平均消耗多少分钟(按阅读速度估算)
  • ROI 评级:高产出(我说得多)/ 高消耗(我看得多)/ 平衡

帮你做"群整理"决定:哪些群在吸走时间却没给你舞台。

设计约束

  • 统一主题绿:所有 Lab 主按钮、Hero 卡片头都用 #07c160,不再有早期五彩渐变
  • 白底导出:分享图固定白底 + 中性灰 footer,不受 html.dark 主题影响(导出底层从 html-to-image 改为 html2canvas,绕开 Chrome 偶发空白图)
  • 错误友好:联系人不存在 / AI 未配置 / 流中断,都给明确提示(v0.2.x 起 5 个新 Lab 的 alert 全改成 toast)
  • 缓存策略:DNA / 断联 / 群聊 Wrapped 全局 10 分钟缓存;语言进化 / 聊天地图 2 小时缓存;其它 Lab 每次实时算

隐私

零 LLM 的 Lab(DNA / 关系星图 / 群金句榜 / 语言进化 / 聊天地图 / 断联 / 群聊 Wrapped / 群语料 ROI)完全本地处理;调 LLM 的 Lab(高光 / 灵魂提问 / 平行宇宙 / 人情债 / 虚拟群聊 / 反向搜索)仅把"必要的聊天片段"送入你自己配置的 LLM。不会上传到 WeLink 服务器(项目本身没有任何后端服务器)。

WeLink · AGPL-3.0 · 所有数据仅在本地处理,不上传任何服务器 · vdev