Notes from Simon Willison's Interview on Software Misadventures

Michael Lynch

西蒙·威利森在 Software Misadventures 访谈的笔记

我刚刚听完了Simon Willison(西蒙·威利森)在 Software Misadventures 播客上的访谈。我从这次访谈中学到了很多,所以整理了一份笔记。

这不是对整个访谈的总结,只是其中对我来说比较新、或是我想记住的部分。

西蒙·威利森在Software Misadventures 播客

西蒙·威利森是谁?

  • Python 最流行的 Web 框架 Django 的联合创始人之一。
  • Hacker News 上最受欢迎的独立博主之一。
  • 过去几年里,他的博客主要聚焦于 AI,尤其是 AI 技术在日常软件开发中的应用。
  • 目前正在开发一款名为 Datasette 的开源数据分析工具。

插件作为一种开源贡献形式

原讨论

  • 将应用设计为可接受扩展其功能的插件,是一种比接受开源贡献摩擦更小的协作方式。
    • 外部协作者无需你审核或批准即可添加功能,且你无需为他们的代码负责维护。

插件最棒的地方在于,它是一种构建开源项目的方式,你无需审核别人的代码就能为自己的项目增加功能。我可能某天早上醒来,发现我的软件就能做一件新事情了,因为有人为它发布了一个插件。

[编者注:我觉得这是一个很有意思的观察。我从未设计过支持插件的软件,但西蒙为这种架构提供了非常有说服力的理由。]

LLMs(大语言模型)

培养如何使用 LLMs 的直觉

原讨论

  • LLMs 看似容易使用,实则很难用好,因为其局限性并不明显。
    • 它们看起来简单,因为只是聊天机器人,但你需要在各种任务上使用数小时,才能培养出对它们能做什么、不能做什么的直觉。
    • 例如:LLMs 不擅长计数,鉴于计算机通常很擅长计数,这一点令人惊讶。
  • 西蒙推荐 Anthropic 的 prompt engineering(提示工程)文档,作为有效提升 LLMs 使用水平的方法。
  • 西蒙建议使用可自托管的模型(例如 Phi-3、LLama 3.1)进行学习,因为它们更频繁地产生幻觉和犯错,能让你更好地培养对 LLMs 不擅长领域的直觉。

西蒙如何使用 LLMs

原讨论

  • 总结信息
    • 利用长上下文窗口来加速研究。例如,要研究一个人时,将其维基百科页面、相关文章及其作品全部丢进对话中,然后让 LLM 总结关键主题并给出例子。
    • 要求提供直接引用,并核对原始来源以验证 LLM 没有幻觉出引用内容。

      如果我的一个朋友读了维基百科页面后能回答我的问题,那么我就知道 LLM 也能回答这个问题。但如果维基百科页面很可能不会涵盖这类内容,那么 LLM 能回答的可能性就比较小。

  • 在你具备专业知识的领域提问

    我会问它一些法律问题,比如我会粘贴服务条款然后说:“嘿,这里有没有看起来有点可疑的内容?”

    我很清楚这是一个糟糕的主意,因为我没有法律知识,对吧?所以我有点像是在跟它演戏、随声附和,但我绝不会基于从 LLM 获得的法律建议去做影响人生的决定,因为我不是律师。

    如果我是律师,我会一直使用它们,因为我可以依靠自己的专业知识来确保负责任地使用它们。

  • 编写 SQL 查询
    • 西蒙建议向 LLM 展示完整的表结构和几行示例数据。
  • 数据录入
    • 例如,从手写笔记中转录信息,或从非结构化文档中提取结构化数据
    • 最好的 LLMs 能达到约 95% 的准确率,这大致相当于雇佣一组人类实习生完成同样任务所能达到的水平。
  • 做出软件架构决策
    • 西蒙会让 LLMs 为同一任务提供多种方案,并逐一讨论各自的优缺点。
  • 阅读学术论文
    • 西蒙编写了一个名为 Dejargonizer 的工具来解释不熟悉的术语。
    • [编者注:我觉得这个工具更多是个有趣的点子,而非真正实用的工具。你需要粘贴文本,而我输入一篇 5 页的论文就耗尽了上下文限制。更合理的做法是将文本重写,并在行文中直接定义行话词汇。]

