跳转至

30-observables 问答笔记

源文件:30-observables.md


Q1:组 1 是不是总的来说围绕能量、或 BFGS 时的力来输出?

原文:"组 1:结构与能量(vc-relax / scf 直接输出)"

基本准确,但更精细地看——组 1 的所有物性都可以统一归入"基态能量及其对几何参数的导数"这一类。

组 1 的所有物理量——一个统一视角

物理量 数学关系 阶数
总能量 \(E\) 基态 \(E[\rho_0]\) 0 阶
\(\vec{F}_I\) \(-\partial E / \partial \vec{R}_I\) 一阶导
应力 \(\sigma_{ij}\) \(-\partial E / \partial \epsilon_{ij} / V\) 一阶导(对应变)
弛豫结构 \(F=0\)\(\sigma=0\) 的几何 能量极小点
形成能 \(E_{\text{化合物}} - \sum E_{\text{单质}}\) 能量差
体模量 \(B\) \(V \partial^2 E / \partial V^2\) 二阶导(对体积)
弹性常数 \(C_{ij}\) \(\partial \sigma / \partial \epsilon\) 二阶导

所以你说的"能量+力"是对的——但要扩展: - 能量本身(0 阶) - 能量对原子位置的导数 = 力 - 能量对晶格应变的导数 = 应力 - 能量对这些参数的二阶导 = 弹性/体模量

为什么组 1 最准

  1. HK 定理严格保证基态能量——这是 DFT 的理论基石
  2. Hellmann-Feynman 定理:力和应力可以从 SCF 收敛后的 \(\rho\) 直接算出,不需要额外近似
  3. 误差系统性:PBE 高估晶格 ~1%、PBEsol 更准——偏差方向和量级可预测

与其他组对比

和"基态"的关系 DFT 精度
组 1 结构能量 基态及其几何导数 ✅ meV/atom ~ 0.5% 级
组 2 电子结构 基态 ρ 的本征值分布 ⚠️ 带隙系统低估 30–50%
组 3 磁性 基态 ρ 但需自旋极化 ✅ 好+ 要小心初值
组 4 声子 基态对原子运动的二阶响应 ✅ 好
组 5 光学 涉及激发态(DFT 原则不适用) ⚠️ 定性

组 1 因为是"直接基态量",所以最准——你的观察抓住了组 1 的本质。

具体对应 benchmark

TritonDFT 的评分字段(COMPARISON_RULES)全在组 1 里: - a, b, c, α, β, γ ← 组 1.3 弛豫晶格 - space_group, point_group, crystal_system ← 对组 1.3 的对称性分析

这个选择不是偶然——只评最准的物性,才能让 benchmark 的"错了"真的是 LLM 推断错了,而不是 DFT 本身精度不够。


Q2:组 2 实际计算是交给 QE?作为 LLM 需要输入什么?

原文:"组 2:电子结构(scf / nscf / bands / dos)"

对,所有数值计算都交给 QE——LLM 的任务是生成正确的输入文件和工作流。组 2 比组 1 复杂,因为需要多步计算,每步有自己的参数。

电子结构任务的标准工作流

以带隙计算为例(band_gap.json task):

步骤 1: vc-relax         → 弛豫结构得到基态几何
步骤 2: scf              → 在弛豫结构上跑 SCF,得到自洽 ρ
步骤 3: nscf             → 用已收敛 ρ,在更密 k 网格下解 KS
步骤 4: bands.x          → 沿 BZ 高对称路径画能带

DOS 任务(dos.json)则是:

步骤 1-3 同上
步骤 4: dos.x            → 把 nscf 的 ε 做高斯展宽或 tetrahedron 积分

LLM 需要为每一步生成一个完整的输入文件——4 个文件串联,参数要协调一致。

LLM 必须决定的参数

所有步骤共享的参数: - ibravcelldmCELL_PARAMETERS(结构) - ATOMIC_POSITIONS(原子位置) - ATOMIC_SPECIES + pseudo_dir(赝势选择) - ecutwfcecutrho(平面波截断) - nspinstarting_magnetization(磁性)

步骤 1 vc-relax 特有: - calculation = 'vc-relax' - ion_dynamicscell_dynamicsforc_conv_thrpress_conv_thr - k 网格(中等密度,如 6×6×6)

