TRAIN YOUR OWN CHEMISTRY AGENT

用开源小模型,
训练你自己的化学研究 Agent。

一个 2–9B 的小模型,学会调用 RDKit、PubChem 和计算平台这些工具,再用可验证的化学规则做强化学习,就能在一张消费级显卡甚至笔记本上运行,数据不出本机。这份指南给出选型、数据构造、LoRA 微调、GRPO 强化学习、评测和部署的完整步骤,代码可以直接复制。

更新于 2026-10-28模型信息核对自 Hugging Face 官方模型卡所有链接已逐一检查

00路线总览

先让大模型(老师)带着工具把任务做对,把做对的过程记下来,教给小模型;再用程序能自动判分的化学任务做强化学习;最后在本机部署,接入 MolAstria 的 AI 助手和 AI 实验室。

  1. 定任务与工具写清要回答的问题和要调用的工具:RDKit、PubChem、Rowan、文献检索
  2. 选底座模型按显存与许可证挑 2–9B 的小模型
  3. 造数据老师模型生成工具调用轨迹,RDKit 校验,只留做对的
  4. LoRA 微调单卡几小时,让小模型学会格式与工具
  5. 强化学习GRPO + 可验证奖励:结构合法、约束满足
  6. 评测与部署ChemBench 与自建测试集;vLLM / Ollama 本地服务

只想先体验:装好 Ollama 后运行 ollama run qwen3.5:4b,再按第 5 步把它接入本站的 AI 助手,不需要训练就能用本地模型问目录、提候选分子。

01按你的显存选模型

选择显存和要做的事,下方表格会标出放得下的模型。显存是按参数量粗略估算的(4-bit 推理约 0.6 GB/十亿参数 + 1.5 GB;QLoRA 微调约 1 GB/十亿参数 + 4 GB;GRPO 约为微调的 1.6 倍),实际还取决于序列长度和批大小。

显存能做什么推荐
无独显 / Mac 16 GB推理 ≤4B;用 MLX-LM 做 ≤2B 的 LoRALFM3-1.7B、Qwen3.5-2B、Gemma 4 E2B
8 GB4-bit 推理 ≤9B;QLoRA ≤2B推理 Qwen3.5-9B;微调 LFM3-1.7B、MiniCPM5-2B
12–16 GBQLoRA 4–9B;GRPO ≤3BQwen3.5-4B(推荐起步)、Granite 4.2 8B、Gemma 4 E4B
24 GBQLoRA ≤14B;GRPO 4–8B;4-bit 跑 ether0Qwen3.5-9B、Gemma 4 12B、Intern-S1-mini、Ministral 3 14B
48 GB+ / 多卡MoE 微调、多卡 RL(verl)gpt-oss-20b、Qwen3.6-35B-A3B、Nemotron 3.5 Lightning

02开源小模型(底座候选)

以下是 2026 年 10 月可下载的主要小模型。点任意一行或它的“介绍”按钮,可以展开这个模型的优势、在化学 Agent 里适合做什么、注意事项和启动命令。

