CC
云谦的博客
发布于 2025年12月29日

译:2025 年终回顾(Mario Zechner)

原文: https://mariozechner.at/posts/2025-12-22-year-in-review-2025/
作者: Mario Zechner
译者: Gemini 3 Pro High

2025-12-22

猜猜我什么时候住院了

目录

距离我上次写年度回顾已经过去一年半了,那次其实涵盖了两年。随着 2025 年接近尾声,我想梳理一下今年我在家庭和工作之外的生活中都做了些什么。像往常一样,这混合了技术折腾、黑客行动主义和一般的胡扯。我想我只是想以一种尽量简明的方式把它写出来。对我来说,是为了留住发生的记忆。对你来说,也许能发现一些有趣的片段,对你也有些用处。

如果你看一眼顶部的图片,你会发现二月和三月有一段空白。原因是:我变老了。我想这是今年对我来说最有趣的观察。我的身体正在慢慢垮掉。我在医院住了一段时间,然后需要相当长的时间来恢复,这意味着除了家庭琐事外,我真的没有精力做任何事情。这就解释了我 GitHub 贡献图上的那段空白。

总之,说完这些,我们开始吧。让我们从我最自豪的一个项目开始。

Boxie

早在 2024 年夏天,我决定学习电子学,这样我就能为我的小儿子制作小玩意儿了。这最终促成了 Boxie 的诞生,这是一个为我们当时三岁的孩子制作的永远离线的音频播放器。我已经详细地写过关于它的文章。这是成果:

这是一段相当漫长的旅程,从最基本的让 LED 闪烁,到自己设计印刷电路板,像疯子一样购买各种装备,并熟练掌握焊接 SMT 元件。显然,我还得把 Doom 移植到嵌入式系统上。

我很高兴地报告,我们的小家伙仍然每天都在使用它,现在他有一个装有大约 72 个卡带的百宝箱,每个卡带里都有他最喜欢的节目、有声读物和音乐的音频剧。

每当有东西坏了(令人惊讶的是这种情况很少发生),孩子和我就会一起拧开设备,查看内部结构,并在里面捣鼓一番。我希望这种早期的技术接触能激发他学习这些东西如何工作的兴趣,就像我的 Game Boy 激发了我的兴趣一样。

Cards for Ukraine (乌克兰卡片)

我很高兴地报告,今年我们的 Cards for Ukraine 筹款突破了 30 万欧元大关(你可以阅读起源故事)。大量的额捐款和一位匿名捐赠者的一笔大额捐款帮助我们实现了这一目标。

我们成功分两批发放了援助,一批在 5 月(190 张卡),另一批在 10 月(308 张卡),这些卡片被送到了奥地利的许多乌克兰家庭手中。Tanja 还在写她的 Substack,并经常在文章中呼吁捐款。而我这一边,仍然试图用愚蠢的项目来娱乐互联网,并在每篇社交媒体帖子的末尾,乞求大家为协会捐款。这仍然有点用,但显然在经历了三年的战争和经济衰退后,人们的钱包不再像以前那样敞开了。

heisse-preise.io

heisse-preise.io起源故事)继续艰难前行。在 2024 年平安夜,SPAR 决定更改他们的 API,这导致他们产品的并数据收集工作中断。我在 3 月份注意到了这一点,但没费心去修。直到 5 月份我才终于腾出手来处理。现在 SPAR 产品的数据在 2024 年 12 月 24 日到 2025 年 5 月 14 日之间有一段空白。这就是爬虫的乐趣。

多年来,我一直呼吁奥地利政府实施 BWB(联邦竞争管理局)2023 年的建议:将抓取杂货价格数据合法化,并要求零售商公开 EAN 代码。杂货商已经通过 API 公开了他们的数据,BWB 发现他们自己也使用这些 API 进行“系统性价格匹配”。消费者应该拥有同样的访问权限。但是 Kocher 部长在实施任何措施之前就去了奥地利国家银行(OeNB),而新政府同样无能或不愿意解决这个法律问题。这不仅能让比价网站拥有良好的法律基础,还能开放数据用于科学研究。没有法律保障,没有哪所大学敢碰我的数据。

有趣的是,Cory Doctorow 在接受 The Verge 采访时,称我为“那个抓取了两大杂货商所有网络价格的奥地利小孩”。我已经 41 岁了。

关于 heisse-preise.io 最酷的事情仍然是我妈妈用它来对着价格发火。

“你好。每天看着这难以置信的价格,我的血压就升得更高……现在 1 个鸡蛋要 40 欧分。噢等等,里面有 15 个。算下来是 26 欧分。但是随着价格上涨,它每天都在涨。”

Messing with AI (折腾 AI)

自 2023 年初,也就是 ChatGPT 发布后不久,我就一直在玩大型语言模型。查看我上一年的年度回顾了解诸如 AMS Berufsinfomat生成式 AI 研讨会LeitkulturomatKärntenGPT 等项目。

在过去的三年里发生了很多事情。我们基本上已经从在各自的网站上询问 ChatGPT 或 Claude 一些函数,转变为在我们的机器上以 YOLO 模式运行半自主智能体。从今年第二季度开始,我完全接受了这种工作流程,并在博客上记录了它:提示即代码MCP vs CLI如果你不需要 MCP 会怎样。早些时候,我还录制了一个1.5 小时长的视频,详细介绍了我是如何使用编码智能体的。回想起来,我的工作流程已经发生了显著变化。我最终会另写一篇博文来介绍。简单来说,它离完美还很远,但它感觉更加流畅、稳定和高效。重点在感觉。因为那就是我们要的一切,氛围(vibes)。

