跨联系人 AI 问答
不限于单个联系人——直接问关于所有聊天记录的问题,AI 自动搜索并汇总回答。
功能入口
在 AI 首页,点击顶部的 「跨联系人问答」 按钮切换模式。
使用示例
| 问题 | AI 做了什么 |
|---|---|
| 谁跟我聊过旅行? | 搜索所有联系人含"旅行"的消息,按匹配数排列 |
| 去年国庆我都跟谁聊天了? | 查询 10/1-10/7 的日历数据,列出每天的聊天对象 |
| 哪些朋友经常提到加班? | 搜索"加班"关键词,汇总每人出现频次 |
| 最近一个月谁给我发了红包? | 搜索"红包"相关消息 |
| 有没有人跟我聊过买房? | 搜索"买房"关键词 |
技术原理:LLM Agent 模式
传统做法是把所有消息塞给 LLM,但百万级消息会消耗上亿 token,完全不可行。
WeLink 采用 Agent 模式——LLM 不直接读消息,而是决定调用什么工具来收集数据:
用户提问
↓
Step 1: LLM 解析意图(~500 token)
→ 提取关键词、时间范围、搜索类型
→ 输出 JSON:{ type, keywords, date_from, date_to }
↓
Step 2: 自动执行搜索/查询(0 token)
→ 关键词问题 → 调用全局搜索 API
→ 时间问题 → 调用日历 API 逐天查询
→ 混合问题 → 两者都调用
↓
Step 3: LLM 汇总回答(~3000 token)
→ 把搜索结果组织成上下文
→ LLM 基于真实数据生成自然语言回答意图解析(Step 1)
第一步使用 LLM 将自然语言问题解析为结构化 JSON:
json
{
"type": "search",
"keywords": ["旅行"],
"date_from": null,
"date_to": null,
"search_type": "contact",
"summary": "用户想知道谁聊过旅行"
}支持的意图类型:
| type | 触发条件 | 调用的 API |
|---|---|---|
search | 问题含具体关键词 | GET /api/search?q=关键词 |
calendar | 问题含时间范围 | GET /api/calendar/day?date=日期 |
both | 同时含关键词和时间 | 两个 API 都调用 |
数据收集(Step 2)
搜索模式:调用已有的全局搜索 API,返回每个联系人/群聊的匹配消息(每个最多 5 条)。取前 10 个匹配度最高的联系人,每人取 3 条消息样本。
日历模式:逐天查询日历 API,获取每天的活跃联系人列表和消息数。最多查询 14 天。
两种模式的数据收集都在后端完成,不消耗 LLM token。
汇总回答(Step 3)
将收集到的数据组织成紧凑的文本上下文,连同用户原始问题一起发给 LLM:
【搜索「旅行」结果:3 个联系人匹配】
[联系人] Saka(5 条匹配):
[2025-03-15 14:23] Saka:下周准备去日本旅行
[2025-06-01 09:12] 我:你那次旅行怎么样
...
[联系人] Ødegaard(2 条匹配):
[2024-12-20 20:30] Ødegaard:云南旅行攻略分享给你
...LLM 基于这些真实搜索结果生成自然语言回答,不会编造不存在的数据。
Token 消耗
| 步骤 | 消耗 |
|---|---|
| 意图解析 | ~500 token |
| 数据收集 | 0 token(后端 API) |
| 汇总回答 | ~3000 token |
| 总计 | ~4000 token |
相比全量分析(可能需要几十万 token),Agent 模式降低了 99% 的 token 消耗。
局限性
- 关键词搜索依赖精确匹配,语义相似但用词不同的消息可能搜不到
- 日历查询最多覆盖 14 天,超长时间范围会被截断
- LLM 意图解析偶尔会提取不准确的关键词,可以换一种问法重试
- 搜索结果每个联系人最多返回 5 条,不一定覆盖所有相关消息
隐私说明
- 搜索和日历查询完全在本地后端执行,不经过 LLM
- 只有搜索结果的摘要(关键消息片段)会发送给 LLM
- 隐私模式下联系人姓名会被替换为
***