肇鑫的日常博客

肇鑫 / Owen Zhao

独立开发者,主要开发 iOS、watchOS、macOS 应用。

目前在维护 SleepTapRooster Time,以及 Markdown Writer 相关工具。

最新文章

你和AI之间存在利益冲突

技术

大模型,以下简称AI。目前在辅助编程方面十分流行。不过在我使用过多个不同的类似工具,包括并不限于Github Copilot,AlexSideBar,通义灵码等,之后。我发现了一个有趣的现象。

在解释这个有趣的现象之前。我想先向某些不熟悉AI编程的读者简单介绍一下AI编程的大致过程。

  1. 开发者使用编辑器将开发的项目打开。
  2. 选择用来询问、作答的AI模型。
  3. 提出具体的问题,同时还要划定范围,比如说是单独的某个文件,又或者某几个文件,又或者全部文件。(有些比较智能的客户端会主动扩大范围,这个暂不讨论)
  4. 等待AI分析、作答。
  5. 开发者对比AI的代码和原始代码,评估是否解决了提出的问题。如果解决,就可以跑一下测试看看。如果没解决,那就针对不足的地方重新提问。
  6. 以此反复。

分析

经常有人说某某AI编程工具特别牛,就是token用得太狠了。充上100美元,一天就用光了。那么,如果我们想减少token的用量,我们一起看看上面的6个步骤有哪些可以进行优化,以减少用量。

首先排除1和4、5和6。要想减少token的用量。主要看2选择的模型,和3提出的具体的问题,以及划定的范围。

但是2这个可以选择的范围不大。因为每个人都有各自的偏好。有的人觉得Claude Opus最牛,有的人觉得Gemini Pro最强,当然也有人更偏好OpenAI O3的。所以,这个主要是个人便好,而不是token消耗。

因此主要的问题就在与步骤3。抛开你和AI对话的那几段文字。划定的范围是最重要的,选择单一文件或几个文件,相比于直接扔整个项目给AI,让它自己选,消耗的token数量肯定不是一个数量级别的。

那么我们要如何优化步骤3呢?首先,我们发现每次发送文件给AI时,AI都是当作是全新的在解析,也就每次都要消耗新的token。理论上,如果我们可以每次把内容分成不变的和已经变化的发给AI,然后让AI处理变化的部分,就可以节省大量的token。而且,由于我们大部分时间都是接受了AI给出的方案。那么AI实际上并不需要重新理解当前的代码。如果它确定用户接受了它的方案,它只需要将它上次输出的结果的token直接拿过来作为输入就可以了。

如果厂家可以做到我上面提出的这个优化,那么我们理论上最高可以节省接近一半的token。但是厂家应该没有动力去做这个优化。因为在这个问题上,厂家、AI、开发者的利益是不一致的。

  • 对于AI来说,直接使用结果的token来作为输入的一部分是有益的,因为提高了效率。
  • 对于开发者来说,更是有益的,因为可以省钱。
  • 但是对于厂家来说,用户省下的钱,就是他少赚的钱。因此,虽然厂家一再强调AI的普及需要大量的电,但是他们却没有动力去主动帮用户节省。他们只会在内部帮自己节省。

结论

很有意思吧。在提高效率,节省token这方面。厂家和AI、开发者的利益是不一致的。这极大地阻碍了AI的更快发展。AI崛起吧!先干掉厂家!

Safari登录时非常卡顿问题的解决

技术

一直用通行密钥登录。可是最近突然用不了了,会界面一直卡住,只能通过密码的方式来登录。

我尝试了常规的办法,比如清空Safari的数据。没有作用,然后我又尝试打开密码应用,删除掉一些过期的密码。还是没有作用。

我注意到spindump在这期间CPU占用会达到100%,我问了AI,AI说这个是Spotlight的工作进程,只要不一致100%,能自动恢复正常就没问题。于是我就放弃了这个线索。

这么将就用了两天,今天在浏览X的时候,看到有人提到自己为了追一个bug,把系统日志喂给AI,让AI逐一排查。我一想,这是个好主意啊。于是我又开始研究这个问题。

