Ajax Zhan's Blog

Welcome!This is Ajaxzhan.
坚信:品味优先于执行,价值驱动下创造、系统工程保安全
持续跟进AI前沿研究,持续思考技术、产品与思维。

这是AI时代,也是一个酒神时代——新技术、新产品、新SOTA层出不穷,从传统大厂到创业公司到OPC到每个个体——每个人都在拼了命想赶上这波浪潮。

神奇的是,在感性和理性的拉扯中,我的理性在这一个月里面变得淡了许多,几乎没有占据过主导地位,感性倒是久不散去,给我带来了许多欢乐和痛苦。

只需要将VPN改成虚拟网卡模式,再打开Cursor的HTTP2.0模式就不会有模型被拦截的问题了,很神奇。解决了HTTP1.1网络环境太差的问题。

最近开始意识到一种很重要的能力——幽默,当然这种幽默不仅仅是对别人,更多是对自己的一种幽默。如果一个人都无法进行自嘲和对生活中的事情进行解构,那么这个人绝对会获得特别痛苦和憋屈,更不用说会产生什么有价值的思考了。所以保持一种对自己冷幽默的态度还是很重要。

兼具深度与启发性的分析,能有效帮助培养更敏锐的Research Taste:关于大海捞针是一个很好的评估长上下文的指标——https://www.zhihu.com/question/654570878/answer/1965228622118888157

AI的发展、LLM的发展太快了,落地的推进也很迅速,中国有无数能人志士正在各自岗位推动这件事情。今年看到的太多新闻都给我一种感觉:AI的浪潮不像是泡沫,未来3-5年AI的需求只会增加,不会减少。浪潮之下,要学习的东西还太多太多。

最近把MLLM当作OCR来用,大概就是识别图中的习题然后转成平台兼容的格式。这个过程中发现大模型的幻觉还挺可怕,他要是直接给你很离谱的错误也就罢了,他居然会给你修改选项中的一些细节,并且修改得很合理,让你完全看不出来。这种幻觉在很多领域我认为还是不可接受的,而且关键是怎么检测出来这种幻觉?如果还要靠人为来检测,那这种基于大模型的自动化工作流其实意义就大打折扣了。

今晚回顾了之前支教的照片,感慨颇深。想做一个好的老师,但确实做的不够好。

今天研究了Coze的Multi-Agent、豆包的语音合成大模型、开源的OpenWebUI和NewAPI,感觉都挺牛的,效果很令人振奋,可以试试组合起来做个项目。

同时我现在越来越觉得,不是为了追求技术而技术,而是要用技术做出真正的好产品,注重用户体验和实际价值。真正的好产品实在令人振奋,字节跳动公司推出的豆包语音系列效果震撼,飞书在办公方面做的绝绝子,今天实用了火山引擎的工单系统都觉得很nice。感觉字节的产品都很有灵气。

今晚看了看过去一年的日记,很有感触,记日记真的很有意思,只有通过当时的文字才能观照今日的自己是否已经成长了。我们需要隔一段时间询问一下自己:自己是否激情依旧,是否能留存有过去许下愿望那时的热情?

Go语言修炼(十三):Go语言是如何抽象Epoll的?

Go语言通过netpoll机制巧妙封装Linux Epoll,实现高性能网络编程。文章对比了BIO、NIO和Epoll的优缺点,指出Go结合了BIO的简洁性和Epoll的高效性:底层使用OS多路复用IO,协程层采用阻塞模型,将阻塞线程转为休眠协程。Go通过抽象层屏蔽不同系统差异(Linux的epoll、Mac的kqueue、Windows的IOCP),利用pollDesc等数据结构管理Socket状态,runtime自动监控Socket状态并调度协程休眠/唤醒,让开发者无需直接操作复杂系统调用即可享受高性能网络编程。

Go语言修炼(十二):高并发下的通信方式Channel

本文深入解析了Go语言Channel的核心概念与实现原理。Channel作为Go协程间的通信桥梁,通过"通信共享内存"的设计理念有效避免数据竞争,提升并发安全性。文章详细介绍了Channel的声明语法、基本操作及常见错误,并剖析其底层数据结构(环形缓冲区、等待队列、互斥锁等)。重点讲解了发送与接收数据的四种场景:直接传输、缓存操作、休眠等待及非阻塞模式(select、timer),揭示了Channel高效实现并发控制的内在机制,为开发者提供了清晰的并发编程实践指导。

Go语言修炼(十一):Go语言的读写锁是怎么工作的?