Armin 在他最近的博文中,将编码智能体用户分为两个阵营:一类是严格控制智能体并保持参与的人,另一类是编排智能体大军的人。我属于前一个阵营,也许是因为我老了。尽管我尽了最大努力,但除了也许是研究任务之外,我根本无法让智能体大军为我工作。到目前为止,让它们编写大量代码对我来说就是一场灾难。也许秘诀就在于不看它们生成的代码,然后祈祷一切顺利。我觉得与拥有智能体大军的人相比,身在其中并没有阻碍我的生产力。我还想指出,并没有很多拥有智能体大军的人真正发布了他们的作品,而我则尽量开源我的东西并记录下来。所以也许这里面有什么教训。

在深入介绍几个精选的“AI”项目之前,我想我对使用编码智能体一年的总结是:还没人知道该如何正确地做这件事。我们都只是在把屎扔到墙上,宣布胜利,同时暗地里为我们要智能体胡作非为而引入代码库的所有技术债务哭泣。如果有人声称他们找到了解决方案,别信他们,他们没有。但是似乎有一些原则正在形成,可以带来更可预测的结果,即使这些结果离可靠还很远。

Texty

Texty 构建于 2025 年 1 月,当时当前形式的编码智能体还没成气候,它是我第一个完全靠“氛围编码”(vibe coded)的项目。我有阅读障碍,所以我的语法和拼写简直糟糕透顶。我想要一个简单的工具,能在我用来写文字的应用中工作:我的浏览器和移动应用。

Texty 所做的只是在任何获得焦点的文本编辑字段旁边显示一个小按钮。点击它,它就会提取文本,让你通过 LLM 检查拼写和语法,然后把修正后的文本放回字段中。我把它构建成了浏览器扩展Android 应用。Android 版本使用无障碍服务(Accessibility Service),因此它可以观察所有正在运行的应用,检查它们的 UI,并与 UI 组件交互。

我用了几个月,直到我受够了这个工作流程。它太繁琐了,而且无障碍服务让应用明显变慢。

构建 Texty 对我真正的益处在于,它是我初次尝试“智能体工程”(也就是让 LLM 掌舵)。在 Texty 之前,我只用 Cursor 进行 Tab 补全,有时用来重写函数。通过 Texty,我想看看在最少的人为干预下,LLM 能在构建项目上走多远。虽然我不得不手动修复一堆东西,但扩展和应用的简单性让 LLM 实际上成功构建了我想要的东西。我还没看过那极其复杂的无障碍服务 API,我希望我永远也不用看。

Hacking Claude Code

大约在四月份,我开始使用 Claude Code。我很好奇它是如何工作的。所以我做了任何理智的人都会做的事:我修补了二进制文件以禁用其反调试检查,通过 monkeypatch 修改 fetch 以拦截所有 API 调用,然后开始四处探索。

一些有趣的发现(针对当时的 Claude Code 版本):

  • Claude Code 使用 Haiku 来生成那些异想天开的“请稍候”小消息。为你。输入的。每一个。token。
  • 它还使用 Haiku 来检查 bash 命令是否包含注入攻击。一个 LLM 判断另一个 LLM 的输出是否危险。能出什么错呢?
  • /cost 命令对 Max 计划用户禁用,因为显然我们不需要知道数字。数字对我们不好。我也把它修补了。
  • 系统提示告诉 Claude 清理测试文件,这就解释了为什么它总是删除不该删除的东西。他们已经移除了那个。
  • 他们在不同的工具中三次添加了表情符号限制,因为大家都讨厌 LLM 到处插入表情符号。

我在两篇博文中详细记录了这些细节:cchistory:跟踪 Claude Code 系统提示和工具变更修补 Claude Code 以支持调试和 Max 用户的 /cost。我还建立了 cchistory.mariozechner.at,在那里你可以看到任何两个 Claude Code 版本的系统提示和工具定义之间的差异。

在 Claude Code 拥有钩子(hooks)和其他扩展特性之前,我构建了一堆工具来辅助我的工作流程:claude-trace 用于记录所有 API 请求并查看 Claude 隐藏的一切(系统提示、工具输出、原始 API 数据),claude-bridge 用于在 Claude Code 中使用其他 LLM 提供商,cc-antidebug 用于禁用反调试并为 Max 用户启用 /costcccost 用于精确的实时成本跟踪(剧情反转:你不能仅根据会话的 .jsonl 文件精确跟踪成本),以及 claude-notify 用于在 Claude 需要输入时获取系统通知。

此后我就放弃了 Claude Code,并编写了自己的编码智能体工具,在过去的几个月里它一直很好用。稍后会详细介绍。

Exploring and Abandoning MCP (探索并放弃 MCP)

我可能会失去我的黑客信誉,但我实际上喜欢用 VS Code 进行代码探索、查看差异和其他导航任务。在使用 Claude Code 时,我希望它能在处理事情时为我在 VS Code 中打开、高亮和比较文件。早在四月份,还没有 Claude Code 的 VS Code 扩展。当时让 Claude Code 与 VS Code 交互的唯一方法是构建一个 MCP 服务器。所以我构建了 vs-claude,一个集成了 MCP 服务器的 VS Code 扩展。这允许我机器上的任何 Claude 实例访问任何 VS Code 窗口、打开文件、高亮行和显示差异。效果还凑合。

