跳到主内容
Ai Lab

导言

一、一张两千年没法兑现的支票

德谟克利特大概是历史上最早、也最笃定的“理论派”。他没见过原子,却坚信它存在:一块奶酪切一半、再切一半,总会切到切不动的那一刻吧?他给最后那一小粒起名 atomos,意思是“不可再分”。没有仪器,没有数据,全凭坐着想。可这个念头出奇地好用:只要承认世界由最小的颗粒拼成,东西的生灭就只是颗粒在重新排队,谁也不必再解释它们怎么凭空冒出来、又凭空消失。接下来近两千年,原子就像一张开出来却没人能兑现的支票——说不出多大、多重,也没有任何办法判断这套说法是对是错。

二、第一次看见:尺度往下挪了一格

打破僵局的是一块玻璃。1665 年,胡克把软木切成薄片塞到显微镜下,看见一格一格排得整整齐齐的小空腔,像修道院里僧侣住的小房间,于是顺手管它们叫 cell。没过多久,荷兰布商列文虎克凭业余爱好磨出了当时最好的透镜,在一滴池塘水里看到成群游来游去的“小动物”。他写信告诉英国皇家学会,对方将信将疑,专门派人去核实。真正被改变的是观念:看不见,不等于不存在。只是显微镜能给的只有轮廓、边界和表面——它能告诉你“那里有东西”,却说不出那是什么、按什么规矩摆放。就像隔着一层毛玻璃看人,知道屋里有人,却认不出是谁。偏偏这种“差一点就看清”的感觉,最能勾起科学家的好奇心。

三、会称重的原子:化学让看不见的东西变得可以算

接下来的突破靠的不是眼睛,而是天平。道尔顿是一位中学老师,还是个色盲——他甚至把自己的色盲写成了论文。他一个原子也没见过,却注意到同样两种元素组成不同化合物时,质量比总是简单的整数比:等量的碳,在二氧化碳里结合的氧恰好是一氧化碳里的两倍。整数背后,只能是一个个完整的“份儿”在参与反应。门捷列夫更大胆:他把已知元素按性质排成一张表,还故意留出几个空位,宣称那里住着尚未露面的元素,连性质都估好了。几年后镓被发现,发现者测出的密度和预言对不上,门捷列夫居然回信说“你再测一遍”——重测之后,数值果然向他的预言靠拢。一张表,第一次具备了预言能力。可到这一步,人们仍然不知道原子内部长什么样,更不知道这些内部结构如何决定一块晶体硬不硬、导不导电。

四、从形状到规律:电子、原子核与量子力学

十九世纪末到二十世纪初,微观世界迎来了一场连续剧。汤姆孙从阴极射线里揪出了电子;卢瑟福用 α 粒子轰击金箔,绝大多数粒子直穿而过,却有极少数被弹了回来——他形容这就像朝一张纸巾打出一发炮弹,炮弹却反弹回来打中了自己。原子中心有个又小又重的核,就此确定。玻尔随后给出电子分层的图像,量子力学把电子的状态写成了方程。薛定谔方程原则上藏着全部答案:给定原子核的位置,就能解出体系的能量,而能量决定结构稳不稳定、表现出什么性质。问题在于解不动。1929 年狄拉克说得很直白:化学所需的物理定律已经完全知道了,麻烦只在于方程太复杂,根本解不出来。原理清清楚楚,计算寸步难行——这道裂缝,在此后一百年里一直是这个领域的头号难题。

几乎同一时期,另一条路让结构变成了可以记录的数据。劳厄和布拉格父子把 X 射线打进晶体,从衍射斑点的位置和强度反推出内部的周期性排列(小布拉格拿诺贝尔奖时才 25 岁)。人第一次在原子尺度上把微观结构写成了几何:晶胞的边长与夹角,原子在晶胞中的坐标。这些数字可以抄下来、寄出去,交给别人复核——科学从此有了一种新的“通用语”。

五、指着一张图说“这是一个原子”

再往后,电子显微镜和扫描探针显微镜让单个原子“现了形”。1989 年,IBM 的研究者用 35 个氙原子在金属表面拼出了公司的三个字母——大概是史上最小的 logo。人不仅知道晶体里有格子,还能指着图上的一个亮点说出它是哪种元素,看清台阶、空位和杂质原子各自蹲在哪儿。然而“看见”和“算出”终究是两码事。一张原子分辨的照片不会自己开口告诉你这块材料的带隙多大、硬度多高、加热后会不会分解。想回答这些问题,还得回到能量上去。

六、结构到性质:计算成了一种实验

密度泛函理论(DFT)找到了一条绕路:与其追踪每一个电子的去向,不如只关心电子在空间里分布得有多密——好比不必记住全班每个人坐在哪儿,只要知道哪片区域坐得满。于是“给定原子位置,求能量与受力”终于成了计算机能跑完的任务。分子动力学接着让原子沿着这张能量地形动起来,扩散、热膨胀、相变都能在屏幕上“做实验”。“结构决定性质”从一句口号变成一条走得通的流水线。材料基因组计划和高通量筛选又把它放大:先在计算机里海选成千上万个候选结构,只把少数有希望的送进实验室。代价也随之浮出水面:精确计算很贵,一个体系动辄吃掉几千核时;泛函、基组、收敛标准只要改动一处,结果就带上不同的系统偏差,两批数据随手混用,就像把摄氏度和华氏度的读数直接取平均。从这以后,数据是否可比,和算法本身一样重要。

七、学会外推:让模型来“猜”

算过的结构越攒越多,公开数据库的条目涨到几十万乃至上百万,一个诱人的念头冒了出来:既然这些数据背后有规律,能不能让计算机“见多识广”之后,直接猜出那些还没算过、更没合成过的结构?机器学习最早以“描述符加统计模型”的形式进入化学:人把分子或晶体手工编码成一串数字,再拟合它和性质之间的关系。图神经网络换了个思路——让每个原子直接和邻居“聊天”,在一轮轮消息传递中更新自己的表示,结构信息交给图本身来承载。等变模型又补上了物理的基本礼仪:把整个结构平移或转个身,能量不该变,每个原子受的力得跟着一起转;一个模型要是连这都不懂,就像一个把地图倒过来就不认路的向导。如今这类模型已经能预测能量、原子力、形成能、稳定性以及部分电子与力学性质,不少任务上误差逼近计算本身的精度,速度却快了几个数量级。它们的角色很明确:做海选的初审评委,把真正值得下注的少数交给更贵的计算和实验。东西还没合成出来,它的性格已经可以先摸个大概。

八、这门课怎么走

从德谟克利特的奶酪到今天的等变网络,这条路走了两千多年。这门课要带你上手的,是其中今天仍在一线使用的那一段:化学、材料和人工智能各取一块,拼成一套能真正动手的工作流。我假设你有一些高中化学底子,认得原子、周期表和化学键——忘了也没关系,用到时会带你复习;也假设你在人工智能这边完全从零开始,没写过模型,甚至和 Python 还不太熟。这门课采用 Agent 辅助的工作方式:你负责提出问题、提供材料、判断结果,写代码、跑代码、改代码的体力活交给 Agent。科学概念和数学会在用到时讲清楚;编程工具的目标不是让你背语法,而是让你看懂工作过程、有能力检查产物。

路线是这样的。第零部分先把装备配齐:认识 ChemDraw、VESTA、RDKit,搞懂 Cursor、Codex 与 Agent 怎么分工,再看 PPT、SVG、LaTeX 如何帮你画图和写论文;补上单位和复现的基本功,养成用 AI 加速学习、执行与核查的日常习惯。第一部分从化学出发:用 ChemDraw 画出分子与反应,打好晶体学基础后用 VESTA 看懂晶胞、原子坐标和周期性,再把结构写成数据,完成你的第一个经典机器学习项目。第二部分请出 DFT,讲清能量和标签从哪里来:先读懂计算输出,再做结构弛豫、比较数据、判断稳定性。第三部分让原子动起来,由计算成本引出 PyTorch、神经网络与机器学习势,并在微调之前先把数据划分和验收标准定死。之后深入评测,学习晶体结构搜索与生成,最后把筛选和主动学习串成一条完整的研究流程。等走完这一程,希望这支从德谟克利特排起的长队里,也能出现你的名字。

0.1 常用科研工具与分工

先知道任务该交给谁

科研工具像课程小组的分工:有人处理结构,有人做计算,有人画图排版。先学会选工具、交代任务和检查产物,具体操作用到时再学。 本课由 AI 协助执行,不要求手写代码。

一、化学侧:三个工具,各司其职

工具 主要负责什么 什么时候用
ChemDraw 画二维分子结构式、反应式与条件标注 在报告或论文里表达分子连接、立体化学和反应
VESTA 查看三维晶体、晶胞、配位与电子密度等数据 打开 CIF、POSCAR 等文件,观察结构并导出结构图
RDKit 批量读写分子、计算描述符、搜索子结构、生成分子图 让 AI 处理一批 SMILES/SDF,交付性质表和带编号的分子网格图

ChemDraw 像精心做一张海报;VESTA 像进入游戏场景转动视角;RDKit 像给全班批量生成资料卡,调用交给 Agent 即可。

你仍要核对:ChemDraw 的键、电荷和立体信息;VESTA 的晶胞与成键显示设置;RDKit 的失败记录和处理规则。图画出来了,不等于结构或结论正确。

二、AI 侧:Cursor 与 Codex

工具或概念 本课需要知道什么
Cursor 结合项目文件与 Agent 对话,查看文件修改、运行反馈和产物
Codex 围绕任务读取材料、处理文件、执行分析、排错并整理结果
Agent 围绕目标调用工具、根据反馈继续推进任务的系统
Harness 连接模型、上下文和工具,组织执行、状态与权限的配套系统

两者用途有重叠,先熟悉一个即可。交代任务时说清:用哪些材料、完成什么、保留什么、交付什么、怎样验收。 代码交给 AI,问题和结果由你判断。

能处理文件,不代表能点击 ChemDraw、VESTA 或 PPT 的界面,这取决于接入了哪些工具。无需自己搭建 harness。

三、论文侧:PPT、SVG 与 LaTeX

工具或格式 分工
PPT 画流程图、方法示意图,组合结构图与数据图;保留可编辑的 PPTX
SVG 矢量图格式,保存可编辑的线条、形状和文字;可让 AI 生成,用 Inkscape 精修
LaTeX 排版正文、公式、图表与引用,编译为 PDF;Overleaf 是常用在线平台

SVG 是格式不是软件;嵌入其中的位图不会因此变清晰。数据曲线应从真实数据生成再放进 PPT。提交前检查 PDF 的文字、图号、引用与清晰度,并保存图源。

四、还值得认识的工具

  • Zotero:管理论文、PDF 和引用,建议尽早使用。
  • Excel / Matplotlib / Origin:查看数据、抽查数值、生成统计图,按习惯选择。
  • Inkscape:编辑 SVG、对齐元素、统一字体和导出图稿。
  • ASE / pymatgen:处理原子与晶体结构,结构数据章节再用。
  • OVITO:查看模拟轨迹与结构变化,分子动力学章节再用。
  • Git:记录和比较项目修改,像带说明的游戏存档;可由 Agent 操作。

不必全部安装。先选一个 AI 工作台,配好当前任务的专业工具,再逐步补齐。

五、把工具连起来

做分子分析时:AI 调用 RDKit 处理分子表并出统计图,重要分子用 ChemDraw 表达,PPT / Inkscape 组合图版,放进 LaTeX,用 Zotero 管引用。晶体项目按需用 VESTA,不必强行用齐。

下载 第零部分练习包,在 AI 工作台中打开,交代:

请阅读 README,使用已有脚本分析教学数据。保留原始文件,另存图片、统计结果和运行记录,说明我应怎样抽查;无法执行时请说明原因。

练习数据为人工构造的 E(r) = 2(r − 1.1)²,r 用 Å,E 用 eV/教学构型,系数单位 eV/Ų,不是实验或 DFT 结果。核对 10 条记录、均值 0.1700 eV、最小值 0、最大值 0.5000 eV,再检查图轴和记录。

0.2 单位与量纲

数字后面的单位,是这条数据的一部分

同学说“我考了 4”,你无法判断好坏:四分制绩点、百分制,还是一道题的得分?数字离开了规则,就失去了可比较的含义。

原子计算也一样。文件里写着 energy = -12.3,还需要知道:什么单位、哪个体系、总能量还是每原子能量、采用什么参考与方法。本节解决单位与计数口径,计算设置和稳定性判据留到 DFT 部分。

目标是会看单位、会换单位、会判断运算是否合适,并能发现明显的数量级错误。 常数不必背,知道该查哪一项就行。

一、物理量、数值、单位与量纲

物理量 = 数值 × 单位。 500 m 和 0.5 km 是同一段路。量纲表示它属于哪类量:m、nm、Å 都是长度,s、ms、fs 都是时间。

游戏里“移动速度”和“攻击力”都是 100,加起来得 200 毫无意义。只有量纲和对象含义都合适,两个量才能相加或比较:5 m 与 20 cm 统一单位后可以相加,5 m 与 20 s 不行。

量 本课常见单位 你要同时确认的含义
长度 Å、nm、m 键长、坐标、晶胞边长还是位移
时间 fs、ps、s 单个积分步长还是整段模拟时长
能量 eV、meV、Hartree、kJ/mol 总能、能量差,还是按粒子数归一化的量
力 eV/Å、N 哪个原子、哪个方向的受力
应力、压强 eV/ų、GPa 分量、符号约定与计算程序定义
温度 K、°C 绝对温度还是温度变化量

量纲相同只是第一步。原子数不同的体系,总能量即使都是 eV,也不能直接拿来判断谁更稳定。

二、科学计数法

原子尺度的数很小,一串 0 容易看错。0.000000001 m = 10⁻⁹ m = 1 nm。换刻度就像缩放校园地图,物体本身没变。

Agent 的输出里常见 1e-3,即 1 × 10⁻³ = 0.001。这里的 e 是数字写法,和 eV 无关;负指数表示小数,不表示负数。

三、Å、nm 与原子尺度的长度

Å 读作“埃”,是结构文件中常见的长度单位:1 Å = 10⁻¹⁰ m;1 nm = 10 Å,所以 2.5 Å ÷ 10 = 0.25 nm。换成更大的刻度,份数更少——先想方向再套公式,就不容易乘反。

常见化学键约 1–3 Å,这只是直觉参考,不是硬阈值。若某个距离变成 15 Å 或 0.15 Å,先查是不是把 nm 和 Å 搞混了。

分数坐标中的 0.5 表示半个晶格向量,而不是 0.5 Å,要结合晶胞才能变成实际长度。打开坐标文件,先确认格式。

四、eV、meV 与 Hartree

eV 是一个元电荷跨过 1 V 电势差对应的能量:1 eV = 1.602176634 × 10⁻¹⁹ J = 1000 meV。

Hartree(Ha、Eₕ)常见于量子化学:1 Ha ≈ 27.211386 eV,例如 0.1 Ha ≈ 2.721139 eV ≈ 2721.139 meV。让 Agent 给出换算系数与来源,你抽查一个数即可。

误差写成 20 meV/atom 即 0.020 eV/atom,不能直接和整个体系的误差比较;/atom 和单位本身同样重要。

五、为什么 kJ/mol 要多想一步

“每人花 10 元”和“全班花 10 元”口径不同。1 mol 含 6.02214076 × 10²³ 个指定单元——原子、分子或一次反应,必须说清是哪一种。

1 eV/单元 ↔ 96.485332… kJ/mol(相同单元)。 这一步既换了能量单位,又从一个单元扩展到一摩尔。例如每个反应单元能量差 0.05 eV,对应 0.05 × 96.485332… ≈ 4.8243 kJ/mol。反过来就除以 96.485332…。“一个晶胞”“一个原子”“一个化学式单元”不能混用;比较论文数值前,先核对反应式与计量系数。

六、总量与平均量

两个班总分 3000 和 4000,不能直接说后者人均更高。4 个原子的构型总能 −20 eV,按原子归一化是 −20 eV ÷ 4 = −5 eV/atom;能否与另一体系比较,还取决于组成、参考态和计算设置。

练习数据中的 energy_ev 是每个教学构型的能量。不能为了数字好看就擅自改成每原子能量,否则脚本和图标签都要跟着改。

能量的零点也是约定,就像地图可以把出生点或海平面记为 0。负能量本身不等于稳定,比较时要用一致的参照和方法,并考虑竞争相。

七、力、应力与时间:用单位检查公式

