想象你刚加入一家 AI 制药公司,导师丢给你一个任务:用分子性质数据训练一个预测模型。你面前摆着三座风格迥异的“数据档案馆”——ZINC、ChEMBL 和 PubChem。ZINC 像一座大型样品超市,货架上全是可下单购买的化合物;ChEMBL 像一间实验记录馆,管理员从文献里工整地抄下每一个活性实验值;PubChem 则像一座开放的公共数据广场,四面八方都往这里堆放档案,数量惊人却难免混乱。不了解这三座馆的分工,你很可能拿到一堆数据却不知从哪下手。 本文就用这三座档案馆的比喻,带你搞懂三者的定位、数据规模、标注类型、许可与更新机制,并帮你学会如何选型、融合,为训练分子性质模型备好可靠数据。

岗位关联

对 AI 从业者而言,掌握分子性质数据集的差异,能避免“拿错数据乱训练”的灾难,直接提升数据选型、模型质量与项目落地效率。

目录
  1. 可视化演示
  2. 背景与价值
  3. ZINC数据规模
  4. ChEMBL活性注释
  5. PubChem多源聚合
  6. 三大库对比
  7. 选型与融合
  8. 实践与流程
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示ZINC、ChEMBL、PubChem三大数据集的维度对比、数据规模及融合流水线,点击步骤切换分析维度。

本节配有交互动效(进入视口后自动加载,约 3KB)。

三数据集维度对比 ZINC: 规模大,标注少 ChEMBL: 生物活性标注丰富 sz×ann×lic×upd四维评分 根据任务需求选择合适数据集

背景与价值

想象你要给档案馆里的每份“分子档案”做一张借书卡:卡片上既要有分子结构,也要有它的性质标签。分子本身非常小,小到肉眼看不见,于是化学家发明了 SMILES 这类“分子身份证”字符串。靠着这张身份证,计算机才能读懂分子长什么样子;再把溶解度、毒性、活性等性质贴上去,就成了机器学习要用的分子性质数据集。

化学信息学就是研究“分子身份证”与“性质标签”如何互相对应的学科。对 AI 从业者来说,这相当于建立了从结构到性质的桥梁。ZINC、ChEMBL、PubChem 三个数据集,正是这座桥上三座存储量巨大的仓库。

1. N 条记录数:N 代表档案馆里有多少条分子档案,规模越大,越能支撑大模型训练。

NN

2. x_i 分子结构:每条记录的核心是分子结构,通常用 SMILES 或 InChI 字符串表示,相当于分子的身份证号。

xix_i

3. y_i 性质标签:标签可以是活性、毒性、LogP 等性质,这是模型要预测的目标值。

yiy_i

4. m_i 元数据:记录中还附带来源、供应商、文献编号等信息,用来做溯源和审计。

mim_i

理解了这个基本结构,再看三座档案库,你就能明白:它们真正的差异不是“谁的文件多”,而是“每份档案上贴了哪些标签、由谁整理、能不能合法使用”。

text3 行
$$ \displaystyle D = \{ (x_i, y_i, m_i) \}_{i=1}^{N}$$

ZINC数据规模

ZINC 更像一座巨大的化合物样品超市。走进超市,你会看到货架上摆着数不清的小分子,每个瓶子上都贴着供应商编号和价格。它回答的问题是:“这个分子我能不能买到?去哪买?”而不是“这个分子对某个靶点有没有活性”。

从技术上说,ZINC 收录的是商业可购买化合物,并提供 SMILES、SDF 文件、三维构象等格式。ZINC20 的规模已达到亿级以上,尤其适合做虚拟筛选的起点:先在海量分子里筛出候选结构,再去实验室购买验证。它与实验活性库最大的区别,是缺少高质量的生物活性标签。

回到比喻:ZINC 的优势是“货架大、标签清楚”,标签主要指供应商和可购买性,而不是实验活性。因此,如果任务是活性预测而不是货源筛选,直接拿 ZINC 当训练集就不合适,容易学到“能不能买到”而不是“有没有效”。