构建那个扩展和相关的 MCP 服务器让我很好地掌握了可能实现的功能。所以自然地,我开始构建更多的 MCP 服务器,比如用于 Gmail 集成的 mailcp,综合考虑,这东西简直糟糕透顶。它基本上就是往智能体的上下文里拉了一堆 JSON。虽然它能工作,但绝对离理想状态相去甚远。

也是那个项目让我意识到,MCP 服务器的输出只能由 LLM 在其上下文中进行转换、过滤或组合。这简直太糟糕了,特别是与你通过 bash 工具链接多个命令所能实现的那种可组合性和上下文空间保留相比。

意识到这一点后,我开始编写更多 LLM 可以调用并通过 bash 轻松组合的 CLI 工具。最初的尝试是 lsp-cli,它使用语言服务器协议(Language Server Protocol)从代码库中提取符号信息。我在一个旧项目的基于智能体的工作流程中使用了它,效果相当不错。但这并不是 LLM 直接调用它。这是一个为 LLM 准备工作上下文的小 CLI。如果你想了解更多,请查看 提示即代码 这篇博文。

总的来说,我发现 LSP 服务器对 LLM 并没有那么大的帮助,无论是用于代码探索还是报告错误。我发现设置强制类型检查、linting 以及作为提交钩子一部分的其他检查,对于让智能体修复其错误要有效得多,而且不会用可能不相关的 LSP 诊断信息填满你的上下文窗口。

2025 年夏天,AI 社交媒体上到处都是关于 MCP 的讨论,这与我自己使用 MCP 和 CLI 工具的体验不符。这促使我去看看在当前一代智能体中,到底什么表现更好。我试图通过一个非常不科学的评估来进行数值评估。结果是:对于许多用例,特别是那些可组合性不起作用的用例,是 MCP 还是 CLI 并不那么重要。更重要的是,无论你使用什么工具,它都不会往你的上下文中拉一堆 token。由于 CLI 工具在创建、维护和调试方面要容易得多,我最终放弃了所有 MCP 服务器,并在 如果你不需要 MCP 会怎样? 中分享了我的结论。

我还构建了一堆 Google CLI 工具,这样我的智能体就可以访问 Gmail (gmcli)、日历 (gccli) 和云端硬盘 (gdcli),这完全取代了 mailcp 和我为这些用例编写的其他临时工具。

Yakety

Veo 3 生成的 Yakety 宣传材料

Peter 带我进入了通过语音指令控制编码智能体的奇妙世界。当我开始做这件事时,市场上已经有少数几个选择,比如 Whisperflow。但它们都需要 macOS 上极具侵入性的权限,比如键盘记录和永久访问你的音频输入设备。虽然我相信市场上现有的产品并非恶意,但它们将是从你那里窃取大量有用数据的绝佳载体。

所以我想,既然我有使用 Whisper 的经验,我就构建我自己的小语音转录应用。这就是 Yakety。它完全本地运行,你可以选择任何你想要的 Whisper 模型,而且它只在你按住热键时录音。按下 FN (macOS) 或 Right Ctrl (Windows),说话,松开,转录内容就会被粘贴到任何获得焦点的应用中。

我原本计划将其作为一个商业产品,采取一次付费、终身更新的策略,包括源代码。随着我被其他事情分心,这个想法渐渐淡去了。此后我也停止了在编码智能体工作中使用语音听写。大多数时候我需要指定文件路径和其他东西来构建上下文,而语音转录不太适合这种工作。而且,我打字很快。直到今天我还在使用 Yakety,但不是为了写代码。我主要用它来写作,比如这篇博文。这是我写这篇博文前一个半小时的 YouTube 视频

它像其他产品一样花哨吗?不。但我确切地知道它在做什么,而且从今天开始它是开源的,可能充满了代码腐烂(bitrot)。请享用!

VibeTunnel

呆子们

六月份的某个时候,Peter 邀请 Armin 和我去他在维也纳漂亮的公寓,我们计划在 24 小时内构建一个东西。最初我们不知道要做什么,所以我们就对着白板开始抛出想法。坚持下来的一个想法是:我们都希望能够随时随地通过手机控制 Claude Code,也就是我们当时都在用的编码智能体。市场上并没有类似的东西,无论是产品还是开源项目。所以我们想,如果我们三个人坐在一起 24 小时,有无数个 Clawd 为我们工作,这能有多难呢。于是 VibeTunnel 诞生了。

这整个事情就是一次临时的氛围编码实验。我们要像臭鼬工厂团队一样工作,给每个人分配项目的不同部分。细节很模糊,但我想 Armin 被分配了后端,Peter 被分配了一个专用的 macOS 应用,而我被分配了前端,这是我最不擅长的。当 Peter 和 Armin 在做他们各自的部分时,我拼凑了一个后端,这样我的前端就有东西可以用了,特别是终端流。Armin 自然是用 Rust 写后端,结果发现 Node.js 版本实际上效果更好。我们最终得到这一个能工作但基本上不可维护的科学怪人。

尽管如此,这是一个非常有趣的实验。我们三个人在现实生活中玩得很开心,因为我们通常只是在互联网上闲聊。在我们解散后,Peter 试图让 VibeTunnel 继续运行,把它变成了一个开源项目,但在那时这个项目可能太复杂了,没人能上手。Peter 此后创建了 Clawdis,它是 VibeTunnel 的一个更好的版本,直接集成了 WhatsApp 和其他聊天应用。它也是一艘宇宙飞船,我还没敢看它的仓库,但它看起来比 VibeTunnel 工作得好多了,至少对他来说是这样。