力是能量随位置的变化率,单位为 eV/Å:1 eV/Å = 1.602176634 nN。应力是能量/体积:1 eV/ų ≈ 160.217662 GPa。力除以长度不是应力——这类错误不用算数就能查出来。

公式 E(r) = a(r − r₀)² 中 r 用 Å、E 用 eV,a 就必须是 eV/Ų。不懂整个模型,也能检查单位是否自洽。

1 fs = 10⁻¹⁵ s,1 ps = 1000 fs。 步长 1 fs 跑 1000 步是 1 ps,就像一帧时长乘帧数才是整局时长。这只是换算示例,合适步长取决于体系和算法。

温度是加法换算:T(K) = t(°C) + 273.15,26 °C 即 299.15 K;但升高 1 °C 就是升高 1 K。代入需要绝对温度的公式时用 K。

八、程序不会替你理解单位

程序只认数字:0.1 Ha 加 0.2 eV 也能算出一个看似正常的数。要求 Agent 列名标明单位(如 energy_ev),图轴和记录写出单位,跨文件转换时保留原始列并说明每次转换。你负责检查这些说明与物理含义是否一致。

请核对这份数据各列的物理量、单位与计数口径,标记信息缺失的列。需要换算时保留原始数据,另存转换结果,并列出换算关系与一个抽查示例。不要把不同口径的量直接混合比较。

模型常做的“减均值、除标准差”叫标准化,参数来自数据,与 Å 换 nm 不同。第一部分会详讲,现在别把缩放后的数字当成新单位。

九、换算速查与交作业前的检查

从什么到什么 换算操作
Å → nm 除以 10
eV → meV 乘以 1000
Ha → eV 乘以约 27.211386
eV/指定单元 → kJ/mol 相同单元 乘以约 96.485332
总能 eV → 每原子能量 eV/atom 除以原子数,并保留体系定义
eV/Å → nN 乘以 1.602176634
eV/ų → GPa 乘以约 160.217662
fs → ps 除以 1000
°C → K 加上 273.15

交出结果前问四件事:哪个物理量?哪个单位?哪个计数口径?数量级是否合理?

十、练习与自查

  1. 将 2.5 Å 换成 nm,将 25 meV/atom 换成 eV/atom。
  2. 某个明确定义的反应单元能量差为 0.05 eV,换成每摩尔同一反应单元的 kJ/mol。
  3. 一个有 8 个原子的构型总能量为 −24 eV。每原子能量是多少?仅凭这个负值能判断它稳定吗?
  4. 力为 0.2 eV/Å,换成 nN;步长 0.5 fs、运行 2000 步,对应多少 ps?
  5. 某同学把坐标从 Å 换成 nm,却保留“对坐标求导得到的力”的原数值和原单位。该检查什么?
完成后再看参考结果

第一题:0.25 nm,0.025 eV/atom。第二题:约 4.8243 kJ/mol。第三题:−3 eV/atom;仅凭负值无法判断稳定性,需要一致的参考态、组成与计算方法,并进一步应用稳定性判据。第四题:约 0.320435 nN,1 ps。第五题:力是能量对位置的负导数,长度单位改变时力的数值表示也要相应转换;同一个力的数值以 eV/nm 表示时,是以 eV/Å 表示时的 10 倍。

常数可在 NIST CODATA 基本物理常数数据库 查阅。本页 eV 与阿伏伽德罗常数采用 SI 定义值,Hartree 换算保留了入门所需的近似精度。

0.3 可复现的习惯

Agent 执行任务,结果也要能追溯

同学交来一张漂亮的图,却没留原始表格和处理过程,下一位就很难接手。让 Agent 完成计算后,同样要留下足够信息,让自己或别人能重跑、能检查。

这像保存游戏进度:除了分数,还要知道关卡、版本、角色配置和进行到了哪一步。本节不要求手写程序或记 Git 命令,重点是让 Agent 留下可核查、可交接的工作记录。

一、给资料与结果安排固定位置

“最终版”“最终版2”“真的最终版”说不清每份结果用了哪组数据。让 Agent 按用途整理:

位置 内容 校园中的对应经验
README 任务说明、数据来源与复跑办法 小组作业的交接说明
data/raw 原始数据 老师发下来的原始材料
scripts 实际执行的程序 保留下来的解题步骤
configs 本次运行的设置 这次实验采用的条件
runs 每次运行的结果与记录 每次独立编号的实验报告

原始数据保留原样,清洗后的数据另存并写清规则。每次运行用新目录,避免覆盖;具体参数要存进文件,不能只靠文件夹名。

请按输入、程序、配置和运行结果组织这个练习。保留原始数据;每次运行独立命名。写一份简短说明,让接手的人知道从哪里开始、如何复跑、去哪里看结果。

二、参数:写下“这次怎么做的”

练习包的配置控制三个设置:直方图分组数 5,随机抽查样本数 3,随机种子 42。修改时说清只改哪一项,例如“只把分组数从 5 改成 10,其余不变,另存结果”,再查运行记录确认。一次改很多项,结果变了也说不清原因。

三、随机种子:相同起点,不等于所有条件相同

游戏的世界种子配合同样的生成规则,能重现同一张地图;程序里的伪随机数也由种子决定初始状态。本练习中种子只决定抽查哪几条记录,十条数据的均值不应随种子变化——可以让 Agent 分别用 42 和 7 运行对比。

但游戏更新会改生成规则,软件版本、算法、硬件和并行方式同样会影响计算。只记住“seed = 42”,不能保证每台机器都得到逐位相同的结果;涉及模型训练时,还要考虑多次运行之间的差异。

四、环境、代码与 Agent 的记录

让 Agent 记录实际使用的 Python、依赖包、操作系统和复跑方式,并区分“安装清单”与“实际装上的版本”。

Git 是带修改说明的作业历史。你不用记命令,可以让 Agent 展示改动差异并按约定保存版本。Git 提交不等于异地备份,重要数据还要另有可靠的存放处。

同一句话交给不同模型,未必生成同样的程序,所以要保存实际执行的脚本与配置,而不只是聊天记录。若要比较 Agent 本身的表现,还应记录模型标识、工作台版本、工具条件和关键任务说明。

请保存实际环境与程序版本、此次任务说明、输入来源、参数和运行结果。给出已改动文件的简短说明;如果某项版本信息无法确定,请明确记录,不要猜测。

五、一次运行应留下什么

要保存的内容 本练习里的产物 你可以检查什么
输入与来源 input.csv、教学数据说明 是否仍是原来的十行,有没有漏掉样本
程序与参数 脚本副本、metadata.json 内的配置 实际运行的版本是否对应此次要求
单位与口径 Å、eV/教学构型 是否在比较同一种量
软件与平台 环境版本记录 别人能否准备相应的运行条件
数值与图片 metrics.json、直方图 数字是否可核对,图轴是否清楚
过程与交接 运行说明、完成状态、错误记录 接下来应该复跑、修复还是继续下一步

记录里的 SHA-256 摘要能判断文件字节是否改变,但不能证明数据含义正确;仅仅换行方式不同,摘要也会变。

六、练习:让 Agent 复跑,再检查差异

继续使用 0.1 的练习包:

请用同一输入、配置和环境,在两个不同的运行目录中各执行一次分析。比较统计结果、输入摘要、程序与参数。时间戳可以不同,请指出哪些字段应一致。随后只把直方图分组数从 5 改为 10,再运行一次,说明哪些结果变化、哪些保持不变。保留每次的产物。

预期:相同条件下统计结果一致;改分组数后直方图区间改变,样本数和平均能量仍是 10 与 0.1700 eV。再把种子改为 7 另存一次,抽查样本会变,均值不变。本练习没有模型训练,也没有训练集与测试集划分。

简单脚本可以直接核对数值;复杂计算要事先约定可接受误差并说明理由,不能看到差异后再随意放宽。

七、中断后,先查状态再继续

有结果目录不代表任务完成,脚本中途失败可能只留下部分文件。让 Agent 检查预期产物是否齐全,记录报错和已完成的步骤,再决定怎样继续。

这个练习很短,直接用新目录重跑即可,它没有断点续跑能力。工作台能恢复对话,不等于程序能从中断处恢复;长任务需要专门保存进度,第六部分会讲。

请根据已保存的文件确认当前状态,列出完成、失败和未开始的步骤。保留旧结果与错误信息,为下一次继续执行写清输入位置、当前参数和下一步操作。

八、把练习交给下一位同学

请同学或一个新的 Agent 会话只依赖项目文件重跑一次;或者隔一天自己再打开,看还找不找得到输入、结果和说明。如果回答要靠“我记得上次好像是这样”,就让 Agent 把缺失的信息补进记录。

一个合格的本节交付应是什么样

清楚的任务与复跑说明;保留原样的输入;实际执行的程序、参数和环境信息;独立命名的运行结果;一份比较结果与完成状态的说明。学生负责检查这些证据和科学含义,具体命令与代码可以由 Agent 执行和维护。

0.4 用 AI 加速学习与研究的习惯

把 AI 用成每天都能配合的学习伙伴

前三节准备了工具分工、单位口径和运行记录。现在把它们连成日常习惯:自己先理解任务,再用 AI 加速学习与执行,最后用证据检查结果。

靠谱的小组合作不是一个人做完、其他人只收文件。用 AI 也一样:具体操作可以交给它,但你要能提出问题、看懂结果、决定下一步。本节不考语法,完成标准是:面对新任务,你能说清自己知道什么、需要 AI 帮什么,以及怎样判断协作真的完成了。

一、开始前,先补到“能判断”的程度

玩新游戏不必背完装备数值,但要知道胜利条件和地图目标。以“分析一份能量数据”为例,开始前应知道:每行代表什么对象;能量是总能还是每原子;单位是什么;想比较分布、平均值还是稳定性;数据来自实验、计算还是教学构造。不懂的部分,先请 AI 用小例子解释。

我要分析这份能量数据。请先列出完成任务必须理解的三个概念,用校园或游戏里的例子解释,再回到这些概念在数据中的准确含义。每个概念给一道小题,先让我回答,再针对我的理解补充。

检验方法:不用 AI 的原句解释一遍,例如“我比较的是同一口径的能量分布,图不能证明材料可合成”。能说清这些,比复制一段漂亮定义有用得多。

二、读到陌生知识:解释、追问、复述

遇到“形成能”“分布外”“等变性”等术语,让 AI 先给直观解释,再给准确说法,最后指出类比在哪里不成立。比如用人均分理解归一化很方便,但不能推出“每原子能量越低就越稳定”。

  1. 贴出正在读的段落或指明文件位置,请 AI 围绕这份材料解释。
  2. 要一个足够小、能手工检查的例子。
  3. 针对不懂的那一步追问,而不是反复要求“再详细一点”。
  4. 用自己的话复述,请 AI 指出遗漏和错误。

AI 也会解释错。涉及定义、数据或论文结论时,回到教材、原文或官方资料核对,并要求它区分原文内容与自己的推断。

三、接到任务,先写一张任务卡

“帮我把实验做好”没说从哪开始、到哪结束。一张简短的任务卡能省去许多返工:

项目 要说明什么 本课的小例子
目的 想回答的问题 看十条教学能量的分布
输入 文件、来源、单位和口径 练习包的 CSV,eV/教学构型
已知与未知 哪些已确定,哪些需查明 知道列名;需检查缺失值
约束 可改变与需保留的条件 原始数据保留,结果另存
产物 最终需要什么 图、统计表、运行记录
验收 怎样确认完成 样本数正确、单位清楚、可以复跑

把任务说完整,比加上“你是顶级专家”“务必完美”更有用。Agent 能读的文件直接给路径,它访问不到的资料先提供内容。

四、做新流程,先跑一个小任务

就像先熟悉副本机制再挑战高难度,计算任务也先用几个样本跑通,确认理解一致再扩大范围。

先用少量样本把流程跑通,展示每一步读入什么、产生什么,以及一个可核对的结果。请估计扩大规模需要的时间与资源,并标明哪些只是估计。小任务检查通过后,再按约定范围继续。

检查点放在成本高、容易误解的环节,例如先确认一个结构文件读对了、单位正确,再处理整个数据库。小任务跑通只说明流程能执行,不说明方法有效——“程序能运行”和“科学结论成立”要分开判断。

五、遇到问题,把现场交给 AI

游戏掉线只说“进不去”很难排查。求助时说清:原本想做什么、实际发生什么、卡在哪一步、用了哪个输入、有什么报错。

目标是生成能量分布图,但这次运行只留下了一个空目录。请先检查实际日志、输入路径和环境,解释失败发生在哪一步,再修复并重新执行。保留旧记录,说明修复后检查了什么。

你不必亲手改脚本,但要能分辨错误类型:文件没找到、依赖不匹配、数据缺失、单位不清,还是算法本身不合适。AI 反复尝试同一种修复时,让它先总结已试过的办法和未验证的假设。

六、收到结果,固定问三个问题

第一,做的是我要求的事吗? 核对数据、样本范围、单位、比较对象与输出形式。

第二,有可检查的依据吗? 打开真实文件,抽查原始记录、图轴和统计值,重要数值用独立方法复核;来源性陈述要回到原文确认。

第三,结论超出证据了吗? 画出分布不等于训练好了模型,已有数据上误差低不等于能预测所有新材料。让 AI 说明本次结果支持什么、还没验证什么,你再判断。

熟练之后,这三问会成为看结果时的自然动作。

七、结束时,留下下次能用的东西

同一个问题下次还从零描述,是最浪费的时间。让 Agent 把验证过的步骤、数据位置、常见错误和当前状态写进项目说明。

请整理这次任务:目标、实际输入、采取的方法、结果位置、已完成的检查、遇到的问题与解决办法,以及下一步。把确认过的信息写入项目说明,把仍不确定的内容单独标明。

某类任务反复出现后,再把稳定步骤整理成模板或 skill。先有真实经验再总结,别一开始就搭一套自己都用不明白的流程。

八、怎样知道 AI 真的让你更快了

“生成了很多文字”不等于“推进了任务”。更实际的指标是:多久得到第一个可核查结果,返工是否减少,下次能否复用,自己是否更能解释结果。

每周留一条简短记录:用 AI 解决了什么问题,哪次输出需要纠正,积累了什么可复用材料,还有哪个概念要补课。熟悉的任务可以多交给 Agent;遇到新体系、新指标或意外结果,就多抽查、多补背景。自动化程度随理解和证据提高,而不是看回答有多自信。

九、综合练习:完成一个小任务,也讲清楚它

继续使用第零部分练习包:

  1. 先用自己的话解释数据的三列、单位和来源,写出这次想回答的问题。
  2. 给 Agent 一张任务卡,请它完成统计、画图和记录。
  3. 自己打开产物,抽查行数和数值,指出图能回答与不能回答的问题。
  4. 用自然语言要求改变一个设置,比较结果,并让 Agent 留下交接说明。
  5. 关掉对话,向同学用两分钟介绍输入、方法、结果和依据。可以看自己的记录,不必背诵代码。
这节最重要的验收标准

你知道自己提出了什么问题,能够解释输入与单位,找得到真实结果和记录,能够发现至少一种可能的错误,并说明下一步为什么值得做。Agent 可以承担全部具体代码操作;这些理解与判断,是学生需要通过一次次实践积累的能力。

后面每一章都重复这套习惯:掌握够用的基础,用 AI 加速解释和执行,用证据检查结果,把有效经验存下来。工具会变,这套协作方式会一直有用。

1.1 化学基础

上一节,我们练习了先理解任务、再用 AI 执行、最后核查结果。现在把这套习惯用到化学上:在请 AI 画分子、整理结构或预测性质之前,先弄清楚图里的原子、连线和能量分别代表什么。

本节围绕三个问题展开:物质由什么组成,原子怎样连接,结构为什么会变化。 学完后,你应能检查一个简单分子是否画得合理,并解释为什么“能量更低”和“反应更快”是两件需要分别判断的事。

一、从原子开始:先分清元素与电荷

原子由原子核和电子组成。原子核里的质子带正电,中子不带电;核外电子带负电。质子数决定元素种类:6 个质子对应碳,8 个质子对应氧。相同元素的原子如果中子数不同,就属于不同的同位素。

可以借用校园学籍来记忆:更换座位不会让你换一个专业。同样,一个原子得到或失去电子,并不会改变它属于哪种元素;不过,它的电荷会改变。这个类比只帮助区分“元素身份”和“带电状态”,并不解释电子怎样运动。

当质子数与电子数相等时,原子呈电中性;失去电子后带正电,得到电子后带负电,这样的带电粒子叫作离子。例如,Na⁺ 仍是钠,但比中性钠原子少一个电子。整个分子也可以带电,例如 NH₄⁺。