模型参数许可证发布一句话链接
LFM3-1.7B 新Liquid AI1.7BLFM Open License 1.02026-10-23专为本地 Agent 和单卡微调设计,4-bit 约 1 GBHF ↗
LFM3-VL-2B 新Liquid AI1.9BLFM Open License 1.02026-10-19端侧看图看视频,回答前先思考HF ↗
Qwen3.5-0.8B / 2B阿里通义0.9B / 2.3BApache-2.02026-02-28最小的 Qwen,适合原型和教学0.8B ↗ 2B ↗
Qwen3.5-4B 推荐起步阿里通义4.7BApache-2.02026-02-27同尺寸里工具调用最强的一档,16 GB 显卡可微调HF ↗
Qwen3.5-9B 推荐阿里通义9.7BApache-2.02026-02-2710B 以内综合最强档之一,官方给出 vLLM 工具调用参数HF ↗
Gemma 4 E2B / E4BGoogle DeepMind有效 2B / 4BApache-2.02026-03-02端侧多模态:文字、图片、视频、语音E2B ↗ E4B ↗
Gemma 4 12BGoogle DeepMind12BApache-2.02026-05-2315B 以内最强的一档,消费级显卡可跑HF ↗
Nemotron 3.5 Bolt-E4B 新NVIDIA有效 4BOpenMDW-1.12026-10-05NVIDIA 在 Gemma 4 E4B 上继续后训练,提供 4 GB 量化版BF16 ↗ 4GB ↗
Granite 4.2 3B / 8BIBM3.7B / 8.8BApache-2.02026-08-07企业级工具调用与 Agent,测试过中文3B ↗ 8B ↗
MiniCPM5-2BOpenBMB / 面壁2.5BApache-2.02026-09-062B 级综合最强之一,训练数据开放HF ↗
Ministral 3(3B / 8B / 14B)Mistral AI3.8B–14BApache-2.02025-12原生函数调用与 JSON 输出,另有推理版8B ↗ 14B 推理 ↗
Phi-4-mini(instruct / reasoning)Microsoft3.8BMIT2025MIT 许可最宽松,数学和逻辑推理强instruct ↗ reasoning ↗
SmolLM3-3BHugging Face3.1BApache-2.02025-07训练数据和配方完全公开HF ↗
Olmo 3 7B(Instruct / Think)Ai27.3BApache-2.02025-11每个训练阶段的检查点都公开HF ↗

03低显存 MoE:总参数大,每次只激活一小部分

混合专家(MoE)模型每个 token 只用到少量参数,推理快、能力强,但显存按总参数算。适合当本地“老师”来造数据,或者在 24–80 GB 上做更强的 Agent。

模型总参数 / 激活许可证发布一句话链接
gpt-oss-20bOpenAI21B / 3.6BApache-2.02025-0816 GB 内存可跑,推理强度可调HF ↗
Qwen3.6-35B-A3B阿里通义36B / 约 3BApache-2.02026-04-15Agent 编程能力强,长上下文HF ↗
Gemma 4 26B-A4BGoogle DeepMind26B / 约 4BApache-2.02026-03-11Gemma 4 的 MoE 版本,速度接近 4BHF ↗
Nemotron 3.5 Lightning-30B-A3BNVIDIA31.6B / 约 3BOpenMDW-1.12026-08-01官方定位就是“拿来再训练”HF ↗
LFM2.5-24B-A2BLiquid AI24B / 约 2BLFM Open License 1.02026-10-12激活参数极少,CPU 也能跑得动HF ↗

04化学专用模型

已经在化学数据上继续训练或强化学习过的模型,可以直接用,也可以作为你继续微调的起点。

模型参数许可证发布一句话链接
ether0FutureHouse24BApache-2.02025-06用强化学习训练的化学推理模型,输出 SMILESHF ↗ 论文 ↗
Intern-S1-mini 化学底座上海 AI 实验室8.5BApache-2.02025-08科学多模态,分词器原生认识分子式HF ↗
ChemDFM-R-14BOpenDFM / 上海交大14.8BAGPL-3.02025-10原子级化学知识增强的推理模型HF ↗
TxGemma(2B / 9B / 27B)Google2.6B–27BHAI-DEF 条款(需同意)2025-03药物性质预测与治疗学对话9B chat ↗ 2B predict ↗

05检索、重排与分子表示

小模型记不住全部化学知识,要配检索(RAG):把论文、SI、组内笔记切块向量化,回答前先查。分子表示模型则把 SMILES 变成向量,用来做相似性搜索和性质预测。

