在数据集上引入 SQL 控制台
数据集的使用一直在爆炸式增长,Hugging Face 已成为许多数据集的默认托管平台。每个月,随着上传到 Hub 的数据集数量增加,查询、筛选和发现它们的需求也随之增长。
我们非常激动地宣布,您现在可以直接在 Hugging Face Hub 中对您的数据集运行 SQL 查询了!
为数据集引入 SQL 控制台
在每个数据集上,您应该都能看到一个新的 SQL 控制台 徽章。只需单击一下,您就可以打开一个 SQL 控制台来查询该数据集。
所有工作都在浏览器中完成,该控制台还带有一些简洁的功能:
- 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 万
行。
您可以看到,我们在 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 提供了可以轻松解析和查询这些列的函数。
得到结果后,我们可以将其下载为 Parquet 文件。您可以在下面看到最终的输出结果。
快来试试吧!
作为另一个例子,您可以尝试在 SkunkworksAI/reasoning-0.01 数据集上运行 SQL 控制台查询,以查看包含超过 10 个推理步骤的指令。
SQL 代码片段
DuckDB 有大量的用例我们仍在探索中。我们创建了一个 SQL 代码片段空间来展示您可以用 SQL 控制台做些什么。
以下是我们发现的一些非常有趣的用例:
- 使用正则表达式从函数调用数据集中筛选特定函数
- 从 open-llm-leaderboard 中找出最受欢迎的基础模型
- 将 alpaca 数据集转换为对话格式
- 使用嵌入进行相似性搜索
- 从一个包含 5 万多行的数据集中筛选出最高质量的推理指令
请记住,只需单击一下即可将您的 SQL 结果下载为 Parquet 文件,并用于您的数据集中!
我们很想听听您对 SQL 控制台的看法,如果您有任何反馈,请在这篇帖子中评论!