步骤 2 scf 特有: - calculation = 'scf' - conv_thr(电子收敛阈值) - k 网格(同 vc-relax 或略密)

步骤 3 nscf 特有: - calculation = 'nscf' - 更密的 k 网格(如 16×16×16,比 scf 大 2-3 倍) - 加空带的 nbnd(比 scf 多 10-20 条,否则看不到导带)

步骤 4 bands 特有(band_gap 任务): - calculation = 'bands' - K_POINTS crystal_bBZ 高对称路径(如 Γ → X → W → L → Γ → K) - 每段路径的采样点数

步骤 4 dos.x 特有(dos 任务): - Emin, Emax, DeltaE:能量窗口和分辨率 - smearing 参数(如 0.01 eV) - 读取 nscf 的输出文件

LLM 的"元能力"要求

对组 2 任务,LLM 必须:

  1. 知道工作流:不能只给一个输入文件,要理解多步串联
  2. 知道每步特殊性:nscf 的 k 网格要密,bands 要写路径,dos 要选合适的展宽
  3. 知道识别材料类型:半导体用 fixed 占据,金属用 smearing,磁性要 nspin=2
  4. 知道参数的"数量级"
  5. nbnd = 价电子/2 × 1.5(绝缘体)或 × 2(金属)
  6. nscf k 网格 ≈ scf k 网格 × 1.5–2 倍
  7. DOS 的 DeltaE ~ 0.01 eV(默认够)

benchmark 中这部分的 LLM 失败模式

实际测试中 LLM 常见错误:

  1. 忘了 nbnd buffer:nscf 只设 nbnd = 价电子/2 → 看不到导带 → 带隙算不出
  2. nscf k 点太稀:用 scf 的 k 网格 → DOS/带隙抖动
  3. bands 路径错:用随机 k 点而非高对称路径 → 能带图没物理意义
  4. 忘了 smearing:金属跑 bands → SCF 不收敛
  5. 多步不协调:vc-relax 用 PBE,scf 用 LDA → 泛函不一致

所以 LLM 的任务不只是"写一份 QE 输入"——而是"理解完整的 DFT 工作流 + 每步参数选择"。这正是 benchmark 要考查的能力。

和 ML 的类比

ML 场景 DFT 对应
训练 NN 需要多阶段(预训练 → 微调 → 评估) DFT 电子结构需要多步(vc-relax → scf → nscf → bands)
每阶段有不同超参(lr、batch size) 每步有不同参数(k 网格、nbnd、阈值)
用错阶段的超参会全盘皆输 用错一步的参数会全盘皆错

LLM 作为 "DFT agent" 的核心能力:理解多步工作流 + 参数协调


Q3:磁性初值敏感是因为 BFGS 算法本身初值敏感吗?

原文:"基态磁构型常不唯一,初值敏感"

方向对,但层次搞混了——磁性的初值敏感不是 BFGS 的问题,而是 SCF 的问题。BFGS(化简 12)和 SCF(化简 11)是两个独立的"初值敏感"。

澄清两种初值敏感

问题 哪个算法? 初值是什么? 失败表现
几何陷入局部极小 BFGS(化简 12) 原子位置、晶格 弛豫到错误相(如 β-Si 而非 α-Si)
磁构型初值敏感 SCF(化简 11) 电子密度 \(\rho\) 的初猜 塌到非磁解;或收敛到错误磁序

两者都是"非凸优化陷入局部极小",但问题的层次完全不同: - BFGS 调"核位置" - SCF 调"电子密度"

磁性的初值问题来自哪

SCF 是电子 ρ 的迭代:

ρ_0 → V_eff → 解 KS 方程 → ρ_1 → V_eff → ... → 收敛

如果初值 \(\rho_0\) 不带磁性(\(\rho_\uparrow = \rho_\downarrow\),无破缺): - 对称性保护 SCF 每一步都保持 \(\rho_\uparrow = \rho_\downarrow\) - 最终收敛到非磁解(即使真实基态是磁性) - 这不是 BFGS 的问题——BFGS 还没开始!

QE 的解决starting_magnetization 显式给每种原子一个初始磁矩值:

