wikiHow起诉OpenAI背后:训练数据版权与合规的工程应对
2026/9/24 22:27:06 网站建设 项目流程

ChatGPT 越来越像一个“什么都会做”的智能助手,修水管、搭帐篷、煮饭、写简历,只要你能把问题描述清楚,它就能给出有条理的操作步骤。但很少有人会在这种顺畅体验背后追问一句:它这些“手把手”的能力,究竟是从哪里学来的?

wikiHow 起诉 OpenAI 这件事,恰好把这层幕布撕开了一个口子。wikiHow 是全球知名的“How-to”内容网站,站内文章以步骤化、结构化、强指令性著称,是搜索引擎结果页里的常客。它的运营商联合多家版权方,指控 OpenAI 未经授权使用其文章语料训练 GPT 系列模型。这起诉讼表面上是版权纠纷,但放在大模型行业看,真正触碰到的是整个 AI 产业的地基:高质量文本数据从哪里来、能不能合法来、来了之后算不算“复制”。

技术圈对这件事的反应很容易分成两派:一派讨论合理使用和侵权边界,另一派觉得“AI 学习就像人读书,不该被算作抄袭”。但站在技术开发者的角度,更有价值的视角不是急着站队,而是看清事件背后三个层次的真实问题:大模型训练数据里为什么必然包含 wikiHow 这类站点?模型训练完之后,原始文本在参数里到底留下了什么?数据工程师和 AI 应用团队能不能在现有工具链里提前规避这类版权风险?

这篇文章会先梳理事件本身,然后从预训练原理和数据管线角度拆解“训练数据为什么值钱”,最后给出可落地的数据集版权自查方法,以及普通开发者在 API 调用和 RAG 应用里应该注意的边界。我们不讨论法律判决,只谈技术事实和工程应对。

1. 事件很热,但技术人的关注点不该只在诉讼本身

wikiHow 起诉 OpenAI 的消息传出后,不少人的第一反应是“又一个内容平台来维权了”。这确实不是第一起,也不会是最后一起。在此之前,新闻机构、图片库、代码托管平台、作家团体都已经对 AI 公司发起过类似的诉讼或抗议。但 wikiHow 的案例有一个特殊性:它代表的不是新闻或小说,而是“程序性操作文本”。

这类文本的特点是:目标明确、步骤清晰、语气稳定、语义密度高。比如“如何更换汽车机油”“如何清理厨房下水道”“如何给简历写自我介绍”,每一篇 wikiHow 文章都在告诉读者“按顺序做哪几步”。这种文本对训练模型来说非常宝贵,因为它天然接近“指令—操作—结果”的结构,和模型需要学习的 instruction following 能力高度吻合。

但技术人的关注点不能只停留在“谁告了谁”的新闻层。真正值得思考的是,为什么版权方敢在 AI 模型已经训练完成的阶段发起诉讼?如果模型训练阶段使用了受版权保护的文本,而这部分文本已经变成模型权重里不可拆解的统计信息,那么法律上如何定性、技术上如何举证、工程上如何防范,才是后续所有大模型团队都要面对的问题。

更实际的一层是:如果你在公司里负责数据采集、数据集构建、模型微调,或者正在做基于 GPT 的知识库问答系统,那这起诉讼就不是遥远的新闻,而是可能直接影响你工作流程的“风险信号”。本文适合大模型训练工程师、数据算法工程师、AI 产品负责人和对版权问题敏感的开发者阅读。读完你可以知道:你的数据管线里是否有版权隐患,以及如何用现有工具把风险降到可解释、可追溯的程度。

2. wikiHow 的文本为什么会被选进 GPT 训练语料

先看 wikiHow 是什么。它本质上是一个“如何做任何事”的维基类网站,内容由专业编辑、社区作者和志愿者共同创建,每篇文章以步骤列表为核心,配有示意图和说明文字。和百科词条不同,wikiHow 文章的落脚点不是“某个概念是什么”,而是“某件事怎么做”。这种内容在互联网上属于典型的高质量长尾知识。

