建立 AI 语料库时,除了文本,还要能回答来源在哪里、能否使用、如何找回原文。下面把教学文本写成 JSONL,保存来源、许可状态和基于文本内容的稳定编号,并拦截空文本与未知使用状态。
环境与运行方法
本文代码在 Windows、Python 3.11 的本地独立环境执行通过。以下数据全部为人为构造的教学样本,不是客户数据,也不是业务效果测试。

新建一个空目录,在终端执行安装命令,把后面的完整代码保存为 demo.py,再执行 python demo.py。文件输出均保存在运行目录,请先在空目录练习。
python --version # 本例只使用 Python 标准库
先定义最小记录结构
每条记录包含 text、source、license_status 和 text_id。source 可以是内部文件路径或已获授权的公开链接;license_status 由实际材料使用依据核实,不能让模型自动猜“公开就可训练”。本例的文本是自行编造,状态统一设为 self_authored。
text_id 对 strip 后的文本 UTF-8 字节计算 SHA-256。同样的规范化字节得到同一编号;如果你改变规范化规则,编号也可能变化,因此规则版本要另行保存。内容编号不等于整条元数据记录编号,同一文本有多个来源时还应保留来源关系。
先校验,再写成逐行 JSON
代码严格拒绝空文本及许可状态未知的材料,再给通过核对的两条教学文本生成编号。每行单独用 json.dumps 序列化;不能在同一个文件连续 dump 多个对象后声称它是一个标准 JSON 数组。JSONL 的读取方式是一行一个 JSON 对象。
教学程序只输出合格记录;正式语料应把被拒绝的材料另存到受控复核表,保留来源和拒绝理由。数据规模很大时逐条写入,避免把整个语料都装进内存。
可复制的完整代码
import json, hashlib
from pathlib import Path
raw = [{"text": "模型训练需要可靠标签", "source": "synthetic:a", "license_status": "self_authored"},
{"text": "检索回答应保留证据", "source": "synthetic:b", "license_status": "self_authored"},
{"text": " ", "source": "synthetic:c", "license_status": "self_authored"},
{"text": "待核实的文本", "source": "synthetic:d", "license_status": "unknown"}]
accepted, rejected = [], []
for row in raw:
text = row["text"].strip()
if not text or row["license_status"] == "unknown":
rejected.append({"source": row["source"], "reason": "empty_text" if not text else "license_unverified"})
continue
accepted.append({**row, "text": text, "text_id": hashlib.sha256(text.encode("utf8")).hexdigest()})
path = Path("toy_corpus.jsonl")
path.write_text("".join(json.dumps(row, ensure_ascii=False) + "\n" for row in accepted), encoding="utf8")
loaded = [json.loads(line) for line in path.read_text(encoding="utf8").splitlines()]
assert loaded == accepted and len(loaded) == 2
assert all(len(row["text_id"]) == 64 for row in loaded)
print("accepted", len(accepted), "rejected", len(rejected))
print("rejected_reasons", [row["reason"] for row in rejected])
print("jsonl_roundtrip", loaded == accepted)
运行结果与核对方法
下面是本文教学代码在上述本地环境中的实际输出。浮点数末位可能随依赖版本变化。
accepted 2 rejected 2
rejected_reasons ['empty_text', 'license_unverified']
jsonl_roundtrip True
打开 toy_corpus.jsonl,应有两行可独立解析的 JSON,每行含 text、source、license_status、64位 text_id。输出显示空文本和许可未核实的两条被拒绝;读回结果须与保存前的两条记录完全一致。
使用边界与常见问题
本例只使用自写教学文本,没有核实任何真实网站的训练授权,也没有建立可公开传播的实际语料库。正式使用要逐来源保存真实使用依据,不能仅把许可字段填成允许。
只有哈希值,能找回文本吗?
不能从哈希逆推出原文。它是核对指纹,必须与原文或可访问的来源记录一起保存。语料文本修改后也要保留旧版与变更说明。
官方资料
接口与参数依据以下官方资料核对(2026年10月1日)。示例验证只覆盖本文输入和步骤。
Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/30731.html