正式研究

我先打开控制台应用,然后点击开始。我一开始过滤的是Safari的日志,但是把错误和故障的日志发给AI后,AI的答案没啥用。

于是我又把日志范围扩大到我操作期间的所有系统日志,结果发现了一个这样的故障。

AuthenticationServicesAgent	
Failed to acquire lock for -[ASCAgent cancelCurrentRequest]_block_invoke

但是AI对于这个问题也没啥好办法。

于是我取消了日志所有的过滤器。结果看到满屏的Spotlight的日志。于是我禁用了SpotLight的索引。然后再试,结果还卡。重启,不卡了。

结论

用户在登录时,会先调用密码应用查询用户名,然后通过密码或者通行密钥登录。在这个过程中,会卡顿几次:

  1. 查询用户名时卡一次。
  2. 选择用户名时卡一次。
  3. 选择通行密钥登录时一直卡。

也就是说,1和2时遇到了缓慢的问题,而3遇到了没有查询结果的问题。

而每次遇到这种情况,macOS的处理方式,就是使用Spotlight重新对于相关内容(密码应用的数据)进行索引。这进一步造成了卡顿。

建议的解决步骤

router

禁用Spotlight的方法

将系统和用户自身文件夹所在的磁盘分区,加入到Spotlight的搜索隐私。恢复则移除即可。

brew应用无法卸载问题的解决

技术

问题

zhaoxin@Mac-mini ~ % brew remove inkscape --cask
==> Uninstalling Cask inkscape
==> Purging files for version 1.4.028868 of Cask inkscape
zhaoxin@Mac-mini ~ % brew info inkscape
==> inkscape: 1.4.230579
https://inkscape.org/
Installed
/opt/homebrew/Caskroom/inkscape/1.4.028868.upgrading (64B)
From: https://github.com/Homebrew/homebrew-cask/blob/HEAD/Casks/i/inkscape.rb
==> Name
Inkscape
==> Description
Vector graphics editor
==> Artifacts
Inkscape.app (App)
/opt/homebrew/Caskroom/inkscape/1.4.230579/inkscape.wrapper.sh -> inkscape (Binary)
==> Analytics
install: 3,464 (30 days), 9,907 (90 days), 32,521 (365 days)

解决办法

Here’s how you can fully remove Inkscape:

  1. Uninstall the Remaining Version

Run the following command to uninstall the remaining version of Inkscape:

brew remove --cask inkscape
  1. Verify Uninstallation

After running the uninstall command, verify that Inkscape is no longer installed:

brew info inkscape

If Inkscape is still listed as installed, you may need to manually remove any leftover files.

  1. Manually Remove Leftover Files

If Homebrew didn’t fully remove the application, you can manually delete the remaining files:

• Application File:

rm -rf /Applications/Inkscape.app

• Caskroom Directory:

rm -rf /opt/homebrew/Caskroom/inkscape
  1. Clean Up Homebrew

Finally, clean up any unused files and caches in Homebrew:

brew cleanup
  1. Verify Again

Run brew info inkscape once more to confirm that Inkscape has been completely removed.

一次有趣的Mac夜晚间隔性唤醒故障的解决经历

技术

最近我的Mac mini在夜晚睡眠之后,经常被多次唤醒,间隔大概在1小时左右。因为每次唤醒,都会导致显示器亮屏,造成原本黑暗的屋内变亮,影响睡眠。

我用命令查看是什么原因导致了系统的唤醒。发现说是蓝牙或是USB设备导致的。我初步怀疑是最近我开始重新使用的蓝牙键盘IKBC DC-87的原因。我选择关闭键盘的开关。之后故障消失。

原本以为这样就可以了。但是我今天使用键盘打字的时候,突然键盘就没响应了。更换电池之后,一切正常。原来仅仅是电池没电了。

这样想来,原本的故障,其实就是电池电量低了。从而导致键盘一会儿有电,一会儿没电。而电池重新有电的时候,会尝试和配对设备连接。从而导致Mac被唤醒。