NZINC=∑s∈Sns\displaystyle N_{\mathrm{ZINC}} = \sum_{s \in \mathcal{S}} n_s
意思是:ZINC 的分子总数,等于所有供应商可购买化合物数量的加总。
  1. N_ZINC 库内分子总数这是 ZINC 的“总货架数”,决定虚拟筛选时可探索的空间大小。
    NZINCN_{\mathrm{ZINC}}
  2. 供应商集合 SZINC 里的化合物来自上百家化学品供应商,相当于超市里不同的供货柜台。
    S\mathcal{S}
  3. n_s 单个供应商贡献量把每个供应商提供的可购买分子数相加,就得到整个库的规模。
    nsn_s

ChEMBL活性注释

ChEMBL 则完全不同,它像一间由专业图书管理员整理的实验记录馆。管理员们从成千上万篇学术文献中,把“化合物 A 对靶点 B 的 IC50 是多少”这类实验记录工整地抄下来,并标注出原始论文编号,方便你回看证据。

正是这种人工整理过程,让 ChEMBL 成为分子性质数据集中“标签质量”的代表。它的核心字段通常是分子结构、靶点、活性值、测定类型等。IC50 可以通俗理解为:要抑制某个靶点一半活性所需药物浓度,数值越小,通常代表这个分子越强。

ChEMBL 的许可通常采用 CC BY-SA,更新也较规律,非常适合作为活性标签的训练集。但要注意,它只包含已被文献报道过的化合物,覆盖度远不如 ZINC 和 PubChem 的“全量货架”。所以它更像“精确但有限”的实验档案,而不是面面俱到的大全。

RChEMBL={(c,t,γ)∣γ=min⁡(IC50(c,t))}\displaystyle R_{\mathrm{ChEMBL}} = \{ (c, t, \gamma) \mid \gamma = \min( \mathrm{IC}_{50}(c, t) ) \}
这里表示 ChEMBL 中每一条活性记录,都来自化合物与靶点的配对,并且会优先取多次重复实验中最强的 IC50。
  1. 化合物 c 与靶点 t档案的核心是一对关系——某个分子和某个生物靶点。
    (c,t)(c, t)
  2. IC50(c, t) 活性测定表示该化合物对靶点的半数抑制浓度,是活性强弱最基本的量化指标。
    IC50(c,t)\mathrm{IC}_{50}(c, t)
  3. min 取最强记录同一实验可能有多次重复,ChEMBL 会取其中最优值作为代表记录。
    min⁡\min

PubChem多源聚合

PubChem 的定位则像一座开放公共广场,任何人都可以来摆摊。美国 NIH 把全球大量机构提交的数据聚合在一起,包括化合物结构、生物活性、药物信息、专利片段等。它不追求由同一批管理员统一整理,而是尽量把所有来源的档案都留下。

这让 PubChem 变得非常庞大,但也带来了重复和混乱:同一个分子可能被不同机构以不同格式上传,同一个字段在不同子库里含义也可能不一样。它的优势是可以跨库交叉检索,通过 PUG 接口做程序化访问,非常适合做补充查询和广覆盖筛查。

用 PubChem 做模型训练前,一定要有心理准备:它适合“查资料”,但不适合直接拿来训练。你要像整理一个共享书架那样,去重、去冲突、补齐缺失值,才能真正把公共数据变成高质量训练集。

DPubChem=⋃d∈Dd\displaystyle D_{\mathrm{PubChem}} = \bigcup_{d \in \mathcal{D}} d
PubChem 本质上是对很多子库做并集:把不同来源的档案合并到一起,量大但需要自己做清洗。
  1. 子库集合 DPubChem 下面有大量子库,每个子库可以看作广场上的一个摊位。
    D\mathcal{D}
  2. 每条数据 d每个摊位可能贡献结构、活性、毒性、文献等不同维度的记录。
    dd
  3. 并集合并取所有子库的并集,所以 PubChem 必然存在重复和字段不一致。
    ⋃\bigcup

三大库对比

现在,你站在三座档案馆的十字路口,需要做一次横向对比。ZINC 回答“哪里买”,ChEMBL 回答“活性多少”,PubChem 回答“还能查到什么”。三者的关系不是替代,而是互补。

| 维度 | ZINC | ChEMBL | PubChem |

|---|---|---|---|

| 核心定位 | 可购买化合物目录 | 实验活性文献库 | 多源聚合公共平台 |

| 典型字段 | SMILES、供应商、可购买性 | IC50、靶点、文献来源 | 结构、疾病、基因、毒性等 |