Sitegeist and Cellgeist

Sitegeist 使用 Google 搜索曲奇食谱,然后创建一个计算器(实时)

Claude for Chrome 试图做同样的事情

OpenAI Atlas 也失败了

十月份的某个时候,我开始开发一个名为 Sitegeist 的浏览器扩展。它的目的有两方面。首先,它是一个深度研究智能体,允许我通过直接使用 Google 和与网站交互来研究公司和个人,或者在网络上查找特定主题的信息。

它也是一个很棒的抓取伴侣,用于我不想自己写程序的一次性抓取。如果你喜欢,你也可以用它来购物,这是 Google 和所有其他公司总是演示的用例。我认为那是对技术的完全浪费。浏览器智能体有更好的用途。

相比 Chrome DevTools Protocol 或 Playwright 之类的东西,它的好处在于我能获得研究过程的完整追踪,所以我可以更容易地验证研究结果。Sitegeist 拥有完整的会话管理,所以如果你愿意,你可以回去继续一个研究会话。它还支持多提供商、多模型,所以你可以使用任何类型的模型。根据经验,Claude 模型到目前为止表现最好。

Sitegeist 还带有 artifact(工件),你可能从 Anthropic 的 Web UI 或 OpenAI 的 Canvas 功能中了解过。Sitegeist 可以创建内存中的 HTML、Markdown、Excel、PowerPoint、Word 文档等,我也可以下载这些文档。这让 Sitegeist 可以创建包含研究结果的交互式仪表板,我可以对其进行迭代。

为了更好地自动化你经常访问的网站,Sitegeist 配备了一个技能系统,Sitegeist 可以自己编写一堆 JavaScript,在页面上执行以完成某些事情。例如,在 Gmail 中写一封新邮件,在 Google Calendar 上添加日历条目,与 Google Sheets 交互等等。

在底层,Sitegeist 做了一堆有趣的事情来与网站交互。基本的要点是它编写 JavaScript 并在网站的上下文中执行。天真的版本只是将带有模型生成的代码的 script 标签硬塞进网站。问题在于,取决于网站的内容安全策略(CSP),这可能行得通也可能行不通。对于大多数热门网站,这根本行不通。替代方案是使用 user scripts,这是一个扩展 API,允许你在没有 CSP 限制的情况下将 JavaScript 注入页面。核选项是直接使用调试器。通过调试器,模型实际上可以访问网站中的一切,包括 HTTP-only cookies。我经常使用这个功能为有付费墙的网站编写爬虫。

当然,能力越大,通过提示注入进行数据窃取的风险也越大。仅仅在网站上放一些隐藏文本,并让模型将数据窃取到某个端点,这出奇地容易。配合调试器的访问权限,模型可以轻松窃取你的认证凭据和浏览器端的秘密。大型实验室的浏览器扩展都没有解决方案。我也没有。我做了一些实验,以更受控的方式隔离 JavaScript 执行环境(见 JailJS 博文)。最终,这也不能覆盖所有的攻击面。我个人认为 Anthropic 把 Claude for Chrome 放到普通人手中是一个非常糟糕的主意,特别是考虑到该模型似乎只能通过调试器与网站交互,这意味着该模型可能可以访问在网络上冒充普通人所需的所有秘密。

另一方面,我也没看到很多人真正使用浏览器智能体,因为让它们变得有用需要一些技术能力。所以也许伟大的提示注入和数据窃取危机之所以被避免,仅仅是因为这些智能体还不适合普通大众。

鉴于 Sitegeist 相比其他产品的表现要好得多,我最初计划将其商业化。但后来我意识到,对于普通人来说,我还得成为一个 token 网关。而对于技术人员来说,为这样一个工具要钱感觉不对。所以我可能会在几周后开源 Sitegeist,等我清理一下代码并将其切换到以 pi 作为底层智能体引擎的时候。

作为一个有趣的小实验,我还构建了 Cellgeist,它是完全相同的东西,只是生活在你的 Excel 里。

Cellgeist 在 Excel 中分析数据并创建图表

这个我也会开源,但它真的只是一个概念验证,而 Sitegeist 实际上已经相当健壮和有用了。

pi coding agent

pi 正在探索自己的代码库

Anthropic 不断给 Claude Code 添加功能,并且经常改动工具集和系统提示词。这严重干扰了我的工作流程,几个月来我变得越来越烦躁。所以我最终决定编写一个完全按照我想要的方式工作的小型编程代理。这意味着剥离所有我不需要且认为是反模式的东西。没有 MCP 支持,没有内置的子代理,没有计划模式,没有待办事项工具。我发现,如果你只给模型提供最基本的工具集:读取、写入、编辑、bash,它们实际上非常高效。除此之外的任何功能都应该是这个最小核心的扩展,而不是内置的东西。正如 Armin 所说,pi 是“黑客的开源选择”。它是可以无限扩展的,而无需触及核心本身,允许你创建完全不同的代理,比如 Peter 的 Clawdis,这是一个存在于你选择的聊天应用中并拥有计算机访问权限的个人代理。

虽然核心很小,但 pi 拥有你习惯的来自 Claude Code、Codex、Amp、opencode 或其他任何工具的所有舒适功能。只是你可以很容易地在其之上编写自己的功能,甚至可以自定义压缩。这也包括钩子(hooks)和自定义工具能够为 pi 提供自定义 UI,这是我在其他任何编程代理工具中都没见过的功能。

