我电脑里躺着 48G 微信记录、237 篇日记,这是我手里最值钱的材料,也是我一个字都不敢往云端发的材料。

这篇讲我怎么用一台 MacBook 把它们盘活,用的是蚂蚁百灵 8 月开源的 Ling-3.0-tiny。

一、先说为什么非本地不可

过去一年我的办法很笨。想让 Claude 从日记里帮我找行为模式,我就手动挑几段,把公司名和内部系统名一个个删掉,再贴过去。删到第五篇就不想干了。

后来我数了一下,237 篇日记里,20 篇出现过公司名,10 篇出现过内部系统代号,13 篇写了绩效相关的事。微信那边 48G,两个号。手工删是删不完的。

于是想到让模型帮我删。这里有个死结。脱敏这个动作本身,就需要一个能读原文的模型。你没法先脱敏再上云,因为脱敏就得先读。

这就是本地模型不可替代的位置。它不跟 Claude 抢活,它干的是 Claude 根本没资格碰的那部分。

你手里只要有下面这三样之一,就该配一个。

  • 数据出不去。传了就违规,或者失去控制,跟你想不想传没关系
  • 量大到按 token 计费你会犹豫。一次跑全量,不是挑一篇试试
  • 要反复重跑。提示词得调十几版,或者它每天无人值守自己跑

三样占全了,云端 API 就出局了。它连原文都读不到,便宜也没用。

二、为什么挑 Ling-3.0-tiny,为什么在 Mac 上

这段时间聊本地部署的文章不少,多数跑在 DGX Spark 上。那是一台一百多克拉的小盒子,公司买来当福利机还行,个人掏钱的不多。

我想知道的是另一个问题。手里只有一台 MacBook 的人怎么办。

官方 model card 里写了,Ling-3.0-tiny 在 NVIDIA DGX Spark、Apple Silicon MacBook 和 Mac mini 上都做过验证,FP8 在 M4 Pro 上大约 86 到 90 tokens/s,8K 上下文峰值内存约 8.34 GiB。

但我去翻官方的 ling-cookbook 仓库,guide/local-deploy/ 底下 8 份部署指引,文件名全部以 dgx-spark- 开头,Mac 一份没有。

所以这篇顺手把 Mac 这条路补上。

它是个什么模型

关键在总参数 7.9B、每 token 只激活 1.3B 这一行。稠密模型每生成一个 token 要把全部权重扫一遍,稀疏 MoE 只叫醒其中一小撮专家干活,剩下的躺着不动。

这个区别在 Mac 上格外要紧,因为 Apple Silicon 是统一内存,容量够但带宽比独显低。权重得整个驻留在内存里,可每一步真正要读的只有一小部分。落到体感就是,它占着 7.9B 的内存,跑出接近 1.3B 的速度。

三档权重在 24G Mac 上怎么选

  • BF16,最全,但 7.9B 的 BF16 大约 16GB,24G 机器上跑起来会挤,不建议
  • FP8,我选的这档,常驻 8.7GB,速度和质量的平衡点
  • INT4,最省,4GB 出头,机器内存小于 16G 或者想同时开一堆别的应用时选它

三、在 M4 Pro 上从零跑通

1
modelscope download --model inclusionAI/Ling-3.0-tiny-fp8 --local_dir ./ling-tiny-fp8

我这台是 M4 Pro / 24GB。整个流程和三个会卡住人的坑。

第一步,拿权重。

别从 Hugging Face 下。我实测 HF 直连和 hf-mirror 都只有 0.3 到 0.5 MB/s,8GB 要下七个小时。换魔搭 ModelScope,36 MB/s,四分钟下完。

第二步,选推理后端。