西蒙关于 LLMs 的“古怪实习生”心智模型

原讨论

  • 西蒙向妻子将 LLMs 描述为“他的古怪实习生”。

    就像有一个实习生,他……背下了每种编程语言的文档,却是个狂野的阴谋论者,有时会提出荒谬的想法,而且……极度自信。

  • LLM 相对于人类队友的一个主要优势在于,你可以不断要求它改进解决方案。
    • 与人类队友合作时,你最终不得不停止要求新的迭代,因为不断想出新点子来改进一个拉取请求会让人感到沮丧;但对于 LLM,你可以要求进行大规模重写,而无需担心浪费它的时间。
  • 西蒙发现,只要说一句“做得更好一点”,就能让 LLM 改进它的回答:

    我最喜欢的提示之一就是直接说“做得更好一点”,而且它真的有效。这太疯狂了!

    它会写一段代码,你说“做得更好一点”,它就会说“哦,抱歉”,然后吐出更好的代码,这项技术居然是这样运作的,愚蠢至极,但也挺有趣。

LLMs 让以往不值得投入精力的项目变得可行

原讨论

  • LLMs 对西蒙的主要影响之一是让他作为开发者变得更有雄心。
    • 以前,他想到一个项目,意识到最适合的实现语言是 AppleScript 或 Go,就会因为不懂这些语言而搁置想法。
    • 现在,他可以利用 LLMs 生成代码并验证其是否符合预期。
  • 他以前也可以学习这些技术,但 LLMs 将入门门槛降低到足以让这些项目的创建变得更切实可行:

    如果没有 LLMs,所有这些小项目都不会存在。不是因为我做不出来,而是因为我无法以足够快的速度完成它们来证明投入是值得的。

紧跟 LLM 的发展

原讨论

  • 最高质量的信息来自约 15 人的私有 WhatsApp 和 Discord 群组。
  • Twitter 上有不错的 AI 讨论。
    • Mastodon 则没有,因为它吸引的是 AI 怀疑论者。
  • 由于西蒙的博客,人们经常向他提供关于 LLM 新进展的有趣线索。

为什么 LLMs 不一定会用糟糕的代码污染世界

原讨论

  • LLMs 的弊端在于,一些作者自己都不理解的代码正在被投入生产。
    • 这对世界来说是一种风险,因为它意味着 LLMs 会降低整体软件质量。
  • 西蒙指出,世界上有大量运行的代码比 LLMs 生成的“糊状”代码还要糟糕:

    我们目前生活在一个世界里,半个世界都运行在没有单元测试、没有备份、没有版本控制的 Excel 电子表格上……任何人都可能搞乱一个公式,公司的估值一夜之间就会腰斩……

    这就是我们今天生活的世界,对吧?Excel 电子表格本身就有点像糊状物,但社会 somehow 仍在运转。

    所以,也许我们这些坚持“每一行代码都必须完美”的人是错的。也许糊状物才是前进的方向,但这有点可怕,你知道吗?

写博客

每天写一篇新的博文

原讨论

  • 西蒙尝试每天写一篇新的博文。
    • 灵感来自 Tom Scott(汤姆·斯科特),他坚持每周制作一个视频,长达 10 年。
    • 这激励西蒙每天去寻找有趣的事情。

时间投入

原讨论

  • 西蒙每天花 10-15 分钟写博客。
  • 由于已经坚持了 22 年,他现在能写得更快。

从博客到简报的流水线