模型用途许可证说明
Qwen3-Embedding 0.6B / 4B文本向量Apache-2.0多语言,中文文献检索首选;0.6B 可在 CPU 上跑
Nemotron-3.5-Embed-1B 新文档页面向量OpenMDW-1.12026-10 发布,直接对 PDF 页面图像做检索,图表、谱图、表格不用先转文字
Nemotron-3.5-Rerank-8B 新重排OpenMDW-1.12026-10 发布,对初检结果重新排序,提高引用准确率
bge-m3 + bge-reranker-v2-m3文本向量 + 重排MIT / Apache-2.0经典多语言组合,资料最多
MoLFormer-XLSMILES 向量Apache-2.0IBM 在大规模 PubChem / ZINC 分子上预训练,用作性质预测特征
ChemBERTa-77M-MTRSMILES 向量见模型卡DeepChem 社区模型,多任务回归预训练,轻量

06老师模型:用来造训练数据

小模型的训练数据最好来自更强的模型带着工具把任务做对的过程。下面的老师可以通过 API 调用,部分也有开放权重。

老师怎么用说明
DeepSeek V4.1 Flash / V4 ProAPI:deepseek-flash、deepseek-v4-pro;开放权重 HF ↗价格低、支持工具调用和思考强度调节;本站 AI 助手已接入
Meta Muse Spark / WonderMeta Model API:muse-spark-1.3、muse-wonder-1.0;开放权重 Muse Spark Open ↗Wonder 是本站 AI 实验室推荐的“化学家”;开放权重版 816B,需申请,适合有集群的团队
Intern-S1-Pro开放权重 HF ↗科学领域大模型(Apache-2.0),化学知识强,可做离线老师
gpt-oss-20b、Qwen3.6-35B-A3B本机运行(见上表)数据完全不出本机的本地老师

用 API 输出训练模型前,先确认该服务的使用条款允许这样做;生成的数据一律用工具校验后再入库。

07第 1 步:造数据——老师带工具做题,只留做对的

写一份任务清单(tasks.txt,每行一个问题,例如“给出 3 个含两个 F、不超过 12 个重原子的碳酸酯溶剂并核对分子式”),让老师模型在真实工具环境里作答,把完整的对话和工具调用记下来。只保留能被程序验证为正确的轨迹(拒绝采样),这样小模型学到的是“正确地用工具”,而不是老师的幻觉。

make_traces.py
# pip install openai rdkit
# Generate tool-use trajectories with a teacher model and keep only the ones RDKit can verify.
import json, os
from openai import OpenAI
from rdkit import Chem
from rdkit.Chem import Descriptors, rdMolDescriptors

teacher = OpenAI(base_url="https://api.deepseek.com", api_key=os.environ["DEEPSEEK_API_KEY"])
TOOLS = [{
    "type": "function",
    "function": {
        "name": "describe_molecule",
        "description": "Validate a SMILES string and return its canonical form, formula, weight and heavy-atom count.",
        "parameters": {"type": "object", "properties": {"smiles": {"type": "string"}}, "required": ["smiles"]},
    },
}]

def describe_molecule(smiles: str) -> dict:
    mol = Chem.MolFromSmiles(smiles)
    if mol is None:
        return {"valid": False}
    return {"valid": True, "canonical": Chem.MolToSmiles(mol), "formula": rdMolDescriptors.CalcMolFormula(mol),
            "mw": round(Descriptors.MolWt(mol), 2), "heavy_atoms": mol.GetNumHeavyAtoms()}

def run(task: str, max_steps: int = 6) -> list[dict]:
    messages = [{"role": "system", "content": "You are a careful chemist. Check every structure with the tool before answering."},
                {"role": "user", "content": task}]
    for _ in range(max_steps):
        msg = teacher.chat.completions.create(model="deepseek-flash", messages=messages, tools=TOOLS).choices[0].message
        turn = msg.model_dump(exclude_none=True)
        turn.pop("reasoning_content", None)          # keep the visible answer and tool calls only
        messages.append(turn)
        if not msg.tool_calls:
            return messages
        for call in msg.tool_calls:
            result = describe_molecule(**json.loads(call.function.arguments))
            messages.append({"role": "tool", "tool_call_id": call.id, "content": json.dumps(result)})
    return messages