FP8 在 macOS 上目前只能走 ollama 的 MLX 后端。这个支持还在 PR 里(ollama/ollama#17643,分支 bailing-moe-v3),没进主线,得自己拉下来编。

意味着你以后升级 ollama 不会自动带上这个支持,得重新编一次。

第三步,装 Metal 工具链。

这一步卡了我最久。MLX 后端要完整的 Xcode,不是 Command Line Tools。装完还要跑两条。

1
2
xcodebuild -runFirstLaunch
xcodebuild -downloadComponent MetalToolchain

许可协议要 sudo,得在有终端的地方自己敲,后台脚本跑不了。

第四步,跟系统里原有的 ollama 隔离。

我机器上本来就有 brew 装的 ollama 在 11434 跑别的模型。直接混用会打架。我给 Ling 单开了一套。

1
2
export OLLAMA_HOST="127.0.0.1:11435"
export OLLAMA_MODELS="$HOME/.ollama-ling"

模型目录也独立,两套互不干扰,OpenAI 兼容端点就是 http://127.0.0.1:11435/v1。

第五步,跑起来之后先关思考。

Ling-3.0-tiny 支持混合推理,可以按请求开关思考模式。默认是开的。

我一开始踩了个坑,/v1 端点默认开思考链,max_tokens 给小了会直接返回空的 content,看着像模型坏了。

官方 model card 上写的开关是 enable_thinking,但走 ollama 的 /v1 端点时这个参数不生效,得用 reasoning_effort: “none” 才关得掉。

开不开思考差多少,我拿同一道判断题测过。题目是从一段日记里挑出能定位到具体公司或具体人的信息。关思考 3.2 秒给答案,开思考 11.4 秒,中间多了 1843 字推理链。

两边的结论也不一样。关思考那次报了 6 条,把「12 层会议室」「下午两点」「Q3 的模型上线节奏」都算了进去。开思考只留下「老王」和「A 部门」两条,还专门说了一句,日记里没有能定位到具体公司的信息。

批量跑数据的活我一律关,要它帮我做判断的时候才开。

还有一个坑记一下。 编译产物的 MLX 动态库放在 build/lib/ollama/,但二进制只搜 /lib/ollama,直接跑会报 MLX not available。补个软链就好。

1
ln -sfn ~/code/ollama-ling/build/lib/ollama ~/code/ollama-ling/lib/ollama

跑起来之后的实际数字。模型本体常驻 8.7GB,算上 KV cache 实际占用显存 10.3GB,24G 的机器还剩一半多,100% 跑在 GPU 上,功耗 18W。

生成速度跟输入长度有关。短问题 ling bench 能跑到 99.9 tokens/s,喂进去 6000 tokens 的长上下文之后掉到 78。官方给的 M4 Pro 数据是 86 到 90,落在这个区间里。

8K 上下文是这个数,把上下文拉到 32K,内存涨到 11GB。

它能一直挂在后台,我该干嘛干嘛。

四、本地模型和 Claude 怎么分工

跑通只是第一步。接下来要定的是哪些活交给它。

我跑了四个场景之后,分工是这样的。

分界线是抽取和判断。

脱敏内部的分工也是撞出来的。我一开始拿敏感词表做替换,日记上跑得很漂亮,换到微信记录就废了。两个字符的昵称会把 https 打成 h[人8]ps,而「某某哥」这类叫法因为联系人库里存的是全名,子串方向反了又匹配不上。

现在是这么切的。

  • 邮箱、网址、手机号、长数字串,形状固定,交给正则
  • 人名、花名、「某某老师」这种叫法,是开放集合,交给 Ling 做命名实体识别
  • 词表法哪边都不该用

五、四个场景的实测成绩

日记脱敏。 12 篇含敏感词的真实日记,公司名和内部系统代号泄漏 0 篇。输入 36877 tokens 压到出闸 828 tokens,44 比 1,平均 15.9 秒一篇。一篇原文里带着内部系统代号的日记,出闸之后长这样。

1
2
3
行为:完成 6 个任务(5 个生活 Move,1 个工作 Move),投入 75 分钟专注时间
投入:75 分钟(3 个番茄,3 段)
情绪/判断:感到烦躁、焦虑,对工作未定事项感到不确定

代号没了,行为模式全在。最后交给 Claude 的只有原文的 2.2%。

微信闸门。 扫 30 天、47 个对话块,19 秒跑完,输入 18710 tokens。出闸文本里邮箱 0 处、网址 0 处、手机号 0 处,7 个已知真名全部清除。唯一残留是三个点,因为有人拿省略号当微信昵称。

命名实体识别。 8 段测试文本,6 个真名全部识别,0 漏检,0 误报,4.4 秒。刚才词表匹配不到的那几种叫法,它一个没落,因为它认的是语义不是字符串。

长文压缩。 一篇 35702 字的播客转写稿压到 4830 字,7.4 比 1,76 秒。说话人是谁、具体数字、双方的分歧点都还在。

去重。 18 对标题判断是不是同一条新闻,对 16 对。把不同内容误判成重复的次数是 0,错的两次都是漏掉了重复。这个方向的错误无害,宁可内容重一次,也不能误杀。

六、它该干什么,不该干什么

这台模型每 token 只激活 1.3B 参数,好处是快和省,代价是语义直觉薄。用对地方它很能打,用错地方会翻车。

我拿它给每天的新闻做初筛试过一次。46 条候选,提示词写成打 0 到 10 分的时候放行 38 条,改成 Y 或 N 二分类之后只放行 2 条。同一个模型、同一批内容,光换个输出格式,放行率从 83% 掉到 4%。

所以估值这类活我不交给它。「这条内容对我有没有价值」牵扯到我自己的偏好和取舍,那是云端强模型该干的。

反过来看它擅长的四件事,去重误判 0、NER 零漏检零误报、压缩不丢信息、脱敏零红线泄漏,全都是有明确对错的抽取任务。

一句话记法。抽取交给它,判断留给云端。 分清这条线,它是个特别称手的工具。

七、现在的状态

三条管道在跑,脱敏、压缩、去重。判断全部留给云端。原文一个字不出本机。

下一步我打算把日记那道闸门接到 Stop Hook 上,每天写完自动跑一遍,攒一份可以放心带出门的行为档案。跑通了再回来汇报~

相关资源