原讨论

  • 西蒙有一个简报,其内容只是自上一期简报以来他博客上所有新增内容的差异:

    这是一种很好的方式,可以将内容推送给那些生活在电子邮件客户端中的人们。

  • 西蒙编写了一个 Observable 笔记本,它从他的博客拉取内容并将其转换为与 Substack 兼容的富文本。然后他从笔记本复制到 Substack 并发送简报。
  • 他有 6,000 名 Substack 订阅者。
  • 整个过程每期简报只需两分钟。

[编者注:西蒙没有提到这一点,但我认为他这种向 Substack 分发内容的方式会对 SEO 产生负面影响,因为它在不同 URL 上创建了相同内容的两个副本,Google 将无法判断哪一个是原件。]

[编者注:我也觉得惊讶的是,西蒙使用的是 Substack 域名,而不是 simonwillison.net 下的某个子域名,因为我认为 Substack 允许你使用自己的域名。]

博客基础设施

原讨论

  • 西蒙的主博客是一个运行在 Heroku 上的实例,前端以 Cloudflare 作为 CDN。

Cloudflare 最棒的地方在于,如果我遇到巨大的流量高峰,比如被 Hacker News 首页链接,我那台便宜又小巧的 Heroku 实例甚至都不会察觉,因为 Cloudflare 吸收了所有流量。

Bing 聊天事件

原讨论

把一切都变成 Github issue

原讨论

  • 西蒙将个人待办清单作为 Github issues 来维护。
  • 他维护着 250 个项目。
    • 他通过假装自己会忘记每一个细节来为这些项目编写文档。

      我可以回到一个一年没碰过的项目,像完全不了解这个项目一样阅读文档,然后开始工作。

  • 他也将设计文档写成 issues。

    我有一些超过一百条评论的 issue 讨论串,而且全都是我自己。就是我一个人在自言自语。

[编者注:这是一个令人惊讶的工作流程,因为它优化的是写入而非读取。当你想了解某个 issue 时,你被迫要阅读数百条评论,而不是阅读一条总结当前状态的评论。]

“时效性”文档与当前文档

原讨论

  • 西蒙认为软件有两种类型的文档。
    1. 说明软件当前功能的文档。
    2. 描述文档编写时软件功能的文档,但今天不一定准确(“时效性文档”)
  • Github issues 适合用作时效性文档。
    • 西蒙可以查看 issue 及其编写日期,以了解该文档在何时是准确的。
  • 对于必须与代码保持一致的文档,他将其作为 markdown 文件保存在与代码相同的仓库中,并确保代码更新时文档也会同步更新。

作为独立开发者的生活

原讨论

  • 西蒙第一次体验独立工作是在斯坦福获得为期一年的带薪研究员职位,从事 data journalism(数据新闻)工作时。

    那太棒了,也彻底把我“宠坏”了,因为他们付钱让我花一年时间去做我认为最有趣的事情。

    一旦你体验过那种自由,就很难再回到由别人来定义你要做什么的状态。所以基本上,问题就在于,我体验了一年的自由,然后我想:“我不想放弃这个。我在做这些事情时太开心了。”

时间管理

原讨论

  • 西蒙发现决定要做什么极其困难,因为相对于为雇主工作,几乎没有外部压力或问责。
    • AI 有太多有趣的领域可以探索,而且没有什么能阻止他永远探索下去。
  • 他有时希望自己有风险投资人,这样就有人能让他专注于目标。
  • 以会议驱动的开发
    • 西蒙会在会议前承诺按时完成功能,这迫使他在截止日期前优先完成实现。
  • 周记

迈向财务独立

原讨论

  • 西蒙渴望实现财务独立。
    • Eventbrite 在西蒙的创业公司仍在成长时收购了它,随后他在那里担任了六年的工程总监。
    • 他有“可观的资金储备”,但还没多到无需担心收入的程度。
    • 他正在寻求咨询机会来提供收入,直到 Datasette 产生足够的收入成为他的主要收入来源。