接下来要关心电子,因为成键主要涉及价电子。对于本节常见的主族元素,可以先把价电子理解为参与成键的最外层电子。电子的状态需要用量子力学描述;入门时先掌握电子数、电荷和成键关系,具体计算留到 DFT 部分。

二、从电子到化学键:原子为什么连在一起

知道有哪些原子之后,还要解释它们为什么能形成结构。当原子靠近时,电子与原子核之间的吸引,以及电子之间、原子核之间的排斥会共同影响能量。若结合后的状态比相应的分离状态能量更低,就可能形成束缚状态。

这有点像组队打副本:了解队员名单之后,还得看他们怎样配合。不过,原子没有组队意愿,是否成键由物理相互作用决定。下面三种成键图像,适合用来建立最初的认识。

成键图像 怎样理解 例子
共价键 原子之间共享电子,入门时常用共享电子对来表示 水中的 O—H 键
离子键 正、负离子之间的静电作用是主要特征 氯化钠晶体
金属键 价电子在许多原子之间离域,参与整体结合 铜、铝等金属

实际成键可以兼有不同特征,不必把每种材料硬塞进一个完全独立的类别。例如,水中的 O—H 键是共价键,但氧吸引成键电子的能力更强,因此电子分布并不均匀,氧端偏负、氢端偏正。这叫键的极性,其中的部分电荷不等于完整的离子电荷。

由此还能理解水分子之间的氢键:一个水分子的氢端,可以与另一个水分子的氧形成特定的吸引作用。这里要区分两个层次——水分子内部的 O—H 共价键,以及水分子之间的氢键。就像课程小组内的分工和不同小组间的合作,讨论前先说明关系发生在哪一层。

三、从化学键到结构式:数量相同,连接可以不同

有了成键的概念,就能开始读结构式。分子式告诉我们有什么、各有多少;结构式进一步告诉我们谁与谁相连。 例如,C₂H₆O 可以对应乙醇 CH₃—CH₂—OH,也可以对应二甲醚 CH₃—O—CH₃。两者的原子数量相同,连接关系却不同,因此是不同的物质,这种关系叫作构造异构。

这像同一批同学参加小组作业:名单相同,并不意味着分组关系相同。因此,把分子交给 AI 时,只给分子式有时不够,还需要明确连接关系。

为了检查这些连接,可以先记住常见中性小分子中的几条规律:H 通常形成 1 个键,C 通常形成 4 个键,N 通常形成 3 个键,O 通常形成 2 个键。这里计入键级:单键计 1,双键计 2,三键计 3。例如,O=C=O 中,碳连接两个氧,但两个双键的键级之和是 4。

这些规律适合初步检查,不是适用于所有化学体系的硬性规则。例如,NH₄⁺ 中的氮形成四个 N—H 键,同时需要标明正电荷。看到不常见的成键数量时,先检查电荷、电子状态和具体化学环境,再判断是否画错。 结构式中的形式电荷是一种电子计数记号,也不能直接当成原子真实电荷分布的测量值。

连接关系确认后,还要看空间形状。水分子虽然可以在纸上写成 H—O—H,真实几何却是弯曲的;孤立水分子的键角约为 104.5°。同样的连接关系也可能对应不同空间构型,单键转动还可以产生不同构象。这像知道教室里坐着哪些同学、谁与谁同组之后,还需要座位信息才能描述实际安排。

因此,读结构可以按三层推进:组成 → 连接 → 三维排列。 下一节 ChemDraw 主要帮助我们表达连接关系及必要的立体信息;三维坐标则需要进一步建立和检查。此外,氯化钠这类晶体通常不存在独立的“NaCl 小分子”,式子表示组成比例,周期排列会在 1.3 节展开。

四、从结构到能量:为什么距离不能随便改

既然三维排列很重要,接下来就要问:同样两个原子,靠近一点或远离一点,会有什么变化?以 H₂ 为例,两个氢原子相距很远时相互作用很弱;逐渐靠近,能量会下降;靠得过近,排斥作用又使能量迅速升高。因此,能量曲线上存在一个最低点,其附近对应平衡键长。

可以把这条曲线想成游戏地图中的一段地形:横轴代表原子间距,纵轴代表能量,谷底附近是较稳定的位置。不过,这里的“高度”只是能量的图像,并不是原子在真实空间里的海拔。真实分子也不是静止在谷底,原子会发生振动。

比较两个状态时,常写成 ΔE = E终态 − E初态。例如,在同一计算方法下,同一个中性分子的两个构象分别为 −10.0 eV 和 −10.2 eV,则后者比前者低 0.2 eV。负号本身没有特殊的稳定性含义,关键是参考一致时的差值。

这里也用到了 0.2 节的单位知识:先确认比较的是总能还是每原子能量,并核对组成、电荷和计算设置。就像比较游戏成绩前要核对模式、规则和计分口径,不同材料的总能数值不能直接拿来排稳定性;涉及不同组成时,还需要合理的参考态或配平反应。

五、从能量到反应:终点更低,还要看过程

化学反应会重新安排原子之间的连接。在普通化学反应中,各元素的原子数和总电荷守恒。因此,读反应式的第一步是配平。例如 2H₂ + O₂ → 2H₂O,两边都有 4 个氢原子和 2 个氧原子。配平能检查数量,却不能证明反应一定发生,也不能说明它有多快。

要理解能量变化,还须纠正一个常见误解:断开化学键需要能量,形成化学键释放能量。 一个反应最终吸热还是放热,要比较整个过程中的能量变化,不能只看到“断键”就说释放了能量。平均键能可以辅助粗略估算,但不能代替具体条件下的反应热计算。

即使产物状态更有利,从反应物到产物也往往需要先跨过能垒。仍用游戏地图来理解:目标区域比当前位置低,但路径上可能横着一段高坡。终点与起点的高度差,对应状态之间的能量差;必须先越过的坡,则帮助我们理解反应能垒。因此,反应是否有利与反应进行得快不快,需要分别判断。

催化剂的作用是提供另一条反应路径,降低相关活化能垒,像游戏地图中出现一条更容易通过的路线;它不会改变反应的始末状态,也不改变给定温度下的平衡常数。类比到这里即可:真实反应速率还受温度、浓度和具体机制等因素影响。

最后补上一条边界:前面用能量曲线建立直觉,而在恒温恒压条件下,判断反应的热力学方向通常要看 Gibbs 自由能变化 ΔG,其中还包含温度和熵的影响。现阶段先记住:一个结构的计算总能较低,不能单独证明它容易生成,更不能单独证明实验一定能合成。

六、自己先判断,再请 AI 核查

现在把前面的内容连起来,先不用 AI 回答三道小题,再请它检查你的理由。

  1. Na 失去一个电子形成 Na⁺ 后,元素种类是否改变?
  2. 乙醇与二甲醚都有分子式 C₂H₆O,为什么仍需分别记录结构?
  3. 某反应的产物能量比反应物低,能否据此判断它在室温下很快发生?
完成后展开,核对理由
  1. 没有改变。质子数不变,改变的是电子数和电荷。
  2. 两者连接关系不同,属于不同物质。只记录分子式会丢失这一差别。
  3. 不能。还要考虑反应路径与能垒、温度等因素;讨论热力学方向时,也应采用相应条件下的自由能判据。

随后可以给 Cursor 或 Codex 一项小任务:

请并列展示乙醇和二甲醚的连接关系,标明各原子的连接、氢原子数与总电荷,并核对两者是否都是 C₂H₆O。如果使用 RDKit,请保存可检查的结构文件和结果图片。我不需要编写代码,但需要你解释检查依据;不要仅凭分子式猜测唯一结构。

拿到结果后,自己数一遍 C、H、O,检查氧连接在哪里,再用两句话解释两幅图的差别。这样,AI 承担具体操作,你保留最基本的化学判断。接下来的 1.2 节,我们就把这些判断带进 ChemDraw,亲手修改结构、标注电荷,并画出清楚的反应式。

1.2 ChemDraw:画出分子与反应

上一节,我们先用眼睛和常识检查了原子、化学键与能量。接下来,就要把这些判断落到纸面上:在 ChemDraw 里亲手画出分子与反应,让别人一眼看懂“谁和谁相连、带什么电荷、朝哪个方向”。

因此,本节的目标不是把 ChemDraw 的每个按钮都背下来,而是学会画出一张化学上正确、别人能读懂、计算机也能读取的结构图。 学完后,你应该能画出一个小分子和一个简单反应式,并且能把它导出为图片和 MOL/SMILES。

一、认识画布与常用绘图工具

打开 ChemDraw 之后,首先看到的是一块空白画布,以及左侧(或顶部)的一列工具栏。其中,最常用的只有几样:画化学键的实线键工具、输入元素符号的文字工具、画环的环工具,以及画反应箭头的箭头工具。此外,选择工具(套索或框选)负责移动、旋转和删除已经画好的部分。

先不急着画复杂分子,而是用一分钟熟悉手感:选中实线键工具,在画布上单击一下,就会出现一根键;接着在键的末端继续单击,就能接出第二根键,并且键角会自动取一个合理的锯齿形。于是,连续单击几次,就得到一条碳链。

这里要先建立一个约定:ChemDraw 默认不写出的线端就是碳原子,碳上的氢也默认省略。 也就是说,画面上的一个拐点代表一个 C,而它还差几根键,就隐含几个 H。这就像班级名单里默认“未注明专业即为本专业”:约定一旦说清,图面就能省去大量重复信息。

不同版本的菜单位置会略有差别,所以遇到找不到的功能时,可以把鼠标悬停在按钮上看提示,或者直接问 AI“在 ChemDraw 某版本里,某功能在哪个菜单”。不过,功能在哪里可以问,画得对不对仍要你自己判断。

二、绘制原子、化学键、芳香环与形式电荷

有了碳骨架之后,下一步就是把杂原子标出来。例如画乙醇时,先画两根相连的键得到 C—C—C 形状,接着选中文字工具,单击最后一个端点并输入 O,这个端点就从碳变成了氧。随后 ChemDraw 会按氧通常形成 2 个键的规律,自动显示成 OH。因此,自动补出的氢数本身就是一次检查:如果你输入 O 后显示的是 OH₂ 或 O 旁边出现警告框,就说明连接或电荷有问题。

接着处理键级。在已有的单键上再次单击,通常会把它变成双键;再单击一次,则可能变成三键。例如乙酸的羧基 C(=O)OH,就是在一根 C—O 单键上再单击一次得到的 C=O。同样,画完后要数一数:中心碳是否仍然正好是 4 个键。

至于芳香环,一般直接用环工具里的苯环模板。ChemDraw 画出的苯环通常是单双键交替的凯库勒式,这和画成圆圈的写法表达的是同一种芳香结构。也就是说,苯环并不是“三个单键加三个双键”各自固定,电子在整个环上离域;交替写法只是一种记账方式。后面把分子交给 RDKit 时,程序会重新识别芳香性,所以两种画法最终应当指向同一个分子。

最后是形式电荷。例如画铵离子 NH₄⁺ 时,氮连了 4 个氢,这时就必须在氮上标一个正电荷;否则,按“氮通常形成 3 个键”的规律,图就是错的。标电荷时,可以用电荷工具(通常是带 ⊕/⊖ 的按钮)单击原子,也可以在文字工具里直接输入 NH4+。同理,乙酸根写作 CH₃COO⁻,负电荷要落在一个氧上。

你画出的情况 可能的含义 应该检查什么
C 连了 5 根键 多画了一根键,或本想画别的原子 重新数键级之和
N 连了 4 根键但无电荷 漏标正电荷 是否应为铵类阳离子
O 只连 1 根键且无 H 可能是带负电的氧,或漏了氢 是否应标 ⊖,或是否本应为 OH
原子旁出现红框或警告 ChemDraw 认为价态异常 先查电荷和键级,再决定是否忽略

此外,ChemDraw 通常可以打开“分析”窗口,实时显示分子式和分子量。因此,每画完一个分子,都值得顺手看一眼分子式:画出的分子式与你预期的分子式一致,才进入下一步。

三、楔形键、虚线键与立体化学

到目前为止,我们画的都是平面上的连接关系。然而,真实分子是立体的,所以有些时候平面图不足以区分两个分子。例如乳酸 CH₃CH(OH)COOH 的中间碳连着四个不同的基团,于是它存在两种互为镜像、却不能重合的结构,就像左手和右手。这样的碳叫作手性中心。

为了在纸面上表达“哪个基团朝前、哪个朝后”,化学家约定:实心楔形键表示指向读者,虚线楔形键表示背离读者,普通实线则在纸面内。 因此,画手性中心时,要从键工具组里选择楔形键或虚线键,并且让楔形的尖端落在手性中心上。

与此同时,双键也会带来立体问题。例如 2-丁烯中,两个甲基可能在双键同侧,也可能在两侧,分别对应顺式(Z)和反式(E)。这类立体信息不需要楔形键,而是由双键两端基团在图中的相对位置直接表达。所以,画双键时如果把取代基画得“歪到一边”,就可能不小心改变了 E/Z。

需要提醒的是,楔形键只有在有意义的位置才表达立体化学。反过来,如果某个手性中心你并不知道构型,就不要随手加一个楔形键;否则,别人(以及后面的程序)会以为你确定了它。较新的 ChemDraw 还可以直接显示 R/S 标记,所以画完后可以打开这项显示,核对它与文献给出的构型是否一致。

四、反应箭头、条件标注与结构排版

分子画好之后,就可以把它们组织成反应式。以酯化反应为例:乙醇与乙酸在浓硫酸催化和加热条件下,生成乙酸乙酯和水。首先,把反应物和产物分别画好;接着,用箭头工具在它们之间拉一根向右的箭头;然后,用文字工具在箭头上方写催化剂“浓 H₂SO₄”,在下方写条件“加热”。

在这里,不同形状的箭头含义不同,所以不能随意混用。

箭头 含义
单向箭头 → 反应向右进行
可逆箭头 ⇌ 可逆反应或平衡
双头箭头 ↔ 共振式之间的关系,不是反应
弯箭头 反应机理中电子对的移动方向

例如,酯化反应其实是可逆的,因此严格来说应当画成 ⇌;而如果把共振式之间的 ↔ 误用成反应箭头,读者就会以为发生了化学变化。

接下来是排版。画完之后,先用“整理结构”(Clean Up Structure)让键长和键角统一,再用对齐工具让反应物、箭头和产物排在同一条水平线上。同时,整张图里的字号、键长和线宽应当保持一致;这就像同一份报告里的字体要统一,否则读者会被格式分散注意力。最后,再对照上一节学过的配平规则,数一遍两边的 C、H、O:左边 C₂H₆O + C₂H₄O₂,右边 C₄H₈O₂ + H₂O,碳、氢、氧分别都是 4、10、3,于是这个反应式在原子数上是平衡的。

五、保存可编辑文件,导出图片与 MOL/SMILES

画完一张图,至少要保留三种产物,因为它们各有用途。

  1. 可编辑源文件:保存为 .cdxml(或 .cdx)。这相当于游戏存档,以后改一根键不必从头再画。
  2. 图片:导出为 PNG 或 TIFF 等格式,用于 PPT 和论文;导出时选择足够高的分辨率,常见要求是 300 dpi 以上。
  3. 机器可读的结构:选中一个分子后,可以复制为 SMILES(通常在“编辑 → 复制为”一类菜单里),也可以另存为 MDL Molfile(.mol)。

其中,第三种最容易被忽略,却对后面的课程最重要。图片只给人看,程序读不出里面的原子和键;而 SMILES 与 MOL 记录的是连接关系本身。 例如,乙醇的 SMILES 是 CCO,乙酸是 CC(=O)O,乙酸乙酯是 CCOC(C)=O。同样,带电荷和手性的信息也能写进 SMILES:乙酸根是 CC(=O)[O-],L-乳酸是 C[C@H](O)C(=O)O,其中 @ 记录了手性。

另外,一张画布上如果同时画了反应物和产物,复制出来的 SMILES 可能是用点号连接的多个分子,或者是一条反应 SMILES。所以,导出前先只选中你要的那个分子,导出后再把 SMILES 贴回 ChemDraw(或交给 RDKit)重新画一次,看是否得到原来的结构。这种“导出再读回”的往返检查,能发现大部分漏标电荷或立体信息的问题。

六、二维结构式、分子连接关系与三维构象的区别

