外观
数据整理
通过画像、筛选与组合记录,为检索、评测与训练准备好数据集。
数据整理(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把查询结果存进一张新表,在对比实验时保持这份产出不变。 - 一套可复用的筛选规则: 把查询保存成视图。视图只存查询定义,所以它不是一份冻结的评测集。
- 存下来但要刷新: 当物化视图支持的查询与刷新行为符合你的工作流时,用它。
把源版本与筛选规则和产出记录在一起。接下来可以看数据加载,把整理好的数据用进训练流水线。