[编者注:整个访谈中让我最惊讶的是西蒙竟然还没有实现财务独立,因为我原本以为他已经实现了。]

Datasette 的目标

原讨论

  • 西蒙对 Datasette 的目标是让一名记者使用 Datasette 来为一篇赢得普利策奖的文章提供信息。
  • 他希望聘请一个团队与他一起从事这个项目,因为他觉得独自工作很孤独。
  • 他想效仿 WordPress 的模式,将代码开源,并通过提供托管服务来盈利。

使用 LLMs 进行数据新闻工作的挑战

原讨论

  • 所有主流的 LLMs 都会审查信息,这使得数据新闻工作更加困难。

如果你是一名记者,你处理的一些原始材料是很棘手的,对吧?它们是关于暴力事件的警方报告。是法西斯留言板……现在,如果你有一个帮助处理这些事情的 LLM,而你让它总结这个法西斯公告板上的主题,它会说“不”,对吧?

很多 LLMs 会直接拒绝处理这些内容,这……极大地限制了它们的有用性……

元信息:我如何创建这些笔记

我使用 yt-dlp 下载了访谈:

yt-dlp https://www.youtube.com/watch?v=6U_Zk_PZ6Kg

然后我使用 Whisper 生成了转录文本:

VIDEO_FILE="~/LLMs\ are\ weird,\ over-confident\ intern\ |\ Simon\ Willison\ (Datasette)\ \[6U_Zk_PZ6Kg].webm"
whisper $VIDEO_FILE

我的 NixOS 系统的 CUDA 配置莫名失效了,所以 Whisper 使用了我的 CPU,速度很慢且容易出错。我使用 Google Gemini 2.5 Pro Preview 来清理它:

Split this transcript into sections by topic.

Under each topic, write the timestamp that the section covers in the transcript.

Break groups of sentences into logical paragraphs under each heading.

Fix words that appear to be transcription errors, but don't editorialize or
change language.

```
1
00:00:00,000 --> 00:00:06,000
call it my weird intern. I'll say to my wife Natalie sometimes, hey so I got my weird intern

2
00:00:06,000 --> 00:00:10,800
to do this. And that works, right? It's a good mental model for these things as well because

[elided...]

```

Gemini 一次只能处理约 30 分钟的转录文本,之后就会耗尽输出 token,所以我不得不在指令末尾加上 Start at 00:26:26,240 来反复执行。

然后我将所有格式化后的转录文本汇总在一起。

这样就生成了一份组织良好的转录文本,例如:

### The Efficiency and Benefits of Consistent Blogging
(00:08:44,480 --> 00:11:24,800)

Well, that's the secret of blogging, is that it takes a lot of work at first,
but I've been blogging for 22 years...

然后我用以下提示将我的笔记喂给 Gemini 2.5 Pro:

Here is a transcript of an interview that's available on YouTube
at https://www.youtube.com/watch?v=6U_Zk_PZ6Kg:

```
SRT TRANSCRIPT GOES HERE
```

Here are  my notes about the interview:

```
MARKDOWN VERSION OF THIS BLOG POST GOES HERE
```

Reproduce the headers in my notes, but under each, include a link to the
original YouTube video that the transcript came from with a timestamped link
that points to that part of the conversation.

我想验证所有直接引用是否都准确,但找不到好的解决方案。我最初尝试提示 Gemini Pro 和 Flash 生成一条 ffmpeg 命令,将视频剪辑到仅包含引用部分,但它总是出错。我尝试了一种更保守的方法,要求它为每条引用附加带时间戳的 YouTube 链接,但总是偏差几分钟。最终我只是通过搜索 SRT 文件并跳转到视频中的对应位置来手动完成。在一个例子中,Gemini 完全改写了西蒙的措辞,但大多数情况下它对引用的处理是准确的。

链接

原文由 Michael Lynch 发布

本文章由 muse-spark-1.2-contributor 进行翻译