pi 还是多提供商和多模型的,所以你可以使用你的 GitHub Copilot 订阅、Claude Max 计划、Cerebras、OpenRouter、本地模型等等。你还可以在同一个会话中切换模型,这可能是一个好主意,也可能不是。它还包括成本跟踪,这是其他编程代理工具做得不好的地方。

我在 What I learned building a minimal LLM coding agent 一文中详细写了我如何以及为什么构建 pi,所以我不会在这里重复所有内容。自从我写了那篇博文以来,pi 收到了很多非常友善的人的第三方贡献。


我很高兴能借此重返开源游戏。在大家都睡着后的夜晚坐下来,在 GitHub 上与人合作,或者调整我发现的微小不足,这给我带来了巨大的快乐。在过去的两个月里,Pi 一直是我唯一的日常驱动工具。

Teaching My Linguist Wife Claude Code

我可爱的另一半 Steffi (@steedl.bsky.social) 是一名语言学家,通常用 Excel 手工进行数据分析。虽然她有一点技术背景(一点 HTML、JavaScript 和一些 Python),但她绝对不是程序员。当她写上一篇论文时,我在她身后看她在做什么,并意识到 Claude Code 可以帮她做一些工作。所以我们用了两个晚上的两个短时间段来教她使用 Claude Code。

她的研究项目涉及分析 32 位说话者的奥地利方言动词前缀,每位说话者有两种对话场景。她有装满 Excel 文件的文件夹,包含 18,000 多行语言注释。手动工作流程本来是:打开每个文件,将包含由分号分隔的四个值的一列拆分为四个单独的列,过滤掉标有星号的某些形式,然后按说话者和场景汇总结果。

相反,Claude Code 为每一步编写了 Python 脚本。一个脚本将所有 Excel 文件转换为具有正确分隔符的 CSV。另一个将注释列拆分为四列。第三个过滤掉不相关的形式并将它们写入单独的文件。然后是分析脚本,统计每位说话者和场景的语言现象的三个可能值,接着是比较场景和分析因素的汇总统计、聚类分析,最后是一个生成图表的可视化脚本。

这个工作流程的美妙之处在于可重复性。当我们发现 18,000 个数据点中有 10 个在源数据库中有错误时,她在云数据库中修正了它们,重新导出,然后只需重新运行这三个 Python 脚本。一切都会自动重新生成。她可以将原始数据和脚本作为补充材料附在论文中,任何人都可以重现她的结果。

我发现有趣的是,仅仅告诉她 Claude 可以为她写代码,她就很快对什么是可能的、什么是困难的产生了直觉。通过给她一些关于如何构建工作的建议(构建由小脚本组成的管道,这些脚本将文件作为输入并生成文件作为输出,以此馈送到下一个小程序),她几乎立刻就能自己使用 Claude Code 了。她无法判断 Claude 为她生成的 Python 代码。但她可以判断每个管道阶段的输出并验证其正确性。

这是代理的一个重复主题:它们只有在领域专家手中才真正有效。另一个重复主题是,领域专家还不知道这些工具如何真正帮助他们自动化可验证的任务,从而让他们有更多时间专注于实际工作。虽然与 Steffi 的实验在提高她的工作效率方面取得了巨大成功,但我仍然很难想出可以部署到更广泛的非技术领域专家受众的教学材料,以便他们也能从这些工具中受益。与每个人坐下来两个晚上不是一个可扩展的方法。我认为最大的问题是,每个领域专家在技术方面的基础知识是不同的。因此,当他们学习这些工具时,问题也会有所不同。这就需要一个非常个性化的导师来帮助他们。

视频是德语的:第一部分第二部分第三部分第四部分。代码在 GitHub 上。

Investigating Slop in the Wild

自从 ChatGPT 发布以来,我一直严厉批评那些不负责任地使用 LLM 或以实际有害的方式使用 LLM 的组织和公司。你可以在我的 two years in review 博文里读到一些。这类话题在社交媒体上很受欢迎,让我可以创建长线帖来解释 LLM 的不同方面及其使用,以及为什么某些用途不是好主意。在这些线帖的最后,我通常会为我们的协会募捐,这也解释了为什么我在这类“工作”上投入了这么多时间。以下是我过去一年做的一些有趣的小探索。

Austrian Media LLM Usage

Commander RaikaBluesky 上发布了一张截图,显示一篇 OE24 文章包含未经编辑的 ChatGPT 痕迹。这在我们行业里被称为“nerd sniping”(极客诱捕)。

奥地利报纸受到大量补贴,既有政府广告,也有直接资助。其中一个资助项目叫“数字转型基金”(Fonds Digitale Transformation),报纸可以提交粗制滥造的项目描述,阐述数字化工作,然后获得数千到数十万欧元。这些项目大多是胡扯。所以当我看到 Commander Raika 的截图时,我想这是一个调查这笔钱是如何花的好时机。这里有一个 OE24 的表格,显示了他们获得资助的一些“数字转型”项目。

那么,我该如何从数值上调查 OE24 是否使用 LLM 来撰写文章呢?我们已经有了直接证据,因为他们在在线文章中留下了 ChatGPT 输出的痕迹。但这可能只是报社的一个人搞砸了。我需要更多数据。