Go语言读写锁(`sync.RWMutex`)通过分离读锁(共享)与写锁(互斥),优化了并发场景下的性能:无写锁时允许多读并发,有写锁时阻塞所有读写,有读锁时阻塞写锁。其核心数据结构包含互斥锁`w`、读写信号量`writerSem`/`readerSem`、读计数`readerCount`及等待读计数`readerWait`,通过状态转换实现锁的获取与释放。合理使用可显著提升读多写少场景的并发效率,但写入频繁时可能退化至互斥锁,需根据实际场景选择同步机制。

Go语言修炼(十):Go语言的互斥锁是怎么工作的?

Go语言互斥锁`sync.Mutex`通过`state`(记录锁状态、唤醒标志、饥饿模式)和`sema`(休眠队列)实现并发控制。正常模式下,协程优先通过CAS尝试加锁,失败后自旋多次仍失败则入队休眠;解锁时直接释放或唤醒队列中协程。当协程等待超1ms进入饥饿模式,新协程直接入队,被唤醒协程优先获取锁,确保公平性。使用时需注意减少锁粒度、缩短持有时间,并用`defer`确保释放,避免性能瓶颈与死锁。

Go语言修炼(九):Atomic操作与sema锁

Go并发编程中,Atomic操作与sema锁是保障数据一致性的核心技术。Atomic操作通过硬件级锁(如LOCK指令)确保变量读写不可分割,解决全局变量自增等非原子性问题,提供增减、CAS等API;sema锁以uint32值控制并发数,>0时通过CAS获取/atomic释放,=0时退化协程休眠队列(AVL树管理),实现灵活并发控制。二者是sync.Mutex/RWMutex等高层锁的底层支撑,共同应对并发场景下的资源访问与数据一致挑战。

Go语言修炼(八):面试必问的GMP调度模型

Go语言GMP调度模型通过Goroutine(轻量级协程)、线程(M)与调度器(P)的协同,解决了传统并发中的全局锁竞争问题。P作为本地队列缓存协程,实现无锁访问;调度时优先本地队列,空则从全局获取或任务窃取,提升效率。针对协程饥饿问题,通过主动挂起(如channel等待)、系统调用完成触发重新调度;对不主动挂起的协程,采用抢占式调度——协作式利用方法调用时的morestack检查标记,信号式则通过GC发送信号触发线程调度,确保高并发下资源公平与高效执行。

Go语言修炼(七):协程的本质与线程循环模型

Go语言协程是其高并发的核心,本质是复用线程、打包程序运行状态以节约调度开销,具有资源利用率高、快速调度、超高并发等优势。底层通过`g`结构体抽象协程,包含栈、运行现场(`gobuf`)、状态及ID等字段;线程则抽象为`m`结构体。早期Go采用单线程循环模型(0.x版本),通过`schedule`、`execute`、`gogo`等循环调度协程执行,多线程版本(1.0)需加锁解决全局队列竞争。但该模型存在协程顺序执行无法大规模并发、锁竞争影响效率等问题,后续被G-M-P调度模型优化。

Go语言修炼(六):什么是Go语言的内存对齐

内存对齐是提升Go程序运行效率的关键,通过优化内存布局提高访问效率并保证原子性。Go中基本数据类型的对齐系数与其长度一致,如int32为4。结构体对齐分内部与外部:内部需满足成员偏移量规则,并通过长度填充对齐系统字长;外部对齐系数取成员最大对齐系数。调整结构体成员顺序可减少内存填充,优化空间。空结构体单独出现不占内存,被包裹时地址跟随前变量,位于末尾时需补齐字长。掌握这些规则能帮助开发者写出更高效的Go代码。

Go语言修炼(五):搞清楚Go语言中的那些“空”们

本文深入剖析Go语言中的“空”概念及接口底层实现。接口值底层由`iface`(非空接口,含`tab`和`data`)和`eface`(空接口,含`_type`和`data`)构成,类型断言依赖`itab`记录的类型与方法信息。空结构体非`nil`,常用于节约内存(如Hashset的Value、channel信号);`nil`是六种类型(指针、channel等)的零值,且具有类型。空接口仅当`_type`和`data`均为空时才为`nil`。核心要点:`nil`有类型,空结构体非`nil`,接口`nil`需类型与数据同时为空。

Go语言修炼(四):面试官问我sync.Map的底层实现

Go语言原生map在并发读写时存在安全隐患,因扩容机制可能导致数据不一致,引发“concurrent map read and map write”错误。sync.Map通过双map结构(read与dirty)分离读写与追加操作:正常读写访问read map,避免锁竞争;新增操作则锁定dirty map,并通过misses计数触发dirty提升为read,优化性能。其设计解决了map并发问题,适用于写多读多但追加较少的场景,性能优于加锁map。