Datasette 表视图重构、JSON 重新设计和?_extra=
本周继续,主要在这个正在进行的拉取请求和这个跟踪问题中。
我还编写了异常多的 TIL,这反映了我一直在深入研究的其他一些研究。
我将以一组带注释的 TIL 链接开始这些周记。
这个 TIL 实际上是几年前学到的:在我开始我的 TIL 网站之前很久,我在一个旧的 Gist中写了关于 SQLite 中分层 CTE 的笔记。我现在已经将其提升为一篇完整的文章。
TIL:在 Python 中使用 gtr-t5-large 计算嵌入
多年来,我一直想在自己的硬件上运行某种形式的语言模型……我终于找到了一个可行的!
gtr-t5-large不是一个完整的 GPT-3 风格的生成文本语言模型:它是一个嵌入模型,类似于我几周前描述的 OpenAI 嵌入 API。
但至关重要的是,它足够小,可以在 MacBook M2 上运行(也可能在功能较弱的机器上运行,但我还没有尝试过)。它生成的嵌入似乎为查找相似内容提供了非常好的结果,这正是我想要使用它们的目的。
TIL:在 MacBook M2 上运行 nanoGPT 生成可怕的莎士比亚
…更令人兴奋的是,我确实成功地训练并运行了一个 GPT 风格的生成语言模型!我使用了 Andrej Karpathy的 nanoGPT,它在 M2 上训练得非常好。我设法让它吐出一些可怕的莎士比亚,你可以在 TIL 中看到。
TIL 中未提及:我还尝试针对我博客的全文内容训练模型。这是我设法输出的一些文本:
Google 是一组软件,因为它看起来更进一步阅读,因为 PHP 对于 Linux 来说已经足够了,但我需要它比 Pingback 更适合我。我将提出一个关于新工具问题的背景想法(在小组时间可访问)。我正在获取一个网页,因为它在我的 HTML 中是一个很棒的网站。我已经完成了使用他们的鼠标手势的入口界面(完成)我还有更多的网站。
我的意思是,它完全是垃圾……但它确实有一点我的声音。
这是从头开始训练的,不是来自预先存在的语言模型。将其训练到可以输出有意义的句子的程度需要混合 TB 的文本和多年的训练。但是让一些东西起作用真是太酷了!
TIL:在 WebAssembly 沙箱中运行 Python 代码
这个 TIL 代表了我的另一个长期目标。
WebAssembly 最让我兴奋的是沙盒:我希望能够在我自己的硬件上安全地运行不受信任的代码——既供个人使用,也供我构建的服务器端 Web 应用程序之类的东西使用,这些应用程序可能想让用户根据自己的需求自定义它们自己的代码。
现在 WebAssembly 中有多个 Python 版本——我在我的Datasette Lite web 应用程序中使用了其中一个。但直到最近,我一直无法弄清楚如何使用 WebAssembly 库(例如wasmer-python或wasmtime-py或pywasm3 )在常规 Python 脚本内的沙箱中运行它们(令人沮丧的是,这三个库的文档不足) .
在我在几个不同的地方大声抱怨这有多么困难之后,Tim Bart 介入并使用wasmtime
和VMware 实验室发布的新 Python WASM 构建解决了这个例子。
有用!我的 TIL 显示了受该示例启发的我自己的版本。这有点不雅——特别是,你必须将标准输出和标准错误重定向到临时文件——但我现在至少有一种方法可以在沙箱中运行不受信任的 Python 代码,这是第一次。
TIL:使用 GitHub Actions 和 toot 构建 Mastodon 机器人
Twitter 宣布他们将终止所有免费机器人。几天后他们没有宣布,但那时我已经决定将我的机器人转移到 Mastodon。
https://fedi.simonwillison.net/@covidsewage是我的 Mastodon 机器人,它每天早上都会发布湾区部分地区最新 Covid 污水数量的屏幕截图。
我的 TIL 描述了我是如何使用预定的 GitHub 操作构建它的。我正准备为此构建一个新的微型 Python CLI 工具,但在检查 PyPI 上的可用名称时,我发现了toot ,它是我一直计划自己构建的工具的超集(我的推文图像实用程序的 Mastodon 版本。 )
这个就不多说了:和SQLite中select datetime('now')
有关。对于 TIL 格式,没有什么是太小了!
TIL:使用 -l 选项避免 Apache Bench 中的“长度”错误
另一个小的。我编写这样的 TIL 主要是为了确保当我(或其他任何人)将来通过谷歌搜索一条令人困惑的错误消息时,可以清楚地解释它的含义。
TIL: SQLite 中选择表达式中的子查询
这个要实质得多:我写了一篇关于我一直在 SQLite 中探索的模式的详细解释,它允许您在单个 SELECT 查询中取回一行和有限数量的相关行。如果您曾经使用过 Django 的prefetch_related ,您就会发现这个问题。
作为这项工作的一部分,我构建了一个小的 Datasette 插件,用于运行和显示explain query plan ...
的输出,值得一提……
数据集解释
本周只有一个新插件: datasette-explain ,它向 Datasette SQL 查询编辑页面添加了一项功能,该页面不断运行explain query plan ...
在您输入的查询上并显示结果。
这在一定程度上是一项实验,旨在了解 Datasette 在您键入查询时运行与查询相关的交互式代码的感觉。
这是动画 GIF 的演示:
该插件通过将您键入的 SQL 查询发送到后台的/db/-/explain
端点来工作。这个端点做了一些事情:
- 它运行
explain query plan ...
对您目前输入的查询。如果这返回一条错误消息(因为查询未完成或包含问题),则该消息将显示给最终用户。 - 如果没有错误,该解释的输出将显示在页面上。这变得非常有趣,因为查询涉及更多功能,例如前面描述的子查询选择表达式 – 此处的演示。
- 它还有一个小窍门:它运行一个
explain select ...
查询并使用该查询的结果来确定查询中引用了哪些 SQLite 表 – 然后获取这些表的完整列列表并将它们显示在页面也是如此。此处的目的是帮助提醒您在键入时查询或加入的表中有哪些列可用。
这个插件在很大程度上是一个 alpha:我不相信它能以正确的方式显示正确的数据。
我真的很喜欢错误检查模式——比解释输出、表格和列更喜欢。我很想将这样的实时错误检查引入 Datasette 核心。
值得强调的是,查询本身非常快——无论 SQL 查询多么复杂,运行explain query plan ...
都非常快。这就是为什么我目前不太想在输入查询时在页面上显示查询的完整结果。
…虽然,在某些时候,这可能值得在另一个原型中进行探索。 Datasette 有一个很好的机制来切断加载时间过长的查询,所以我可以尝试预览查询,但前提是它们可以在不到 100 毫秒左右的时间内运行。
无论如何,这是一个值得探索的有趣方向。
本周发布
- 数据集解释: 0.1a0 – 2023-02-09
在将 SQL 查询键入 Datasette 时解释和验证它们 - db-to-sqlite : 1.5 -(总共 17 个版本)- 2023-02-07
用于将表或查询从任何 SQL 数据库导出到 SQLite 文件的 CLI 工具 - shot-scraper : 1.1.1 -(共 26 个版本)- 2023-01-30
用于自动截取网站屏幕截图的命令行实用程序
原文: http://simonwillison.net/2023/Feb/9/weeknotes/#atom-everything