本地优先的 AI 通讯录助手:把大模型请进地址簿,数据却不离家

作者:

🇬🇧 English

本地优先的 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):

  1. 关系定位:把对方归到哪种关系语境(老同事、久未联系的朋友、商务对接方……)。
  2. 沟通分寸:这次沟通该用什么语气、注意什么边界。
  3. 破冰示例:一句可直接参考的开场白。

只看你提供的少量信号:联系人姓名、归属地、你填的关系/称呼偏好,以及"关于我"的设定。它不读、也不猜对方的具体身份或往事。"关于我"里的性别设定会用来调整沟通分寸;若选择"不愿透露",则退化为中性建议。结果按联系人 ID 存本机,可覆盖。

第五章 本地备注 + 自然语言查找

📝 本地备注src/utils/contactNotes.ts):每个联系人一条私有笔记,仅存本机,不进任何模型、不上传。

🔍 自然语言查找src/utils/contactSearch.ts):不想翻列表时,直接用大白话查——比如"备注里写过老乡、同在一家公司待过的"。模型把这句话理解成筛选意图,在姓名 / 归属地 / 备注范围内匹配,返回符合条件的联系人 ID。同样的,它只基于这些非敏感字段做检索,不会触碰号码等私密信息。

第六章 导出与隐私边界

应用支持两种导出:

  • CSVsrc/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 兼容)

相关链接

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

首页 简历 关于 隐私政策 商店 Web Chat Nsbp.js

© 2026 Erishen
沪ICP备2024079226号-1   沪公网安备31010502007082号