| 许可特点 | 免费开放,重分发需看版本条款 | CC BY-SA,开放友好 | 整体开放,子库许可各异 |

| 更新方式 | 代际更新 | 定期版本发布 | 持续聚合更新 |

回到比喻:如果你要开药店,首先去 ZINC 超市进货;如果要写药效报告,就去 ChEMBL 实验馆查记录;如果想了解某分子是否被其他人研究过,再去 PubChem 广场搜一圈。三座馆各有专长,选库本质是项目需求的映射。

Scorei=α⋅Scalei+β⋅Qualityi+γ⋅Licensei\displaystyle \mathrm{Score}_i = \alpha \cdot \mathrm{Scale}_i + \beta \cdot \mathrm{Quality}_i + \gamma \cdot \mathrm{License}_i
选库时很难只看单一方面,这个公式提醒我们:最终评分由规模、质量和许可三个维度加权决定。
  1. Score_i 综合得分每个候选数据集都有一个业务匹配度得分,表示“适不适合当前项目”。
    Scorei\mathrm{Score}_i
  2. Scale、Quality、License规模代表数据量,质量代表标注可靠性,许可代表能否合法商用。
    Scalei,Qualityi,Licensei\mathrm{Scale}_i, \mathrm{Quality}_i, \mathrm{License}_i
  3. 权重 alpha、beta、gamma不同任务对三个维度的侧重不同,比如做生成模型更看重规模,做活性预测更看重质量。
    α,β,γ\alpha, \beta, \gamma

选型与融合

真实项目往往不只依赖一座馆。做一次药物发现管线,可以用 ZINC 提供候选分子,用 ChEMBL 提供活性标签,用 PubChem 补充毒性和专利信息。就像做一道大菜,既要有食材市场,也要有菜谱和营养检测报告。

融合的关键不是简单地把三个文件拼在一起,而是要做去重和冲突处理。同一个分子在三个库中都出现,SMILES 写法可能不同,活性值也可能互相矛盾。通常的做法是先把结构标准化,再以高可信来源为准,并保留每一份记录的来源,做到可追踪。

这里还有一个常被忽略的点:许可合规。ZINC 的条款、ChEMBL 的 CC BY-SA、PubChem 子库的不同授权,决定了你的产物能否商用。数据融合前,最好让数据工程师和法务一起做一张“使用权限清单”,否则模型训练得再好,上线时也可能被版权问题拦下。

Dtrain=dedup(DZINC∪DChEMBL∪DPubChem)\displaystyle D_{\mathrm{train}} = \mathrm{dedup}\left( D_{\mathrm{ZINC}} \cup D_{\mathrm{ChEMBL}} \cup D_{\mathrm{PubChem}} \right)
意思是训练集不是三库数据的简单并联,而是先去重、再合并后的结果。
  1. 三库并集先把 ZINC、ChEMBL、PubChem 的数据放在一起,形成候选池。
    DZINC∪DChEMBL∪DPubChemD_{\mathrm{ZINC}} \cup D_{\mathrm{ChEMBL}} \cup D_{\mathrm{PubChem}}
  2. dedup 去重通过标准化后的分子指纹或规范 SMILES,把同一个分子识别出来并合并。
    dedup\mathrm{dedup}
  3. 训练集 D_train最终用于模型训练的数据集必须干净、可靠、有来源可查。
    DtrainD_{\mathrm{train}}

实践与流程

最后,把选好的档案变成模型,需要一条完整流程。首先是下载与解析,ZINC 常用 FTP 或分块 SDF 下载,ChEMBL 可以从官网直接获取 TSV 或 SDF,PubChem 则推荐用 PUG 接口做程序化查询。拿到原始文件后,第二步不是立刻训练,而是清洗、筛选和标准化。

清洗内容至少包括:统一原子连接性、去除明显无机盐或结构异常、修正不合法 SMILES、处理缺失值。随后要根据任务做分子表征,例如把 SMILES 转为指纹或图数据。最后再把数据集划分成训练、验证、测试三部分,训练性质预测模型。

从下载、清洗到建模,每一步都像档案馆的整理流程。只有档案编号统一、标签可靠、摆放整齐,模型才能从数据中学到真实的化学规律。记住:数据决定上线,训练只决定上线后的表现。