讲到这里,需要把三个容易混在一起的概念分开。首先,ChemDraw 画的是二维结构式,它的主要任务是表达连接关系,以及必要的立体标记。其次,连接关系(谁和谁相连、键级多少、电荷在哪)才是结构式真正承载的化学信息。最后,三维构象是原子在空间中的实际坐标,同一个连接关系可以对应许多构象。

因此,ChemDraw 图上的键长和键角只是为了好看,并不是真实的几何数据。例如,你把乙醇的 C—O 键拉长一倍,它仍然是乙醇;同样,把图整体旋转 90°,它也还是同一个分子。反过来说,从 ChemDraw 导出的 MOL 文件里虽然有坐标,这些坐标通常只是二维排版坐标(z 全是 0),不能直接当作三维结构去做计算。

那么,三维结构从哪里来?一般有两种途径:一是从实验或数据库里读取已测定的结构;二是由程序(例如 RDKit)从连接关系生成一个初始构象,再用力场或 DFT 优化。这两条路会分别在 1.5 节和第二部分展开。现在只需记住:结构式回答“连成什么样”,三维坐标回答“摆成什么样”,两者不能互相替代。

七、练习:画出一个小分子及其反应式,核对原子价态与导出结果

现在把本节内容串起来完成一次完整练习。

  1. 在 ChemDraw 中画出乙醇、乙酸、乙酸乙酯和水,并排成酯化反应式;箭头上方写“浓 H₂SO₄”,下方写“加热”,并用可逆箭头。
  2. 逐个打开分析窗口,核对四个分子的分子式分别为 C₂H₆O、C₂H₄O₂、C₄H₈O₂、H₂O。
  3. 另画一个 L-乳酸,用楔形键或虚线键表示手性中心,并打开 R/S 显示,确认它是 S 构型。
  4. 保存 .cdxml,导出一张 PNG,再分别复制四个分子和乳酸的 SMILES,粘贴到一个文本文件里。
完成后展开,核对要点
  1. 反应式两边 C、H、O 分别为 4、10、3。如果不平衡,通常是漏画了水,或羧基少了一个氧。
  2. 乙酸中间的碳必须是一个 C=O 双键加一个 C—O 单键;如果画成两个单键,分子式会多出两个氢。
  3. 乳酸的楔形尖端应当落在中间那个碳上;如果 R/S 显示为 R,可以把楔形键和虚线键对调,或者交换两个取代基的位置。
  4. SMILES 贴回 ChemDraw 后应当得到同样的结构;乳酸若失去手性标记,说明导出时没有包含立体信息。

最后,把文本文件交给 Cursor 或 Codex,请它做一次独立核查:

请用 RDKit 读取这个文件里的每条 SMILES,逐条输出规范化 SMILES、分子式、形式电荷和手性中心的 R/S 标记,并生成一张带编号的分子网格图。读取失败的条目请单独列出原因,不要跳过。我不需要写代码,但需要你说明每项检查的依据。

拿到结果后,把 AI 给出的分子式和 R/S 与你在 ChemDraw 里看到的逐项对照。这样,你负责判断结构,ChemDraw 负责表达,RDKit 负责批量核对,三者各司其职。接下来,1.3 节会从单个分子走向成千上万个原子规则排列的晶体,看看结构在三维空间里怎样“重复”。

1.3 材料与晶体学基础

上一节,我们在 ChemDraw 里画的都是单个分子:原子数量有限,连接关系一目了然。然而,金属、陶瓷和半导体这类材料里,原子动辄以 10²³ 的数量堆在一起,显然不可能逐个画出来。因此,本节要换一种思路来描述结构:先找出重复的规律,再只描述一个重复单元。

具体来说,本节依次回答五个问题:晶体为什么可以只描述一小块?这一小块怎样划定?块里的原子位置怎样记录?哪些位置是“等价”的?真实材料又在哪些地方偏离理想晶体?学完后,你应该能读懂一份晶体结构的基本信息,并为下一节用 VESTA 观察晶胞做好准备。

先认识 DFT:后面反复提到的计算方法

在正式进入晶体之前,先简单认识一个本节会多次提到的名字:DFT。不妨把电子想成房间里的一团“雾”:有些地方雾浓,有些地方雾淡。那么,要估计这团雾的整体能量,与其追踪每个电子的所有细节,不如先描述它在各处有多浓,再用计算方法去估算。当然,这只是帮助理解的比喻,电子并不是真的雾。

具体来说,DFT 的全称是密度泛函理论。它用“电子在空间各处有多密”这张分布图,来计算材料或分子的能量和结构。并且,计算时电脑会反复调整这张图,直到结果稳定下来。其中,“泛函”指的是把整张电子密度分布作为输入、用来估算能量的公式;例如,PBE 就是常见的一种泛函。

举个例子,给电脑一个硅晶胞和里面原子的位置,DFT 就会估算电子如何分布、整个结构的能量有多高,并据此判断原子是否需要稍微移动。于是,电脑反复调整之后,就能找到比较稳定的结构,也能比较不同结构哪个更稳定。

简单记:DFT 是计算方法,而泛函是其中负责估算能量的一类公式。 至于它的原理和设置,会在第二部分详细展开;本节只需知道,下面讲的晶胞和坐标,正是交给 DFT 的输入。

一、周期性:只要知道一块瓷砖,就能想象整面墙

先看一个生活里的例子。一面铺满相同瓷砖的墙,虽然有成百上千块砖,但只要知道一块砖的图案,再知道它向左右、上下怎样平移,整面墙就能完整地想象出来。

同样,许多晶体中的原子也按固定规律重复排列。也就是说,只要描述一个小范围内的原子排列,再沿三个固定方向不断平移,就能拼出整个理想晶体。这种“沿固定方向平移后与自身重合”的性质,叫作周期性。

例如,硅晶体里的原子就按固定结构反复排列。因此,后面做计算时,不必真的放进一整块无限大的硅;相反,只要给程序一个硅的基本结构,并告诉它“这块结构会在空间中周期重复”,程序就能用有限的计算近似表示整块晶体。第二部分的 DFT 计算正是这样工作的,所以周期性不只是描述上的方便,也是计算上的前提。

不过,并不是所有固体都有这种规整的重复。例如,玻璃和液体中的原子只在很短的距离内有一定规律,放远了看就杂乱无章,这类材料叫作非晶。因此,本节的描述方法主要适用于晶体;处理非晶时,通常需要换用更大的模型或统计方法。

二、晶胞与坐标:用一个小盒子装下重复单元

既然晶体可以靠重复拼出来,接下来就要问:拿哪一块来重复?在瓷砖墙上,我们挑一块砖作为基本单元;在晶体里,这个基本单元就叫晶胞。顾名思义,晶胞可以理解为“晶体的细胞”:正如许多细胞构成生物体,许多晶胞也沿三个方向堆叠成整块晶体。

更准确地说,晶胞是一个平行六面体形状的空间盒子,它通过平移能够不重不漏地填满整个晶体。于是,描述一个晶胞需要两类信息:

信息 内容 例子(硅的常规晶胞)
盒子的形状 三条边长 a、b、c,以及三条边两两之间的夹角 α、β、γ,合称晶格参数 a = b = c ≈ 5.43 Å,α = β = γ = 90°
盒子的内容 盒子里有哪些元素的原子,各自位于什么位置 8 个硅原子及其坐标

值得注意的是,晶胞的选法不止一种。就像同一面墙既可以把一块砖当单元,也可以把相邻四块砖合起来当单元,晶体的晶胞也可以取大取小。其中,体积最小、只含最少原子的叫原胞;而为了让对称性一目了然,人们常常选用更大、更规整的常规晶胞。例如,硅的常规立方晶胞含有 8 个硅原子,换成原胞却只需要 2 个硅原子,但两者重复出来的是同一块硅晶体。所以,计算时选原胞往往更省力,而画图和讲解时选常规晶胞通常更直观。

另外,数晶胞里的原子时还有一个常见陷阱:位于晶胞顶点、棱上或面上的原子,其实同时被相邻的几个晶胞共享。例如,以氯化钠的常规立方晶胞为例,若氯原子位于 8 个顶点和 6 个面心,那么每个顶点原子只有 1/8 属于这个晶胞,每个面心原子只有 1/2 属于它,因此氯原子实际共有 8 × 1/8 + 6 × 1/2 = 4 个。同理,钠原子也是 4 个,所以这个晶胞的组成是 Na₄Cl₄,与化学式 NaCl 的 1∶1 比例一致。如果数出来的比例和化学式对不上,首先怀疑是不是把共享的原子重复计算了。

三、分数坐标与笛卡尔坐标:两种报位置的方式

盒子划定之后,还要说清楚原子在盒子里的位置。这就像在房间里指路:你可以说“从墙角出发,沿两面墙各走一半”,也可以说“从墙角向东 2 米、向北 3 米”。前一种按房间边长的比例来报位置,后一种直接报实际距离,于是就对应了晶体中的两种坐标。

首先,分数坐标说的是沿三条晶胞边各走了多少比例。例如,(1/4, 1/4, 1/4) 表示沿 a、b、c 三条边各走四分之一。因此,分数坐标没有长度单位,并且晶胞内部的原子,其分数坐标一般都落在 0 到 1 之间。

其次,笛卡尔坐标直接给出相对原点的实际距离,通常以埃(Å)为单位。例如,立方硅晶胞边长约 5.43 Å,那么分数坐标 (1/4, 1/4, 1/4) 对应的笛卡尔坐标约为 (1.36, 1.36, 1.36) Å。可见,两者描述的是同一个位置,只是表达方式不同。

不过,只有在直角盒子里,换算才是“各乘边长”这么简单。如果晶胞的夹角不是 90°,那么分数坐标仍然沿三条斜着的晶胞边来量,而换算成笛卡尔坐标时,就需要用整个晶格矩阵去乘。这项计算交给程序即可,但你要记住结论:同一组数字,当成分数坐标还是笛卡尔坐标,得到的位置可能完全不同。 因此,读取任何结构文件时,第一件事都是确认它用的是哪一种坐标。

此外,由于周期性,分数坐标还有一个特别的性质:把坐标加上或减去一个整数,得到的是相邻晶胞中的等价原子。例如,(1.02, 0.5, 0.5) 和 (0.02, 0.5, 0.5) 在晶体中代表同一种位置。所以,看到略大于 1 或略小于 0 的分数坐标时,不必惊慌,它往往只是原子“跨出了盒子边界”,平移回来即可。

四、直观的对称性:转一转、照一照,看是否重合

接下来看对称性。例如,正方形转 90° 后看起来还是原来的正方形;同样,铺得整齐的地砖图案在旋转或镜像后,也可能与原来完全重合。这种“做了某个操作之后,看起来没有变化”的性质,就叫作对称性。

放到晶体里,判断标准就更严格一些:把原子整体平移、旋转或镜像之后,每个原子都必须落到同种元素原子原来所在的位置上,才算具有相应的对称性。换句话说,不能只看几何轮廓是否重合,还要看元素是否对得上;把硅原子转到另一个硅原子的位置才算重合,转到空位上则不算。

那么,对称性有什么用?首先,它能告诉我们哪些原子的环境是等价的。例如在理想硅晶体中,每个硅原子周围都是 4 个硅原子,以正四面体方式排布,所以所有硅原子是等价的。因此,研究一个硅原子的局部环境,就等于研究了全部硅原子。其次,计算程序也会利用对称性识别等价位置,从而减少重复计算。

然而,对称性很容易被打破。例如,从理想硅晶体里拿掉一个原子,原来能与自身重合的一些旋转操作就不再成立了。也就是说,缺陷不仅改变了局部结构,还可能降低整体的对称性。至于对称性更系统的描述,也就是空间群和 Wyckoff 位点,会留到第五部分晶体结构预测时再展开;现阶段,能用“转一转、照一照”来直观判断即可。

五、缺陷与相:真实材料与理想晶体的差别

到目前为止,我们讨论的都是完美的、无限重复的理想晶体。但真实材料总有不完美之处。仍以瓷砖墙为例:少了一块砖、多塞进一块砖,或者换了一块不同颜色的砖,都会让墙面偏离完美的重复,这就相当于晶体中的缺陷。

缺陷类型 含义 瓷砖墙里的样子
空位 本该有原子的位置空着 少了一块砖
间隙原子 原子挤进了本不该有原子的空隙 砖缝里多塞了一块
替位缺陷 某个位置换成了另一种元素 换了一块别的颜色的砖

尽管缺陷只占极少数原子,它们却常常决定材料的关键性质。例如,在硅中掺入极少量的磷或硼替代硅原子,就能大幅改变它的导电能力,这正是半导体器件的基础。

那么,怎样在计算中表示一个缺陷?通常的做法是:先把晶胞沿三个方向扩大若干倍,得到一个超胞,然后在其中拿掉或替换一个原子。之所以要先扩大,是因为计算时这个超胞仍会被周期复制,所以模型里实际上会出现一排排重复的缺陷。因此,超胞如果太小,相邻缺陷之间的距离就太近,它们会相互影响,算出的结果也就不能代表“一个孤立的缺陷”。

另一方面,除了局部缺陷,同一种化学成分还可以采用完全不同的整体排列方式,这些不同的结构状态叫作相。例如,钻石和石墨都只由碳组成,但钻石中每个碳原子与 4 个碳原子形成三维网络,而石墨中碳原子排成一层层平面,层与层之间只靠较弱的作用力结合。于是,同样是碳,一个极硬、不导电,另一个却柔软、能导电。同理,二氧化钛也有金红石、锐钛矿等不同的相。

更重要的是,哪个相最稳定,会随温度和压力变化。例如,常温常压下石墨比钻石略稳定,而在高温高压下钻石才成为更稳定的相。这提醒我们:只写化学式并不能确定一个材料,还必须说明它是哪一个相、在什么条件下。 后面整理数据时,这一点会反复出现。

六、把五个概念连起来

最后,把本节内容串成一条线:周期性告诉我们晶体会重复;晶胞让我们用一个小盒子描述这种重复;坐标记录原子在盒子里的位置;对称性帮助我们识别等价的原子和环境;而缺陷与相则描述真实材料怎样偏离理想晶体,或者采用另一种整体结构。

在此基础上,先不借助 AI,试着回答下面三道小题。

  1. 一个晶胞的晶格参数为 a = b = c = 4.0 Å、α = β = γ = 90°,其中一个原子的分数坐标是 (0.5, 0.5, 0.5)。它的笛卡尔坐标是多少?
  2. 某份结构文件中出现了分数坐标 (−0.01, 0.25, 0.25),这是否说明原子跑到了晶体外面?
  3. 要计算硅中单个空位的性质,为什么不能直接从 2 个原子的原胞里拿掉一个原子?
完成后展开,核对理由
  1. (2.0, 2.0, 2.0) Å。因为是直角盒子,所以分数坐标各乘边长即可。
  2. 不是。由于周期性,它与 (0.99, 0.25, 0.25) 是等价位置,只是原子落在了晶胞边界另一侧。
  3. 因为拿掉后只剩 1 个原子,而且周期复制后每个晶胞都缺一个原子,相当于缺了一半的硅,已经不是“少量缺陷”了。所以应先扩成较大的超胞,再拿掉一个原子。

接着,可以请 AI 帮你核查自己的理解:

请以硅的常规立方晶胞(a ≈ 5.43 Å)为例,列出 8 个硅原子的分数坐标,并换算成笛卡尔坐标;再说明原胞与常规晶胞的原子数为什么不同。请标明坐标单位,不要省略换算依据。

拿到结果后,挑两个原子自己手算一遍笛卡尔坐标,再检查原子总数是否为 8。这样,下一节打开 VESTA 时,你看到的就不再是一团彩色小球,而是一个有边长、有坐标、有规律的晶胞。

1.4 VESTA:看懂晶胞与原子结构

上一节,我们用晶格参数、分数坐标和对称性,在纸面上描述了一个晶胞。然而,只看数字很难想象原子在空间里怎样排布,所以本节要借助 VESTA,把这些数字变成一个可以旋转、测量和导出的三维结构。

需要先说明的是,VESTA 是一个查看和检查结构的工具,而不是修改结构的主要工具。因此,本节的重点是:打开一份结构文件,先核对数字,再观察图像,最后导出一张准确的结构图。 学完后,你应该能用同一份文件解释晶胞、配位和周期性,并且能分辨“显示出来的原子”和“文件里真实存在的原子”。

一、打开 CIF/POSCAR,核对元素、晶格参数与原子坐标

首先,需要一份结构文件。常见的来源有两种:一是从 Materials Project 或晶体学开放数据库(COD)下载 CIF 文件;二是使用课程或计算得到的 POSCAR 文件。本节以氯化钠(岩盐结构,a ≈ 5.64 Å)和硅(a ≈ 5.43 Å)为例,你可以请 AI 帮你找到这两份 CIF,并说明来源。

