本地AI模型并非天然私密
你安装了 Ollama。你拉取了一个模型。它回答了你的提示词,连 Wi-Fi 图标都没动一下,于是你认定问题解决了:没有云端、没有泄露、没有厂商偷看你的提示词。
这个结论只对了一半。
本地推理意味着模型的计算在你的机器上进行。它并不意味着整个应用是离线的。也不意味着你输入的任何内容都不会到达互联网。这是三个完全独立的声明,而大多数"本地 AI"营销会悄悄把它们合并成一个。
这篇文章不是关于监控的警告。它是一份工程检查清单。读完它,你会得到可以实际运行的命令,而不只是担忧的理由。
1、困惑从何而来
本地模型运行时是一个运行在你机器上的原生进程、容器或后台服务。这部分确实是离线的。权重保存在磁盘上。前向传播发生在你的 CPU 或 GPU 上。生成一个 token 不需要任何 API 调用。
但几乎没有人会只使用一个裸的模型运行时。他们会把它包装在桌面应用、Web UI、一组工具或一个智能体框架中。这些层中的每一层都可能独立于模型,自行决定如何使用网络。
架构通常看起来不像一条笔直的管线,而更像一个枢纽:
虚线是潜在路径,不是已确认的泄露。它们是否活跃完全取决于你安装的具体应用以及你如何配置它。这才是重点:你必须自己去检查,因为"本地"这两个字对图中另外四个盒子什么也说明不了。
2、数据离开你机器的八条路径
2.1 UI 遥测
在假设之前先检查,因为不同工具有不同情况。Ollama 默认不收集遥测数据,也不向任何地方发送提示词数据。LM Studio 会:匿名的会话计数、模型名称和性能指标,默认开启,可以在"设置 → 隐私 → 发送匿名使用数据"下关闭。这两个事实都不是猜测,也都不是普遍适用的。如果你用的是别的本地客户端,去找它自己的开关,而不要假设它和这两者中任何一个行为相同。
2.2 远程工具和 MCP 服务器
工具调用的工作原理是这样的:模型本身不执行任何操作,它只是发出一个结构化的 JSON 对象,指定函数名及其参数,真正发起调用的是你的编排器。所以,如果你的设置中包含网络搜索、数据库连接器,或用于天气、票务的 MCP 服务器,那么那个由你的对话上下文构建的 JSON 载荷,会通过网络发送到支撑该工具的任何后端。模型可以完全是本地的,而编排器却把你的查询直接送到第三方 API。这是人们最常忘记的泄露路径,因为模型本身从未离开过本地。在假设一切流量都走 localhost 之前,请检查你客户端的工具或 MCP 配置中的端点 URL。
2.3 云端回退
这不再是假设了。从 0.12 版本开始,Ollama 提供云模型,例如 gpt-oss:120b-cloud 或 qwen3-coder:480b-cloud,用你本地使用的同一条 ollama run 命令即可运行。它们需要登录 ollama.com,一旦登录,模型就在 Ollama 的基础设施上执行,而不是在你的 GPU 上。命令行体验两种情况下完全相同。唯一可见的区别是模型标签上的 -cloud 后缀。
如果你想测试一个你的笔记本装不下的 480B 模型,这确实是个好功能。但它也恰恰是"我在运行 Ollama"这句话悄悄不再等于你以为的那个意思的地方。在相信某次会话是本地的之前,先运行 ollama list 检查每一个标签。
2.4 嵌入与重排序
聊天可以完全在本地进行,而文档嵌入或重排序仍然会调用外部服务。RAG 设置中很常见的是本地聊天模型搭配托管的嵌入 API,因为嵌入这一步外包很便宜,而且容易被遗忘。如果你会上传文档,这是第一个要检查的地方。
2.5 对话历史
这里没有任何内容离开你的机器,但它仍然是一个隐私问题,也是我会让你亲自核实、而不是相信任何你读到的东西(包括这篇文章)的唯一一处。某个工具是把历史持久化到磁盘、只保存在内存中,还是以未加密方式写入,因应用和版本而异。我在研究这篇文章时,发现关于 Ollama 自身默认行为的有直接矛盾的声明。
不要听信任何人的说法。发送一条提示词,关闭应用,然后亲自到它的应用数据文件夹里看看。
2.6 日志与崩溃报告
调试日志通常在设计上就非常详细,而详细通常意味着它包含的正是你想保密的内容:完整的提示词、原始的 API 响应、文件路径,有时还有所连接工具的 API 密钥。日志轮转设置决定了这些东西会留存多久。
2.7 浏览器扩展与 Web 界面
一个"本地"的 Web UI 仍然运行在浏览器里。那个浏览器有扩展、缓存的脚本,以及从 CDN 加载的第三方资源。这里有一个值得了解的具体机制:Ollama 的 API 默认拒绝跨域请求,只允许固定的白名单(localhost、127.0.0.1、0.0.0.0 以及少数应用 scheme),由 OLLAMA_ORIGINS 环境变量控制。一个基于浏览器的工具要从不同的源访问你的本地 Ollama 实例,只有在该源被加入白名单后才能工作,而这意味着有人放宽了限制。在假设你的设置默认是封闭的之前,先检查 OLLAMA_ORIGINS 里有什么。一个注重隐私的本地模型,并不能覆盖它所依托的那个浏览器标签页或 CORS 策略的隐私姿态。
2.8 模型与软件更新
即使某次会话没有向任何地方发送提示词数据,更新检查和模型下载仍然会暴露你的 IP 地址、你的应用版本,以及你正在运行哪些模型。这是元数据,不是内容,但它仍然是一个按你未设定的计划表离开机器的信号。
3、一个真实的隐私测试,而不是靠信仰接受的清单
在应用运行时检查你的网络连接,比任何隐私政策都能在三十秒内告诉你更多信息。
在 macOS 上:
lsof -i -n -P
按特定应用过滤:
lsof -i -n -P | grep -i ollama
在 Windows 上,PowerShell 的等价命令是:
Get-NetTCPConnection | Where-Object { $_.OwningProcess -eq (Get-Process ollama).Id }
在发送提示词之前运行其中任意一个命令,然后在响应过程中再运行一次,并对两次结果做对比。只在生成期间出现的新连接值得逐个调查,而且与通用数据包捕获不同,这个命令会告诉你每个套接字属于哪个进程,在大多数系统上都不需要 root 或管理员权限。
还有两条命令值得直接针对 Ollama 自己的 API 运行,因为它们会告诉你 Ollama 认为正在发生什么,与网络实际显示的情况无关:
curl http://localhost:11434/api/tags
ollama ps
第一条列出 Ollama 知道的每一个模型,云模型和本地模型都在内,因为云模型会以名称带 -cloud 后缀的形式出现在同一个列表里。第二条显示当前加载到内存中的内容。这两条命令除了你自己的回环接口外,都不会触碰网络,而且都比翻设置菜单更快。
如果你想确认 API 服务器除了你自己的机器之外无法被访问,可以检查绑定地址:
curl -v http://127.0.0.1:11434 2>&1 | grep Connected
有响应就确认服务器只监听回环接口,这是默认情况。如果你或某个应用设置了 OLLAMA_HOST=0.0.0.0,那么同一个端口对你网络上的任何设备都可达,而不只是你的笔记本,堆栈中任何地方的隐私设置都无法改变这一点。
更有说服力的测试是一次完整的离线运行:
- 趁还有网络时下载你想测试的模型。
- 关闭 Wi-Fi 并拔掉以太网线。
- 从干净状态重启应用。
- 开启一个新会话。
- 分别测试纯聊天、文档上传、网络搜索和任何已连接的工具,一次一个。
- 记下哪些功能失效、哪些仍然可用。
离线时仍能持续回复的聊天,证明了模型在本地运行。但这对其它七条路径什么都证明不了。文档上传可能因为嵌入需要网络调用而失败。某个工具可能返回一个静默错误。这些失败就是你手里的答案密钥。
4、"本地"到底承诺了什么
"在本地运行"是关于推理发生位置的声明。"隐私"是关于整个系统行为的声明,包括那些没有人写进落地页的部分。
在把任何敏感内容托付给本地 AI 设置之前,请查看四件事:它连接什么、它记录什么、历史存储在何处、以及本地模型不可用时会发生什么。隐私不是你 ~/.ollama 文件夹里那个模型文件本身的属性。它是完整数据路径的属性,从你输入的那一刻,到任何你无意发送的内容都确实没有离开机器的那一刻。
如果你想要这个测试最尖锐的版本,不要在任何一点上听信我的话。打开终端,在你自己的设置上运行本地测试,看看当你切断网络后到底会发生什么。
原文链接:Local Models aren't Automatically Private: 8 Ways Your Data Can Still Leave Your Laptop
汇智网翻译整理,转载请标明出处