L(θ)=1∣Dtrain∣∑(x,y)∈Dtrain(fθ(x)−y)2\displaystyle \mathcal{L}(\theta) = \frac{1}{|D_{\mathrm{train}}|} \sum_{(x, y) \in D_{\mathrm{train}}} \left( f_\theta(x) - y \right)^2
这是最简单的回归损失函数:模型预测值越接近真实标签,损失越小。
  1. 参数 theta模型内部需要学习的权重,可以理解为预测分子的决策规则集合。
    θ\theta
  2. 预测函数 f_theta(x)输入分子结构 x,输出模型预测的性质值。
    fθ(x)f_\theta(x)
  3. 均方误差把预测值和真实 y 的差平方后取平均,是衡量模型训练好坏的常见指标。
    (fθ(x)−y)2\left( f_\theta(x) - y \right)^2

AI 应用场景

虚拟筛选候选池搭建

阶段:数据准备与虚拟筛选

解决的问题:传统方式是人工从海量化合物中挑候选分子,费时费力且容易遗漏。使用 ZINC 数据集,可以程序化下载数亿可用分子,再用简单规则过滤成药性指标,快速得到虚拟筛选候选池。

具体案例:一家 AI 制药公司希望寻找某激酶抑制剂先导化合物。工程师从 ZINC20 下载活性位匹配的 3D 分子库,保留可购买、分子量适中、LogP 在规定范围内的结构,再配合分子对接工具,把候选规模从 1 亿压到 5000,进入实验验证。

分子活性预测模型训练

阶段:训练集构建与模型训练

解决的问题:没有活性质心标签,监督模型便无从下手。ChEMBL 的人工整理活性值提供了可靠标签,使模型能学习“分子结构到靶点活性”的映射关系。

具体案例:团队从 ChEMBL 中下载某靶点全部已知活性数据,取 IC50 小于 1μM 的分子作为正样本,大于 30μM 的作为负样本,并划分训练集和测试集,训练了一个基于分子指纹的梯度提升模型,用于预测新化合物活性。

多源数据合规融合

阶段:数据治理与合规审计

解决的问题:单一数据库覆盖不全,融合多个数据库又可能带来许可和一致性问题。通过梳理 PubChem 子库来源和许可,再与 ZINC、ChEMBL 做去重合并,可建立安全合规的私有训练集。

具体案例:某数据平台搭建化合物知识图谱时,使用 PubChem PUG 接口检索 100 个分子的专利、疾病和结构信息,记录每个字段来自哪个子库,并标记可否商用,最终形成一份合规的数据血缘报告。

Python 演示