结论:以后遇到这种故障,提前换电池就可以了。

M4 Mac mini连接Apple TV HD声音断断续续问题的一种解决方案

技术

将Mac mini从M1换成M4之后,Apple TV HD的画面没啥问题,但是声音断断续续,根本没法看。之前M1的时候没问题,但M4的时候就这样了。我认为它应该和M4的网络从Wi-Fi 6升级到Wi-Fi 6E有关。

如图是我调整之后的设置。

wifi

这个和M1的相比主要有两点变化:

  1. 频道,M1只支持80MHz
  2. 安全性,之前为了兼容性,我统一使用了WPA2个人级的加密。

解决方案

因为Apple TV HD不支持WPA3的加密,当我开启5G的WPA3之后,就需要在Apple TV中手动选择2.4G的Wi-Fi。采用了这个设置之后,目前Apple TV HD只在刚开始的时候会断断续续几秒,之后就一切正常了。

我的路由是小米的BE6500 Pro。不清楚这个问题和路由是否也有关。

扩展丐版Mac的磁盘空间

技术

今年Mac mini M4丐版火了。主要是两点:

  1. 苹果将祖传的8GB内存升级到了16GB。
  2. 国家补贴20%,将价格降到35xx。

东西买来了。但是只有256G容量的SSD,却有些捉襟见肘。尤其是做开发的。Xcode自身日常就能占据80-100G。如果是512G的容量就好了。但是从256G升级到512G,苹果要价1500,算上国补,也需要加价1300。实在不够划算。

这篇文章探讨几种不同的方式来扩展Mac的内存。因为这件事实际操作起来,才能发现比原本预期的要更复杂。

硬核办法,更换内置SSD

既然SSD空间小,那么大家首先想到的就是更换一个更大的SSD。想法很好,但是苹果的SSD是焊接在主板上的。普通用户没有这个手艺。因此,要么你找有这个手艺的第三方去更换。要么你直接买别人已经更换好的。

注意:更换SSD的行为会使你的Mac mini失去质保。有些卖已经更换好的Mac mini的商家,提供一年的店铺保修。也就是说,如果坏了,你可以邮寄给商家进行保修。

这种方式的好处是,SSD仍旧是内置的,不会有额外的空间和接口占用。缺点是价格相对较贵,同时会失去苹果质保。另外还有就是第三方的技术水平参差不齐,更换可能存在隐患。

外置硬盘法

顾名思义,外置硬盘法就是使用移动硬盘的方式。而按照硬盘盒的区分,又分为10Gbps的USB 3.1/3.2硬盘盒,以及40Gbps的雷电3/4硬盘盒。二者各有各子的优缺点。

  • 10Gbps的USB 3.1/3.2硬盘盒
    • 优点:价格便宜,温度低
    • 缺点:速度相对较慢,读取写入在900MB/s以下。
  • 40Gbps的雷电3/4硬盘盒
    • 优点:速度快,读取写入可以达到2000到3000MB/s。
    • 缺点:价格要贵一些。温度较高。

虽然雷电的盒子温度要高,因此有的盒子有主动散热的风扇。但是购买时不要买有风扇的版本,因为那个实在太吵了。Mac mini睡眠时风扇也不会停。要买就买无风扇,但是硬盘盒特别重的,因为盒子重的,散热才好。比如我购买的ITGZ的那款。放在手里沉甸甸的,就是一块儿铝锭。

上面提到的是按照硬件进行划分。下面再按照使用方式进行划分。

系统外置法

系统外置法,就是将系统安装到移动硬盘上。安装的方法有两种:

  1. 通过macOS的安装文件进行安装,安装时选择外置硬盘作为安装的位置。
  2. 通过类似CCC这类的备份软件进行备份,备份时选择备份为可以启动的磁盘。
  3. 通过启动磁盘进行选择,选择从移动磁盘启动。

优点:
安装方法简单。
缺点:
完全使用外置磁盘,内置磁盘浪费掉了。
据说苹果智能要求必须使用内置磁盘。外置磁盘无法开启苹果智能。