def verified(messages: list[dict]) -> bool:
    # Keep a trace only if the tool was used, every structure it saw was valid, and the run ended with an answer.
    results = [json.loads(m["content"]) for m in messages if m["role"] == "tool"]
    return bool(results) and all(r["valid"] for r in results) and messages[-1]["role"] == "assistant"

with open("traces.jsonl", "w", encoding="utf-8") as out:
    for task in open("tasks.txt", encoding="utf-8"):
        trace = run(task.strip())
        if verified(trace):
            out.write(json.dumps({"messages": trace, "tools": TOOLS}, ensure_ascii=False) + "\n")

数据从哪来

  • 自己组里的真实问题:组会记录、常被问的计算设置、合成路线讨论。
  • 公开指令数据:SMolInstruct、Mol-Instructions(CC-BY-4.0)。
  • 可自动判分的任务:ether0-benchmark 的题型很适合改写成强化学习任务。
  • 本站 AI 实验室导出的候选与计算结果(CSV / JSON),可以直接变成“提出 → 校验 → 解释”的训练样本。

经验

  • 500–2,000 条高质量轨迹就能让小模型学会工具格式;质量比数量重要。
  • 按 InChIKey 给分子去重,并把同一分子只放进训练集或测试集之一,避免泄漏。
  • 保留一部分“工具报错、模型改正”的轨迹,小模型才学得会纠错。

08第 2 步:LoRA 微调——让小模型学会格式与工具

用 TRL + PEFT 做 LoRA:只训练少量附加参数,单卡几小时完成。想更快、更省显存可以换成 Unsloth;不想写代码可以用 LlamaFactory 的网页界面。

train_sft.py
# pip install "trl>=0.20" peft datasets accelerate
# LoRA fine-tuning on the verified traces. A 2–4B model fits on one 16–24 GB GPU.
from datasets import load_dataset
from peft import LoraConfig
from trl import SFTConfig, SFTTrainer

BASE = "LiquidAI/LFM3-1.7B"   # or ibm-granite/granite-4.2-3b; for multimodal bases (Qwen3.5, Gemma 4) follow their model card
data = load_dataset("json", data_files="traces.jsonl", split="train").train_test_split(test_size=0.05, seed=0)

trainer = SFTTrainer(
    model=BASE,
    train_dataset=data["train"],
    eval_dataset=data["test"],
    peft_config=LoraConfig(r=16, lora_alpha=32, lora_dropout=0.05, target_modules="all-linear", task_type="CAUSAL_LM"),
    args=SFTConfig(
        output_dir="chem-agent-lora",
        num_train_epochs=2,
        per_device_train_batch_size=2,
        gradient_accumulation_steps=8,
        learning_rate=1e-4,
        max_length=4096,
        gradient_checkpointing=True,
        bf16=True,
        logging_steps=10,
        eval_strategy="steps",
        eval_steps=100,
    ),
)
trainer.train()
trainer.save_model("chem-agent-lora")
merge_lora.py
# Merge the adapter into the base weights so vLLM / llama.cpp can load a single model.
from peft import AutoPeftModelForCausalLM
from transformers import AutoTokenizer

model = AutoPeftModelForCausalLM.from_pretrained("chem-agent-lora")
model.merge_and_unload().save_pretrained("chem-agent-merged")
AutoTokenizer.from_pretrained("chem-agent-lora").save_pretrained("chem-agent-merged")

Mac 用户:MLX-LM 的 LoRA 教程可以在 Apple 芯片上微调 ≤4B 的模型。

09第 3 步:强化学习——用化学规则当裁判

GRPO(DeepSeekMath 提出)让模型对同一题生成多个答案,按奖励比较优劣,不需要单独的奖励模型。化学特别适合这种“可验证奖励”:结构合不合法、元素和大小是否满足约束、性质是否落在目标范围,都能用 RDKit 或计算平台自动判断。ether0 就是这样训练出来的。