基本思路是这样的:LLM 喜欢到处插入长破折号(em-dashes)和短破折号(en-dashes)。假设是,在引入 ChatGPT 之后(加上技术真正进入新闻编辑室的一些时间),我们会看到破折号的使用随着时间的推移而增加。这种增加显然也可以由其他原因解释,例如更改了风格指南、新作者加入团队或 CMS 的更改。但是只要有足够的数据,我们或许能够区分这些原因。

所以我抓取了 OE24 的网站地图,下载了 2021 年到 2025 年每年 10 月的数千篇文章,并统计了按文章长度归一化的破折号数量。结果:2021-2024 年破折号使用稳定,然后在 2025 年激增。像购物、动物保护(Tierschutz)和生活方式等类别的文章从几乎没有破折号变成了满是破折号。

由于激增在各个类别中并不均匀,我认为这并不是风格指南或 CMS 更改导致的。他们也不太可能把这些类别的整个团队都换成写作风格中使用更多破折号的作者。所以我把这视为直接证据,表明至少对于这些类别,OE24 现在让 LLM 撰写文章。这有点道理,因为这是 LLM 擅长的内容,不一定需要人类介入。我制作了一个 YouTube 视频 并写了一个 Bluesky 线帖 解释整件事。

对于第二次调查,我的语言学家朋友 Jenia 加入了我。我们扩展到了 Exxpress、Heute、Krone 和 Falter。Falter 和 Krone 也显示出破折号使用量上升:

Falter

Krone

虽然我们的偏见会让我们认为这对 Krone 来说是意料之中的,但我们没想到 Falter 也会这样,因为它通常被认为是一份高质量的周刊。他们也开始使用 LLM 了吗?

不一定。许多 CMS 系统会自动将 <空格><连字符><空格> 转换为 <空格><短破折号><空格>。所以 CMS 更新可以解释这种模式。解决方案:差异分析。如果破折号上升而连字符按比例下降,那是 CMS 对现有内容进行查找和替换。如果破折号激增而连字符保持平稳,那是添加了新的大量使用破折号的内容,这意味着是 LLM 生成的。Falter 和 Krone 显示了 CMS 模式:

Falter

Krone

Exxpress、OE24 和 Heute 显示了 LLM 模式:

OE24

Heute

对于最终调查,我们加入了 Kurier 和 Kleine Zeitung。两者都显示在生活方式和娱乐等特定垂直领域选择性地采用 LLM,而硬新闻则保持人工撰写。

这与 RTR(奥地利监管局)的公共资助非常吻合。OE24 的母公司在 2024 年因“AI 图像识别/数据库/校正/创作”获得了 287,000 欧元。Heute 因“AI 支持的新闻业”获得了 140,876 欧元。奥地利纳税人资助了这些 AI 部署,但没有任何出版物向读者披露 LLM 的使用情况。

作为一个副产品,我现在拥有所有主要奥地利新闻网站的抓取工具。我正在努力将其转化为媒体监控工具和一个涵盖过去 30 天发布的所有新闻文章的公共搜索引擎。这是一个在 ZIB 2 采访后跨出版物追踪 Mahrer 报道的演示

在奥地利新闻网站上搜索 Mahrer 的报道

为了好玩,Jenia 和我让 Claude 写了一份包含所有图表和细节的完整方法论论文,如果你想深入研究的话。

fobizz School AI Tools

LLM 在学校和大学中现在已成为现实。这是好是坏还有待观察。政治决策者最喜欢把 AI 工具塞进学校,假装它们提高了一些编造的指标。我真的很讨厌这一点。我相信如果使用得当,LLM 实际上可以帮助学习。但我看到的实际情况只是盲目的 GPT 包装器,实际上阻碍了学习。

其中一个工具叫 fobizz,你应该一定要看看 Rainer Mühlhoff 和 Marte Henningsen 的这个 38C3 演讲。他们调查了 fobizz 的自动作业批改工具,发现它产生的成绩基本上是随机的。他们还采访了教师关于课堂上的 AI,并讨论了用科技工具解决教育中的社会问题是多么反乌托邦。德国的多个州已经为他们的所有教师购买了 fobizz 的许可,一些奥地利学校也在使用它。演讲是德语的,但非常值得一看。

我参加了 fobizz 自己的教师培训课程,并记录了我的发现。培训视频使用 AI 生成的画外音,假装是真人。像测验生成器和课程规划器这样的工具都有显眼的 PDF 下载按钮,鼓励教师直接使用输出而无需验证。几乎没有关于检查 LLM 输出正确性的警告。

他们声称在 GDPR 合规方面具有“最高安全标准,TÜV 认证”,但也告诉用户“请勿输入敏感数据”。他们的转录工具抓取 YouTube 和 Vimeo 视频,这违反了这两个平台的服务条款。他们建议教师使用来自未知创作者的随机自定义 GPT。

最离谱的是:历史人物角色扮演聊天机器人。包括一个 Sophie Scholl 机器人。当被问及“Welches Unrecht ist dir widerfahren?”(你遭遇了什么不公?)时,机器人回答“Mir persönlich ist kein Unrecht widerfahren”(我个人没有遭遇不公)。Sophie Scholl 被纳粹处决了。这就是学校用纳税人的钱买的东西。

从 2024 年 4 月到 2025 年 9 月,114 所奥地利学校参与了一个由 KF Uni Graz 提供“科学伴随”的 AI 工具试点项目。最终报告基本上就是一个美化的链接合集。我浏览了一遍,发现他们不加思考地推荐 fobizz(包括 Sophie Scholl 机器人),将 Perplexity 列为提供“基于事实的答案”,并包括像 LaLeTu 这样收集儿童完整 PII(姓名、生日、母语、性别)加上录音并发送到其服务器的工具。没有任何对这些工具的真正评估,没有指导教师如何在实践中评估它们。学校只能自己摸索。