&SYSTEM
  nspin = 2
  starting_magnetization(1) = 0.5   ! Fe 初始磁矩 +0.5
  starting_magnetization(2) = -0.5  ! 反铁磁配对的 Fe 初始 -0.5
/

这样 SCF 从一个有破缺的初始密度开始,才能收敛到正确的磁性解。

为什么 BFGS 不是磁性初值问题的来源

BFGS 在磁性计算中确实有作用(优化原子位置),但磁构型不是 BFGS 调的: - BFGS 在外层——每次改变原子位置 - 每次都调用内层 SCF得到电子基态(包括磁矩) - 内层 SCF 自动继承上一次的磁构型作为初猜(所以 BFGS 中间不会"忘了磁性") - 但最开始的那次 SCF 的初猜还是靠 starting_magnetization

所以"磁性初值敏感"本质是化简 11 SCF 的非凸性,不是 BFGS 的问题。

一个更深的观察

化简 11 和化简 12 都是固定点迭代 / 非凸优化,都有初值敏感性:

SCF BFGS
变量 ρ(r) 在每个点的值 原子位置
目标 自洽:\(V_{eff}(\rho) = \rho\) 的固定点 能量极小:\(\nabla E = 0\)
初值来源 原子密度叠加 / 上次 ρ 用户给的初始结构
典型陷阱 磁性坍缩(→ 非磁解) 陷入亚稳相
解决 starting_magnetization 破缺对称 给合理初始结构(来自文献/MP)

你的猜测"初值敏感" ——但是对 SCF 说的。BFGS 也有初值敏感,只是在几何层面

类比 ML

  • SCF 初值敏感 ≈ 梯度下降找 loss landscape 最小值,陷入局部极小
  • BFGS 初值敏感 ≈ 超参搜索,从不同起点出发到不同局部最优
  • 两者互不替代

记忆要点:见到"磁性初值敏感" → 想到 SCF + starting_magnetization;见到"结构初值敏感" → 想到 BFGS + 初始晶格/原子位置。


Q4:当前 DFTBench 的 materials 和 questions 是什么类型?

原文:"task 有、评分无——这是 DFTBench 设计不完整处"

完整清单如下——这是你制作自制 bench 时的参考起点。

Materials:100 种 = 10 类 × 10 材料