python46 行
import math MOLE_LIMIT = 1000000 def coverage(records, field):    known = [r for r in records if r.get(field) is not None]    return len(known) / len(records) if records else 0.0 def average_coverage(records):    fields = ["purchasable", "activity", "safety"]    return sum(coverage(records, f) for f in fields) / len(fields) def merge_datasets(groups):    merged = {}    for group in groups:        for rec in group:            key = rec["canonical_smiles"] or rec["id"]            merged[key] = rec    return list(merged.values()) def choose_score(records):    size_score = min(1.0, len(records) / MOLE_LIMIT)    return 0.6 * size_score + 0.4 * average_coverage(records) if __name__ == "__main__":    zinc = [        {"id": "ZINC0001", "canonical_smiles": "CCO", "vendor": "Sigma", "purchasable": True, "activity": None, "safety": None},        {"id": "ZINC0002", "canonical_smiles": "CCN", "vendor": "TCI", "purchasable": True, "activity": None, "safety": None},        {"id": "ZINC0003", "canonical_smiles": "c1ccccc1", "vendor": "Alfa", "purchasable": False, "activity": None, "safety": None},    ]    chembl = [        {"id": "CHEMBL1", "canonical_smiles": "CCO", "vendor": None, "purchasable": None, "activity": -3.2, "safety": "ok"},        {"id": "CHEMBL2", "canonical_smiles": "CCN", "vendor": None, "purchasable": None, "activity": -5.4, "safety": "ok"},        {"id": "CHEMBL3", "canonical_smiles": "O=C(O)C", "vendor": None, "purchasable": None, "activity": None, "safety": "unknown"},    ]    pubchem = [        {"id": "PUBCHEM1", "canonical_smiles": "CCO", "vendor": "Sigma", "purchasable": True, "activity": None, "safety": "ok"},        {"id": "PUBCHEM2", "canonical_smiles": "CC=O", "vendor": "TCI", "purchasable": True, "activity": None, "safety": "ok"},        {"id": "PUBCHEM3", "canonical_smiles": "c1ccccc1", "vendor": "Alfa", "purchasable": False, "activity": None, "safety": "unknown"},    ]     merged = merge_datasets([zinc, chembl, pubchem])    print("merged_records", len(merged))    print("zinc_score", round(choose_score(zinc), 3))    print("chembl_score", round(choose_score(chembl), 3))    print("pubchem_score", round(choose_score(pubchem), 3))
目的:模拟 ZINC、ChEMBL、PubChem 三座档案库的记录合并,并计算字段覆盖率与综合选型评分,帮助判断哪个库更适合当前任务。
  1. def merge_datasets(groups):把所有数据源按序遍历,准备合并。
  2. key = rec["canonical_smiles"] or rec["id"]优先用规范 SMILES 做主键,实现分子级去重。
  3. merged[key] = rec后写入的记录会覆盖同结构旧记录,模拟多源冲突时的优先级处理。
  4. return list(merged.values())去重后返回干净记录列表,供后续模型训练使用。
  5. def coverage(records, field):统计某个字段的记录覆盖率,是评判数据质量的重要指标。
  6. known = [r for r in records if r.get(field) is not None]过滤掉缺失值,只统计有标签的记录。
  7. return len(known) / len(records) if records else 0.0防止空列表导致除零错误。
  8. def choose_score(records):综合规模和覆盖率给出选型分数。
  9. return 0.6 * size_score + 0.4 * average_coverage(records)当前任务更看重标签覆盖,因此覆盖率权重占四成。
  10. merged = merge_datasets([zinc, chembl, pubchem])执行三库合并,得到最终训练集雏形。

常见误区

误区我以为 ZINC 是公开数据集,里面有很多分子,应该可以直接拿来做活性预测训练,下载之后才发现根本没有 IC50 这类标签。

正解ZINC 的核心标签是“可购买性”与供应商,而不是生物活性。它更像样品超市,货架上不会写“这个药对什么病有效”。活性标签应优先来自 ChEMBL,或通过实验、公开文献补充。

为何常见:初学者看到 ZINC 规模很大、又是分子数据集,容易默认所有分子数据集都带活性标签,忽略了不同数据集的立馆之本。

误区PubChem 最大的好处是数量多,模型训练应该“数据越多越好”,所以我直接把 PubChem 全部下载下来训练。

正解PubChem 是多源聚合平台,不同子库的字段含义、质量控制都不一致,还存在大量重复与半结构化信息。未经清洗直接训练,可能让模型学到噪声而不是化学规律。

为何常见:在普通机器学习中,数据量常被视为重要优势,这让人忽略了生物数据更依赖标注一致性和质量。

误区两座馆里都写了 IC50,训练前我直接把数值合并,反正都是活性值。

正解IC50 会因实验方法、单位、重复次数、细胞环境不同而不可直接比较。正确做法是先统一单位,记录实验类型,必要时做标准化,或者以 ChEMBL 的保守人工整理值为主。

为何常见:字段名相同就以为是同一种语义,这是跨库数据融合最常见的天真假设。

误区申请 ZINC 账号下载数据没花钱,ChEMBL 也是开放的,那我用它训练商用模型应该没问题。

正解免费下载不等于可任意商用。ChEMBL 采用 CC BY-SA,需要遵循署名和相同方式共享条款;ZINC 有明确的使用条款;PubChem 的子库许可也各不相同。商用前必须做许可审计。

为何常见:国内团队容易混淆“公开可得”和“公共领域”,忽略了数据使用许可与最终产品分发方式之间的法律关联。

误区两个分子只要 SMILES 字符串长得一样就是同一个分子,所以我用 Python 的集合去重就够了。

正解同一分子可能有多种合法 SMILES 写法,必须先用 RDKit 等工具转成规范 SMILES 或计算分子指纹,再做去重和相似度判断。否则大量同分异构体或等价表示会被当成不同分子。

为何常见:SMILES 看起来像字符串,掩盖了它作为化学图编码的复杂性,导致数据工程师用普通文本处理方式去重。