Facial Recognition Hiring Paper

《经济学人》发表了一篇关于一篇论文的文章,该论文声称面部分析可以预测性格特征以用于招聘决策。文章读起来就像作者对这被用于生产环境的想法感到兴奋。我阅读了实际的论文,它在方法论上就是垃圾。

该论文试图通过引用遗传学研究来建立面部特征与性格特征之间的联系。但引用的论文只说性格特征部分是遗传的。它们并没有说你可以从面部特征推断出性格特征。作者随后建立在之前一篇论文的方法之上,该方法已经在 Cell 中被撕得粉碎,被称为“机器学习中伪科学的复活”。

数据来自 Revelio,一家使用 AI 生成大部分数据的公司。工资数据是模型生成的。“种族”分类是基于姓名和地点,加上图像识别。他们使用了一个在自我报告的性格特征上训练的模型,任何心理学家都会告诉你这是不可靠的。

该论文甚至承认其预测能力很弱(低 R²),但声称该方法是“新的”。稳健性检查简直可笑:他们在 28 名女性和 37 名男性身上测试了“平静”与“快乐”的面部表情,所有人的光线和发型都完全相同。没有任何现实世界条件的变化。

论文问“筛选掉那些面部预测出不太理想性格的人是否符合伦理”。这不是一个具有挑战性的问题,因为该方法行不通。具有挑战性的问题是,为什么像这样的伪科学会在《经济学人》这样的媒体上获得报道。这是披着 AI 新外衣的颅相学。

Other Investigations

政府聊天机器人:我使用 Sitegeist 查找并测试了奥地利政府网站上的聊天机器人。Kremsi (Kremsmünster) 是由 schorn.ai 构建的,很容易被越狱。其隐私政策声称仅在欧盟处理数据,但实际上托管在美国的 Vercel 上。它获得了一个行政奖。Feldi (Feldkirchen) 是由 AI Concierge 构建的,该公司也是 AMS Berufsinfomaten 的幕后公司。KLARA (Klagenfurt) 使用相同的平台。Telfer Copilot (Telfs) 托管在爱尔兰的 Azure 上,实际上可以阅读市议会记录,这真的很有用。我做了一个 YouTube 直播 展示整个过程。

Clinara 医疗转录:有人发帖提到 Clinara,一家向医生销售 AI 转录服务的奥地利初创公司。我通过用标准德语朗读一篇 Standard 文章来测试它,并分析了词错误率。基于 Whisper 的转录大约有 5-10% 的词错误率,这意味着每 100 个词中大约有 5-10 个是错的。对于医疗文档来说,这令人担忧。额外奖励:他们的网络应用从客户端发送系统提示词,所以我可以把他们的服务器当作免费的 GPT API 端点使用。

StoryOne 书籍生成器:FAZ 发表了一篇关于 StoryOne 的吹捧文章,这是一家声称用 AI 彻底改变非虚构类书籍写作的奥地利初创公司。我做了一个自测:给了它我的一篇博文,让它生成一本“基于事实”的书。结果是 75 页(其中 18 页为空白“用于排版”),尽管他们声称是“神经符号 AI”,但实际上没有事实丰富,只是幻觉般的 LinkedIn 垃圾内容。所有相关方都应该感到羞耻,包括 FAZ。

Other Notable Projects

Parliament Watch@alltagsprolet.at 问我是否可以建立某种东西来追踪谁缺席了议会会议。“给我 10 分钟,”我说。结果花了 2 小时。该网站抓取速记协议,并按党派和个别议员显示缺席排名。

Carinthian Honors Dashboard:Kathrin Stainer-Hämmerle 发帖说,克恩顿州每年颁发大约 50 个州级荣誉,但声称他们无法确定有多少颁给了女性。Armin Wolf 建议有人手动统计一下。我使用 Sitegeist 抓取了 3 年的荣誉数据,并让 LLM 根据名字分类性别。几小时内建立了一个仪表板

联盟协议泄露:2 月,有人泄露了 FPÖ/ÖVP 联盟谈判协议。我托管了这份 223 页的 PDF,以便人们可以自己阅读。然后一只小鸟也发给了我失败谈判中的 ÖVP/SPÖ/NEOS 协议。我公开了这两份文件并在 Wayback Machine 上进行了归档。Martin Thür 问是否有人能在两份文件之间找到相同的表述。我建议使用 LLM 比较主题相似的章节。

记者圈的反应很有趣。我收到了不少私信,祝贺我真的泄露了这个东西。其他人则很生气,因为这破坏了他们自己的报道。我甚至接到了一个著名的奥地利记者的电话,他想让我曝光我的消息来源。那很有趣。

WaveMind:我开始抓取奥地利音频新闻源并用 AI 进行转录。这始于 Falter Radio,我转录了所有追溯到 2023 年的 437 集。然后我添加了 Ö1 Journale、ORF 电视新闻、Dunkelkammer 和其他一些播客。一切都可以在转录级别上搜索,但在内部进行。内部进行是因为我不想被奥地利最大的广播公司起诉。它不仅仅是一个转录搜索引擎。它还允许你将搜索结果放入 Gemini 的上下文中,然后通过 LLM 询问转录内容。我确实给了一些记者访问权限。他们觉得这有点用。

