本地优先的 AI 通讯录助手:把大模型请进地址簿,数据却不离家
第一章 痛点:通讯录里最缺的不是存储,是"上下文"
每个人的手机里都有一份通讯录:几百个名字、号码、归属地。它能帮你拨号、发短信,却帮不了你一件更日常的事——知道该怎么跟某个人开口。
- 久未联系的老同事,过节该用什么样的语气?
- 一个只存了名字的客户,邀约时该怎么称呼才不尴尬?
- 脑子里闪过"那个好久没联系、但一直想约出来聚聚的老朋友",却想不起 TA 叫什么?
这些信息散落在记忆、备注和对话里,通讯录本身并不承载。于是我做了一个本地优先(local-first)的小工具:在设备内读取通讯录,叠加一层注重隐私的 AI 辅助——帮你起草消息、理解关系分寸、记私有备注、用大白话查人。关键约束从第一天就定了:通讯录是高度敏感数据,它绝不能离开本机。
第二章 架构:本地优先到底意味着什么
"本地优先"不是一句口号,它落实在三处具体设计上。
1. 数据不出设备
通讯录通过 expo-contacts 在本机读取,所有联系人信息只存在于运行时内存与本地存储,不上传任何服务器。
2. 给模型的上下文最小化
AI 能力调用一个 OpenAI 兼容的大模型接口,但只发送完成当前任务所必需的最少信息——通常是「联系人名字 + 手机号归属地(城市名)+ 你的意图/场景」。提示词里不包含手机号、邮箱等可直接定位个人的字段,也不发送整份通讯录。模型返回的是建议文本,而非对联系人身份的任何推断或存储。
3. 密钥进系统安全存储
大模型 API Key 不写进 JS bundle、不落在明文字段,而是存进系统的安全存储(Keychain / Keystore 等价机制),仅在调用时由原生层取出。即便有人反编译安装包,也拿不到可用密钥。
本地状态(备注、画像、草稿)用 AsyncStorage 持久化,按联系人 ID 隔离,跨会话保留、可随时清除。
第三章 AI 起草:让开头不再卡壳
「✍️ AI 起草」是一个与任何私人数据解耦的通用消息起草器(见 src/utils/contactComposer.ts)。它的提示词工程有几个刻意的设计:
- 只用名字,不直呼全名:对"张伟"这类联系人,指令模型优先用名字或去掉姓的称呼("伟"),避免生硬地叫全名;辈分不确定时用中性称呼,不默认"哥/姐"。
- 场景化语气:内置「寒暄 / 邀约 / 问候 / 致歉 / 商务」等意图标签,不同场景给不同口吻示例。
- 落款用"关于我":在设置页定义"希望对方怎么称呼我"(如"老王")与性别后,模型在需要自称或文末署名时优先用这个设定,而不是凭空编造。
一个真实感的例子:意图=邀约、场景=朋友、关于我自称"老王",模型可能给出——
伟,最近咋样?下周末有空的话一起搓顿饭?——老王
草稿按联系人 ID 存本机,可编辑、重新生成、复制、清除。
第四章 AI 画像:怎么跟这个人打交道
「💡 AI 画像」生成三段建议(见 src/utils/contactInsight.ts):
- 关系定位:把对方归到哪种关系语境(老同事、久未联系的朋友、商务对接方……)。
- 沟通分寸:这次沟通该用什么语气、注意什么边界。
- 破冰示例:一句可直接参考的开场白。
它只看你提供的少量信号:联系人姓名、归属地、你填的关系/称呼偏好,以及"关于我"的设定。它不读、也不猜对方的具体身份或往事。"关于我"里的性别设定会用来调整沟通分寸;若选择"不愿透露",则退化为中性建议。结果按联系人 ID 存本机,可覆盖。
第五章 本地备注 + 自然语言查找
📝 本地备注(src/utils/contactNotes.ts):每个联系人一条私有笔记,仅存本机,不进任何模型、不上传。
🔍 自然语言查找(src/utils/contactSearch.ts):不想翻列表时,直接用大白话查——比如"备注里写过老乡、同在一家公司待过的"。模型把这句话理解成筛选意图,在姓名 / 归属地 / 备注范围内匹配,返回符合条件的联系人 ID。同样的,它只基于这些非敏感字段做检索,不会触碰号码等私密信息。
第六章 导出与隐私边界
应用支持两种导出:
- CSV(
src/utils/exportCsv.ts):姓名、手机号、归属地、邮箱、备注——标准的通讯录字段。 - Markdown 档案(
src/utils/exportProfile.ts):在 CSV 基础上附加每人的 AI 画像与草稿,生成一份可读的个人关系档案,可通过系统分享面板导出。
导出的字段只包含你主动填写或应用生成的内容(姓名/手机/邮箱/备注/画像/草稿),不含任何模型内部状态或外部衍生数据。
隐私边界收个尾:所有联系人数据始终留在设备端;AI 功能只发送完成当前任务所需的最少上下文;API 密钥存于系统安全存储。这正是"本地优先"承诺的三道保险。
源码导航
App.tsx– Tab 导航架构,Contacts / Chat / Settings 三大模块的入口src/screens/ContactsScreen.tsx– 本地通讯录读取与列表主页面src/screens/SettingsScreen.tsx– 服务商预设、API Key 安全存储、关于我src/utils/contactComposer.ts– AI 消息起草器(提示词工程:名字称呼 / 场景语气 / 落款)src/utils/contactInsight.ts– AI 画像(关系定位 / 沟通分寸 / 破冰示例)src/utils/contactNotes.ts– 本地备注的读写src/utils/contactSearch.ts– 自然语言查找的意图理解src/utils/exportCsv.ts/src/utils/exportProfile.ts– CSV 与 Markdown 档案导出src/config/providers.ts– LLM 服务商预设配置(OpenAI 兼容)
发表回复