从大模型预训练的角度看,GPT 系列模型的训练语料主要来自大规模互联网抓取。业内最常提到的公开数据源是 Common Crawl,它定期对整个公网页面进行抓取并开放快照。从技术逻辑上讲,一个在搜索引擎里长期排名靠前、页面结构稳定、内容更新频繁的高权重站点,几乎必然出现在 Common Crawl 的历史快照里。wikiHow 就是这样一类站点。

那“用 wikiHow 的文章训练 GPT”到底是什么意思?需要澄清一个常见误解:模型训练不是把文本原样存入数据库,而是通过反复的梯度下降,从海量文本中提取统计规律,再把规律压缩成参数。比如模型读了一万篇“如何换轮胎”的教程,它学到的不是一个文本副本,而是“换轮胎时大概率要经历哪几个步骤、每一步通常涉及什么工具、什么情况下需要警告读者”这种深层模式。

所以,“模型使用了某网站文本”和“模型能背出该网站的某篇文章”是两个层级完全不同的事情。前者是训练语料层面的问题,后者是模型记忆层面的问题。绝大多数训练文本并不会被模型逐字记住,只有那些出现频率极高、文本模式非常独特的片段,才有可能在模型输出中被完整复现。但训练语料里有没有包含某类文本,直接决定了模型在某类任务上的能力上限。

这就带来了一个微妙的技术与法律交汇点:文章被用于训练后,模型确实“学到了”其中的知识模式,但很难证明某条具体输出直接来自某一篇文章。版权方看到的是“你没经过我同意用了我的东西”,模型方看到的是“我学的是知识而非复制品”。这个分歧恰恰是诉讼中最难用技术手段裁决的部分。

3. 争议的核心:合理使用、授权边界与训练记忆

把版权争议拆开看,双方围绕的核心无非三个:使用行为、复制程度、商业影响。

版权方的主张有一条清晰的逻辑链:OpenAI 在构建训练数据集时,从公开互联网抓取了包含 wikiHow 文章的页面;“抓取并用于模型训练”本身是一种复制行为;模型在训练后形成的输出能力,让 OpenAI 的商业产品获得了收益;这种收益没有回报给原始内容创作者。所以他们要求的不只是“停止使用”,还包括赔偿和内容溯源。

OpenAI 这类公司可能的抗辩角度是“合理使用”(fair use)。这个法律概念的核心判断标准包括:使用的目的和性质是否具有转换性、原作品的性质、使用部分占原作品的比例、使用行为对原作品市场的影响。OpenAI 可以说,模型训练不是简单复制,而是从文本中提取统计特征,属于转换性使用;而且模型并不会替代 wikiHow 网站本身,用户不会因为用了 ChatGPT 就不去看 wikiHow。这套逻辑在部分司法辖区有支持先例,但远未形成共识。

技术侧的困难更加现实。训练后的模型是一个巨大的参数矩阵,不存在一张“数据来源登记表”可以精确指出第 5832 层的某个权重来自 wikiHow 的某一句话。如果你想通过“手术”精确删除模型中学到的某部分知识,当前学术界的共识是:可靠的知识卸载(knowledge unlearning)仍处于研究阶段,还没有能在生产级大模型上稳定运行的通用方案。

所以在工程上比较务实的思路,不是在训练完成后“清洗记忆”,而是在训练数据进入语料库之前,就建立来源黑白名单和相似度筛查机制。这既是数据工程质量问题,也是版权风险控制问题。下面会从预训练数据管线的角度具体展开。

4. 从训练原理看,为什么知识型“步骤文本”如此重要

要理解 wikiHow 这类文本为什么会被“盯上”,需要先理解 GPT 预训练的一个基本原理:预测下一个 token。

GPT 类模型在预训练阶段做的事情,本质上是从海量文本中学出一个概率分布——给定前文,下一个最可能出现的 token 是什么。看起来很简单,但当语料规模达到数千亿 token 时,模型会从这种“看似只是预测”的任务里学出语法、事实、逻辑链、指令跟随等多种能力。业内有一个共识:预训练语言模型的能力上限,很大程度上由训练语料的质量上限决定。模型参数规模再大,如果喂进去的文本质量差,最终效果也会被数据拖住。