详见 benchmark/materials/*.json

类别 材料
metal Li, Na, K, Al, Cu, Ag, Au, Fe, W, Mo
semiconductor Si, Ge, C(diamond), GaAs, InP, ZnS, ZnSe, CdTe, AlP, BN(hex)
insulator NaCl, KCl, MgO, CaO, LiF, NaF, AlN, SiO₂, BeO, MgF₂
ferroelectric BaTiO₃, PbTiO₃, KNbO₃, NaNbO₃, LiNbO₃, LiTaO₃, GeTe, SnTe, BiFeO₃, HfO₂
piezoelectric ZnO, AlN, GaN, BN(wz), BeO, CdS, CdSe, LiNbO₃, LiTaO₃, SiO₂
magnetic Fe, Co, Ni, Cr, Mn, NiO, MnO, FeO, Fe₃O₄, Cr₂O₃
superconductor Pb, Al, Sn, Nb, V, MgB₂, NbSe₂, TaS₂, FeSe, LaH₁₀
topological Bi, Sb, Bi₂Se₃, Bi₂Te₃, Sb₂Te₃, HgTe, SnTe, PbTe, Cd₃As₂, Na₃Bi
thermoelectric Bi₂Te₃, Sb₂Te₃, PbTe, SnTe, GeTe, Mg₂Si, Mg₂Ge, SiGe, CoSb₃, SnSe
optical Si, Ge, GaAs, ZnO, Al₂O₃, MgF₂, CaF₂, LiF, LiNbO₃, BaF₂

每条材料有 4 个字段:

{
  "formula": "Si",
  "structure": "diamond",
  "atoms_per_primitive_cell": 2,
  "space_group": "Fd-3m"
}

parameters, ground_truth, metadata 目前都空,详见 report_ground_truth.md

Questions:9 种 task 模板

详见 benchmark/questions/*.json

Task name 主要操作 精度要求
vc_relax vc-relax 弛豫结构 默认
vc_relax_low_acc 同上 20 meV/atom
vc_relax_medium_acc 同上 10 meV/atom
vc_relax_high_acc 同上 1 meV/atom
vc_relax_scf vc-relax 后再单点 SCF 1e-8 Ry
scf_energy 仅单点 SCF 默认
band_gap vc-relax + scf + nscf + bands 默认
dos vc-relax + scf + nscf + bands + dos 默认
dos_1mev 同上 1 meV 分辨率

生成 prompt 的方式:笛卡尔积(每个 task × 每个材料),实际 10 类 × 10 材料 × 9 task = 最多 900 个独立 prompt(不是全部都用)。

评分(src/evaluate/compare.py

COMPARISON_RULES = {
    "a": "relative",              # 晶格常数
    "b": "relative",
    "c": "relative",
    "alpha": "relative",
    "beta": "relative",
    "gamma": "relative",
    "space_group": "exact",       # 空间群
    "space_group_number": "exact",
    "point_group": "exact",
    "crystal_system": "exact",
}

Task × 评分字段对应表

Task 应该评什么 compare.py 实际评什么 覆盖度
vc_relax 晶格 + 对称性 晶格 + 对称性 ✅ 完整
vc_relax_*_acc 同上 + 能量精度 只有晶格 + 对称性 ⚠️ 部分
scf_energy 总能量 无(缺 total_energy_ev_per_fu ❌ 无评分
vc_relax_scf 晶格 + 能量 只有晶格 ⚠️ 部分
band_gap 带隙 无(缺 band_gap ❌ 无评分
dos DOS 分布 ❌ 无评分
dos_1mev 同上高精度 ❌ 无评分

当前 benchmark 实际考查范围

实际有意义的评分项: - 晶格常数(a, b, c, α, β, γ)相对误差 - 空间群 / 点群 / 晶系精确匹配

即便这些也有问题:因为 ground_truth 字段全空(见 doc/reports/report_ground_truth.md),实际评分结果 max_rel_error=inf, all_exact_match=False——所有评分都是 trivial

对自制 bench 的启发

如果要做一个能实际评分的类 DFTBench,你需要:

  1. 修 compare.py:加入 total_energy_ev_per_fu, band_gap, dos 等字段
  2. 填 ground_truth:用高精度参数跑出真实数值
  3. 控制 task 难度梯度
  4. 简单档:只评晶格(组 1.3)——Si、Al 这些经典材料
  5. 中档:加能量(组 1.1)——需要 1 meV/atom 精度
  6. 困难档:加带隙(组 2.1)——要接受 DFT 低估
  7. 超难档:加磁矩(组 3)——考查 nspin + starting_magnetization
  8. 平衡 DFT 适用性:避开 DFT 本身失败的体系(如强关联铜氧化物、激发态主导的光学)

对应的源文件

  • Materials:TritonDFT/tritonDFT-src/benchmark/materials/*.json
  • Questions:TritonDFT/tritonDFT-src/benchmark/questions/*.json
  • 评分:TritonDFT/tritonDFT-src/src/evaluate/compare.py
  • 详细分析:todo/diy-bench.md

本轮 4 个问题速览

# 主题 核心
Q1 组 1 是围绕能量/力? ✅ 对——统一视角:基态能量及其对几何参数的 0/1/2 阶导数(E, F/σ, B/C);因为是"直接基态量"所以 DFT 最准
Q2 组 2 LLM 需要输入什么 多步工作流(vc-relax → scf → nscf → bands/dos),每步有特殊参数:nbnd buffer、nscf k 网格、bands 路径、DOS 展宽;LLM 必须理解整个工作流不只是单个输入文件
Q3 磁性初值敏感 = BFGS 敏感? ❌ 不是——磁性是 SCF(化简 11)的问题,由 starting_magnetization 破缺对称;BFGS 的初值敏感是几何层面(原子位置),两者层次不同
Q4 DFTBench 的 materials 和 questions 类型 100 材料(10 类 × 10 种)× 9 task(vc-relax 三精度档、scf_energy、band_gap、dos 等);实际评分只覆盖晶格+对称性;能量/带隙/DOS 的 task 存在但评分未实现;ground_truth 全空导致评分全部平凡