今日 Hacker News 上的焦点围绕几场发布和一段四十年历史:AI 赛道迎来两款有竞争力的新模型,Cliff Stoll 在 DefCon 34 现场重述他追踪黑客的经典故事,DuckDB 背后的公司将加入 AWS。技术社区也在持续讨论 RAG 系统的复杂度、Python 编码实现中的细节隐患,以及一种把可执行文件变成数据库的尝试。
Stalking the Wily Hacker: 40 years later – Cliff Stoll
75 美分的记账错误
1986 年 8 月 8 日,Cliff Stoll 在 Lawrence Berkeley 实验室的 Unix 系统上发现一个 75 美分的记账错误。这个错误引出了一整年的追踪,最终揪出五名为东德 Stasi 和苏联 KGB 工作的德国黑客。在 DefCon 34 的演讲中,他用投影仪播放了 35 年前在 NSA 演讲时用过的幻灯片,回顾了整个经过。
当时 Stoll 刚完成 Keck 十米望远镜的光学设计,转到地下室管理一组 Unix 机器。他上任第二天,记账程序失灵,一个新用户用了 75 美分的机时。只有系统管理员才能添加用户,而 Stoll 就是管理员。他没有向上级申请许可,而是等到周五晚上,推着实验室推车挨个办公室“借用”打印机和电传打字机,用烙铁和 Radio Shack 夹线把它们接到调制解调器组上,这样每次有人拨号进入系统,都会留下打印记录。他裹着睡袋蜷缩在路由器后面,旁边放着一暖瓶意大利蔬菜汤。
零预算的追踪战
打印纸显示出入侵者的路径:有人通过 cron 任务利用 set-user-ID 漏洞获取 root 权限,关闭记账程序,经过当时 Cisco 生产的第三台路由器,进入尚未完全成型的 Arpanet,然后转向军事网络 milnet,在系统里搜索“弹道导弹”“钚”“核”之类的关键词。
实验室主任 Dave Shirley 给了 Stoll 三周时间和全部资源。Stoll 决定反着来:不堵漏洞,而是把洞开大,让入侵者继续进来,同时监控每一个按键。整个项目预算是零美元。他打电话给 FBI,FBI 问他损失了多少钱,他说 75 美分。对方让他损失到 50 万美元再打电话。
他只能自己想办法。他借来一台串行线路分析仪,把它接到寻呼机上,入侵者一登录就呼他。他很快注意到一个细节:入侵者习惯性地敲 ps 命令查看系统进程,但用的是 ps -gxua,其中 g 标志只存在于 AT&T System 5,而 Berkeley 的 BSD Unix 没有这个选项。Stoll 因此判断入侵者不在北加州。
追踪线路一路向东。到了弗吉尼亚,电话公司接线员要求出示搜查令。Stoll 没有搜查令,但他寄去了自己拍的土星和月球照片,附上说明:可以清楚看到卡西尼环缝和月海。一周后,电话追踪信息到了。信号源头是一家叫 MITER 的军工承包商,对方坚称自己的系统有气隙隔离,不可能被入侵。Stoll 说可以把这个消息交给报社,第二天 MITER 就拔掉了所有调制解调器的电源。
1987 年 1 月 12 日,FBI 探员 Mike Gibbons 参与进来,协调了一次国际追踪:从 Berkeley 到 FBI,到美国驻波恩使馆,到德国联邦刑侦局,再到汉诺威德国电信。电话追踪需要有人在物理交换机旁守着,而当时还是机械交换时代,一次追踪需要一两个小时。黑客在追踪完成前断线。
Stoll 的解法是“淋浴头行动”:他和女友(后来成为妻子)在一家旧金山报摊上吃冰淇淋时想出的点子。他们建立了一个文件,里面全是伪造的战略防御计划(SDI)文档,故意做得像官僚机构的产品——抬头写着“SDI 网络项目 50351”,结尾是“谨启,Barbara Sherwin 女士”。黑客发现这个文件后,花了一个多小时下载,德国警察趁这段时间追踪到了汉诺威某条街上公寓四号的电话号码。
四十年前与今天
演讲接近尾声时,Stoll 批评了 NSA 在他去 Fort Meade 演讲前预先提供的七个问题,比如“入侵者是如何被追踪的”“系统管理员如何审计拥有系统级权限的人”。这些被动语态的第三人称问题让他愤怒:“他们超然物外,没有判断,没有道德参照,不想想谁被利用了、谁被伤害了。这样提问,狩猎就会变成技术拼图,早上九点打卡上班,下午五点打卡下班,把这叫事件响应。”他把问题改写了一遍:“这个臭鼬是怎么闯进计算机的”“这条蛇溜进了哪些系统”“这个无赖是怎么拿到 root 权限的”。
他谈到 1986 年和今天的对比:当时 Arpanet 上只有几千个节点、几千个用户,一个相互信任的游乐场;现在有数十亿节点。当年他孤身一人追踪六个黑客,现在安全行业面对的是国家行为体、犯罪集团,甚至可能是某个少年。他强调当时整个项目预算为零,今天的 DefCon 徽章价格是当年投入的 700 倍。
演讲结尾,他说自己 40 年后还没写完最后一个 shell 脚本,还没准备好退出登录。“我把烙铁传给你们,别烧到手指。”
社区的记忆
评论区里,许多人在讨论他的书《The Cuckoo's Egg》。有网友说这是唯一一本让他一口气读完的平装书,Stoll 回复说那是因为他们往书脊里涂了秘密胶水,防止牛津逗号从书页上掉下来。一位网友提到 1990 年 PBS Nova 的纪录片《The KGB, the Computer, and Me》,Stoll 回忆起拍摄时去 Calistoga 泡泥浆浴的经历。还有不少用户分享购买 Klein Bottle 的经历——Stoll 亲手写的便条、打包过程的照片、骑自行车去邮局的轶事。一位叫 EvanAnderson 的网友说,大多数视频他都要 1.5 倍速看,但 Cliff 的语速本来就是别人的 1.5 倍,Stoll 回复说“从我的非牛顿参照系来看,生活正以 1 倍速进行”。
AWS Acquires DuckLabs
收购的是公司,不是项目
DuckLabs 将加入 Amazon Web Services(AWS),消息在 2026 年 8 月 26 日由 DuckLabs 创始人 Mark Raasveldt 和 Hannes Mühleisen 正式宣布。DuckLabs 是嵌入式分析数据库 DuckDB 背后的商业公司,团队约 30 人,留在阿姆斯特丹,继续开发 DuckDB、DuckLake 和 Quack。交易预计在 9 月初完成。
需要先澄清一点:AWS 收购的是 DuckLabs 这家公司,而不是 DuckDB 项目本身。DuckDB 的代码由非营利组织 DuckDB 基金会持有,MIT 许可证下的开源地位不变。基金会董事会成员 Peter Boncz 在声明中说,基金会持有开源 DuckDB 的全部知识产权,并会继续持有。
独立运营的瓶颈
DuckLabs 成立于五年前,由创始团队完全持股,没有接受外部融资。选择 AWS 是因为原有的独立运营模式遇到了瓶颈:DuckDB 每天下载量超过一百万次,靠一家 30 人的小公司支撑增长,越来越吃力。但把 DuckLabs 扩张成大规模的销售和支持组织,又会把精力从技术开发上拉开。AWS 给了他们资源和覆盖范围,同时允许团队继续专注技术工作。
社区的三派声音
社区反应分成了几派。有人对项目前景乐观,认为 AWS 收购团队有助于扩大影响力,Fivetran CEO George Fraser 评论说,AWS 只是希望人们多用计算和存储资源,这给 DuckDB 保留了技术中立的成长空间。也有人推荐了替代方案,例如 Apache DataFusion,它是 Rust 写的查询引擎,定位和 DuckDB 有重叠,社区活跃度也不错。但有人指出 DataFusion 缺少事务、索引和存储格式这类嵌入式数据库的完整能力,DuckDB 在这些方面更成熟。
担忧的声音同样不少。多位评论者把亚马逊列为大公司里对技术项目最不上心的收购方,认为团队会被内部流程消耗,有前 AWS 员工描述了月度商业报告(MBO)带来的压力。还有人提起 AWS 历史上把开源项目商业化时引发的争议,例如 Elasticsearch 改许可证后 AWS 推出 OpenSearch 分支的事情。一位网友留言:“我在会议里直接喊出了‘哦不’。”
法律结构让部分人放心了一些。DuckDB 基金会的存在意味着代码不归 AWS 所有,MIT 许可证也允许任何人在必要时分叉。社区里已经有人在维护自己的分支,例如一个叫 Haybarn 的发行版,从 DuckDB 1.5.3 开始持续发布。
也有人关注 MotherDuck 这家公司,它是 DuckDB 的云托管服务商,CEO Jordan Tigani 是这篇文章的引言人之一,发言中表达了对收购的积极态度。但评论者普遍认为 AWS 这次收购对 MotherDuck 并不友好,有分析说“MotherDuck 可能被 AWS 架空了”。
基金会下一步
就技术方向而言,DuckDB 2.0 预览里出现的服务器模式和异步 I/O 功能,结合这次收购,让一些老用户感到项目在偏离最初嵌入式数据库的定位。他们担心核心团队接下来的精力会优先投向 AWS 的托管服务需求。
DuckDB 基金会的下一步计划包括成立技术顾问委员会(TAC),吸纳社区成员参与技术方向决策,并开放扩展签名机制,让第三方开发者可以分发自己签名的扩展。这些计划在收购后能否兑现,是评论里反复被检验的问题。
GLM-5.3-Flash
原生多模态 MoE
GLM-5.3-Flash 是智谱 GLM-5 系列的首个原生多模态模型(直接处理图像、视频等输入,无需外部视觉模块转换)。总参数 320B,每次推理只激活 18B 参数。官方称它在基准测试和真实工作负载上超过 GLM-5.2,价格只有后者的十分之一,编码和智能体(能自主完成多步任务的 AI 系统)基准上接近 Claude Opus 4.8。发布前,团队以 ox-alpha 的匿名身份在 OpenCode 和 OpenRouter 上测试,它很快成为当周最流行模型,所有流量由国产 AI 芯片集群承担。
在 Artificial Analysis Intelligence Index v4.1.1 上,GLM-5.3-Flash 得分 57,每个任务成本 0.045 美元(折扣价),同等智能水平此前价格约为 10 倍。六个编码和智能体基准全部超过 GLM-5.2:DeepSWE v1.1 上 63.4 对 46.2,AutomationBench 上 48.8 对 26.2。视觉基准上 OfficeQA Pro 62.4、CharXiv Reasoning 89.4,超过或追平 Claude Opus 4.8。
架构上,相比 GLM-4.5 系列总参数相近(320B 对 355B),激活参数从 32B 降到 18B,层数从 92 层减到 45 层,训练语料为 30T token 的多模态语料。混合架构结合线性注意力和稀疏注意力:线性注意力通过状态建模捕捉局部依赖,稀疏注意力通过轻量索引器检索全局上下文。IndexPool 把四个索引器键向量压缩为一个,降低 1M token 上下文下的延迟和显存开销。相比 GLM-5.3,注意力计算减少 3.0 倍,KV 缓存(存储已处理 token 中间状态的缓存)减少 4.4 倍。
跑在国产芯片上
过去一周的匿名测试流量全部由国产 AI 芯片承担。团队基于 SGLang 构建了专用推理引擎,GLM-5.3 驱动的基建智能体协助工程师优化内核、诊断性能瓶颈,形成“模型帮助优化服务自身的系统”的反馈循环。EPD(Encode-Prefill-Decode,将多模态编码、提示词预填充和逐 token 解码分离调度的架构)在数万个国产加速器上运行。相比同硬件初始基线,端到端服务性能提升 3 倍,硬件效率和单 token 成本达到主流 NVIDIA GPU 水平。
社区对国产芯片的说法反应不一。有用户认为这是“定义性时刻”,出口管制反而加速了中国芯片替代;也有多位用户反馈 ox-alpha 免费测试期间速度约 20 tokens/s,延迟很高,经常超时,并认为“RIP NVIDIA”言之过早,NVIDIA 芯片依然供不应求。有用户猜测这些芯片是华为昇腾,在较老的半导体工艺上以功耗换性能,总产量有限。
社区实测量化
权重在 HuggingFace 上以 MIT 许可证公开,本地部署支持 SGLang、vLLM 和 TokenSpeed。OpenCode 10 美元/月套餐中已经可以手动添加模型配置,输入 0.15 美元/百万 token、输出 0.5 美元/百万 token。NovitaAI 已在 OpenRouter 上提供托管。
实际使用体验上,社区评价分化。一位用户用它做 SwiftUI/AppKit 应用的复杂 UI 重构,“速度快,印象深刻”。有用户对比后认为它在 UI 设计上接近 Kimi K3,而 K3 价格昂贵,这个价格点的表现“疯狂”。也有用户持保留态度:一位说 GLM 5.3 做智能体任务“感觉不如 5.2”,另一位则相反,认为 5.3 更懂代码、编辑更细致。有用户测试后说它和 DeepSeek V4 Flash 价格相近但更聪明。基准测试和真实体验之间的差距也被讨论:有用户发现 Opus 5 基准排名靠前但持续输出“不可读的胡言乱语”,而评分不高的小模型反而更可靠。
本地部署的经济账是讨论热点。一位用户买了四台 Asus GX10(DGX Spark),加上线材共约 21,500 加元。有评论估算这类硬件要多年才能回本,token 价格还在下降,而 API 订阅每月能获得价值数千美元的补贴 token;也有人反驳说自己的本地硬件买后升值约 60%、DeepSeek token 价格在上涨,API 的价格补贴不可能永远持续。一位用户说本地跑模型可以做自己的 RLHF(基于人类反馈的强化学习)调整行为,云端模型做不到。
服务条款争议与确认消息
Z.ai 的服务条款被批评。有用户指出条款对输入输出主张广泛且永久的许可,甚至包括用户的姓名和头像;有模糊禁令,包括可能损害 Z.ai“利益”或任何国家“国家利益”的内容;Z.ai 可自行判断封号,年付用户可能损失已付款项。也有用户回应说 OpenAI、Anthropic、x.ai 的条款都有类似问题,x.ai 甚至更糟,而且模型权重以 MIT 许可公开,可以从其他托管商获得服务。
Bloomberg 的报道确认了另一件事:Z.ai 回应查询时确认,近期在在线使用排行榜上冲到顶部的匿名模型 Ox Alpha 就是 GLM-5.3-Flash,模型正式名称与博客发布一致。确认消息公布当晚,权重即公开,社区随即着手验证量化表现和本地运行速度。有用户在 OpenRouter 上连续数日让它做编程任务,认为能力介于 Sonnet 和 Opus 之间,错误少但不算很聪明。主要问题在于模型会陷入“doom loop”(死循环),比如把同一个 bash 命令重复跑了上千次,导致无法无人值守地使用。有用户指出 GLM 系列一直有这个问题,也有人认为这取决于模型和代理运行框架双方的配合。
有用户总结了近期的节奏:7 月 16 日 Kimi K3 发布,被视为“中国追上 Opus”;四周后 GLM 5.3 以约三分之一的参数和成本达到同等性能;12 天后 GLM 5.3 Flash 又把激活参数减半、价格降到五分之一,并跑在国产芯片上。还有用户补充,DeepSeek、Qwen、Z.ai 和 Moonshot 公开研究方法和权重,而 OpenAI 和 Anthropic 的模型内部机制只能靠猜测。
Qwen3.8-Flash-Next
Qwen4 架构预览
Qwen 团队开源 Qwen3.8-Flash-Next,一个多模态 MoE(混合专家)模型,同时作为 Qwen4 架构的早期预览。团队在完整 Qwen4 系列发布前公开架构改动,让社区先行检验,做法与之前 Qwen3-Next 预告 Qwen3.5 系列相同。
模型主参数量 125B,每 token 激活 6B,另加 51B N-gram 嵌入参数。训练成本约为 Qwen3.7-Plus 的 1/9,在编码和办公类任务上的能力超过 Qwen3.7-Plus。原生上下文 262,144 tokens,用 YaRN 可扩展到 1,000,000 tokens。权重已放到 Hugging Face 和 ModelScope;生产版本 qwen3.8-flash 在 QwenCloud 上提供,默认 1M 上下文、带官方内置工具,按每百万输入 tokens 0.16 美元、每百万输出 tokens 0.47 美元计价。API 支持 OpenAI 兼容和 Anthropic 兼容接口,可接入 Claude Code、Codex、Qwen Code、OpenClaw 等工具。
架构上的四个改动
注意力上,每四层中三层用 Gated DeltaNet(GDN)把历史信息压缩进固定大小状态,剩下一层用全局注意力精确检索。全局注意力引入 Qwen 稀疏注意力(QSA),先用轻量索引器把序列聚成微块,在块级别估计重要性再选择区域。官方数据是 1M tokens 下 QSA 注意力内核预填充和解码分别提速 7.6× 和 4.9×;在 90% 前缀缓存命中率、代表高缓存复用在线服务场景的实验条件下,预填充吞吐是 Qwen3.7-Plus 的 8.6 倍。
嵌入上,N-gram Embedding 用当前 token 和前几个 token 组成的局部上下文查表,而不是单个 token。51B 额外参数几乎不增加每 token 计算量;查表位置可以预先确定,参数放主机内存里异步预取,不长期占用 GPU 显存,相当于在网络靠前位置加了一块大规模“局部模式记忆”。这个设计受 Gemma 3n 的逐层嵌入和 DeepSeek Engram 启发。
优化上使用 Muon 优化器,改进了正交化精度、Muon 与 AdamW 的参数分工、融合参数矩阵的拆分,并针对新架构重拟合缩放定律,模型可以稳定使用更大的学习率和批次大小。批次大小预热被省略:从小的批次逐步升到目标批次不提升最终结果,反而多花 18.8% 优化步骤。
社区实测与讨论
社区当天就开始在本地硬件上测试。Unsloth 已放出 GGUF 量化版,但 llama.cpp 主线还不支持名为 qwen4exp 的新架构,等待合并 PR。有用户合并分支后跑出 23.54 token/s;在 AMD Ryzen 395(Strix Halo)上约 22 token/s,质量和速度都好于 Qwen3.8 27B;DGX Spark 上 nvfp4 量化约 80GiB 驻留内存,N-gram 表从 SSD 分页,解码约 12 token/s。N-gram 参数可以放内存或 SSD,让 128GB 统一内存设备有机会运行它;Unsloth 文档标注最小量化版本需要至少 75GB 内存,4-bit 量化约 112GB。
围绕上一代 Qwen 模型的“过度思考”问题,用户对新模型持保留态度。有用户希望它“少想一点”;有人实测 Qwen3.8 27B 在同一个提示上纠结 5-10 分钟、消耗约 10 倍 token,而 Gemma 4 26B 在 20 秒内完成且答案一致;xhigh 推理档位不仅拖慢速度,还可能把自己绕进去写出更差的代码。也有用户说这取决于任务:问题空间越开放,模型越容易自我怀疑;有清晰路径时它可以很简洁。另有用户引用论文说明,思考 token 即使换成毫无意义的 '.' 也能带来性能提升,思考更像“加载画面”,实际推理发生在激活值里,不在这段文本中。
价格讨论中,有用户拿 GPT 5.6 Luna 对比:Luna 在 DeepSWE 上 67%,高于 Qwen 的 59%,价格是 $0.20/$1.20 对 $0.16/$0.47。也有人提醒按 token 单价比较有误导性,不同模型完成同一任务消耗的 token 数差别很大;Artificial Analysis 按每任务成本计算,Luna(max)约 $0.05,Qwen 3.8 27B 约 $0.25。还有讨论认为 OpenAI 和中国厂商的定价都未必覆盖成本,各有补贴或商业化压力。
有用户认为这类小模型缺少大模型内化的世界知识,只有接近的智力;赞同者说可以靠检索补上,模型与知识库分离可能是方向。有人问为什么 6B 激活参数的 MoE 能胜过同系列新发布的 27B 稠密模型,回应说 MoE 的价值在于把知识与推理分开,每个 token 只读取需要的专家,而稠密模型每个 token 都得为全部知识付计算成本。有用户质疑是否每天都需要 Qwen 新闻,回应认为这次不同——它是 Qwen4 架构预览,而且这种 MoE 尺寸特别适合 AMD 和 Mac 等统一内存设备的本地推理。
RAG Is Simpler Than You Think
别一上来就建向量数据库
大多数团队把 RAG(Retrieval-Augmented Generation,检索增强生成)系统建得过于复杂:一上来就上嵌入模型(embedding)、向量数据库和重排序管道,而用户往往只是想找到写着“如何重置密码”的那篇文档。这是工程师 Rafael Pierre 在技术通讯 Lighthouse AI 上发表的看法,他给出六种从简到繁的检索方案,主张按需选择。
选择方案取决于五个因素:数据更新频率、语料特征(每日变动超过 10% 就不要全量预嵌入;90% 内容无人访问的长尾语料适合即时计算)、查询模式(关键词型查询用全文搜索,语义型查询用嵌入)、规模(每日低于 1000 次查询用简单方案即可)和团队能力(没有机器学习经验就留在全文搜索加查询改写的层面)。
第一种方案是纯全文搜索:BM25(经典关键词相关性排序算法)、Elasticsearch、Postgres 全文搜索。作者认为它被严重低估:零 API 成本、10 毫秒内返回、容易调试(能清楚看到文档为什么被匹配上)、不需要设计分块(chunking)策略,也不存在模型被弃用的风险。Hacker News 上有读者以自己做大规模 RAG 系统的经验表示认同:“人们严重低估全文搜索、严重高估嵌入。全文搜索真的容易、可移植、可扩展,80/20 法则适用。”嵌入看似神奇,但语义相似度没那么可靠,最终会陷入重嵌入、重排序和向量搜索的运维负担,而一个 500 个关键词的查询虽然笨拙,就是能工作。
六个方案与决策树
第二种方案是用 LLM 重写查询。核心洞察是:大多数“语义搜索”问题其实是“查询表达”问题。LLM 可以把口语化描述改写成关键词:去掉“how do I”这类停用词,补充同义词(car 变成 car automobile vehicle),翻译领域术语(“speed up code”变成“optimize performance”),还能识别复杂查询中的多个意图。文章举的例子是内部框架取名 Atlas:通用嵌入模型只把 Atlas 的向量映射到希腊神话和地图,而查询改写可以在系统提示词里定义“Atlas = 内部数据处理框架”,再用 BM25 精确匹配。每次查询成本约 0.001 美元(用 GPT-4o-mini),调优只需改提示词,不用重嵌入语料。评论中有人形容这是“传统 Lucene 之上的代理式查询改写”,认为嵌入和语义搜索是在不确定性上叠加不确定性。另一位工程师说,他把几千份文档放进 SQLite 的 FTS5(全文搜索索引),让 DeepSeek 自己生成 SQL 来查询,效果超过公司试过的所有商业方案。
第三种方案是混合搜索:先用 BM25 取前 50 到 100 个候选,再用嵌入重排到前 10。按 OpenAI text-embedding-3-small 的定价算,每次查询嵌入 50 篇文档约 0.0005 美元,每日 1000 次查询每月约 15 美元。真正的代价是延迟:每次现算嵌入要增加 200 到 500 毫秒,而且分块、块大小、重叠率这些全文搜索不存在的问题全部回来了。
第四种方案“即时嵌入”针对高频变动数据:不预建索引,查询时现算。最大好处是换嵌入模型时只需改一行代码。文章对比了模型弃用的成本:如果预先嵌入 1000 万篇文档,从旧模型迁移到新模型要全部重嵌入、更新向量库、跑回归测试;而即时嵌入随时切换。OpenAI 就用 text-embedding-3 替代了 text-embedding-ada-002。第五种方案是热/冷分层:预嵌入 20% 的热门文档,冷门文档即时嵌入。第六种方案是全量预嵌入加向量数据库,适合每日上万次查询、语料稳定(每月变动低于 5%)、需要 50 毫秒内响应的场景,但换模型的成本最高。
作者最后给出决策树:没有搜索就先建 BM25;有就用 2 到 4 周收集反馈;用户抱怨“文档明明存在但找不到”,先试查询改写,A/B 测试两周;还不够就试混合检索,并依据语料变动选择即时嵌入、热/冷分层或全量预嵌入。他的经验法则是:60% 的系统停在全文搜索加查询改写就够了,25% 需要混合方案,10% 需要全量预嵌入,5% 需要定制。别为 60% 的问题去建那 5% 的解决方案。
社区的反驳与补充
评论区并不是一边倒。有读者认为文章方向错了:嵌入计算量大但不复杂,收益也大,90% 的文档型 RAG 项目应该把语义搜索作为主要方法,先试一下再判断性能问题。多语言场景是全文搜索的明显短板:一位读者提到技师用不同语言搜索,知识库本身也混用多种语言,嵌入天然跨语言,而全文搜索要为每种语言单独处理词干(stemming)和拼写变体。在编程场景,有工程师说自己的编码代理移除了检索后效果反而更稳定——代码仓库本身可被 grep 检索,分块检索会把看似相关的内容塞给模型,模型倾向于信任它而不去核实源码。
还有评论者澄清定义:RAG 的本意是任何在生成前把外部数据放进模型上下文的方式,不一定需要向量数据库;只是因为大量文章只写嵌入和向量库,让“RAG”被窄化成了“嵌入加向量搜索”。
文章本身也引发了一场关于 AI 生成内容的争论。多位评论者从标题风格、短句节奏、以及“GPT-4o-mini”这个 2024 年 RAG 热潮期常见的模型引用判断文章由 LLM 代笔。作者本人回应,自己在多家财富 500 强公司工作,RAG 至今仍是热点,这正是他写这篇文章的动机。一位读者说,自己读 AI 生成的文本越来越吃力,“大脑就是不读它,因为我们已经知道那不是真正的交流”。也有读者承认自己本来觉得文章不错,看到评论说这是 LLM 写的之后,就失去了继续阅读的兴趣。
When str.lower() is a security vulnerability in Python
Unicode 版本错位
互联网标准只支持 ASCII 字符,但世界语言文字远不止拉丁字母。为了让域名也能用其他文字书写,需要把 Unicode 映射到 ASCII,NamePrep 就是这个方案的一部分。它定义在 RFC 3491 中,是 StringPrep 的一个配置档,也是 IDNA 2003(国际化域名应用)的关键组件。IDNA 2003 后来被 IDNA 2008 取代,后者定义在 RFC 5890 到 5893 中。
Python 通过 idna 编解码器(str.encode('idna'))支持 IDNA 2003,通过 PyPI 上的 idna 包支持 IDNA 2008。标准库里的 stringprep 模块实现了 StringPrep。通常应该用 idna 包(IDNA 2008),而不是 .encode("idna")(IDNA 2003),但有些场景确实需要旧行为。
StringPrep 在 RFC 3454 第 3.2 节定义了“大小写折叠”(case folding),也就是把码点转成小写或大写,用于字符串不区分大小写的比较。它通过映射表 B.2 和 B.3 实现,B.2 基本等价于 str.lower(),B.3 是例外项。Python 的实现代码是:
def map_table_b3(code):
r = b3_exceptions.get(ord(code))
if r is not None: return r
return code.lower()
问题出在这个 str.lower()。str 使用 Python 解释器自带的 Unicode 数据,可以通过 unicodedata.unidata_version 查看版本。而 StringPrep 依赖 Unicode 3.2.0 的行为,RFC 3454 的 B.2 和 B.3 表就是按这个版本编码的。每个 Python 版本都带一份 Unicode 3.2.0 数据(unicodedata.ucd_3_2_0),专门给 StringPrep 和 IDNA 用。但上面代码里的 str.lower() 用的是当前 Unicode 版本,不是 3.2.0。结果就是实现和规范不一致,变成漏洞。文章给出了具体例子:字符“Ꭰ”(U+13A0),用规范要求的 3.2.0 规则编码成 'xn--58da',用 Python 17.0.0 的规则编码成 'xn--kz9aa',两者不同。
实际风险在哪里
多位读者对“漏洞”这个说法提出异议。有人认为这只是产生错误数据的 bug,不是漏洞,除非能演示实际利用。作者在评论中回应:这种实现差异会造成解析器分叉(parser differential),系统里两个组件对同一个字符串可能解释成不同的主机名。比如 Web 应用前面的 WAF 用非 Python 语言实现,后端是 Python,两边对输入的理解不一致,就可能绕过安全策略。SSRF(服务端请求伪造)就是利用 URL 解析器差异的典型例子。还有评论指出,更准确的标题应该是“当 encode('idna') 是安全漏洞”,因为问题不在 str.lower() 本身,而在 encode('idna') 对它的使用方式。
修复与反思
修复方法是扫描所有 Unicode 码点,找出 str.lower() 在当前 Unicode 版本和 3.2.0 之间行为不同的情况,把它们加进例外表,让 str.lower() 在这些码点上表现得像 3.2.0。评论中有人贴出了修复代码的关键部分:遍历 0 到 0x110000 的所有码点,如果该码点在当前 Unicode 中已分配且支持大小写折叠,但不在 B.2 或 B.3 表中,就把这个码点加入 b3_exceptions,映射为自身(恒等映射)。这样旧版本的例外表就能覆盖新 Unicode 引入的所有变化。这个修复记为 CVE-2026-17084。
修复靠硬编码例外表也引来担忧:如果未来 Unicode 再变,str.lower() 的行为又不一样,这个表需要跟着更新,否则会再次出问题。除非对全部码位做单元测试,确保始终与 3.2.0 一致。
还有一些衍生讨论:浏览器实际用的是 WHATWG 的 UTS #46,不是 IDNA 2008,有评论推荐使用跟踪 WHATWG 规范的 ada-url 库,以减少与浏览器之间的解析器差异。也有人提到 IDN 本身就有域名混淆风险,比如 ß 和 ss 的映射,注册局会限制同一主体注册这种易混淆域名,但不同注册局的策略不同。
Queryable Executables
一个 SQLite 数据库就是可执行文件
可执行文件本身就是一个 SQLite 数据库,这个想法来自作者上一篇《你的可执行文件是一个 SQLite 数据库》。通过 Linux 的 binfmt_misc 机制,系统可以把一个 SQLite 数据库文件当作程序来执行:自定义解释器读取 segments 表里的行,跳转到入口点。这样一来,针对二进制文件的整套工具链都变成了 SQL 查询。
作者进一步想:既然数据库可以被写入,那么正在运行的程序能不能把状态也存进同一个文件里?答案是能。程序可以用事务的方式,在运行文件的同一个 SQLite 数据库里读写自己的状态,不再需要 /var、/tmp、/home 这些文件系统目录,整个应用的代码和数据都在同一个文件里。
活生生的例子
这个想法被实现成了一个叫 self-httpd 的 Web 服务器,它由单个文件组成,同时是程序、网站、路由表和访问日志。你用 ./server 启动它,用 curl 访问页面,然后可以用 sqlite3 server 'SELECT count(*) FROM presses' 查询按钮点击次数。页面本身,甚至页面访问记录,都作为行存在于同一个数据库文件中。部署新版本就像数据迁移一样,两条 INSERT ... SELECT 把旧访问日志复制进新文件,再替换文件、重启进程即可。更新正在运行的网站不需要重启或重新部署,一条 UPDATE 语句就能改掉页面内容,而且支持回滚。sqldiff 能对比两个版本的可执行文件,显示“部署”具体改了什么。还可以创建 FTS5 虚拟表,让网站用全文搜索索引自己的页面,搜索“transaction”能直接定位到页面上那句“Editing is a transaction”。
作者把这种格式称为“Actually Queryable Executable”,与 Justine Tunney 的 redbean 对比:redbean 是一个单文件 Web 服务器,把 ZIP 归档和 Lua 钩子塞进可执行文件里;而 SELF 用 SQLite 数据库本身作为容器,添加一个路由只是往 handlers 表插入一行。redbean 是“实际上可移植的可执行文件”,SELF 是“实际上可查询的可执行文件”。
社区反应
Hacker News 上的评论普遍觉得这个点子既离谱又有趣。有人说这是“今年在 HN 上看到的最棒的东西之一,疯狂且接近愚蠢”。也有人认真讨论顾虑:把运行数据写进可执行文件让多实例共享状态变得麻烦,纯只读二进制加上单独的可写数据目录在实践中更清晰;更有人指出,程序可自写意味着所有 SQL 注入都能变成任意代码执行,对暴露在互联网上的服务来说,这让人不太敢用。评论者联想到这类思路在历史上出现过多次:Tcl 社区的 starkit/tclkit 用 ZIP 打包并携带元数据,Lisp 和 Smalltalk 的镜像文件,以及 AS/400 把一切当作对象、用 SQL 操作操作系统的设计。还有人说,如果不用编译好的机器码,而把代码存成 s-expression 再允许动态更新,那就相当于重新发明了 Lisp。
Maiao: Gerrit-style code review workflow for GitHub, GitLab, Gitea, others
stacked diffs 工作流
Maiao 是一个让 GitHub、GitLab、Gitea、Forgejo、Bitbucket Cloud 和 Cursor Origin 支持 Gerrit 式代码评审工作流的命令行工具。它实现 stacked diffs(堆叠差异)方法:把分支上的每个提交变成独立的 PR/MR,并按父子依赖自动堆叠。三个提交会生成 PR #3 -> PR #2 -> PR #1 -> main 这样的链条。工具用 Change-ID(Gerrit commit-msg hook 生成的提交标识)追踪提交,支持 git commit --fixup 处理评审意见,合并后自动 rebase,还能从 remote URL 自动识别托管平台;自建实例首次使用会询问并保存到 git config maiao.provider。
为什么 fork 这个项目
项目是 adevinta/maiao 的社区 fork。维护者 joaoqalves 在 Hacker News 上解释了原因:Adevinta 被私募财团(Permira 和 Blackstone)收购后经历多轮裁员,原维护者都已离职,runetes 是他们维护开源项目的组织。fork 仍在活跃开发,最近更新包括支持 GitHub 原生 Stacks API、升级 go-github 到 v90、用 release-please 自动化发布和 Homebrew 公式更新。
社区看法
关于“每个提交一个 PR”是否合理,讨论区有争议。有用户认为这听起来像 crazy town;另一些人指出在 stacked diffs 世界里这是标准做法,尤其适合 10 到 20 人以上活跃提交的团队。一位用过 Gerrit 的用户认为 Gerrit 的评审风格最合理:提交本身是评审单位,历史干净,评审意见直接落到对应提交上;相比之下 GitHub 的大 PR 评审很困难,评论容易在大量建议中丢失。也有人担心这会给提交质量带来不必要压力,认为中间提交留在 feature 分支更自然。维护者回应,Maiao 不引入新命令、不要求团队整体切换,它只用普通 git commit 和 GitHub API 自动 rebase,因此单人使用也不会破坏现有流程。
关于与 jujutsu(一种新兴版本控制系统)的兼容性,维护者表示自己不了解 jj,但 Maiao 完全兼容 git,不做 API 或 UI 创新,只在现有 GitHub 流程上做渐进增强。GitHub 原生 stacked PR 功能(2024 年推出)被当作渐进增强:可用时注册 stack,不可用则退回基于分支的堆叠。名字 Maiao 来自法属波利尼西亚的一个小岛,寓意鼓励开发者提交更小、更整洁的变更。
Tim Curry has died
从洛基恐怖秀到小丑回魂
蒂姆·柯里(Tim Curry)在洛杉矶家中去世,享年 80 岁。这位横跨电影、舞台和电视的演员,因在《洛基恐怖秀》(The Rocky Horror Show)中饰演浮夸的弗兰克-N-福特博士(Dr Frank-N-Furter)而成名——1973 年舞台剧和 1975 年电影版让他完成突破。他最出名的角色都要求大幅度的身体改造:弗兰克-N-福特博士涂着浓妆、穿着渔网袜和吊带袜;1985 年雷德利·斯科特执导的《黑魔王》(Legend)里,他装上巨角、全身涂红扮演黑暗之王;1990 年改编自斯蒂芬·金小说的电视剧《小丑回魂》(It)里,他又以全脸小丑妆出演潘尼怀斯(Pennywise)。
柯里 1946 年出生,1968 年获得伯明翰大学戏剧与英语学位,随后开始舞台生涯。他的第一个重要角色是 1968 年伦敦西区《毛发》(Hair)首演,在那里结识了理查德·奥布赖恩,后者后来在自己创作的音乐剧《洛基恐怖秀》中启用了他。此后他演过汤姆·斯托帕德《戏谑》(Travesties)中的特里斯坦·查拉、1980 年百老汇《阿玛迪斯》(Amadeus)中的莫扎特,以及百老汇《火腿骑士》(Spamalot)中的亚瑟王。
电影方面,他出演了《孤家寡人 2》(Home Alone 2: Lost in New York)、《布偶金银岛》(Muppet Treasure Island)、《惊声尖笑 2》等喜剧,并为多部动画配音。电视上他演过莎士比亚、比尔·赛克斯(《雾都孤儿》)、特里蒙(《魔法的颜色》),也客串了《灵异妙探》《大侦探波洛》《犯罪心理》等剧集。1979 年,他还以单曲《I Do The Rock》登上美国公告牌百强单曲榜。
中风之后仍在坚持
2012 年,柯里在接受按摩时中风,接受了脑部手术,留下行动障碍和短期记忆受损。2025 年他出版了回忆录《Vagabond》。“我有过这些机会,而且我还在继续出现,”他对《卫报》说,“我想这就是你必须做的。你必须不断出现。”在近期百老汇版《洛基恐怖秀》中饰演弗兰克-N-福特博士的卢克·埃文斯在 Instagram 上悼念:他是一股力量,一团明亮炽热的火焰,“只有一个蒂姆·柯里”。
社区对他的记忆
社区的记忆各有不同。一个流传很广的说法是:迈克尔·凯恩在布偶电影里把布偶当真实演员,而柯里把自己当成一只布偶。柯里本人否认过这种解读:“我把布偶看成具有鲜明个性的演员,你很快就把他们当成人了。”一位少年时代在前排看过柯里舞台剧《洛基恐怖秀》的观众回忆,那是他见过的最强大的舞台磁力,“电影版捕捉到了一点,但现场的他令人难以置信,充满力量,而且神圣”。旧金山一个影子剧团(shadow cast,在银幕前同步表演的剧团)成员说,他观看和参演《洛基恐怖秀》超过 1000 次,弗兰克-N-福特这个角色“你必须体现蒂姆·柯里。你可以演出自己的版本,但所有版本都带着他的根”。柯里中风后仍坐着轮椅出席粉丝活动,有网友认为他应该安静休养,但也有在场者说“他度过了人生中最快乐的时光”。还有用户打趣说,凭每个人记住的柯里角色,就能猜出他的年龄段——从《洛基恐怖秀》到《妙探寻凶》(Clue),从《红色警戒 3》到《布偶金银岛》,几代人都各有自己认定的那个蒂姆·柯里。
相关链接:
- Stalking the Wily Hacker: 40 years later – Cliff Stoll [video]
- AWS Acquires DuckLabs
- GLM-5.3-Flash
- RAG Is Simpler Than You Think
- When str.lower() is a security vulnerability in Python
- Qwen3.8-Flash-Next
- Tim Curry has died
- Queryable Executables
- Maiao: Gerrit-style code review workflow for GitHub, GitLab, Gitea, others
- Z.ai confirms Ox Alpha is a new GLM-series model and will release its weights