接着,用 File → Open 打开文件,画面上就会出现一个带边框的晶胞和若干彩色小球。不过,先别急着欣赏图像,而是先核对数字。 具体来说,打开 Edit → Edit Data → Unit Cell,可以看到晶格参数 a、b、c 和 α、β、γ;然后切换到 Structure Parameters,可以看到每一种原子的元素、分数坐标和占位率。

核对项目 氯化钠应当看到 如果不一致,可能的原因
晶格参数 a = b = c ≈ 5.64 Å,三个角都是 90° 文件用了原胞,或下载了别的相;计算数据库的值可能略大,约 5.7 Å
原子列表 只列出 1 个 Na 和 1 个 Cl 这是不对称单元,其余位置由对称操作生成
占位率 都是 1 小于 1 说明存在无序或部分占位
空间群 Fm-3m 空间群不同,说明结构不同

其中,第二行最容易让人困惑:明明晶胞里有 4 个钠和 4 个氯,为什么列表里各只有 1 个?这是因为,CIF 常常只记录最少的一组原子(不对称单元),再由空间群的对称操作把其余位置“复制”出来。因此,文件里写了几个原子,和晶胞里实际有几个原子,是两回事;VESTA 会自动完成这一步展开,所以图里能看到完整的晶胞。

同理,打开 POSCAR 时也要做对应的检查:元素顺序和每种元素的原子数是否对得上,坐标是 Direct(分数坐标)还是 Cartesian(笛卡尔坐标)。如果这一步就错了,那么后面画得再漂亮也没有意义。

二、旋转、缩放与选择观察方向

核对完数字之后,就可以开始观察了。首先,用鼠标左键拖动可以旋转结构,滚轮可以缩放,右键或中键(取决于设置)可以平移视图。于是,你可以像在游戏里转动视角一样,从各个角度看这个晶胞。

不过,随意转动得到的图往往既不好看,也不好解释。因此,更常用的是沿特定方向观察:工具栏上通常有“沿 a 轴看”“沿 b 轴看”“沿 c 轴看”的按钮,点一下,视线就会对准相应的晶轴。例如,沿 c 轴看氯化钠时,钠和氯会排成整齐的棋盘格,这比斜着看要清楚得多。

此外,如果想强调某个晶面上的原子排布,可以在视图方向设置中指定一个晶面方向,让视线垂直于它。这里暂时不需要掌握晶面指数的完整定义;你只需知道,好的结构图总是先选定观察方向,再截图,而不是“转到差不多就截”。并且,写论文时要在图注里说明观察方向,这样读者才能复现你看到的画面。

三、晶胞边界、周期性显示范围与跨边界邻居

接下来是本节最容易出错、也最值得理解的一点。默认情况下,VESTA 会把分数坐标恰好等于 0 或 1 的原子都画出来。例如,氯化钠晶胞的 8 个顶点上都能看到原子,而在上一节我们算过,这 8 个顶点原子合起来只算 1 个。因此,图上能数出的小球数,通常多于晶胞真正包含的原子数。

那么,显示范围由谁决定?在 Objects → Boundary 里,可以设置沿 x、y、z 三个方向显示的分数坐标范围。例如,把范围从默认的 0~1 改成 −0.5~1.5,画面上就会多出一圈相邻晶胞中的原子;反过来,也可以缩小范围,只显示部分原子。

之所以要调整显示范围,是因为晶胞边界附近的原子,它们的邻居往往在相邻晶胞里。例如,位于晶胞一角的钠原子,按默认显示只能看到它的一部分邻居;只有把显示范围放大,才能看到它周围完整的 6 个氯原子。也就是说,边界是我们人为划定的盒子,而原子本身并不知道边界在哪里。

但一定要记住:Boundary 只改变“显示多少”,不改变“结构是什么”。 无论你显示几个晶胞,文件里的结构都没有变化;同样,把这张图导出后数小球,也不能得到晶胞的真实原子数。

四、设置成键距离,测量键长与键角

看清原子之后,下一步是看它们之间的“连线”。然而,VESTA 里的键并不是从文件里读出来的,而是按距离规则自动画出来的:两个原子的距离落在设定的范围内,就画一根键。因此,这些连线只是一种显示约定,并不等于化学上一定存在化学键。

具体来说,在 Edit → Bonds 里,可以为每一对元素设置最小和最大距离。例如,为 Na–Cl 设置 0~3.2 Å,就会把相距约 2.82 Å 的最近邻钠和氯连起来。反过来,如果把上限设得太大,图上就会出现一堆本不该有的连线;设得太小,本该相连的原子又会断开。所以,看到奇怪的键时,先检查成键距离设置,再怀疑结构本身。

接着就可以测量。工具栏上有测量距离和测量角度的模式:选中距离模式后,依次点击两个原子,下方信息栏就会显示它们之间的距离;同样,选中角度模式后依次点击三个原子,就会显示夹角。例如,在硅中测量相邻两个硅原子,应得到约 2.35 Å;再测量以一个硅为顶点的两根键之间的夹角,应得到约 109.5°,这正是正四面体的键角。

值得注意的是,测量结果要和已知数据相互印证。例如,氯化钠中最近邻 Na–Cl 距离应当等于 a/2 ≈ 2.82 Å。如果你测出来是 1.4 Å 或 5.6 Å,那么多半是点错了原子,或者文件本身有问题。测量不仅是为了得到数字,更是为了检查结构是否合理。

五、球棍模型、配位多面体与结构图导出

同一个结构可以用不同风格来画,而不同风格强调的信息也不同。

显示风格 突出什么 适合的场景
球棍模型 原子位置和连接关系 讲解原子排布、标注键长
空间填充 原子的相对大小和堆积程度 展示密堆积、孔道是否被占满
多面体 中心原子周围的配位环境 比较不同位点的局部结构
线框 只看骨架 结构很大、原子很多时

其中,配位多面体特别值得学会。所谓配位,指的是一个原子周围最近邻原子的数目和排布方式。例如,氯化钠中每个钠被 6 个氯包围,这 6 个氯的位置连起来恰好是一个八面体;而硅中每个硅被 4 个硅包围,连起来是一个四面体。于是,只要打开多面体显示,看一眼形状,就能读出配位数和局部结构。在 VESTA 里,通常可以在 Bonds 设置中为中心原子开启多面体显示,并选择多面体的透明度和颜色。

最后是导出。一般用 File → Export Raster Image 导出 PNG 或 TIFF 等位图,并且可以在导出时放大倍数,以获得更高的分辨率。导出之前,建议先统一背景颜色、隐藏不需要的坐标轴,并确认观察方向;导出之后,再把图放进 PPT 里与其他图组合。同时,别忘了另存一份 VESTA 的工程文件(.vesta),这样以后修改颜色或视角时,就不必从头设置。

六、显示范围、超胞与实际结构修改的区别

讲到这里,需要把三件看起来相似的事情区分开来,因为它们对后续计算的影响完全不同。

  1. 改变显示范围(Boundary):只影响画面上显示多少原子,文件里的结构完全不变。这就像把地图放大缩小,地形本身没有变化。
  2. 构造超胞(在晶胞设置里做变换,例如 2 × 2 × 2 扩胞):生成了一个更大的新晶胞,原子数也随之增加,但它描述的仍是同一块理想晶体。这就像把四块砖合起来当成新的“单元”,墙的图案并没有变。
  3. 实际修改结构(删除、替换或移动原子):结构本身发生了变化,例如制造了一个空位或替位缺陷。这时得到的已经是另一个体系。

因此,如果你想把一个结构交给后面的计算,那么就要通过 File → Export Data 导出新的 CIF 或 POSCAR,而不是导出一张图片。并且,导出后应当检查原子数:只调整了显示范围时,原子数不应变化;做了 2 × 2 × 2 超胞后,原子数应当变为原来的 8 倍。

不过,VESTA 并不擅长批量、可复现地修改结构。所以,真正要用于计算的超胞和缺陷结构,更推荐让 Agent 用 ASE 或 pymatgen 生成,再用 VESTA 打开检查。这样,每一步修改都有脚本和记录可查,这一点会在 1.5 节展开。

七、练习:用同一份结构文件解释晶胞、配位与周期性

现在,用氯化钠的 CIF 完成一次完整练习。

  1. 打开文件,记录晶格参数、空间群,以及结构参数列表中的原子数。
  2. 在默认显示下数一数画面上的钠和氯小球,再解释为什么它不等于晶胞中的 4 个钠和 4 个氯。
  3. 把显示范围扩大到 −0.5~1.5,找到一个钠原子,确认它周围有 6 个氯,并开启多面体显示。
  4. 测量最近邻 Na–Cl 距离,与 a/2 比较。
  5. 沿 c 轴导出一张 PNG 结构图,并另存 .vesta 文件。
完成后展开,核对要点
  1. a ≈ 5.64 Å,三个角均为 90°,空间群 Fm-3m;结构参数中通常只有 1 个 Na 和 1 个 Cl。
  2. 默认显示会把顶点、棱和面上的原子都画出来,所以小球数多于 8;按共享比例折算后,才是 4 个钠和 4 个氯。
  3. 配位多面体应当是八面体,配位数为 6。
  4. 测量值应约为 2.82 Å,与 a/2 一致;若相差很大,先检查是否点错原子。
  5. 图注里应写明结构来源、观察方向和显示范围。

完成之后,可以请 AI 做一次交叉核对:

请用 pymatgen 读取这份氯化钠 CIF,输出晶格参数、空间群、常规晶胞中的原子数与化学式,以及钠原子的配位数和最近邻 Na–Cl 距离。请说明数据来源和计算依据,我会与 VESTA 中的测量结果逐项对照。

把 AI 给出的数字与你在 VESTA 里看到的逐项比对,并把差异记下来。这样,VESTA 帮你看见结构,程序帮你算准数字,两者互相印证。下一节,我们就把这些看得见的分子和晶体,正式写成计算机能读取、能追溯的数据记录。

1.5 把化学对象写成可计算的记录

前面几节,我们用 ChemDraw 画出了分子,也用 VESTA 看清了晶胞。化学家可以从一张结构图中看出分子由哪些原子组成,也可以从晶体结构图中看出原子大致如何排列。但是,计算机并不能可靠地“看懂”一张图片;相反,它需要明确的数据,说明有哪些原子、原子之间如何连接、原子位于什么位置,以及体系是否具有周期性。

因此,把化学对象变成可计算对象,并不只是把文件换一种格式保存,我们还要确保结构的含义没有在转换中丢失。例如,原子价态或手性读错、坐标单位弄混、晶体被误设为非周期体系,都可能让后续计算顺利运行,却得到错误结果。所以,本节的目标是:让每一条结构数据都说得清“是什么、从哪来、怎么处理过”。

一、从 ChemDraw 的连接关系到分子图

在 ChemDraw 里,分子通常画成原子符号和连接它们的线。对计算机来说,这可以表示成一张分子图:原子是图中的节点,化学键是连接节点的边。并且,每个节点可以记录元素、形式电荷和手性等信息;同样,每条边可以记录键级、芳香性和双键构型等信息。

例如,乙醇可以写成 C—C—O:图中有两个碳原子和一个氧原子,它们由单键相连。然而,这张图只告诉我们原子的连接关系,却不告诉我们乙醇在三维空间中的具体形状。正如 1.2 节所说,ChemDraw 上的二维图并不是分子的真实三维构象;因此,如果要计算三维结构,还需要另外生成或读取原子坐标。

这一点对区分相似分子尤其重要。例如,乙醇和二甲醚的分子式相同,都是 C₂H₆O,但原子连接方式不同:乙醇是 C—C—O,二甲醚是 C—O—C。也就是说,只记录分子式,计算机就无法区分它们;而分子图则能保留这项关键信息。

二、让 Agent 用 RDKit 读取 SMILES/SDF,核对结构、失败记录与转换规则

有了分子图的概念,接下来看它在文件里怎样保存。首先,SMILES 是用一串字符表示分子连接关系的简单写法,例如乙醇可写为 CCO。因此,它适合紧凑地保存分子图,也能表示一些立体化学信息,但通常不包含分子的完整三维坐标。相比之下,SDF 通常保存原子、化学键、坐标和附加属性;并且,一个 SDF 文件还可以连续保存多个分子记录。下面就是一个 SDF 的例子:

Ethanol
Example
3 2 0 0 0 0 999 V2000
0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
1.5000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
2.1000 1.2000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0
1 2 1 0
2 3 1 0
M END
> <name>
ethanol
$$$$

读这个例子时,可以按从上到下的顺序看:

  • 3 2:首先说明有 3 个原子、2 条键。
  • 接下来的三行:依次列出两个碳和一个氧,每行先写笛卡尔坐标,再写元素符号。
  • 1 2 1:然后说明第 1 个原子和第 2 个原子之间是单键;同理,下一行表示第 2 个和第 3 个原子之间也是单键。
  • M END:到这里,分子结构记录结束。
  • $$$$:最后,这一条 SDF 记录结束;因此,同一个文件里可以接着放其他分子。

值得注意的是,这个例子只写了重原子,氢原子是隐含的;同时,它的 z 坐标全是 0,所以只是二维排版坐标。这正好印证了前面的提醒:有坐标,不等于有可用的三维结构。

在此基础上,Agent 可以调用 RDKit 这类化学信息学工具来读取 SMILES 或 SDF,并做基本检查。不过,一个可靠的流程不应只问“文件能不能打开”,还应核对原子数、化学式、形式电荷、键级、价态和立体化学信息。此外,对于多记录的 SDF,还要逐条记录哪些分子读取成功、哪些失败,以及失败原因。

更进一步,如果 RDKit 无法解析某条 SMILES,Agent 不应悄悄跳过这条数据;同样,如果它要执行去盐、补氢、调整电荷或互变异构体标准化,也应记录具体规则。这是因为,这些操作可能改变分子的表示方式,甚至改变后续任务所研究的化学对象。所以,较稳妥的做法是保留原始输入,并把每一步处理后的结构作为带有来源记录的新版本保存。

另外,若需要从 SMILES 生成三维坐标,软件可以先生成一个可能的构象,再做几何优化。但是,这只是一个初始结构或近似构象,因此不应直接当作 DFT 优化后的结构或实验测得的构象。

三、从 VESTA 的结构视图到坐标记录

说完分子,再来看晶体。VESTA 可以把晶体结构文件显示为三维图像,帮助我们观察晶胞、原子排列和局部环境;并且,写论文时需要的结构示意图,也常常由此导出。但是,图像是给人看的,而计算程序需要的是结构数据:晶胞的形状和大小、元素种类、原子的坐标、占位率,以及适用的对称操作等。

例如,VESTA 可以把 CIF 中给出的晶体结构显示出来。正如 1.4 节所见,有些 CIF 只列出不对称单元中的原子,再通过对称操作生成完整晶胞;因此,VESTA 显示的完整结构可能包含由程序生成的原子位置,以及边界上重复显示的周期副本。于是,若只根据屏幕上的图像数原子,或试图从截图估算坐标,就可能把周期副本误认为晶胞中的额外原子。

所以,VESTA 适合用来检查和理解结构,而精确的结构记录应当来自 CIF、POSCAR 等原始结构文件。同样,看到不合理的键长、缺失原子或异常晶胞时,也应回到原始数据核查,而不是从示意图反推坐标。

四、分子与晶体结构文件(MOL、CIF、POSCAR、XYZ 与 extxyz)

既然结构要以文件为准,那么就得了解常见的文件格式。不同结构文件保存的信息不同,所以选择文件格式时,不能只看文件扩展名,还要确认它是否保存了当前任务需要的结构、坐标、周期性和性质数据。

格式 常见用途 使用时要留意
MOL 保存一个分子的原子、键及坐标 坐标可能是二维,也可能是三维;要确认是否包含所需的电荷和立体化学信息
SDF 保存一个或多个分子记录及附加属性 多条记录可能有不同的读取结果;应保留每条记录的编号和失败信息
CIF 保存晶体的晶胞、原子位置、对称性等 坐标常用分数坐标;文件可能只记录不对称单元,也可能包含无序或部分占位
POSCAR VASP 常用的周期结构输入文件 包含晶格和原子坐标;要确认坐标是 Direct 还是 Cartesian,并核对元素顺序与原子数
XYZ 简单保存原子种类和笛卡尔坐标 传统 XYZ 通常不记录晶胞、周期性、化学键和电荷
extxyz 扩展 XYZ,可记录晶胞、周期性及性质 可以保存能量、力等信息,但字段名称和单位仍需确认

