Skip to content

数据整理 ​

通过画像、筛选与组合记录,为检索、评测与训练准备好数据集。

数据整理(curation)就是把一堆记录变成适合某个任务的数据集。可能是挑出带标注的样本用于训练,可能是准备一份固定的评测集,也可能是把检索语料里的重复文档去掉。

先从你需要的产出出发,然后看清源数据、决定哪些记录该进来,最后把选中的数据、或者产出它们的规则保存下来。

选择整理任务 ​

任务帮你决定什么
创建函数如何把你自己写的 Python(CPU、GPU 或打远程服务)作为 SQL 的一部分跑起来。
把密钥下发给函数绑定的 Secret 的值到底怎么到达运行中的 Function。
查看数据集如何用同一种方式查询表、HuggingFace 数据集或对象存储里的数据集,并免去单独的下载步骤直接导入。
记录切块如何把一条记录拆成多条——段落、片段或图块。
只处理变化部分如何只处理上次运行之后新增的行。
数据集画像覆盖率、缺失值与类别分布是否适合这个任务。
统计抽样该抽多大比例来查看或做实验。
选择性取样如何按 ID、行地址或偏移量重新取出特定行。
连接数据集如何把存在别处的标签、元数据或分数挂上来。
排名与去重当多条记录共享同一个显式 key 时,该留哪一条。
按索引分区聚类如何按向量邻近度分组,而不必训练新的聚类模型。
近重复去重当记录只是长得像、又没有共享 key 时,该把哪些合并成一条。

本节里的分析类示例用的是 Enterprise SQL,连接方式见 SQL 指南。如果只想在 LanceDB Embedded 或 Enterprise 里通过 Python SDK 随机取子集,见置乱(Permutation)。

准备一份带标注的文档数据集 ​

假设你的训练实验需要「一篇文档一条带标注的记录」。先看清源记录,为每篇文档选出最新版本,再把它对应的标签连接进来,最后检查选中记录的类别分布。

示例数据 ​

用 Enterprise SQL 客户端连接。这些示例用到一张小的文档表和一张单独的标签表,展开下面的设置步骤就能把它们建出来。

创建示例表

curation_documents 有六条记录,描述四篇文档。 curation_labels 里有三篇文档各一条标签。row_id 标识一条记录, doc_id 标识它描述的是哪篇文档。

请在一个临时数据库或命名空间里逐条执行这些语句。整节只建一次这两张表, 若已存在就用新的名字。

sql
CREATE TABLE curation_documents (
    row_id BIGINT, doc_id BIGINT, version BIGINT,
    source VARCHAR, caption VARCHAR, score DOUBLE
);
INSERT INTO curation_documents VALUES
    (1, 10, 1, 'web', NULL, 0.80),
    (2, 10, 2, 'web', 'A cat on a chair', 0.95),
    (3, 20, 1, 'books', 'A dog in a field', 0.90),
    (4, 30, 1, 'web', NULL, 0.70),
    (5, 30, 1, 'web', 'A cat by a window', 0.85),
    (6, 40, 1, 'books', 'A bird in a tree', 0.60);

CREATE TABLE curation_labels (doc_id BIGINT, label VARCHAR);
INSERT INTO curation_labels VALUES
    (10, 'cat'), (20, 'dog'), (30, 'cat');

score 是样本质量分,不是检索结果分。文档 10 有两个版本;文档 30 在同一版本上有两条记录;文档 40 没有标签。这几种情况刚好能让你看清每个操作的实际效果。

下面这条查询为每篇文档选出最新的一条记录,然后只保留有标签的文档:

sql
WITH ranked AS (
    SELECT *, row_number() OVER (
        PARTITION BY doc_id ORDER BY version DESC, row_id DESC
    ) AS rn
    FROM curation_documents
)
SELECT d.row_id, d.doc_id, d.caption, l.label
FROM ranked AS d
JOIN curation_labels AS l ON l.doc_id = d.doc_id
WHERE d.rn = 1
ORDER BY d.doc_id;

结果包含文档 10、20 和 30,标签分别是 cat、dog 和 cat。文档 40 因为本次任务要求必须有标签而被排除。row_id 这个并列裁决让文档 30 的选择结果确定下来;实际使用时请按你自己的数据选取合适的裁决字段。

这个示例假定每篇文档只有一条标签。标签表里若有重复 key,结果行会被乘出来。连接指南里讲了怎么检查这个假设。

检查选中的数据 ​

把结果和任务要求对照一遍:该在的文档在不在、必填字段有没有填、类别分布是否合适?这个示例里是两只猫一只狗。这个分布对探索来说也许够用,但不足以构成一个有代表性的评测集。

数据集画像能给出用于检查的计数。统计抽样与排名则能在不改动原始记录的前提下调整选择结果。

保存并复用结果 ​

按你后续的用法选择产出形式:

  • 一份固定数据集: 用 CREATE TABLE AS SELECT 把查询结果存进一张新表,在对比实验时保持这份产出不变。
  • 一套可复用的筛选规则: 把查询保存成视图。视图只存查询定义,所以它不是一份冻结的评测集。
  • 存下来但要刷新: 当物化视图支持的查询与刷新行为符合你的工作流时,用它。

把源版本与筛选规则和产出记录在一起。接下来可以看数据加载,把整理好的数据用进训练流水线。