面试题

Q1. ZINC 数据集最核心的定位是什么?

单选题 · easy

  • A.商业可购买化合物目录← 正确答案
  • B.文献活性值档案
  • C.多源公共数据平台
  • D.分子生成模型库

答案:A。ZINC 的核心是可购买化合物目录,解决“从哪里买”的问题;活性、多源、模型库分别是 ChEMBL、PubChem 和生成模型的任务。

Q2. ChEMBL 最突出的数据特点是?

单选题 · easy

  • A.商业采购和供应商信息
  • B.生物活性实验数值← 正确答案
  • C.多源异构数据聚合
  • D.分子三维坐标文件

答案:B。ChEMBL 由专家从文献中整理活性实验值,如 IC50 和靶点关系,是训练活性预测模型的重要标签来源。

Q3. PubChem 的数据来源主要特征是?

单选题 · easy

  • A.单一厂商独家供给
  • B.只收录人工实验资料
  • C.多来源整合汇聚← 正确答案
  • D.仅提供分子图片

答案:C。PubChem 是典型的多源聚合平台,来自全球很多机构,因此数据量庞大但需要清洗去重。

Q4. 关于三大数据集许可与更新,下列说法正确的是?

单选题 · mid

  • A.ZINC 以可购买目录见长
  • B.ChEMBL 采用 CC BY-SA← 正确答案
  • C.PubChem 只来自美国机构
  • D.三者均不允许下载

答案:B。ChEMBL 采用开放且带署名要求的 CC BY-SA 许可;A 说的是定位,C 说法错误,D 与实际不符。

Q5. 使用 ZINC 做虚拟筛选时,最应优先关注哪个字段?

单选题 · mid

  • A.供应商和可购买性← 正确答案
  • B.半抑制浓度 IC50
  • C.化合物在研专利
  • D.二维结构图片

答案:A。ZINC 是样品超市,核心优势是货源信息;IC50 需要到 ChEMBL 去找,专利和图片不是 ZINC 的主打标签。

Q6. 为什么 PubChem 不能直接替代 ChEMBL 训练活性模型?

单选题 · mid

  • A.数据量太少无法训练
  • B.来源混杂且字段不统一← 正确答案
  • C.全部都是付费数据
  • D.只有蛋白质结构数据

答案:B。PubChem 聚合多个子库,字段口径差异大,需要大量清洗;它适合检索,但活性标签的规范性不如 ChEMBL。

Q7. 三库融合时,同一个分子出现不同活性记录,首选处理方式是?

单选题 · mid

  • A.随机保留其中任意一条
  • B.优先高可信来源并记录出处← 正确答案
  • C.三份记录全部删除
  • D.不做处理直接合并

答案:B。数据融合要保持可追溯性。随机保留会引入噪声,全部删除浪费信息,直接合并会传染冲突,因此应优先参考规范来源并保留出处。

Q8. 以下哪些属于分子性质数据集中常见的标注类型?

多选题 · mid

  • A.活性浓度 IC50← 正确答案
  • B.脂水分配 LogP← 正确答案
  • C.供应商报价单
  • D.靶点名称注释← 正确答案

答案:ABD。IC50、LogP、靶点名称都是描述分子性质或生物注释的字段;供应商报价属于商业元数据,不属于分子性质标注。

Q9. 在 ZINC、ChEMBL、PubChem 之间做选型时,需要重点考察哪些维度?

多选题 · hard

  • A.数据规模与覆盖范围← 正确答案
  • B.标注质量与数据口径← 正确答案
  • C.许可协议与更新机制← 正确答案
  • D.页面配色与官网布局

答案:ABC。数据规模决定覆盖度,标注质量决定模型上限,许可与更新决定能否商用和维护成本;页面配色只是 UI 问题,不影响选型。

Q10. 关于 PubChem 的使用,下列说法正确的有哪些?

多选题 · extreme

  • A.聚合了多种子数据库← 正确答案
  • B.子库许可可能不同← 正确答案
  • C.所有字段都人工审核
  • D.PUG 接口可程序化检索← 正确答案

答案:ABD。PubChem 是多源聚合平台,各子库许可不同,且提供 PUG 接口便于程序化访问;但并非所有字段都经过人工审核,很多数据来自自动上传。