其中,分数坐标表示原子相对于晶胞边的比例,而笛卡尔坐标表示以实际长度描述的位置,通常以 Å 为单位。虽然两种坐标可以描述同一个结构,但读取文件时必须知道当前使用的是哪一种;否则,坐标值看起来合理,实际位置却可能完全错误。

五、周期性边界

了解了文件格式,接下来还要处理一个晶体特有的问题:周期性边界。1.3 节说过,程序会把一个晶胞在空间中无限复制。因此,一份晶体结构除了晶胞和坐标,还必须说明“哪些方向是周期重复的”。

一般来说,常见的情形有三种。首先,块体晶体在三个方向上都周期重复。其次,表面或二维材料只在面内两个方向重复,而垂直方向留出一段真空层,以免上下两层相互作用。最后,孤立分子在任何方向上都不重复。所以,同样一组原子坐标,周期性设置不同,描述的就是完全不同的体系。

更重要的是,周期性会改变“距离”的算法。例如,在边长 10 Å 的立方晶胞中,一个原子在 x = 0.5 Å,另一个在 x = 9.5 Å。如果直接相减,它们相距 9 Å;然而,考虑周期性后,第二个原子在相邻晶胞中的副本位于 x = −0.5 Å,于是两者实际只相距 1 Å。换句话说,在周期体系中,两个原子的距离要取所有周期副本中最近的那一个,这叫作最小镜像约定。

因此,如果把一个晶体误当作孤立分子处理,程序就会“看不见”跨边界的邻居;反过来,如果把孤立分子放进一个太小的周期盒子,它又会和自己的副本相互作用。这两类错误都不会让程序报错,所以每次读取或转换结构后,都要确认周期性设置是否符合你的本意。

六、用 ASE 的 Atoms 与 pymatgen 的 Structure 读写与转换

在实际工作中,读写和转换结构通常交给两个 Python 库:ASE 和 pymatgen。其中,ASE 用 Atoms 对象表示一组原子,而 pymatgen 用 Structure 表示周期晶体、用 Molecule 表示孤立分子。虽然你不需要亲手写代码,但能读懂一小段代码在做什么,就能更好地检查 Agent 的工作。例如:

from ase.io import read, write
atoms = read("NaCl.cif") # 读取 CIF
print(atoms.get_chemical_formula(), len(atoms))
print(atoms.cell.cellpar()) # a, b, c, α, β, γ
print(atoms.pbc) # 三个方向是否周期
write("POSCAR", atoms, format="vasp")

这段代码依次做了四件事:首先读取文件,然后打印化学式和原子数,接着打印晶格参数和周期性设置,最后另存为 POSCAR。同样,pymatgen 也能完成类似的读写,并且提供了 AseAtomsAdaptor,可以在 Atoms 和 Structure 之间相互转换。

那么,转换之后要检查什么?一般来说,至少核对下面几项:

检查项 为什么要查
原子数与化学式 对称展开或去重出错时,原子数会变化
晶格参数与体积 单位或坐标类型弄错时,晶胞会明显变形
周期性设置 XYZ 等格式可能丢失周期信息
最近原子间距 小于约 0.7 Å 通常说明原子重叠或坐标读错
元素顺序 POSCAR 中元素顺序与原子数一一对应,错位即换了元素

此外,还有一个简单而有效的办法:把转换后的文件再读回来,与原始结构比较。如果原子数、晶格和最近距离都一致,那么这次转换大概率没有丢失信息;否则,就要回到原文件查找原因。

七、性质标签是什么:单位、实验或计算来源、计算设置与版本

到目前为止,我们讨论的都是结构本身。然而,建模时我们真正想预测的是性质,例如形成能、带隙或体模量,这些要预测的值叫作标签。那么,一个标签只写一个数字够不够?答案是不够。

例如,“某材料的带隙是 1.1”这句话至少缺了四样东西。首先,缺单位:是 eV 还是别的单位?其次,缺来源:是实验测得,还是计算得到?再次,缺条件或设置:如果是实验值,测量温度是多少;如果是计算值,用了哪种泛函、是否加了 +U 修正。最后,缺版本:数据来自哪个数据库、哪一次发布。因此,一个完整的标签应当是“数值 + 单位 + 来源 + 设置 + 版本”。

之所以要这么较真,是因为不同来源的数值往往带有系统差异。例如,常用的 PBE 泛函算出的带隙通常明显低于实验值;同样,数据库更新计算设置之后,同一种材料的形成能也可能发生变化。所以,如果把实验带隙和 PBE 带隙混在一起训练,模型学到的就是一堆口径不一的数字。这一点会在第二部分 2.7 节详细展开。

另外,还要注意“总量”和“平均量”的区别。正如 0.2 节所说,形成能常以 eV/atom 表示,而总能则随原子数增加。于是,一份标签表至少应当包含下面这些列:

列名 例子
结构编号 mp-22862(NaCl)
性质与数值 formation_energy ≈ −2(示意值)
单位 eV/atom
来源 计算(Materials Project)
计算设置 PBE 泛函,修正方案以数据库说明为准
数据版本 数据库发布版本或下载日期

这样,半年之后再看这份数据,你仍然能说清每个数字是怎么来的。

八、原始坐标用于建模时要处理哪些对称性

最后,还有一个问题需要在建模之前想清楚:能不能直接把原子坐标当作模型的输入?答案是通常不能,因为同一个结构可以写成许多组不同的坐标。

例如,把整个结构平移 1 Å,或者整体旋转 30°,所有坐标数值都变了,但它仍是同一个结构,能量也不变。同样,把文件中原子的顺序调换一下,结构不变,坐标列表却变了。此外,对晶体来说,还可以换一种晶胞选法,或者把原子平移到相邻晶胞,这些也都不改变结构本身。

操作 坐标是否改变 结构与能量是否改变
整体平移 改变 不变
整体旋转 改变 不变
调换原子的排列顺序 改变 不变
换一种晶胞选法 改变 不变
把原子平移到相邻晶胞 改变 不变

因此,如果模型直接吃进原始坐标,它就会把同一个结构的不同写法当成不同的样本,于是既学得慢,又容易出错。所以,建模时通常采用两种思路:一是先把结构转换成不随这些操作改变的描述,例如元素组成的统计量或原子间距离的分布,这正是 1.6 节要讲的描述符;二是设计本身就满足这些对称性的模型,这会在第三部分讲到。

与此同时,这些对称性也会影响数据清洗。例如,同一个结构可能以不同的晶胞或坐标写法重复出现在数据中。因此,去重时不能只比较文件内容是否相同,而应当用 pymatgen 的 StructureMatcher 等工具判断两个结构是否本质相同。这一步如果漏掉,重复样本就可能同时出现在训练集和测试集里,这个问题会在 1.7 节详细讨论。

九、练习:把一小批结构整理成可追溯的记录

现在,把本节内容串起来完成一次练习。你可以请 Agent 执行下面的任务:

请下载乙醇、乙酸、乙酸乙酯的 SMILES,以及氯化钠和硅的 CIF。分子部分用 RDKit 读取,输出规范化 SMILES、分子式、形式电荷,并各生成一个三维初始构象存为 SDF;晶体部分用 ASE 读取,输出化学式、原子数、晶格参数、周期性设置和最近原子间距,再转换为 POSCAR 和 extxyz,并读回比较。最后生成一张记录表,每一行写清文件名、来源、处理步骤和检查结果。读取或转换失败的条目请单独列出,不要跳过。

拿到结果后,先自己检查三件事:分子式是否与 1.2 节一致;氯化钠常规晶胞的原子数是否为 8(如果文件用的是原胞,则应为 2);extxyz 读回后周期性设置是否仍为三个方向都周期。确认无误之后,这批结构就从“一张图”变成了“一份可计算、可追溯的数据”。接下来,1.6 节就在这份数据的基础上,把结构变成数字,训练第一个预测模型。

1.6 经典机器学习与描述符

上一节,我们把分子和晶体整理成了可追溯的数据记录,并且发现原始坐标不宜直接交给模型。那么,接下来的问题就很自然:怎样把一个结构变成一串模型能用的数字,又怎样让模型从这些数字里学到规律?

本节就回答这个问题。首先,我们会分清输入、标签和预测值;接着,学习两类描述符,把结构变成数字;然后,认识四种经典模型;最后,讨论模型“学过头”时怎么办。学完后,你应该能说清一个预测任务的输入与输出,并能判断一个模型是学到了规律,还是只背下了答案。

一、输入、标签、预测值与训练目标

先用一个熟悉的例子建立直觉。假设你要根据同学的平时作业分数,预测他的期末成绩。于是,平时作业分数是输入(也叫特征),真实的期末成绩是标签,而你根据规律猜出来的分数就是预测值。

放到材料里,道理完全一样。例如,要预测材料的形成能,那么输入就是描述这个材料的一串数字,标签就是数据库里的形成能,而预测值则是模型给出的估计。因此,一个预测任务可以简写成:

输入(结构的数字描述) → 模型 → 预测值,并与标签比较

那么,模型怎样“学”?简单来说,就是不断调整内部的参数,让预测值尽量接近标签。为此,需要先定义一个衡量“差多远”的数,叫作损失函数。例如,最常用的均方误差,就是把每个样本的“预测值 − 标签”平方后取平均。所以,训练的目标就是找到一组参数,使训练数据上的损失尽可能小。

不过,这里要提前埋下一个伏笔:损失小只说明模型在“做过的题”上答得好,并不说明它在新题上也答得好。这个区别,正是本节后半部分和 1.7 节的核心。

二、组分描述符与结构描述符(Magpie、SOAP、ACSF)

既然模型需要数字输入,那么首先要把结构翻译成数字,这一步叫作构造描述符。一个好的描述符,至少要满足两点:一是包含与目标性质相关的信息;二是正如 1.5 节所说,不随平移、旋转和原子顺序改变。

最简单的一类是组分描述符,它只看化学式,不看原子怎样排列。例如 Magpie 描述符的做法是:先为每种元素查出一组基本性质,如原子序数、电负性、原子半径等;然后,按化学式中各元素的比例,计算这些性质的平均值、最大值、最小值、范围等统计量。以 NaCl 为例,钠的电负性约 0.93,氯约 3.16,于是“电负性平均值”约 2.05,“电负性范围”约 2.23。这样,一个化学式就变成了一百多个数字。

组分描述符的优点是简单,而且只需要化学式就能计算。然而,它的缺点也很明显:同一化学式的不同相,会得到完全相同的描述符。 例如,钻石和石墨都是 C,组分描述符无法区分它们;因此,如果目标性质强烈依赖结构,就需要结构描述符。

于是,第二类是结构描述符,它描述每个原子周围的局部环境。例如,ACSF(原子中心对称函数)的思路是:以某个原子为中心,统计一定半径内邻居原子的距离分布和角度分布,再把这些分布写成一组数字。同样,SOAP 也描述局部环境,只不过它把邻居原子想象成一团团模糊的“密度云”,再用一套数学展开把这团云的形状编码成数字。由于它们都只依赖原子间的距离和角度,所以天然不随平移和旋转改变。

描述符类型 需要什么 能区分同分异构/多形体吗 例子
组分描述符 只需化学式 不能 Magpie
结构描述符 需要原子坐标 能 ACSF、SOAP

因此,选择描述符时,先问自己:要预测的性质主要由组成决定,还是由结构决定? 如果数据里只有化学式,就只能用组分描述符;如果有可靠的结构,结构描述符通常能提供更多信息。实际操作中,这些描述符可以让 Agent 用 matminer、DScribe 等库计算。

三、线性与岭回归

有了输入之后,接下来选模型。首先从最简单的线性回归开始。它假设预测值是各个特征的加权求和,再加一个常数:

预测值 = w₁ × 特征₁ + w₂ × 特征₂ + … + b

其中,w 叫作权重,b 叫作截距,它们都是要学的参数。例如,只用一个特征“电负性范围”预测形成能时,模型就是在二维图上画一条直线,使所有数据点到直线的距离尽量小。

线性模型的好处是透明:每个权重的正负和大小,直接说明对应特征对预测的影响方向和强弱。然而,当特征很多、而且彼此高度相关时,线性回归可能给出非常大、相互抵消的权重。这样一来,数据只要稍有变化,权重就会剧烈摇摆,模型也就变得不可靠。

为了解决这个问题,岭回归在损失函数里额外加了一项“惩罚”:权重越大,惩罚越重。于是,模型在拟合数据的同时,也被迫让权重保持温和。这种惩罚的强度由一个参数 λ 控制:λ 越大,权重越保守;λ 为 0 时,岭回归就退回普通线性回归。至于 λ 怎么选,会在本节第八小节讨论。

四、随机森林

线性模型只能表达“直线”式的关系,但材料性质往往与特征之间存在弯曲、分段的关系。因此,我们需要更灵活的模型。

先来看决策树。它像玩“猜猜我是谁”的游戏:先问一个问题,例如“电负性范围大于 1.5 吗?”,根据回答把样本分成两组;接着,在每组里再问下一个问题,如此层层细分;最后,落在同一片“叶子”里的样本,就用它们标签的平均值作为预测。所以,决策树能自然地表达分段和非线性的关系。

然而,一棵树很容易把训练数据分得过细,以致于记住了每个样本的偶然特点。于是,随机森林的做法是:种很多棵树,每棵树只看随机抽取的一部分样本和一部分特征,最后把所有树的预测取平均。这就像请很多位评委打分再取平均,个别评委的偏见会被相互抵消。因此,随机森林通常比单棵树稳定得多,而且对特征的尺度不敏感,是描述符建模中非常常用的默认选择。

不过,随机森林有一个重要的局限:由于每片叶子的预测都是训练标签的平均值,所以它的预测永远不会超出训练集标签的范围。 例如,训练集中带隙最大是 5 eV,那么它不可能预测出 8 eV。也就是说,随机森林擅长“在见过的范围内插值”,却不擅长外推。

五、高斯过程

前两种模型只给出一个预测值,却不告诉我们这个预测有多可靠。然而,在科研中,“有多确定”往往和“预测是多少”同样重要。于是,这里介绍第三种模型:高斯过程。

它的核心思想很直观:相似的输入,应当有相似的输出。 具体来说,高斯过程先定义一个衡量两个样本有多相似的函数,叫作核函数;然后,预测一个新样本时,参考与它相似的训练样本的标签,并按相似程度加权。因此,如果新样本周围有很多相似的训练样本,预测就比较确定;反过来,如果它离所有训练样本都很远,模型就会给出较大的不确定性。

这正是高斯过程最有价值的地方:它不仅给出预测值,还给出一个误差范围。例如,它可能告诉你“这个材料的形成能约为 −1.2 eV/atom,上下浮动约 0.1”。于是,后面在第六部分做主动学习时,我们就可以优先去计算那些“最不确定”的样本。

但是,高斯过程也有代价。由于它需要比较所有训练样本两两之间的相似度,所以计算量会随样本数急剧增长,通常适合几千个以内的样本。此外,它给出的误差范围是否可信,还取决于核函数选得是否合适,这会在第四部分专门检验。

模型 优点 局限
线性/岭回归 简单、透明、训练快 只能表达线性关系
随机森林 灵活、稳健、对特征尺度不敏感 无法预测超出训练范围的值
高斯过程 同时给出预测和不确定性 样本多时计算量很大

六、过拟合

讲完模型,现在回到开头埋下的伏笔。假设有两位同学准备考试:第一位理解了知识点,第二位则把练习册的答案逐题背下。于是,在练习册上两人都能拿满分;然而,一到考试换了新题,第二位同学就答不上来了。

模型也会犯同样的错误。当模型过于复杂、而数据又不够多时,它可能把训练数据中的噪声和偶然特点也一并记住,这叫作过拟合。因此,过拟合的典型表现是:训练误差很低,但在没见过的数据上误差明显更高。

例如,用一棵不限深度的决策树拟合 100 个样本,它可以把每个样本都分进单独的叶子,训练误差几乎为 0;可是,换一批新样本,误差却可能比简单的线性模型还大。反过来,如果模型太简单,连训练数据的主要规律都没学到,训练误差和新数据误差都很高,这叫作欠拟合。

所以,判断模型好坏,永远不能只看训练误差,而必须留出一部分模型没见过的数据来检验。至于怎样留、留多少、怎样避免作弊,就是 1.7 节的内容。

七、正则化

既然过拟合来自模型“太自由”,那么解决思路就是给它适当加一些约束,这类方法统称为正则化。