wikiHow 类文本在语料中天然属于高质量样本。它有以下特征:

  • 指令结构明确。每篇文章围绕一个用户意图展开,标题本身就是 Query 的等价表达。
  • 步骤逻辑清晰。文章给出可验证的先后顺序,模型能学到“先做什么、后做什么”的因果链条。
  • 语言风格规整。文本经过编辑审校,无语病、少冗余,适合模型学习稳定的语言模式。
  • 覆盖长尾场景。从家居到数码,从职场到心理,内容覆盖面广,能显著提升模型的常识广度。

这就解释了为什么很多人在用 ChatGPT 时,会觉得它“很会教人做事”。当你问“WiFi 信号差怎么办”,它的回答往往是一二三步排查——先检查路由器,再换信道,再考虑位置调整。这种结构化回答风格,不能说完全来自 wikiHow,但知识型步骤文本在训练语料中的存在,确实是塑造这类能力的重要力量。

在实际落地层面,预训练数据管线通常包含这几个阶段:网页抓取、正文抽取、语言过滤、质量过滤、去重、安全过滤、混合采样,最后进入 tokenizer 和训练流程。每一道过滤都在为“到底让哪些文本进入模型”做选择。对于版权风险而言,最可控的介入点就在“网页抓取”和“质量过滤”这两步。

下面给出一个可以在本地直接运行的 Python 示例,演示如何通过 URL 黑名单和站点许可信息,对数据集做版权风险前置筛查。

5. 实操:建立数据版权风险自查的数据管线

这里不去评判 wikiHow 诉讼的是非,只从工程实际出发:如果你在构建自己的数据集,或者公司内部正在做垂直领域模型微调,你应该怎么把类似 wikiHow 这样的风险站点挡在训练语料之外。

5.1 第一步:URL 来源过滤

最直接的做法是建立域名黑名单,在处理每个文本样本时,检查它的来源 URL。

# 文件路径:data_audit/url_filter.py import urllib.parse from pathlib import Path # 风险域名列表,按需维护 BLOCKED_DOMAINS = { "wikihow.com", "www.wikihow.com", # 其他法律风险较高或未授权站点,可在生产环境动态加载 } def should_keep_url(url: str) -> bool: """ 判断一条原始文本的 URL 是否允许进入训练语料。 返回 True 表示保留,False 表示丢弃。 """ if not url: return False try: domain = urllib.parse.urlparse(url).netloc.lower() except ValueError: return False if domain.startswith("www."): domain = domain[4:] return domain not in BLOCKED_DOMAINS def filter_jsonl_dataset(input_path: str, output_path: str) -> None: """ 过滤 JSONL 格式的数据集,每条数据需包含 "url" 和 "text" 字段。 示例输入: {"url": "https://www.wikihow.com/Fix-WiFi", "text": "Steps ..."} """ import json from pathlib import Path kept_count = 0 blocked_count = 0 with open(input_path, "r", encoding="utf-8") as fin, \ open(output_path, "w", encoding="utf-8") as fout: for line in fin: line = line.strip() if not line: continue obj = json.loads(line) url = obj.get("url", "") if should_keep_url(url): fout.write(line + "\n") kept_count += 1 else: blocked_count += 1 print(f"处理完成:保留 {kept_count} 条,过滤 {blocked_count} 条") if __name__ == "__main__": filter_jsonl_dataset("raw_dataset.jsonl", "filtered_dataset.jsonl")

这段代码的逻辑很简单:遍历数据集,读取每条样本的 URL,判断域名是否命中黑名单,命中就过滤,否则保留。很多公开数据集,例如从 Common Crawl 衍生出的清洗版本,原始 JSONL 里通常会保留 URL 字段。拿到数据后先做这一步,属于成本最低的合规动作。

运行方式:

python data_audit/url_filter.py

预期输出类似:

处理完成:保留 240000 条,过滤 3580 条

如果你没有现成的 JSONL 文件,也可以先跑一遍“URL 收集脚本”,从自己的爬虫日志里统计域名分布,再决定黑名单范围。

5.2 第二步:robots 协议与元数据许可检查

除了域名黑名单,还可以检查目标站点是否通过 robots.txt 或页面元数据声明了内容使用限制。虽然 robots.txt 在多数司法辖区不直接等同于法律授权,但它可以作为一个重要信号,帮你判断网站运营方的态度。