train_grpo.py
# pip install "trl>=0.20" rdkit datasets
# GRPO with a verifiable chemistry reward: RDKit grades every answer, no reward model needed.
import re
from datasets import Dataset
from rdkit import Chem, RDLogger
from trl import GRPOConfig, GRPOTrainer

RDLogger.DisableLog("rdApp.*")
ALLOWED = {"C", "H", "O", "F"}
TASK = ("Propose one lithium-battery electrolyte solvent containing only C, H, O and F, "
        "with at most 12 heavy atoms and at least two fluorine atoms. Answer as ....")
prompts = Dataset.from_list([{"prompt": [{"role": "user", "content": TASK}]}] * 256)   # use many varied tasks in practice

def text_of(completion):
    return completion[-1]["content"] if isinstance(completion, list) else completion

def chemistry_reward(completions, **kwargs):
    rewards = []
    for completion in completions:
        found = re.search(r"(.*?)", text_of(completion), re.S)
        mol = Chem.MolFromSmiles(found.group(1).strip()) if found else None
        if mol is None:
            rewards.append(-1.0)                      # no answer or an invalid structure
            continue
        symbols = [a.GetSymbol() for a in mol.GetAtoms()]
        score = 0.2                                   # a valid structure
        score += 0.4 if set(symbols) <= ALLOWED else -0.4
        score += 0.2 if mol.GetNumHeavyAtoms() <= 12 else -0.2
        score += 0.2 if symbols.count("F") >= 2 else 0.0
        rewards.append(score)
    return rewards

trainer = GRPOTrainer(
    model="chem-agent-merged",                        # start from the SFT model
    reward_funcs=chemistry_reward,
    train_dataset=prompts,
    args=GRPOConfig(output_dir="chem-agent-grpo", num_generations=8, max_completion_length=512,
                    per_device_train_batch_size=8, gradient_accumulation_steps=4,
                    learning_rate=5e-6, bf16=True, logging_steps=5),
)
trainer.train()
trainer.save_model("chem-agent-grpo")

好奖励的样子

  • 能自动、确定地算出来:RDKit 解析、元素与原子数、官能团 SMARTS、分子量、相似度。
  • 分层给分:先奖励“结构合法”,再奖励“满足约束”,最后奖励“性质达标”。
  • 贵的打分(UMA、DFT)只用在少量样本上,或先离线算好再查表。

多卡与大规模

  • verl:多卡、多节点的强化学习框架,支持多轮工具调用的 Agent RL。
  • TRL GRPO 文档:奖励函数、vLLM 加速生成等参数说明。
  • Unsloth:单卡 GRPO 更省显存。

10第 4 步:评测——训练前后都要量

  • 通用化学能力:ChemBench(代码、数据),确认微调没有让基础化学知识退化。
  • 你的任务:留出 10–20% 自建任务做测试,统计 SMILES 合法率、约束满足率、工具调用成功率、最终答案正确率。
  • 对比三个版本:原始底座、SFT 后、GRPO 后,同一测试集、同一采样参数。
  • 人工抽查:每轮随机看 30 条完整轨迹,找出“答对了但理由错”的情况。

11第 5 步:部署,并接入 MolAstria

把模型跑成 OpenAI 兼容的本地服务,然后在本站右上角 AI 助手 → 设置 → 其他兼容接口 里填上地址,AI 助手和 AI 实验室就会使用你自己的模型。请求只在你的浏览器和你的电脑之间往返。

vLLM(Linux / WSL,NVIDIA 显卡)
# Serve the trained model with tool calling (pick the parser your base model's card recommends)
vllm serve ./chem-agent-grpo --served-model-name chem-agent --port 8000 \
  --enable-auto-tool-choice --tool-call-parser hermes