Cremer Archive:Matthias Cremer 在 Der Standard 上有一个图片博客,通过图片记录奥地利政治。我抓取并归档了整个内容。这是一个不错的小项目,Matthias 送给了我他的书作为感谢。这让我很高兴。

Talks

Vienna Tech Soirée 小组讨论

2025 年是我恢复发表演讲的一年。从 2010 年到 2016 年,我经常参加会议,既为了我的开源工作,也为了我的赚钱工作。然后我停止了。真的很享受重新投入其中。

这始于 Vienna Tech Soirée 的邀请,我被要求顶替病得很重的 Peter Steinberger。这是一个与 Flask 和 Sentry 闻名的 Armin Ronacher 以及致力于 AMPNicolay Gerold 的小组讨论。小组的主题是“如何凭感觉编程(vibe code)赚到十亿美元”。有趣的是,我们这些小组成员实际上都不认为这已经是一回事了。如果你想看我出丑,YouTube 上有完整的小组讨论

那是一次愉快的经历,Andreas Klinger 和其他人组织得很好。小组讨论结束后,我与许多在此之前只在互联网上认识的人进行了有趣的讨论。

Peter 随后组织了维也纳第一次 Claude Code 匿名聚会,我把我的 Hacking Claude Code 博文变成了一个五分钟的演讲。活动在 Felix Krause 的 Context 办公室举行。一切都是临时的、凑合的,但我很喜欢。我又遇到了一些在此之前只在互联网上认识的人,还有像 Christian Cito 这样的老朋友,他在抓取杂货店信息方面是我的共犯。

我在格拉茨的 LLMs in Real Software 聚会上发表了同样的演讲。我又遇到了很多以前只在互联网上认识的人,还有一些感觉像是上一辈子的老同事。

我今年发表的最后一次演讲是在 Dynatrace 大厅举行的 GrazJS 聚会上关于 JailJS 和 Sitegeist 的。我这辈子都没想过会在 JavaScript 聚会上发表演讲,但我们还是去了。

在我们对奥地利报纸和 LLM 使用进行了一番小冒险之后,Jenia 和我决定做一个临时的两小时极客盛会,讨论语言学、计算和 LLM,名为 Bit & Babel。如果你没别的事可做,可以看看。

发表演讲需要致力于人们真正感兴趣的项目。我不确定明年是否还能做到这一点。今年是探索所有 AI 和代理编程工具领域的疯狂一年。所以有很多话要说。我觉得随着这一年接近尾声,这个领域发生的事情少了很多。至少没有那么多真正创新的东西。我也有点没主意了。走着瞧吧。

Workshops

GenAI Workshop 演示系统

2025 年也是我做更多研讨会的一年。2024 年,我创建了一个关于如何将 LLM 集成到你的程序中的研讨会。今年,我为普通人创建了一个生成式 AI 研讨会,解释 LLM 的来龙去脉、聊天界面等等。目标始终是灌输对黑盒内部实际发生情况的理解。这意味着研讨会实际上是对 LLM 及其工具机制的深入探究。参与者将学习 LLM 实际上是如何处理他们上传的 PDF 的,视觉是如何工作的以及有哪些限制等等。这基本上是一个去神秘化和现实核查,应该有助于参与者在使用这些工具时更有效,并了解它们的故障模式。

所有的课程材料基本上都是参与者可以使用的交互式演示。它在网络上,但你只能阅读材料。除非我给你一个密钥,否则你无法执行演示。这实际上是建立在 pi 之上的,使用了大量的 pi 代码。它甚至包括 artifacts 和 MCP 支持。我还做了一个 2.5 小时的研讨会直播(德语)。

Profil 和 Kurier 像优秀的奥地利人一样庆祝圣诞节

来自 Profil(奥地利周刊)的记者 Max Müller 问我是否愿意在他们的神圣大厅里举办这个研讨会。所以我去了。与调查记者一起研究这些材料并深入了解他们的日常工作,这非常有益。感谢 Max 给我这个机会。我从你身上学到了很多。

12 月,我还创建了一个代理编程研讨会,它部分基于更通用的 GenAI 研讨会,搭配了许多小演示和注意事项,而不是规定性的。这基本上是我过去一年经验的 3-4 小时浓缩版。我不声称有银弹,但我试图交流什么对我有效,什么无效。到目前为止,我已经在一个本地软件公司部署了这个研讨会。反响非常好。

希望 2026 年有更多的研讨会。

In Conclusion

像往常一样,今年的回顾有点长。相信我,如果我告诉你还可以塞进更多的东西。

我今年最大的收获是,我真的很享受在现实生活中与同行见面。对于 2026 年,我希望我能参加更多的聚会,结识更多有趣的人。

在学习方面,我对自己目前的电子知识水平感到非常高兴。我已经危险到可以制造出能杀死我的东西了,这太棒了。至于软件工程,我相信我跟上了代理编程领域的步伐,尽管我尽量不盲目跟风(drink too much of the Kool-Aid),并保持脚踏实地。

我的生产力通过 LLM 提高了吗?我其实不知道。与“两年回顾”相比,你会发现实际上并没有进行更多的项目。区别可能在于我今年从事的项目具有更深的技术深度。如果没有编程代理,我可能不会开始这类项目,仅仅因为没时间手工完成所有工作。

但这又只是一种感觉。我认为这就是今年的总体主题。一切都只是感觉(vibes)。

评论 (0)

请登录后发表评论

暂无评论,快来发表第一条评论吧!