事实上,我们已经见过两个例子。首先,岭回归对大权重的惩罚就是一种正则化,它让模型倾向于更平滑、更简单的解。其次,随机森林中限制每棵树的最大深度、要求每片叶子至少包含若干样本,也起到了同样的作用:不让树分得过细。

此外,还有一种更朴素的正则化:减少特征数量。例如,Magpie 有一百多个特征,而如果只有几百个样本,其中很多特征可能只是在“凑巧”地拟合噪声。因此,先去掉明显无关或高度重复的特征,往往能让模型更稳。

不过,约束也不能太强。正则化过强,模型又会退回欠拟合。所以,正则化的强度需要在“记住细节”和“把握规律”之间取得平衡,而这个平衡点要靠下一小节的方法来确定。

八、超参数

到这里,你可能已经注意到,有些数值是模型自己学出来的,例如线性回归的权重;然而,另一些数值需要我们事先指定,例如岭回归的 λ、随机森林中树的数量和最大深度、高斯过程核函数的形状。后一类数值叫作超参数。

那么,超参数怎么选?最直接的办法是多试几组,看哪一组效果最好。但关键在于“效果”要在哪里衡量:如果用训练数据来挑,就一定会挑中最复杂、最容易过拟合的那组。 因此,正确的做法是另外留出一部分数据作为验证集,在验证集上比较不同超参数的表现,再选最好的一组。

模型 常见超参数 调大后的一般趋势
岭回归 λ(正则化强度) 更平滑,可能欠拟合
随机森林 树的数量、最大深度、叶子最少样本数 深度越大越容易过拟合
高斯过程 核函数类型与长度尺度 长度尺度越大越平滑

此外,还需要强调一点:超参数一旦在验证集上选定,最终效果就应当在一份从未参与任何选择的测试集上报告。否则,你报告的其实是“挑过的最好成绩”,而不是模型在新数据上的真实水平。这三份数据怎样划分,正是下一节的主题。

九、自己先判断,再请 AI 核查

现在,先不借助 AI,回答下面三道小题。

  1. 用 Magpie 描述符预测钻石和石墨的硬度,会遇到什么问题?
  2. 一个随机森林在训练集上的误差是 0.01 eV/atom,在新数据上是 0.30 eV/atom。这说明什么?应当先调整什么?
  3. 训练集中形成能的范围是 −3 到 0 eV/atom,随机森林能否预测出 −4 eV/atom?
完成后展开,核对理由
  1. 两者化学式都是 C,因此组分描述符完全相同,模型只能给出相同的预测;应当改用结构描述符。
  2. 这是典型的过拟合。可以先限制树的最大深度或增加叶子的最少样本数,并在验证集上比较效果。
  3. 不能。随机森林的预测是训练标签的平均,因此不会超出训练范围。

接着,可以让 Agent 做一个小实验,亲眼看看过拟合:

请用 matminer 加载一个小型公开材料数据集,计算 Magpie 描述符,分别训练岭回归和不同最大深度的随机森林。请把数据按固定随机种子分为训练集和验证集,画出“最大深度—训练误差/验证误差”曲线,并说明哪个深度开始过拟合。我不需要写代码,但需要你保存数据版本、参数和结果图。

拿到结果图后,找到训练误差继续下降、验证误差却开始上升的那个位置,并用一句话解释它。这样,你就亲手确认了“训练误差低不等于模型好”。下一节,我们将进一步追问:怎样划分数据,才能让验证和测试的结果真正可信?

1.7 可信度基础

上一节,我们看到训练误差低并不代表模型好,因此必须用模型没见过的数据来检验。然而,“没见过”这三个字远比听起来难做到。所以,本节要解决的问题是:怎样划分和使用数据,才能让最后报告的误差真正反映模型在新材料上的表现?

具体来说,我们会依次讨论数据的三种用途、相似样本怎样“偷偷作弊”、预处理为什么也会泄漏信息、指标和基线怎么定,以及交叉验证、外推和误差来源。之所以把这些放在项目一之前,是因为验收标准必须在做项目之前定好;否则,看到结果再改规则,得到的就只是一个好看的数字。

一、训练、验证与测试各自负责什么

先打个比方。准备一门考试时,你会用练习册学习,用模拟卷检查自己、调整复习方法,最后再参加正式考试。于是,练习册、模拟卷和正式考试分别对应机器学习中的三份数据。

数据 对应 负责什么 可以用几次
训练集 练习册 让模型学习参数 反复使用
验证集 模拟卷 比较模型、挑选超参数 可以多次使用
测试集 正式考试 报告最终效果 原则上只用一次

其中,最容易被破坏的是测试集。例如,你在测试集上看了结果,觉得不满意,于是回去改模型,再测一次;这样反复几次之后,测试集实际上就变成了第二份验证集。因此,测试集上的成绩只有在它“没有参与任何决定”时才可信。 换句话说,正式考试的题目,不能提前拿来当模拟卷。

一般来说,常见的划分比例是训练 70%~80%、验证 10%~15%、测试 10%~15%。不过,比例本身并不是重点;更重要的是,划分一旦确定,就要把每个样本属于哪一份记录成文件,并在整个项目中保持不变。

二、去重、按体系或组分分组,避免相似样本跨集合

有了三份数据之后,还要检查它们之间是否真的“互不相见”。例如,如果模拟卷里的题和正式考试的题几乎一模一样,那么考试高分就说明不了什么。同样的问题在材料数据里非常普遍。

首先是完全重复。例如,同一种材料可能在数据库里被计算过多次,或者同一个结构以不同的晶胞写法出现了两次。于是,随机划分时,它可能一份进了训练集,一份进了测试集;模型只要“记住”训练集里的那个答案,就能在测试集上答对。因此,划分之前必须先去重,并且正如 1.5 节所说,晶体去重应当比较结构是否本质相同,而不是比较文件是否相同。

其次是高度相似。例如,α-Fe₂O₃ 和 γ-Fe₂O₃ 这两个相,或者 LiCoO₂ 和 NaCoO₂,它们虽然不是同一个样本,却非常相似。所以,如果训练集里有一个,测试集里有另一个,测试就变得偏容易。这时,更可靠的做法是分组划分:先按某种规则把相似样本归为一组,再以组为单位分配到训练、验证或测试集。

分组方式 同一组包含什么 测试的是什么能力
按化学式分组 同一化学式的所有相 能否预测没见过的化学式
按化学体系分组 由同一组元素构成的所有化合物(如 Li–Co–O) 能否预测没见过的元素组合
按结构原型分组 结构类型相同的材料 能否预测没见过的结构类型

那么,应当选哪种分组?这取决于模型将来要怎样使用。例如,如果将来要预测全新元素组合的材料,那么按化学体系分组才能模拟这种场景。因此,先想清楚“模型将来面对的新样本长什么样”,再决定怎样划分。

三、预处理只在训练集拟合

除了样本本身,数据处理的步骤也可能泄漏信息。例如,很多模型要求先把每个特征缩放到相近的范围,常见做法是减去平均值、再除以标准差。然而,问题在于:这个平均值和标准差,是用哪些数据算出来的?

如果用全部数据(包括测试集)来计算,那么测试集的信息就已经悄悄进入了训练过程。这就像复习时偷看了考试成绩的分布,虽然没看到具体题目,但也不再是“完全没见过”。因此,正确的做法是:只在训练集上计算平均值和标准差,然后用同一组数值去变换验证集和测试集。

同理,其他预处理步骤也要遵守这条规则。例如,填补缺失值时用的均值、筛选特征时依据的相关性、降维时用的主成分,都只能从训练集中得到。实际操作中,可以让 Agent 把所有预处理步骤和模型放进同一条“流水线”,这样每次训练时都会自动只用训练集拟合,从而减少人为出错的机会。

四、指标怎么选,简单基线怎么设

划分好数据之后,还需要确定用什么数字来衡量模型。首先,最常用的是平均绝对误差(MAE),即所有样本“预测值与标签之差的绝对值”的平均。因为它的单位和标签相同,例如 eV/atom,所以最容易解释:MAE = 0.1 eV/atom,就表示平均每个样本差 0.1 eV/atom。

其次是均方根误差(RMSE)。它先把误差平方、再平均、最后开方,因此对少数特别大的误差更敏感。于是,如果 RMSE 远大于 MAE,通常说明有一小部分样本预测得特别差,值得单独检查。

此外,还有决定系数 R²,它衡量模型比“一律预测平均值”好了多少。R² 越接近 1 越好;然而,R² 容易受标签分布范围的影响,所以最好和 MAE 一起报告,而不要单独使用。

指标 单位 适合回答的问题
MAE 与标签相同 平均每个样本差多少
RMSE 与标签相同 是否存在少数特别大的误差
R² 无单位 相比“预测平均值”好了多少

但是,光有指标还不够,因为一个数字本身没有好坏之分。例如,MAE = 0.2 eV/atom 算不算好?这必须和一个基线比较才能知道。最简单的基线就是“不管输入是什么,一律预测训练集的平均值”;稍强一点的基线则是组分描述符加线性回归。因此,如果你的模型连这些简单基线都赢不了,那么再复杂也没有意义。 反过来,如果它明显优于基线,这个提升才值得报告。

五、交叉验证与超参数选择

接下来,考虑一个现实问题:数据量不大时,只留一份验证集,结果可能很依赖“恰好分到了哪些样本”。例如,同一个模型换一种随机划分,验证误差可能从 0.15 变成 0.22。于是,只凭一次划分挑超参数,就可能挑中一个“运气好”的设置。

为了减小这种偶然性,可以使用 k 折交叉验证。具体来说,先把训练数据平均分成 k 份,例如 5 份;然后,轮流用其中 1 份作验证、其余 4 份作训练,一共训练 5 次;最后,把 5 次的验证误差取平均。这样,每个样本都恰好当过一次验证数据,结果也就更稳定。同时,5 次结果之间的差异,还能告诉你这个误差本身有多大的波动。

需要注意的是,交叉验证同样要遵守前面两条规则。首先,如果数据需要分组,那么交叉验证的每一折也要按组划分,否则相似样本仍会跨折泄漏。其次,每一折的预处理都只能在该折的训练部分拟合。

因此,一个完整的流程应当是:先留出测试集并封存;然后,在剩余数据上用交叉验证比较模型和超参数;选定之后,用全部剩余数据重新训练一次;最后,只在测试集上评估一次并报告结果。

六、外推与分布外

即使划分和验证都做得很规范,还有一个问题需要正视:测试集的样本,通常和训练集来自同一个数据库、同一类材料。然而,科研中我们真正关心的,往往恰恰是“和已知材料不太一样”的新材料。

如果新样本落在训练数据覆盖的范围之内,模型做的是插值;反过来,如果新样本的组成、结构或性质超出了训练数据的范围,模型做的就是外推。一般来说,插值时误差较小,而外推时误差往往会明显变大,甚至完全不可信。例如,只用氧化物训练的模型去预测硫化物,或者只用带隙小于 3 eV 的数据训练、再去预测宽带隙材料,就都属于外推。

那么,怎样知道模型的外推能力?一种直接的办法是故意构造外推测试。例如,把含某种元素的所有材料都放进测试集,看模型在“从没见过这种元素”时表现如何。于是,你会得到两组数字:随机划分下的误差,和刻意外推下的误差。通常后者更大,并且两者之间的差距,恰恰说明了模型的适用范围。

因此,报告结果时,最好同时说明测试集与训练集的关系。这个问题会在第四部分的分布外评测中系统展开;现阶段,只需养成一个习惯:看到一个误差数字,先问它是在什么样的测试集上得到的。

七、误差从哪里来

最后,当模型出现误差时,我们需要知道误差来自哪里,这样才能决定下一步该改什么。一般来说,误差有四个主要来源。

误差来源 含义 可能的迹象
标签噪声 标签本身就不准或口径不一 同一材料在不同来源中数值差别很大
表示不足 描述符没有包含决定性质的关键信息 描述符相同的样本,标签却差别很大
数据不足 某类样本太少,模型没学到 误差集中在稀有元素或稀有结构上
模型能力不足 模型过于简单,或超参数不合适 训练误差本身就很高

其中,第一项特别值得重视。例如,如果同一材料的实验带隙在不同文献里相差 0.3 eV,那么无论模型多好,MAE 也很难降到 0.3 eV 以下。换句话说,标签本身的不确定性,决定了模型误差的下限。 因此,看到模型误差已经接近标签噪声时,就不必再费力调模型,而应当回头改善数据。

此外,找到误差来源最好的办法,是逐个查看预测最差的样本。例如,把误差最大的 20 个样本列出来,看它们是否集中在某类元素、某种结构,或者标签本身就有疑问。这样,误差就不再只是一个数字,而变成了下一步改进的线索。

八、自己先判断,再请 AI 核查

现在,先不借助 AI,判断下面三种做法是否有问题。

  1. 先用全部数据计算特征的平均值和标准差并做标准化,然后再随机划分训练集和测试集。
  2. 在测试集上比较了 10 组超参数,报告其中最好的一组测试误差。
  3. 数据中同一化学式有多个相,随机划分后,模型测试 MAE 很低,于是认为它能很好地预测新化学式。
完成后展开,核对理由
  1. 有问题。标准化用到了测试集的信息,属于预处理泄漏;应当先划分,再只在训练集上拟合标准化参数。
  2. 有问题。测试集被用来挑选超参数,已经变成了验证集;报告的误差会偏乐观。
  3. 有问题。随机划分让同一化学式的不同相分散在训练和测试中,测试偏容易;要评估对新化学式的能力,应当按化学式分组划分。

接着,可以请 Agent 做一个对照实验:

请用同一份公开材料数据集、同一套 Magpie 描述符和随机森林,分别在“随机划分”和“按化学体系分组划分”下做 5 折交叉验证,报告两种划分的 MAE 平均值和波动,并与“预测训练集平均值”的基线比较。请保存划分清单、随机种子和参数,并列出分组划分下误差最大的 20 个样本。

拿到结果后,比较两种划分的 MAE 相差多少,并试着从误差最大的样本中找出一个共同点。这样,你就为项目一准备好了一套验收规则。下一节,我们就按这套规则,完整地做一次预测项目。

1.8 项目一

到这里,第一部分的工具和概念都已经齐备:1.1 节到 1.4 节让我们看懂分子与晶体,1.5 节把结构写成可追溯的数据,1.6 节学会用描述符和经典模型做预测,而 1.7 节则定好了怎样诚实地验收。于是,本节就把这些串成一个完整的小项目:用描述符加经典模型预测一个材料性质,并且诚实地评估它。

需要强调的是,这个项目的目标并不是追求最低的误差,而是完整地走一遍“定问题—定规则—建模型—比基线—查错误—留记录”的流程。因此,一个误差不算低、但每一步都说得清的项目,远比一个误差很低、却讲不清数据怎么划分的项目更有价值。

一、选择性质,核对标签来源、单位与计算设置

首先,要选一个预测目标。对于第一个项目,建议选数据公开、规模适中、只需化学式就能建模的任务。例如,本节以实验带隙为例:输入是材料的化学式,标签是实验测得的带隙,单位为 eV。这类数据可以通过 matminer 加载公开的基准数据集(例如 Matbench 中的实验带隙任务),规模在几千条左右,适合在个人电脑上完成。当然,你也可以换成形成能等其他性质,只要按下面的步骤做同样的检查即可。

接着,在动手建模之前,先像 1.5 节那样核对标签。具体来说,至少回答下面几个问题:

核对问题 为什么重要
标签的单位是什么 单位弄错,后面所有误差都没有意义
来自实验还是计算 实验带隙与 PBE 计算带隙存在系统差异,不能混用
数据集的出处与版本 以后别人要能找到同一份数据
有多少条、是否有重复 重复化学式会导致训练和测试之间泄漏
标签分布是什么样 例如大量带隙为 0 的金属,会影响模型和指标的解读

其中,最后一项尤其值得先看一眼。例如,如果数据中有相当比例的样本带隙为 0,那么一个总是预测 0 附近的模型,也可能得到看似不错的 MAE。因此,先画出标签的分布直方图,再决定怎样解读后面的误差。 把这些检查结果写进一份简短的数据说明,作为项目的第一份记录。

二、固定数据划分、预处理与评测指标

标签核对无误之后,下一步是在看到任何模型结果之前,把验收规则全部定下来。之所以强调顺序,是因为一旦先看了结果,就很难不被结果影响规则。

