当年ChatGPT 3横空出世的时候,我对它不屑一顾,心想这不就是超大知识库的复读机么。如今,在现实的"严刑拷打"下,我的态度发生了180度大转弯。
目前,我购买了ChatGPT、Claude和Cursor的会员,另外还用了些Deepseek的API,每月的支出是60美元多点。这笔会员费并不算少,但我觉得它很值。直观上来说,我的生活有了如下改变:
- 再也不用在Google和Stack Overflow上查询技术问题了。
- 几乎不用请教其他领域的专业人士。
- 开发小工具的速度指数级地提升。
可以说AI在各个专业领域里,已经超过了95%的人,而且它还是个通才。举个例子,手机系统是非常复杂的,对于我们这种系统工程师而言,经常一个问题会横跨多个部门。大家有时候会相互扯皮,因为你不懂我的模块,我也不懂你的模块。所以传统的手机厂商里,几乎没人能够从上到下,从camera到audio全都了解。但如今AI可以做到,所以你可以通过它去了解各个模块。而且几乎没有必要去请教所谓的"专家",因为AI会比大部分人回答得更全面,也更有耐心。
同时,AI的快速发展也会逐渐挤压传统学习媒介的生存空间,譬如博客、问答社区、书籍及课程。 因为这种主动式的一问一答,可以更快给到我们想要的答案。譬如,有时我们通读一篇博客,可能只是为了解决某个特定的问题。当然,传统媒介也有它的优势,譬如知识可能更成体系。但其实我们也可以通过AI来体系化地学习某块知识,尤其是程序领域内的知识。我一直认为,深刻理解最好的方式就是阅读源码,而非看书或者是博客。因为书和博客本质上是知识的二次加工,其质量也取决于加工者的水平。而AI时代,读代码、理解代码会比以前容易很多,尤其是一些可读性不高的代码,有了AI加持后简直如虎添翼。
当然,目前它也仍然有些缺点,主要在三个地方:
- 对于特别细节和多信息联动的推理还不擅长。
- 有时候会走进一个死胡同,特别是写代码的时候,给出的结果来回震荡,就是无法收敛到最终的正确答案上。
- 偶尔的胡说八道。
这些问题的存在,其实引出了一个更深层次的讨论:我们到底该如何和AI共处?是把AI当先知?当老师?当高维度生物么?如果你过分地依赖AI,把所有的思维、理解过程全都交给它,那么最后的结果一定是被误导、被欺骗。 类比到人类生活的模式,其实最合适的就是将AI当作一个能力很强的助手。一个领导可以把很多事情分派给助手来做,但他必须分辨助手递交上来的结果哪些是真实的,哪些是忽悠人的。这里面依靠两种能力,一是领导对这些事情的运作方式比助手更了解,二是领导有更好的理性思维,能够通过逻辑推断来拆穿谎言。因此,即便在AI时代,扎实的专业知识和理性的思考能力仍旧至关重要。
至于工具开发,上周我试着用cursor开发了一个小agent,耗时半天。这要放在以前,估计几天才能搞定,因为我对前后端都只是略微了解。
这个agent来源于一个实际的需求,就是tombstone分析的时候,经常需要了解崩溃时代码在干嘛。而有时,我们需要根据pc指针附近的内存值来恢复出相应的汇编指令。譬如如下格式的数据,我们希望把它转换为汇编代码。
erlang
memory near pc (/system/framework/arm64/boot-framework.oat):
000000007168d5b0 34000180b947d6e0 b907d6e1b9400c01 ..G....4..@.....
000000007168d5c0 f9404a7034000081 38316a10530a7ef1 ...4pJ@..~.S.j18
000000007168d5d0 b948e2e1b9000c1f b908e2e151000421 ......H.!..Q....
000000007168d5e0 5280000014000002 aa1803e0aa0003f9 .......R........
000000007168d5f0 d63f03c0f941a67e aa1703e035000359 ~.A...?.Y..5....
000000007168d600 d63f03c0f940ee7e 90ff2cc1d5033abf ~.@...?..:...,..
000000007168d610 b940f837912b8021 34000097b9001417 [email protected]
000000007168d620 530a7c11f9404a70 b400009638316a10 pJ@..|.S.j18....
000000007168d630 aa0003f6f9001016 aa0003f614000017 ................
000000007168d640 d0ff85c052800038 f9400c1e91318000 8..R......1...@.
000000007168d650 f90012c0d63f03c0 1400000e3900d6d8 ..?........9....
000000007168d660 3900db3f52800038 f9001336b4000096 8..R?..9....6...
000000007168d670 140000073900d73f 91318000d0ff85c0 ?..9..........1.
000000007168d680 d63f03c0f9400c1e 3900d738f9001320 ..@...?. ...8..9
000000007168d690 aa1603e0aa1903f6 a9427bf9a94163f7 .........cA..{B.
000000007168d6a0 d65f03c0a8c35bff 003cd50e00000000 .[...._.......<.
以往我都是借助这个网站,手动把数据小端转大端输入进去,然后看结果,遇到不懂的汇编指令还要查看ARM手册了解它的含义,总之费时费力。如今有了AI的助力,我可以开发出一个网页服务,前端界面如下:
后端采用Flask,处理流程如下:
- 对数据进行分割提取,并进行大小端转换。
- 将处理好的数据送入capstone库中,转换成ARM 64位的汇编指令。
- 将汇编指令通过API送入DeepSeek,得到每一条指令的解释。
最终的效果呈现如下:
事实上,AI给出的解决方案考虑得更加全面,它考虑到三点:
- 无效输入的处理。如果输入的不是内存数据,那么它会提示"未找到可反汇编的内容";如果输入的数据仅部分有效,那么不可以的数据将会提示"无法反汇编",而有效的数据将继续输出。
- 访问DeepSeek时,批量送入指令。因为如果每一条指令发起一次请求,那么无疑会增加token的开销;而如果一次输入过多指令,则会增加AI产生幻觉的可能。因此AI采取8条指令为一批的方式进行访问。
- 增加缓存机制。持久化了一个缓存文件,建立汇编指令到解释的映射关系。这样一来,使用的次数越多,需要访问DeepSeek的概率就越低,因为很多指令能直接从缓存文件中找到解释。这一方式极大地降低了AI访问的开销。
这个项目只是我个人电脑上尝鲜的实验,如果真要落地,模型还得换成本地的。整个过程我更多地感触到:AI对于工作效率的革命已经开始。 写代码由于其通用性广,已经被大家广泛地讨论。但各行各业里的工作流,其实都可以通过AI来提效。这个效率,既可以是时间上的节省,也可以是智能上的提升。
我个人是做稳定性工作的,因此日常工作中分析log必不可少。在我们这个领域,智能化地分析问题一直是个前进的目标。但当下的水平只能做到基于文本和规则的"半智能化"。如今有了AI的加持,真正的智能化或许不算遥远。试想当一个智能体可以联动多份log,调用各种工具(e.g. objdump、lldb、crash)加载出想要的数据,结合源码分析出问题的原因,并提出修改建议,那将是多么美好的体验。只是这项工作,单搞AI的搞不定,单搞稳定性的人也搞不定。因此,作为专业领域的人才,是很有必要去学习AI知识的。从原理上去理解它,才能更好地将它和特定的工作流结合。而这,也是我2025年的重要目标。
技术上的牛人往往对新鲜事物的接受度都偏低。所以读到这里的技术大牛们,如果你们还没有频繁地使用AI,那么我诚恳地建议你们快用起来。这无关乎新旧世界的切换,而是技术人理应对世界保持孩童般的好奇。