隐私怎么设计
人格跑在运行它的人自己的电脑上,聊天和记忆都存在本机。往外发的只有两样:聊天平台上它要说的话,模型服务商那里它要想的事。私聊里学到的东西只留在那段私聊里。
存在哪
聊天记录、记忆、关系、说话习惯,都存在数据目录里的本地数据库,每个人格一个库。没有 Aeria 自己的服务器,也不往任何地方上报使用情况。
会往外连的只有这些,每一样都是为了一件看得见的事:
- 聊天平台:Discord 或 QQ(QQ 经过本机的 NapCat),收消息、发消息;
- 模型服务商:你选的那一家,或者本机的 Ollama;
- 第一次用本地语义检索时,下载一次检索模型(官方源下不动就换镜像,下完按哈希核对);
- 检查更新、从插件市场装插件、有人让它放歌时找歌:做这件事的时候才连。
后台默认只在本机能打开,要登录。从别的电脑访问要自己改监听地址,并在前面加一层 HTTPS。
发给模型服务商的是什么
每次要想、要回话,模型拿到的是:人格设定、最近的聊天、这一轮想起来的记忆、对说话的人的印象,以及程序核验过的此刻(几点、作息、身体状态)。只发这一轮要用的,不发整个库。
服务商怎么处理这些数据,看各家自己的条款。不想让聊天离开这台电脑,就用本机的 Ollama。
私聊和群聊分开
每个服务器、每个群学到的东西各归各的,一个服务器里的事不会在另一个服务器里说出来。同一处跑着几个人格时,默认各记各的;可以设成一个人格借用另一个对某人的客观资料(叫什么、多大),关系和感情永远各算各的。
每段私聊有自己的记忆空间:私聊里学到的事、摘要、说话方式、对这个人的印象,只在这段私聊里用。群里公开的印象可以带进私聊(公开的事私下知道不算泄露),反过来不行。
运行的人在后台把 QQ 和 Discord 上的两个号认成同一个人以后,这个人在两边的私聊算同一段:记忆、关系、聊天记录都是一份,人格在哪个平台都认得他(2.25)。
有些事不记
这些内容一律不存成记忆:密码、验证码、私钥和助记词、各家的密钥和令牌、身份证和护照号、银行卡号、手机号、邮箱、详细住址、收入和债务、政治倾向、宗教、性取向。说了也只在当下的聊天里,不会被记下来、以后想起。
病史、诊断、用药这类身体上的事:群里一律不记;私聊里可以记,只在这段私聊里用。
日志先打码再写:密钥、令牌、带标签的口令、邮箱、用户目录都换掉。备份不含密钥;诊断包不含聊天、记忆和任何密钥,生成在本机,不自动上传。
密钥放在哪
- 桌面版:模型的 API key、Discord 的 bot token、后台的密码,放在系统钥匙串里(macOS 钥匙串、Windows 凭据管理器、Linux Secret Service)。界面只能存、删、问有没有,拿不到原值。
- 从源码跑:放在项目目录的环境变量文件里,不进 git;后台的密码第一次启动时随机生成,存在数据目录里,只有你能读(3.1)。
对应的代码
- 私聊的记忆空间:
src/aeria/private_chats.py的memory_space、learning_scope。 - 跨平台认成同一个人:
src/aeria/platform_bridge.py。 - 不记哪些:
src/aeria/memory_filter.py的assess_memory(私聊用include_health=False的那一版)。 - 检索模型的下载和核对:
src/aeria/onnx_embeddings.py(默认模型每个文件钉了 SHA-256,对不上不用)。 - 日志打码:
src/aeria_identity/log_redaction.py;后台监听地址:主配置的webui_host(默认127.0.0.1);从源码跑时密钥在.env,后台密码在data/webui.token。 - 测试:
tests/test_private_chats.py的「私聊学到的只在这个私聊里取得到,别的私聊和群都取不到」「私聊的空间和真服务器永远不撞」;tests/test_cross_persona_isolation.py的test_relationship_learning_does_not_cross_personas;tests/test_memory_filter.py。
没做到的
- 「不记哪些」是按词和格式认的,换个说法、用中文以外的语言说,可能认不出来。
- 存在本机的库没有加密:能登录这台电脑这个账户的人和程序都读得到。
- 发给模型服务商之前不做脱敏:聊天里说了什么,这一轮就把什么发过去。