具体来说,需要固定以下几项。首先,去重:确认同一化学式只保留一条记录,或者对重复记录的处理方式写清楚。其次,划分:按 1.7 节的做法,先留出 15%~20% 作为测试集并封存;然后在剩余数据上做 5 折交叉验证。并且,为了同时了解模型的外推能力,建议准备两套划分:一套随机划分,另一套按化学体系分组划分。再次,预处理:所有标准化和特征筛选都只在训练部分拟合。最后,指标:以 MAE(eV)为主指标,同时报告 RMSE 和 R²。

于是,这一步的产物应当是一组文件:划分清单(每个样本属于哪一份)、随机种子、预处理设置和指标定义。这样,任何人拿到这些文件,都能复现同一套验收规则。

三、用描述符加经典模型预测一个性质

规则定好之后,才开始建模。首先,由于输入只有化学式,所以选用 1.6 节介绍的 Magpie 组分描述符,把每个化学式变成一百多个数字。接着,检查描述符是否有计算失败的样本,例如包含罕见元素而查不到元素性质;这些样本同样不能悄悄丢掉,而要记录下来。

然后,训练两到三个模型进行比较。例如,岭回归作为简单透明的线性模型,随机森林作为灵活稳健的非线性模型;如果样本数不太多,还可以加上高斯过程,以便观察不确定性。同时,每个模型的超参数都在交叉验证中选择,例如岭回归的 λ、随机森林的最大深度和树的数量。

在此过程中,你并不需要自己写代码,但需要像项目负责人一样给 Agent 下达清楚的任务卡。例如:

请按我提供的划分清单和随机种子,用 Magpie 描述符分别训练岭回归和随机森林。超参数在 5 折交叉验证中选择,候选范围写进配置文件;预处理只在每折的训练部分拟合。请输出每个模型在随机划分和分组划分下的交叉验证 MAE 均值与波动,并保存模型、配置和运行日志。在我确认之前,不要在测试集上评估。

注意最后一句:测试集要等所有选择都做完之后,才能打开一次。

四、与简单基线比较,检查误差与失败样本

交叉验证选定模型之后,就可以在测试集上做唯一一次评估。然而,拿到测试 MAE 之后,还不能立刻下结论;相反,要先和基线比较。具体来说,至少准备两个基线:一是“一律预测训练集平均值”,二是“Magpie 加岭回归”。于是,结果可以整理成下面这样一张表:

模型 随机划分 MAE(eV) 分组划分 MAE(eV)
预测训练集平均值 填入结果 填入结果
Magpie + 岭回归 填入结果 填入结果
Magpie + 随机森林 填入结果 填入结果

读这张表时,可以依次问三个问题。首先,最好的模型比“预测平均值”好了多少?如果好得不多,说明描述符或模型并没有学到太多规律。其次,随机划分和分组划分的误差差了多少?差距越大,说明模型越依赖“见过相似的材料”,外推能力也就越弱。最后,模型之间的差异是否超过了交叉验证中的波动?如果没有,就不能说一个模型明显更好。

接着,要查看误差最大的样本。例如,把测试集中误差最大的 20 个样本列出来,逐个看它们的化学式、标签和预测值。于是,你可能会发现一些规律:它们也许集中在含过渡金属的化合物上,也许是真实带隙很大、而模型预测偏低,也许标签本身就可疑。同时,还可以画一张“预测值—真实值”散点图,看看模型是否系统性地高估或低估某一范围的样本。这些发现,比测试 MAE 本身更能说明模型的能力和边界。

五、保存数据版本、模型与评测记录

最后,项目做完并不等于结束,还要让它能被复现和交接。正如 0.3 节所说,一次运行应当留下足够的记录,使别人(或几个月后的你)能重新得到同样的结果。因此,项目一至少应当保存以下内容:

类别 应保存的内容
数据 数据集名称、版本或下载日期、去重规则、数据说明
划分 划分清单、随机种子、分组规则
特征 描述符类型与版本、计算失败的样本清单
模型 模型类型、超参数候选范围与最终取值、训练好的模型文件
评测 各模型与基线的指标表、散点图、误差最大样本的分析
环境 Python 与主要库的版本、运行命令、Agent 的操作记录

然后,请你用自己的话写一段不超过 300 字的结论,至少回答三个问题:模型比基线好多少?它在什么样的材料上表现较差?它能否用来预测全新元素组合的材料?这里,结论要和证据对应,例如“分组划分下 MAE 明显增大,因此对新化学体系的预测应谨慎”。能诚实地写出模型做不到什么,是这个项目最重要的收获之一。

六、验收清单与承上启下

在提交项目之前,对照下面的清单逐项确认:

  1. 标签的单位、来源和版本已写进数据说明。
  2. 划分清单和随机种子在建模之前就已固定,并且测试集只评估了一次。
  3. 预处理只在训练部分拟合。
  4. 结果表中包含至少两个基线,以及随机划分和分组划分两组结果。
  5. 列出并分析了误差最大的样本。
  6. 另一台电脑按记录重新运行,能得到相同或非常接近的指标。
常见问题:结果不理想怎么办?
  1. 如果模型只比“预测平均值”略好,先检查标签分布和描述符是否计算正确,再考虑增加结构信息。
  2. 如果分组划分的误差远大于随机划分,这不是项目失败,而是一项有价值的发现;把它写进结论即可。
  3. 如果看了测试结果后想改模型,那么改完之后,原来的测试集已经不再“干净”;应当在记录中如实说明,必要时重新划分一份新的测试集。

完成项目一之后,你已经走完了一条最基本的“结构 → 数据 → 模型 → 评估”的路线。然而,这条路线中有一个环节始终被当成了“给定”:标签从哪里来?为什么计算得到的带隙会和实验不同?于是,第二部分就从电子与能量出发,讲清 DFT 怎样算出这些标签,以及它们各自带着怎样的误差。

1.9 知识总结

学完第一部分,我们已经从原子和化学键出发,一路走到了第一个预测模型。不过,内容一多,重点就容易散开。因此,本节不讲新知识,而是把最重要的结论收拢成一张清单,方便你随时回看。

一、化学与结构

  • 首先,结构式记录的是连接关系。 因此,分子式相同的乙醇和二甲醚,仍是两种不同的分子(1.1、1.2)。
  • 其次,二维图不等于三维结构。 所以,ChemDraw 里的图只说明连接和立体化学,真实构象要另外生成或读取。
  • 再者,晶体只需描述一个晶胞。 这是因为周期性保证了,晶格参数加原子坐标就能拼出整块晶体(1.3)。
  • 同时,数原子时要按共享比例折算。 例如,顶点算 1/8,面心算 1/2;于是,NaCl 常规晶胞中共有 4 个 Na 和 4 个 Cl。
  • 另外,只写化学式并不够。 换句话说,同一化学式可以有不同的相,所以还要说明结构和条件。

二、查看与记录

  • 首先,VESTA 用来查看和检查,而不是修改结构。 因此,Boundary 只改变显示多少原子,并不改变结构本身(1.4)。
  • 其次,先核对数字,再看图像。 也就是说,元素、晶格参数、坐标类型和原子数都要先对上。
  • 此外,分数坐标和笛卡尔坐标不能混用。 否则,同一组数字会被放到完全不同的位置(1.3、1.5)。
  • 并且,周期体系中的距离要取最近的周期副本。 所以,把晶体误当成孤立分子时,跨边界的邻居就会“消失”。
  • 最后,一个标签应当写全“数值 + 单位 + 来源 + 设置 + 版本”。 这样,不同口径的数据才不会被混在一起训练。

三、建模与评估

  • 首先,模型不能直接吃原始坐标。 这是因为平移、旋转或调换原子顺序都会改变坐标,却不改变结构,所以要先转成描述符(1.5、1.6)。
  • 其次,训练误差低不代表模型好。 因此,必须用模型没见过的数据来检验,并警惕过拟合。
  • 同时,测试集只能用一次。 也就是说,一旦用它挑过模型,它就变成了验证集(1.7)。
  • 此外,相似样本不能跨集合,预处理也只在训练集上拟合。 否则,信息会悄悄泄漏,误差也会偏乐观。
  • 并且,结果要和简单基线比较。 换句话说,连“预测平均值”都赢不了的模型,再复杂也没有意义。
  • 最后,看到一个误差数字,先问它来自什么样的测试集。 例如,分组划分和随机划分之间的差距,恰恰说明了模型的适用范围。

四、一条主线

总的来说,第一部分走的是这样一条路线:结构 → 可追溯的数据 → 描述符 → 模型 → 诚实的评估。 其中,每一步都要留下记录,这样别人才能复现你的结果(1.8)。

那么,你是否真正掌握了这些内容?不妨合上课本,试着用自己的话向 AI 复述上面三组要点,再请它指出你漏掉或说错的地方。接下来,第二部分将回答一个始终被当作“给定”的问题:这些标签究竟是怎样算出来的。

2.1 电子怎样决定能量

从薛定谔方程到密度泛函

Kohn-Sham 框架

交换关联泛函的层级

2.2 从实空间到倒空间

实空间中的周期性

倒格子与波矢

布里渊区

为什么需要 k 点采样

2.3 一次计算怎么设置

泛函

赝势与投影缀加波

基组/截断能

k 点

自旋初始化与磁构型

DFT+U

色散校正

收敛判据

2.4 提交第一次计算:算力与作业

本地与集群的区别

CPU/GPU 与并行:按程序支持选择资源

SLURM 作业脚本与资源申请

提交、查看日志与检查任务是否完成

任务失败的常见原因与重跑

2.5 单点计算与读懂输出

固定原子位置与晶胞的单点计算

检查电子收敛与输出完整性

总能、受力与应力

态密度与带隙及其后处理

电荷密度与 VESTA 等值面显示

2.6 结构弛豫与优化

离子弛豫与晶胞优化

力与应力的收敛

局域极小与初始结构的影响

用 VESTA 比较弛豫前后的结构

2.7 数据的可比性与 DFT 自身的误差

不同设置为何不能混用

PBE 与 r²SCAN 的差异

带隙低估与形成能的系统偏差

向实验值的 Δ 修正

Materials Project

OQMD

AFLOW

Alexandria

JARVIS

NOMAD

坑在哪里

2.8 从能量到稳定性:形成能与凸包

参考态、归一化与形成能

竞争相与分解反应

凸包与 E_hull

亚稳窗口与判据的适用条件

热力学稳定、动力学稳定与可合成性的区别

2.9 声子与有限温度

简谐近似

虚频与动力学稳定性

振动熵与自由能

弹性常数

3.1 势能面与原子运动

势能面、能量梯度与原子受力

MD 的基本框架

积分器

温度与统计量

系综与控温控压

每一步都要计算受力:为什么需要机器学习势

3.2 神经网络与 PyTorch 入门

配置 PyTorch,认识张量与设备

预测一个数字:从线性模型到神经网络

损失函数

导数、梯度与自动微分

反向传播与参数更新

一个包含验证步骤的完整训练循环

3.3 表示与对称性

平移/旋转/置换不变性

等变性

为什么力要随几何旋转

截断半径与“局域性假设”的代价

3.4 图神经网络

一个原子怎样读懂周围

消息传递

不变架构与等变架构的分水岭(SchNet → NequIP/MACE → Equiformer 一类)

3.5 从图神经网络到势函数

从原子表示到原子能量与总能

由能量对坐标的负梯度得到力

能量与力标签、单位和归一化

能量/力联合损失与权重选择

能量守恒与力的物理一致性

从小模型训练过渡到通用势微调

3.6 通用势与基础模型

MPtrj

Alexandria

OMat24

MatPES

OMol25

MACE-MP-0

CHGNet

MatterSim

GRACE

eSEN/UMA

拿来即用

微调(含冻结迁移)

蒸馏

什么时候必须自己从头训

3.7 MLIP 的失效模式

长程静电与电荷转移

极化与界面

自旋与磁性

反应与键断裂

外推与势面软化

“力误差很低但 MD 跑飞”

3.8 项目二之前:准备数据与固定评测

选择体系、构型范围与一致的计算设置

按体系、弛豫或 MD 轨迹分组后再划分数据

重复与近重复结构:同一轨迹的多帧为什么不能随机拆分

固定训练、验证与测试集,记录来源和划分清单

预先确定能量/力误差与短程 MD 稳定性检查

3.9 项目二

按既定体系与计算设置生成数据

执行已固定的去重与分组划分

微调通用势并用验证集选择设置

与未微调模型比较能量和力误差

短程 MD 检查与失败记录

3.10 用 MD 算性质

扩散系数

热导与热学量

相变与稳定性

增强采样与自由能

4.1 评测协议

回顾项目一与项目二的固定划分

随机与分组评测为什么会得出不同结论

按体系/组分/时间划分对应什么使用场景

留一族交叉验证

4.2 数据泄漏审计

复查重复与近重复结构、弛豫与 MD 轨迹分组

预处理与模型选择是否接触了测试信息

目标量与特征的隐含耦合

通用势的预训练数据是否与评测集合重叠

4.3 分布外与外推

怎么判断一个样本在不在训练分布内

迁移到新化学空间时的衰减曲线

4.4 任务级评测

不看能量 MAE 该看什么

Matbench Discovery 的稳定性判别

κ_SRME

MD 稳定性测试

4.5 不确定性的度量与校准

集成

MC-dropout

高斯过程后验

校准曲线与可靠性图

4.6 回到项目二

用本部分的协议重新验收那个微调出来的势

分布外样本

稳定性测试

不确定性是否可信

5.1 问题的形态

给定组成,找出它会长成什么样

搜索空间到底有多大

5.2 把稳定性判据用于结构搜索

用形成能、凸包与 E_hull 筛选候选

亚稳窗口与搜索目标

温度、熵与虚频如何影响候选的判断

安排弛豫、声子与更高精度计算的验证顺序

5.3 空间群与 Wyckoff 位点

从对称操作到空间群

等价位置、位点对称性与 Wyckoff 位点

占位、组成与结构自由度

结合 CIF 与 VESTA 查看对称操作生成的原子位置

Wyckoff 模板如何约束结构搜索

5.4 搜索方法

随机采样

遗传算法

粒子群

模板替换

对称性约束(Wyckoff 模板)搜索

能量评估器和搜索算法是两件独立的事

5.5 生成模型入门:从预测性质到生成结构

性质预测与结构生成各自输入什么、输出什么

概率分布、采样与条件生成的直观含义

生成对象:元素、晶格与原子坐标

扩散主线:加噪、学习去噪与逐步采样

周期性边界与对称性如何进入生成过程

VAE、流匹配与语言模型的思路概览

5.6 晶体生成方法与性质导向设计

主线案例:DiffCSP 的输入、训练与生成流程

CDVAE 与 MatterGen:任务、表示和生成条件的比较

条件生成与性质导向设计

拓展:流匹配(FlowMM)与语言模型(CrystaLLM)

5.7 生成结果怎么评

有效性/唯一性/新颖性

SUN 率

DFT 验证通过率

与已知数据库的查重

精读 Cheetham 与 Seshadri 对 GNoME 的批评

5.8 可合成性

从 E_hull 到合成可行性预测

前驱体与反应路径

预测与实验之间真实存在的鸿沟

6.1 工作流与作业管理

批量任务

命名

版本

失败重跑

atomate2 / AiiDA / jobflow

跨库取数与 OPTIMADE 互操作

6.2 筛选漏斗的设计

从百万候选到十个值得做的

按代价分层与多保真度

假阳性与假阴性的成本并不对称

6.3 主动学习

下一次计算给谁

采集函数

批量采集与多样性

冷启动

必须和随机采样基线对照

6.4 项目三

让计算预算形成可恢复闭环

7.1 能量之外

电子结构的机器学习

DFT 哈密顿量与密度矩阵预测(DeepH 一类)

性质直接预测的适用边界

7.2 与实验对接

XRD 与谱学(XAS、NMR)的正向模拟和反向解读

机器学习谱学预测

7.3 自动化与智能体

自驱动实验室

LLM agent 在文献抽取与工作流编排中的位置和当前局限

7.4 怎么读这个领域的论文

看数据划分

看基线

看验证率

而不是看排行榜名次

A 术语与符号表

B 单位换算速查

C 三个项目的代码与数据清单

D 各章“你应该能做到”清单汇总

课程管理登录

登录后可以修改课程文字、插入图片并发布。

编辑本节

用 ### 写小标题、**文字** 加粗,支持列表、链接、表格和代码块。上传或粘贴图片会插入图片链接;复杂图注与折叠内容保留为 HTML。

可拖入或粘贴图片(PNG、JPEG、WebP、GIF,单张不超过 8 MB)。保存草稿后可跨设备继续;发布才会更新学生看到的内容。

历史版本与恢复

展示最近 50 次保存与发布。恢复只更新草稿,不会立即改变公开课程。