# MolAstria settings: address http://localhost:8000/v1, model chem-agent, key: any text
Ollama(Windows / macOS / Linux)
# 1) Convert to GGUF with llama.cpp, then register it with Ollama
python llama.cpp/convert_hf_to_gguf.py chem-agent-grpo --outfile chem-agent.gguf
echo "FROM ./chem-agent.gguf" > Modelfile
ollama create chem-agent -f Modelfile
# 2) Allow molastria.com to call your local Ollama, then start it
OLLAMA_ORIGINS=https://molastria.com ollama serve
#    Windows PowerShell: $env:OLLAMA_ORIGINS="https://molastria.com"; ollama serve
# MolAstria settings: address http://localhost:11434/v1, model chem-agent, key: any text

浏览器第一次从网页访问本机服务时,可能弹出“允许访问本地网络设备”的提示,选择允许即可。OLLAMA_ORIGINS 的说明见 Ollama 文档,OpenAI 兼容接口见 这里;vLLM 的工具调用参数见 vLLM 文档。

把化学工具做成 MCP 服务

用 MCP 把 RDKit 等工具包装一次,你的小模型、Claude、以及其他支持 MCP 的客户端都能直接调用。

chem_tools_mcp.py
# pip install mcp rdkit
from mcp.server.fastmcp import FastMCP
from rdkit import Chem
from rdkit.Chem import Descriptors, rdMolDescriptors

mcp = FastMCP("chem-tools")

@mcp.tool()
def describe_molecule(smiles: str) -> dict:
    """Validate a SMILES string and return canonical SMILES, formula, weight and heavy-atom count."""
    mol = Chem.MolFromSmiles(smiles)
    if mol is None:
        return {"valid": False}
    return {"valid": True, "canonical": Chem.MolToSmiles(mol), "formula": rdMolDescriptors.CalcMolFormula(mol),
            "mw": round(Descriptors.MolWt(mol), 2), "heavy_atoms": mol.GetNumHeavyAtoms()}

if __name__ == "__main__":
    mcp.run()

12工具、框架与数据集

类别项目用途
微调Unsloth · TRL · PEFT · LlamaFactory · AxolotlLoRA / QLoRA、SFT、DPO、GRPO;LlamaFactory 有网页界面
强化学习verl · TRL GRPO多卡 Agent RL;单卡 GRPO
推理服务vLLM · SGLang · Ollama · llama.cpp · MLX-LMOpenAI 兼容接口、量化、Apple 芯片
Agent 框架smolagents · LangGraph · OpenAI Agents SDK · MCP Python SDK多步工具调用、状态管理、工具标准化
化学工具RDKit · PubChem PUG REST · rowan-python · fairchem(UMA) · DeepChem结构校验、数据库查询、云端量化计算、机器学习势
参考工作ChemCrow(代码)· ether0(代码)化学工具 Agent 的早期代表;化学推理强化学习
数据与评测ChemBench · ether0-benchmark · SMolInstruct · Mol-Instructions · OMol25(需申请)评测、指令数据、可验证任务、分子量子化学数据

13常见坑

结果可信度

  • 小模型会编造 SMILES、CAS 号和文献;所有结构一律过 RDKit,所有数据一律回到数据库核对。
  • 不要让模型直接给数值性质(沸点、电位)当结论;数值来自计算或数据库,模型负责调度和解释。
  • 训练集和测试集按分子去重,否则分数虚高。

许可证与安全

  • 商用优先 Apache-2.0 / MIT;LFM(LFM Open License)、ChemDFM(AGPL-3.0)、TxGemma(HAI-DEF)、Nemotron(OpenMDW)都要先读条款。
  • 微调可能削弱底座原有的安全行为;涉及危险物质合成的请求要在工具层拦截。
  • API 老师的服务条款可能限制用输出训练模型,使用前确认。

模型名称、参数量、许可证与发布日期核对自各模型的 Hugging Face 官方页面(2026-10-28);工具仓库核对自 GitHub。显存数字为粗略估算。新模型发布很快,使用前请以模型卡为准。相关页面:AI 实验室 · Agent 工程 · 资源目录