# 文件路径:data_audit/robots_check.py from urllib.robotparser import RobotFileParser def check_robots(domain: str, user_agent: str = "*") -> bool: """ 检查该域名是否允许指定 UA 抓取页面。 返回 True 表示允许,False 表示禁止或无法判断。 """ rp = RobotFileParser() rp.set_url(f"https://{domain}/robots.txt") try: rp.read() return rp.can_fetch(user_agent, f"https://{domain}/") except Exception as e: print(f"读取 robots.txt 失败:{domain},原因:{e}") return False if __name__ == "__main__": test_domains = ["wikihow.com", "wikipedia.org"] for domain in test_domains: result = check_robots(domain) print(f"{domain} -> {'允许抓取' if result else '禁止抓取或不可判断'}")

这里需要注意,robots.txt 只能作为辅助判断。很多允许搜索引擎抓取的站点,并不代表允许 AI 公司将其内容用于模型训练。所以不要只靠这一步做合规结论,更合理的做法是把 robots 状态、站点协议、版权说明汇总成一张数据源评估表。

5.3 第三步:文本指纹近似去重

URL 黑名单只能挡住已知站点。如果你的语料来自二手数据集,或者经过多轮清洗,原始 URL 已经丢失,那就需要用文本相似度手段找出“疑似来自同一来源”的内容。

下面用标准库实现一个简易的 Jaccard 文本指纹去重示例,不依赖第三方库:

# 文件路径:data_audit/shingle_dedup.py import hashlib import re from collections import defaultdict def tokenize(text: str) -> list: """将文本切分为小写 token 序列。""" return re.findall(r"[a-z0-9\u4e00-\u9fff]+", text.lower()) def shingles(tokens: list, k: int = 5): """生成 k-shingle,即长度为 k 的连续 token 片段。""" for i in range(len(tokens) - k + 1): yield tuple(tokens[i:i + k]) def jaccard_similarity(set_a: set, set_b: set) -> float: if not set_a and not set_b: return 1.0 return len(set_a & set_b) / len(set_a | set_b) def dedup_dataset(documents: list, threshold: float = 0.7): """ documents: list of {"id": str, "text": str} threshold: 相似度阈值,超过则视为重复,保留第一个。 """ seen = [] duplicate_ids = [] for doc in documents: tokens = tokenize(doc["text"]) doc_shingles = set(shingles(tokens, k=5)) is_dup = False for existing_set in seen: sim = jaccard_similarity(doc_shingles, existing_set) if sim >= threshold: duplicate_ids.append(doc["id"]) is_dup = True break if not is_dup: seen.append(doc_shingles) return { "duplicate_ids": duplicate_ids, "kept_count": len(documents) - len(duplicate_ids), } if __name__ == "__main__": docs = [ {"id": "doc_1", "text": "更换汽车机油需要先准备好机油滤芯和扳手。将车辆抬起后,拧下放油螺栓。放掉旧机油后更换滤芯。最后加注新机油。"}, {"id": "doc_2", "text": "更换汽车机油时,先准备机油滤芯和扳手。抬起车辆,拧下放油螺栓。旧机油放掉后,更换滤芯并加注新机油。"}, {"id": "doc_3", "text": "今天天气很好,适合去公园散步。带上水和零食,注意防晒。"}, ] result = dedup_dataset(docs, threshold=0.6) print(result)

这个简易版本适合小规模数据集演示。生产环境下,面对千万级文本,建议使用 MinHash 配合 LSH(局部敏感哈希)做近似去重,可以显著降低计算开销。当前主流的数据清洗开源工具链也会内置类似功能,不一定需要从零实现。

5.4 第四步:向量检索采样自查

如果数据集的原始 URL 已经丢失,又需要更精确地判断“某些文本是不是来自某个站点”,可以借助向量检索做抽样自查。思路是:把已知风险站点的代表性文章切成段落,用 embedding 模型向量化,再对数据集文本做向量检索,找出语义高度相似的内容。