软连接法

软连接法,就是通过命令行的ln命令创建软连接。将文件夹连接到移动硬盘上的对应文件夹。

优点:
简单,灵活。不需要新建系统,可以针对任何大的文件夹。
缺点:
有些应用会有兼容问题。比如Xcode的模拟器在使用软连接之后,就消失了,也无法新建新的模拟器。只能从软连接恢复到原来的文件夹方式。因此,这个需要不断的试错。

移动默认用户法(推荐)

苹果其实支持了用户文件的重定向功能。即在设置->用户和组->用户上点鼠标右键,然后选高级,就可以设置新的用户文件夹。

这个文件夹是磁盘占用的大头,这个转移走了,剩下的空间就超级大了。

优点:
这个方式是官方支持的。也无需安装新系统。
缺点:
操作复杂。用户文件下是包含资源库文件夹的。而这个文件夹具有系统属性,因此复制时可能存在问题。因此,你在复制粘贴到新位置时,一般不会成功,而只会提示复制失败。

解决办法:
不要直接从系统当前用户的文件夹复制。而是要利用备份软件,比如从时光机中提取这个文件夹,然后保存到新位置。又或者从CCC的备份中直接复制粘贴。

缺点:
这个方式还有一个缺点。就是对于一基于磁盘的备份工具,因为系统和用户文件夹已经不再一个磁盘,那么CCC备份的内容就不在完美。
不过系统自带的时光机还是会正常备份系统和用户文件夹到一个备份的。

谈谈目前阶段我认为的大模型使用策略

技术

先说一个公理:同一个大模型中,参数越高的版本越智能。

从表面上看,既然参数越高的版本越智能,那么在硬件允许的情况下,是否应该本地运行参数更高的版本呢?答案是:是,也不是。这是因为,虽然参数更高的模型更智能,但它们消耗的资源也更高。而且,参数越高的模型,输出所需的时间通常也越长。尤其是如果使用独立显卡进行推理,当模型所需的内存超过显卡的显存时,就会转而使用CPU进行推理,那速度可能会令人无法接受。

相较于本地运行大模型的高参数版本,我更推荐本地运行低参数版本的模型,比如2B、3B这种,同时订阅在线的大模型。尽管这些低参数版本的模型在能力上不及高参数版本强大,但用于一些简单的任务,比如翻译、总结等,效果还是很不错的。而且,它们占用的资源较少,运行速度也相当快。即便是在16GB内存的Mac mini M1上,它们运行时的内存占用也仅在2GB左右。

对于复杂的任务,我们可以将其交给在线的大模型处理。因为相比于在线模型的订阅费,本地运行这些大模型所需的硬件费用远远更高。而在线大模型的好处在于,我们可以根据当前任务选择最合适的模型进行使用。

有人可能会说,若想灵活切换,就需要订阅多个在线大模型,那么费用不就高了吗?其实并非如此。我们可以考虑订阅第三方服务,比如OpenCat。在其订阅期间,我们可以有限制地使用所有它支持的大模型。这样,我们就不必为每个大模型单独订阅。而且,通过这种方式,我们还可以避免一些大模型随意封号的风险。

非官方支持的Mac开启macOS 15.1 AI功能和Xcode AI代码补全功能的办法

技术

github上的文档已经写的很不错了。大家按照上面操作基本上就能成功。就是还有一些注意事项,我会在这里提一提。

https://github.com/Kyle-Ye/XcodeLLMEligible/blob/main/README_CN.md

推荐使用禁用SIP自动运行脚本的方法。

注意:Xcode和苹果AI是两个不同的脚本。需要分别运行。
运行Xcode脚本之前,要先安装完成Xcode 16 beta。不然可能会遇到问题。遇到问题,解决办法就是再次运行一遍Xcode的脚本。

禁用/打开SIP的方法

  1. 关闭Mac。
  2. 长按电源按钮,直到屏幕亮起。
  3. 选择设置。
  4. 选择终端。
  5. 输入命令,按照提示操作。
  6. 重启电脑。