在数据集上引入 SQL 控制台

发布于 2024 年 9 月 17 日
在 GitHub 上更新

数据集的使用一直在爆炸式增长,Hugging Face 已成为许多数据集的默认托管平台。每个月,随着上传到 Hub 的数据集数量增加,查询、筛选和发现它们的需求也随之增长。

每月创建的数据集 每月在 Hugging Face Hub 上创建的数据集

我们非常激动地宣布,您现在可以直接在 Hugging Face Hub 中对您的数据集运行 SQL 查询了!

为数据集引入 SQL 控制台

在每个数据集上,您应该都能看到一个新的 SQL 控制台 徽章。只需单击一下,您就可以打开一个 SQL 控制台来查询该数据集。

查询 Magpie-Ultra 数据集,寻找优质的推理指令。

所有工作都在浏览器中完成,该控制台还带有一些简洁的功能:

  • 100% 本地运行:SQL 控制台由 DuckDB WASM 提供支持,因此您无需任何依赖项即可查询数据集。
  • 完整的 DuckDB 语法:DuckDB 支持完整的 SQL 语法,并内置了许多用于正则表达式、列表、JSON、嵌入等功能的函数。您会发现 DuckDB 的语法与 PostgreSQL 非常相似。
  • 导出结果:您可以将查询结果导出为 Parquet 格式。
  • 可分享:您可以通过链接分享公开数据集的查询结果。

工作原理

Parquet 转换

Hugging Face 上的大多数数据集都以 Parquet 格式存储,这是一种列式数据格式,针对性能和存储效率进行了优化。Hugging Face 上的数据集查看器和 SQL 控制台直接从数据集的 Parquet 文件加载数据。如果数据集是其他格式,前 5GB 的数据会自动转换为 Parquet 格式。您可以在数据集查看器 Parquet API 文档中找到有关 Parquet 转换过程的更多信息。

SQL 控制台使用 Parquet 文件,根据您的数据集拆分和配置为您创建可供查询的视图。

DuckDB WASM 🦆

DuckDB WASM 是驱动 SQL 控制台的引擎。它是一个在浏览器中通过 Web Assembly 运行的进程内数据库引擎。无需服务器或后端。

通过完全在浏览器中运行,它为用户提供了最大的灵活性,可以随心所欲地查询数据,而无需任何依赖。这也使得通过一个简单的链接分享可复现的结果变得非常简单。

您可能会问:“它对大型数据集也有效吗?” 答案是:“是的!”

这是一个对 OpenCo7/UpVoteWeb 数据集的查询,其 Parquet 转换文件有 1260 万行。

Reddit Movie Suggestions

您可以看到,我们在 3 秒内就收到了一个简单筛选查询的结果。

虽然查询时间会根据数据集的大小和查询的复杂性而变长,但您会对 SQL 控制台能做的事情感到惊讶。

与任何技术一样,它也有局限性。

  • SQL 控制台可以处理大量查询。然而,内存限制约为 3GB,因此可能会出现内存不足而无法处理查询的情况 (提示:尝试使用筛选器来减少您正在查询的数据量,并配合使用 LIMIT)。
  • 虽然 DuckDB WASM 非常强大,但它与 DuckDB 的功能并不完全相同。例如,DuckDB WASM 尚不支持使用 hf:// 协议来查询数据集

示例:将 Alpaca 数据集转换为对话格式

既然我们已经介绍了 SQL 控制台,让我们来看一个实际的例子。在微调大语言模型 (LLM) 时,您通常需要处理不同的数据格式。其中一种特别流行的格式是对话格式,即每行代表用户与模型之间的多轮对话。SQL 控制台可以帮助我们高效地将数据转换为这种格式。让我们看看如何使用 SQL 将 Alpaca 数据集转换为对话格式。

通常,开发人员会通过 Python 预处理步骤来完成这项任务,但我们可以展示如何使用 SQL 控制台在 30 秒内实现同样的效果。

在上方的数据集中,点击 SQL 控制台 徽章以打开 SQL 控制台。您应该会看到下面的查询被自动填充。

准备好后,点击 运行查询 按钮来执行查询。

SQL

-- Convert Alpaca format to Conversation format
WITH 
source_view AS (
  SELECT * FROM train  -- Change 'train' to your desired view name here
)
SELECT 
  [
    struct_pack(
      "from" := 'user',
      "value" := CASE 
                   WHEN input IS NOT NULL AND input != '' 
                   THEN instruction || '\n\n' || input
                   ELSE instruction
                 END
    ),
    struct_pack(
      "from" := 'assistant',
      "value" := output
    )
  ] AS conversation
FROM source_view
WHERE instruction IS NOT NULL 
AND output IS NOT NULL;

在查询中,我们使用 struct_pack 函数为每次对话创建一个新的 STRUCT 行。

DuckDB 提供了关于 STRUCT 数据类型函数的详尽文档。您会发现许多数据集的列中包含 JSON 数据。DuckDB 提供了可以轻松解析和查询这些列的函数。

Alpaca to Conversation

得到结果后,我们可以将其下载为 Parquet 文件。您可以在下面看到最终的输出结果。

快来试试吧!

作为另一个例子,您可以尝试在 SkunkworksAI/reasoning-0.01 数据集上运行 SQL 控制台查询,以查看包含超过 10 个推理步骤的指令。

SQL 代码片段

DuckDB 有大量的用例我们仍在探索中。我们创建了一个 SQL 代码片段空间来展示您可以用 SQL 控制台做些什么。

以下是我们发现的一些非常有趣的用例:

请记住,只需单击一下即可将您的 SQL 结果下载为 Parquet 文件,并用于您的数据集中!

我们很想听听您对 SQL 控制台的看法,如果您有任何反馈,请在这篇帖子中评论!

资源

社区

注册登录 以发表评论