# 文件路径:data_audit/embedding_sampling.py # 伪代码:请结合实际使用的 embedding API 或本地模型接入 from typing import List def embed_texts(texts: List[str]) -> List[List[float]]: # 这里接入你的 embedding 服务或本地模型 # 返回每个文本对应的向量 raise NotImplementedError def build_risk_index(risk_texts: List[str]): """将风险站点文本向量化,构建索引,例如 FAISS。""" risk_vectors = embed_texts(risk_texts) # 使用 faiss.IndexFlatIP 或其他向量库建立索引 return risk_vectors def sample_check(candidate_docs: List[str], risk_vectors, top_k: int = 5): """对候选文档做向量检索,输出相似度最高的风险段落。""" # 对候选文档逐条向量化,与 risk_vectors 做相似度计算 pass

向量检索的价值不在 100% 覆盖率,而在于“抽样发现盲区”。特别是团队做数据审计时,先用向量检索抽几百条人工看,往往能发现 URL 黑名单覆盖不到的问题,比如二手转载、镜像站、内容拼接等。

6. 对普通开发者和 AI 应用团队的落地影响

wikiHow 起诉 OpenAI 看起来是模型厂商和内容平台之间的战争,但涟漪一定会扩散到普通开发者,尤其是以下三类人。

第一类是直接调用 OpenAI API 做产品的人。你不需要自己训练模型,但如果你在产品里使用了未经授权的第三方内容,比如把某本电子书全文灌进知识库,再通过 API 生成答案,风险并不会因为“用的是别人训练好的模型”而消失。OpenAI 的官方条款通常要求用户确保输入内容没有侵犯第三方权利。对应用层开发者来说,最稳妥的做法不是依赖模型厂商兜底,而是自己做好内容来源管理。

第二类是在做企业级 RAG(检索增强生成)应用的团队。RAG 的核心思路是把外部知识检索出来,拼进 Prompt,再让模型基于这些信息生成答案。这意味着你的检索库里如果存在受版权保护的文章全文,系统就会在每次回答时“复制”相关内容并展示给用户。这种场景下的版权风险,比模型训练更直接,因为它是实打实的复制和展示。

第三类是对开源模型做微调的研究者。现在开源社区的模型非常多,很多人会自己收集指令数据做微调。如果你从某些内容平台批量爬取文章来构造指令集,然后发布模型权重,风险会比闭源 API 更大,因为权重里的训练痕迹可以被复现、被检测出来。所以在造微调数据集的阶段,就要把来源授权问题想清楚。

另外,最近 OpenAI 在工具链层面动作很频繁,例如 Codex harness 的开源。这件事本身和版权诉讼没有直接因果,但它传递了一个信号:AI 工具链会越来越开放,模型接入方式会越来越多。工具链开放之后,数据来源问题反而更容易被放大,因为更多人可以拿到训练工具、更多数据会被送进训练流程,而每一项数据都背着授权问题。开发者不能只关注“模型强不强”,还要关注“我输入的数据是不是干净、可用、合法”。

下面给出一个 RAG 场景下的来源白名单示例,帮助团队把合规判断嵌入检索流程:

# 文件路径:rag_app/source_policy.py ALLOWED_SOURCE_TYPES = { "内部文档", "已获授权的内容", "公开领域内容", "公司自研技术方案", } BLOCKED_SOURCE_TYPES = { "未经授权的网络文章", "不明来源的 PDF 全集", "付费内容转载", } def check_source(document: dict) -> bool: source_type = document.get("source_type", "") if source_type in BLOCKED_SOURCE_TYPES: return False if source_type not in ALLOWED_SOURCE_TYPES: # 无法判断来源类型时,默认进入人工审核 return "manual_review" return True

这个检查函数可以挂在文档入库之前,也可以挂在检索结果返回之前。前者是源头控制,后者是输出控制。生产环境建议两层都做。

7. 常见问题与误区

问题现象可能原因排查方式解决方案
模型输出了 wikiHow 原文片段该文本在训练语料中出现频率较高,形成模型记忆用文本相似度工具对比输出与 wikiHow 原文上线内容过滤器,对高风险输出进行改写或拦截
数据集里没有 wikiHow 域名,但存在疑似原文内容来自二手转载站或镜像站对文本做 MinHash 或向量相似度检索扩大黑名单范围,补充文本指纹去重
微调时用了爬来的教程数据,担心商用风险数据来源未授权,商用存在法律不确定性整理数据来源清册,逐条标注授权状态替换为已授权数据集,或联系版权方洽谈授权
已经训练完的模型发现数据有问题训练阶段未做版权来源筛查对训练数据做审计,确认问题数据比例无法精准删除记忆,需重训、微调抑制或增加输出过滤
RAG 回答中引用了一段付费文章原文知识库中包含了未授权的全文内容检查入库文档的来源和授权字段只保留摘要或改写内容,删除原文全文
自己开发的爬虫只抓了公开网页,认为可自由使用“公开可访问”不等于“可用于模型训练”查看网站服务条款、robots、版权声明建立网站使用条件评估表,不能确定就放弃抓取

