ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

用人工智能代理搭建材料发现工作流:数据、模型与验证

2026/8/29 13:57:54 拓冰建站 浏览量
用人工智能代理搭建材料发现工作流:数据、模型与验证 一个名为 Discovered Materials 的 YC 批次项目定位是用 AI agents 自动发现新材料。这个方向在材料信息学和机器学习领域并不是新名词但以“agent”为核心去重写材料发现工作流确实意味着技术组织方式在变化。过去我们习惯训练一个模型去预测某个性质再把预测结果交给研究人员做判断现在则变成由一组工具、模型和决策逻辑组成的自主循环完成从候选生成、性质筛选到结果验证的多个环节。这篇文章不讨论具体公司进展而是从工程实现角度拆解AI agent 要发现新材料需要什么样的数据、工具、模型和验证机制。文章会用 Python 写一个最小可运行的材料筛选 agent读的人可以把它当作骨架替换成自己的数据源和模型后用于电池材料、合金、催化剂等方向的前期筛选。也会给出参数表、排错表和发布前检查清单方便直接落地到本地项目或实验室日常工作中。1. 先理清 AI Agent 在材料发现中到底做什么1.1 传统材料发现链条为什么慢传统新材料发现通常沿着“文献调研 - 经验假设 - 实验合成 - 结构表征 - 性质测试 - 数据分析”的路径推进。每一步都依赖研究者的判断和手工操作。一个配方失败往往要重新回到假设阶段调整元素配比或合成条件后再试一轮。整个过程可能持续数月甚至数年而且大量知识沉淀在论文、实验记录和个人经验里换一个人就很难完全复用。真正降低效率的不是“实验本身”而是“决策环节的碎片化”。数据分散、格式不统一、计算工具之间缺乏接口、实验与模拟结果难以对齐。研究者大量时间花在整理数据和等待计算结果上而不是在提出和检验假设上。AI 模型能解决一部分预测问题但无法自动把“搜索候选”“计算性质”“判断可行性”串起来。1.2 AI Agent 如何把流程变成自主闭环AI agent 在材料发现中的角色不是替代某一个物理模型而是把多个步骤编排成一个闭环。一个典型的闭环包括感知任务、制定计划、调用工具、验证输出、根据反馈调整策略。举个例子给定“找含锂、含过渡金属、含氧的稳定正极候选”agent 可以做如下工作生成候选化学式组合。调用本地或远程数据库查询已知结构。对未知候选调用机器学习模型预测带隙和形成能。过滤物理上不合理的结构。输出排序后的候选清单。和普通脚本不同agent 会记录每一步结果并在某一步失败时尝试修正。比如候选集为空它不会直接退出而是会减小约束条件后重新生成候选。这种“反馈-重试”机制是 agent 区别于一次性批处理脚本的关键。1.3 材料 Agent 必须具备的四类能力从工程角度看材料 agent 至少需要四类能力能力类型解决的问题典型工具数据检索从数据库或本地文件获取已知结构、性质Materials Project API、本地 CSV、pymatgen性质预测估算带隙、形成能、稳定性、力学性能ML 代理模型、DFT 接口、经验规则结果验证检查化学式是否合理、结构是否完整、数值是否异常pymatgen、ASE、自定义规则行为编排决定先调哪个工具、失败后如何重试、如何汇总结果LangGraph、AutoGen、自研循环目前很多“AI 材料发现”项目只实现了第二类能力缺少编排和验证。实际项目里第一类能力决定了 agent 是否能在真实数据上工作第三类能力决定了预测结果是否可信第四类能力决定整个系统能否自我纠错。所以在写代码之前先想清楚这四类能力分别由谁来承担比直接堆模型重要得多。2. 搭建材料发现 Agent 需要的数据与运行环境2.1 可以优先接入的公开数据源材料领域常见的数据源包括第一性原理计算数据库、实验数据库和文献数据库。下面这些在开源项目中经常被使用但具体访问方式和条款需要以官方文档为准接入前要确认版本和授权要求。数据源主要内容获取方式说明Materials Project计算结构、热力学性质、电子性质REST API需申请 key覆盖广适合做候选筛选入口OQMD量子力学材料数据库REST API 或下载偏热力学稳定性可配合形成能判断AFLOW晶体结构、弹性性质、声子等REST API数据和枚举规则丰富JARVIS多种性质预测结果下载或 API适合做 ML 模型基准测试NOMAD计算数据归档库大数据平台更适合做数据挖掘实验本地文献/实验表格合成实验结果、实测性能自己整理 CSV实验室内部数据往往最关键这里有一个容易犯的错误想直接抓所有数据库结果被 API 限流和字段格式差异拖住。推荐做法是先从一个小而可控的数据集开始。比如手动整理几十条已知正极材料记录跑通 agent再逐步接入远程 API。2.2 Python 环境与依赖清单材料 agent 的工程栈通常以 Python 为主核心依赖包括pymatgen用于解析和操作晶体结构、化学式ase用于原子结构建模与计算任务对接pandas用于数据表处理numpy、scikit-learn用于 ML 模型训练和特征处理。如果计划让大模型参与任务规划和结果总结则要引入openai、langchain或langgraph之类依赖如果只做规则型 agent则可以只依赖上述科学计算库。一个适用于学习环境的requirements.txt可以这样写pymatgen2024.1.1 ase3.22.1 pandas2.0.0 numpy1.24.0 scikit-learn1.3.0 requests2.31.0 pydantic2.0.0安装时要注意pymatgen在部分机器上依赖monty、spglib等底层库直接用 pip 安装通常能解决但如果你使用 conda建议先创建独立环境conda create -n material-agent python3.11 -y conda activate material-agent pip install -r requirements.txt注意不同库版本之间兼容性差异明显尤其是pymatgen的大版本升级可能改变 API。如果原始项目没有锁定版本落地前务必先在一个干净环境里确认依赖可安装、可导入。2.3 为什么建议先建本地数据快照连接远程数据库固然方便但生产环境依赖远程 API 会带来几个问题网络不稳定、接口限流、字段变化、复现困难。因此对于自动化 agent推荐在本地保存一份数据快照。一个轻量方案是把候选材料记录存成 CSVcomposition,space_group,formation_energy_per_atom,band_gap,known LiCoO2,R-3m,-2.90,2.30,1 LiFePO4,Pnma,-3.10,3.40,1 LiMn2O4,Fd-3m,-3.50,1.20,1 LiNiO2,R-3m,-2.60,0.50,1 Li2MnO3,C2/m,-2.40,2.10,1这个文件不一定来自真实数据库但可以用于开发调试。agent 在本地先完成开发再把查询函数替换成 API 调用。这样可以保证单元测试稳定不会被远程数据库的状态影响。3. 用最小可运行的 Agent 筛选锂电池正极材料候选3.1 任务拆解从一句话需求到工具序列把需求“找出含锂、过渡金属、氧的潜在正极材料”拆成 agent 可执行步骤生成候选化学式从元素组合中生成可能的化学式。查询本地知识库判断候选是否在已有数据中如果存在则直接读取性质。性质预测对不存在的候选用经验规则或代理模型估算带隙、形成能。物理约束过滤排除电荷不平衡、明显不稳定的候选。排序输出按稳定性和带隙综合打分。实现时我建议先写工具层再写编排层。工具层保证单个函数正确编排层负责调度和重试。3.2 工具层材料计算与查询函数下面是一份简化版工具代码保存为materials_tools.py。它不依赖真实 DFT 计算带隙和稳定性使用经验规则模拟方便运行。实际项目中把estimate_bandgap和estimate_stability替换为训练好的模型或 DFT 接口即可。import math import pandas as pd from typing import Optional DB_PATH materials_db.csv # 元素周期表简单属性用于模拟预测 ELEC_NEG { Li: 0.98, Ni: 1.91, Co: 1.88, Mn: 1.55, Fe: 1.83, O: 3.44, P: 2.19, Ti: 1.54, V: 1.63, Cr: 1.66, Zn: 1.65, } def _load_db(): return pd.read_csv(DB_PATH) def generate_candidates(elements, max_atoms6): 从元素列表生成简单化学式组合示例仅用于演示。 candidates [] # 简化生成逻辑只对固定化学计量比示例做扩展 patterns [ {A: elements[0], M: elements[1], O: elements[2], ratio: (1, 1, 2)}, {A: elements[0], M: elements[1], O: elements[2], ratio: (1, 2, 4)}, {A: elements[0], M: elements[1], O: elements[2], ratio: (2, 1, 4)}, ] for p in patterns: a, m, o p[ratio] formula f{p[A]}{a}{p[M]}{m}O{o} candidates.append(formula) return candidates def query_known(composition: str) - Optional[dict]: 查询本地知识库。 db _load_db() row db[db[composition] composition] if row.empty: return None item row.iloc[0] return { composition: item[composition], formation_energy_per_atom: float(item[formation_energy_per_atom]), band_gap: float(item[band_gap]), } def estimate_bandgap(composition: str) - float: 模拟带隙预测根据元素电负性差估算。 # 示例公式仅用于流程演示 elems [] tokens [] current for ch in composition: if ch.isupper(): if current: tokens.append(current) current ch elif ch.islower(): current ch else: tokens.append(current) current tokens.append(ch) if current: tokens.append(current) # 简单计算平均电负性差 env 0.0 cnt 0 for t in tokens: if t in ELEC_NEG: env ELEC_NEG[t] cnt 1 if cnt 0: return 1.0 avg_env env / cnt # 带隙经验值较高电负性差的化合物更容易绝缘 return round(abs(ELEC_NEG[O] - avg_env) * 1.2, 2) def estimate_stability(composition: str) - float: 模拟形成能预测返回值越负越稳定。 db _load_db() row db[db[composition] composition] if not row.empty: return float(row.iloc[0][formation_energy_per_atom]) # 未收录的材料用简单规则模拟 if Ni in composition: return -2.4 if Mn in composition: return -2.9 return -1.8 def filter_neutral(composition: str) - bool: 演示用电荷平衡检查实际项目需要更严格方法。 # 简单检查是否含有氧作为最小规则 return O in composition这个文件里的generate_candidates非常简化只生成三种固定化学计量比目的是跑通流程。在实际项目中应该使用pymatgen.core.Composition来解析化学式用空间群枚举或元素组合生成器来扩充候选集。3.3 编排层Agent 循环保存为material_agent.py。这里不使用大模型而是通过一个规则型 planner 控制工具调用顺序这样任何人都能直接运行。from materials_tools import ( generate_candidates, query_known, estimate_bandgap, estimate_stability, filter_neutral, ) class MaterialAgent: def __init__(self, target_elements, top_k5): self.target_elements target_elements self.top_k top_k self.trace [] def _log(self, step, data): self.trace.append({step: step, data: data}) print(f[{step}] {data}) def plan(self, task): # 规则型 planner按顺序规划步骤 return [generate, query, predict, filter, rank] def run(self, task): self._log(task, task) plans self.plan(task) if generate in plans: candidates generate_candidates(self.target_elements, max_atoms6) self._log(candidates, candidates) results [] for comp in candidates: known query_known(comp) if known: results.append({ composition: comp, band_gap: known[band_gap], formation_energy_per_atom: known[formation_energy_per_atom], source: database }) else: bg estimate_bandgap(comp) fe estimate_stability(comp) results.append({ composition: comp, band_gap: bg, formation_energy_per_atom: fe, source: prediction }) # 过滤物理上不合理的候选 filtered [r for r in results if filter_neutral(r[composition])] self._log(filtered, len(filtered)) # 按形成能升序排序越负越稳定 ranked sorted(filtered, keylambda x: x[formation_energy_per_atom])[:self.top_k] self._log(ranked, ranked) return ranked if __name__ __main__: agent MaterialAgent(target_elements[Li, Co, O], top_k5) result agent.run(find stable cathode candidates) print(final:, result)核心逻辑是planner 负责返回步骤序列executor 按步骤执行validator 在 filter 阶段发挥作用。这里用formation_energy_per_atom升序作为稳定性排序符合一般判断习惯形成能越负结构越稳定。3.4 运行结果和预期输出在包含materials_db.csv和两个 Python 文件的目录中运行python material_agent.py预期输出类似[task] find stable cathode candidates [candidates] [LiCoO2, LiCo2O4, Li2CoO4] [filtered] 3 [ranked] [{composition: LiMn2O4, band_gap: 1.2, formation_energy_per_atom: -3.5, source: database}, ...] final: [...]这里只展示了最小闭环。真正用于发现新材料时候选生成逻辑、性质模型和验证逻辑都要替换成更可靠的实现。但代码骨架可以直接复用工具函数对外暴露的接口保持不变内部换成真实模型即可。4. Agent 参数、模型选择与结果验证4.1 Agent 关键参数速查规则型 agent 的参数不多但每个参数都会影响最终结果。下面是一份常用参数速查表。参数含义推荐值调小/调大的影响max_steps单任务最多执行工具步数5-20太小会导致任务未完成太大容易在无意义步骤上消耗资源top_k最终返回候选数量5-20太小容易漏掉好结构太大会让用户淹没在不合格候选中stability_threshold形成能过滤阈值随体系调整常用 -0.5 eV/atom 到 -1.0 eV/atom阈值过严会筛掉全部数据过松会输出大量不稳定候选band_gap_range带隙范围过滤电池材料一般不设硬范围视应用而定设置过窄会排除多用途材料db_path本地数据库路径绝对路径或项目相对路径配置错误会导致查询为空或报错log_level日志粒度INFO 或 DEBUG生产环境建议 INFO调试时用 DEBUG在刚才的最小 agent 里top_k是显式参数stability_threshold没有显式写出。实际项目中最好把这种阈值放到配置文件中避免每次修改都需要改动代码。4.2 性质预测模型怎么选性质预测是 agent 中最核心、也最容易踩坑的部分。不同方法精度和成本差异很大。方法精度成本适用场景注意点经验规则低极低快速预筛选、流程演示无法外推到新化学空间机器学习代理模型中低大规模筛选需要高质量训练数据避免数据泄漏图神经网络中高中晶体结构性质预测需要结构特征训练集分布影响大DFT 计算高高精准验证关键候选计算资源需求高需要并行队列大语言模型不可用于精确数值预测中任务规划、结果总结容易产生“合理但不正确”的材料结论在选择时建议采用“分级策略”先用经验规则或代理模型做宽筛再用 DFT 对 top 候选做精算最后用实验验证。这既是成本控制也是可靠性的保障。4.3 为什么不能让 LLM 单独决定材料结论大语言模型在材料发现中适合承担“规划者”和“解释者”的角色但不适合承担“数值计算器”的角色。原因有三第一LLM 的训练目标不是保证物理一致性。它可能从训练数据中学到“LiFePO4 是稳定的正极材料”但无法可靠地给一个全新化学式计算形成能。第二材料数据稀疏很多组合在语料中从未出现LLM 会生成看起来专业但实际错误的内容。第三可复现性差。相同 prompt 可能给出不同候选这在科学计算中很难接受。因此工程上更应该把 LLM 放在任务分解层。比如让 LLM 把用户自然语言请求转成plan步骤但数值计算一律交给工具函数并对结果做规则校验。4.4 结果验证的向上校验路径Agent 输出的候选不能直接当作新材料必须经过验证。验证路径从低到高可以分为四层结构有效性化学式是否电荷平衡晶格是否完整原子间距是否合理。数据一致性候选是否与已知数据库冲突比如数据库已有更稳定结构。理论合理性预测形成能是否在合理范围内带隙是否与应用需求匹配。实验/DFT 抽查对排名靠前的 3-5 个候选做 DFT 精算有条件时进行实验合成。在最小示例中我只做了化学式层级的检查。实际项目一定要在 agent 的 validator 中增加结构有效性检查否则预测模型很容易给出原子重叠等物理上不可能的构型。5. 常见问题、日志现象与排查路径5.1 从现象到根因的排查表材料 agent 运行中常见错误可以分为四类数据层、工具层、模型层、编排层。下面表格列出高频问题。问题现象常见原因检查方式解决建议查询数据库返回结果为空CSV 路径错误或表字段名不匹配打印db.columns检查composition字段统一字段命名用pydantic做配置校验化学式解析失败元素符号大小写错误如co而非Co用pymatgen.core.Composition解析提前用正则校验元素符号不通过的直接丢弃候选集过少generate_candidates逻辑太简单或约束过严打印生成数量检查元素列表增加化学计量比枚举或引入结构模板带隙预测异常值特征缺失、元素不在训练集内检查元素映射是否覆盖全部候选对未覆盖元素做降级处理给出提示而非错误输出形成能全部为正训练数据分布偏移或阈值设置错误画形成能分布直方图检查单位确认数据单位是 eV/atom不是 eV/cellAgent 循环无法结束planner 生成的步骤不完整或 validator 过度过滤打印 trace检查max_steps为每步增加超时和重试上限远程 API 超时请求并发过高或本机网络受限看日志中requests.exceptions.Timeout增加重试和指数退避优先使用本地快照5.2 一个典型问题化学式解析失败的修复过程假设 agent 收到了LiCoO2之外的候选Li2coO4说明元素符号中的co被当成一个未知元素。现象表现为deprecation警告或者解析后元素数量错误。排查步骤打印原始候选字符串确认大小写是否错误。用pymatgen.core.Composition(Li2coO4)测试会得到错误提示。修复方案在生成候选时强制元素首字母大写或使用Composition的解析异常捕获。推荐在工具层增加一个safe_parse_composition函数from pymatgen.core import Composition def safe_parse_composition(formula): try: comp Composition(formula) return comp except Exception as e: print(fparse failed for {formula}: {e}) return None这样 agent 遇到异常化学式时返回None由 validator 决定跳过或重试而不是中断整条任务。5.3 推荐排查顺序面对一个复杂 agent 报错建议按下面顺序检查检查输入用户请求是否完整元素列表是否合理。检查数据文件路径、表头、字段名、数据格式。检查工具函数单个函数单独测试确认输出是否可预期。检查模型预测结果分布是否异常特征是否覆盖。检查 Agent 编排 planner 是否按预期生成步骤trace 中哪一步中断。原则是先在“最小单元”上做验证再进入集成循环。如果直接看 agent 报错往往会被多层嵌套的时间消耗拖进去。6. 生产环境实践与后续扩展方向6.1 可复现性Agent 必须能回放材料发现属于科学研究场景可复现性比普通业务系统更重要。一个连自己都复现不出来的 agent无法为研究结论提供支撑。建议至少做到锁定依赖版本使用requirements.lock.txt或uv.lock。固定随机种子记录所有随机过程参数。保存数据快照远程数据库版本变化不应影响复现结果。记录 agent trace包括每一步的工具输入、工具输出、模型版本。为每个任务生成一个唯一的run_id关联日志、输出和配置。其中 agent trace 是最容易被忽略的。在实际项目中trace 可以保存成 JSON 或直接落库便于事后回溯。{ run_id: 20250218_123456, task: find stable cathode candidates, config: {top_k: 5, stability_threshold: -1.0}, steps: [ {step: generate, output: [LiCoO2, LiCo2O4]}, {step: predict, output: {LiCoO2: {band_gap: 2.3}}} ] }有了这样的 trace排查问题就不再依赖人的记忆而是可以像看调试日志一样逐步回放。6.2 人机协同Agent 能自动到什么程度材料发现 agent 并不是越自动越好。合成实验一旦执行改变的是真实物质出错成本远高于计算。建议对 agent 做“自动化级别”区分级别自动化范围适用场景L0人工执行全部步骤开始接触 agent 的实验组L1自动生成候选和预测文献调研、课程设计L2自动筛选并给出解释研究助手辅助判断L3自动调用 DFT 计算有计算集群的课题组L4自动驱动实验平台已有自动化合成/表征设备的实验室新项目从 L1 或 L2 开始不要直接进入 L4。原因是 agent 每增加一层自动化就需要新增对应的异常处理、监控和安全机制。自主实验还需要考虑设备状态、安全限制和材料毒性复杂度会成倍上升。6.3 发布前检查清单把 agent 放到测试环境或给团队其他成员使用前建议逐项检查是否包含本地数据快照并且路径使用相对路径或环境变量。是否所有工具函数都有异常处理不会因一条坏数据退出。是否记录 trace包含关键输入和输出。是否固定随机种子和依赖版本。是否对模型预测结果设置范围校验。是否对候选数量为空的情况做显式处理。是否在文档中说明数据来源和模型训练范围。是否防止 agent 在生产环境直接触发实验设备。这个清单不是一次性的而是每次新增数据源或模型后都要重新执行。6.4 后续扩展方向如果一个最小 agent 已经稳定运行可以考虑以下扩展一是主动学习。让 agent 从尚未标记的候选空间中挑选不确定性最高的样本交给 DFT 或实验验证后把结果补充回训练集。二是多智能体协作。一个 agent 负责结构生成另一个负责性质验证再有一个负责成本或可持续性评估。三是与自动化实验平台联动。通过标准协议把候选列表发送给合成机器人合成结果回传后自动更新数据库。每一步扩展都意味着新的失败模式。比如主动学习可能偏向不稳定区域多智能体之间可能因为指令冲突产生重复计算自动化实验平台可能出现样品混淆。提前为这些场景设计回退方案比事后修补更重要。从工程角度看AI agent 发现新材料的本质不是“让模型决定材料可行性”而是“把可复验的工具组合成可纠错的工作流”。对实际项目最有效的做法是先用一个小数据集跑通闭环再逐步替换成更可靠的模型和更大范围的数据源。每一步都记录 trace每一次筛选都可回放最终才能真正帮研究人员节省时间而不是制造看起来前卫却无法判断对错的结果。