这里要特别提醒一个高频误区:很多人认为“互联网上公开的内容,抓下来用不会有问题”。但公开访问与商业使用授权是两回事。一个网站允许搜索引擎抓取,不代表允许任何人批量下载后用于模型训练。数据伦理和版权合规的基本判断标准是:你是否获得了内容所有者的明确授权,而不是你能不能访问到。

8. 最佳实践与工程建议

对于正在做数据相关工作的团队,下面这些实践建议可以按优先级逐步落地。

8.1 数据采集阶段:建立来源登记制度

每个数据源都应该记录以下信息:

  • 站点或内容包名称
  • 抓取或获取时间
  • 内容授权方式(例如 CC BY、商业授权、内部自产)
  • robots.txt 状态
  • 联系人邮箱或版权方信息
  • 检查结论(允许/不允许/待定)

这份登记表不需要多复杂,但必须存在。它是以后审计和出现争议时的第一道凭据。

8.2 训练前:黑名单、指纹、抽检三件套

在数据进入训练流程前,至少完成三层检查:

  1. URL 域名黑名单过滤,成本最低,能挡住明确高风险的来源。
  2. 文本近似去重,使用 MinHash、SimHash 或向量检索,发现和已标记风险文本高度相似的内容。
  3. 人工抽检,从数据集中随机抽取一定比例样本,让标注人员判断是否存在明显的未授权内容。

8.3 上线后:输出监控与投诉响应

模型部署后,要建立输出内容监控机制。尤其是那些面向公众的对话产品,如果用户能把模型诱导到“复述某网站原文”,这不仅是产品体验问题,也可能演变成版权纠纷。建议在输出侧加一层相似度检测,对命中风险文本的输出做改写处理,或者直接屏蔽。

8.4 团队协作:法务不是最后才介入

很多技术团队的习惯是开发完成后再找法务审核。但在数据版权这件事上,更合理的顺序是:法务、数据工程师、模型工程师在数据采集方案设计阶段就一起评审。早期定好规则,比后期弥补成本低得多。

8.5 安全与最小权限原则

涉及数据下载、内容复制、语料导出时,遵循最小权限原则。不要给每个开发人员都开放全量原始数据权限,也不要让数据导出操作没有任何审计日志。版权风险和工作流安全一样,都需要通过权限、日志、审批来管理。

9. 总结与后续关注方向

wikiHow 起诉 OpenAI 这件事,短期看是一起法律纠纷的推进,长期看是整个大模型行业从“跑马圈地”走向“合规用地”的转折信号。内容平台手里的高质量文本,正在被重新定义价格;模型厂商的数据采购成本,也正在从零变成一种必须面对的支出。

对技术开发者来说,能从这起事件里得到的启发很具体:

第一,训练数据的版权合规不是一个“法务问题”,而是一个需要数据工程手段解决的问题。域名过滤、指纹去重、来源登记、输出监控,这些全部落在开发的日常工具箱里。

第二,模型训练完之后,“精准删除某个来源知识”依然不现实。所以数据合规的前置门槛会越来越高,未来优秀的数据工程师和 AI 工程师,一定会同时具备“建数据管线”和“审数据风险”的双重能力。

第三,如果你正在做产品,不管你是调用 OpenAI API、部署开源模型,还是自研模型,都应该尽早审视自己的数据来源。与其等到收到投诉或律师函再排查,不如现在就给数据管线加上一套可解释的来源审查机制。

后续值得关注的方向包括:数据集授权协议和交易市场会不会加速出现、版权方会不会推出“AI 训练友好”的授权模式、以及各家模型公司会不会在 API 层增加数据来源声明能力。无论你怎么看待这起诉讼,有一点正在变得越来越确定:数据质量决定模型能力,而数据合规决定模型能走多远。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询