Skip to content

LeMat-Synth

Turn materials science papers into machine-readable science — synthesis recipes, performance curves and quality scores, extracted at scale by LLMs and VLMs.

Get started Tutorials Dataset

Paper Dataset GitHub Python License


What you get

  • Synthesized materials


    Every material a paper actually makes, identified by chemical formula and separated from the ones it merely cites.

    How extraction works

  • Structured procedures


    Step-by-step recipes — reagents, amounts, temperatures, durations, atmospheres — normalised into a controlled Pydantic ontology.

    Output format

  • Performance data


    Quantitative values read straight off the paper's plots by a VLM, then linked back to the material each curve belongs to.

    Case studies

  • A quality score


    An LLM judge rates every extraction on five dimensions, benchmarked against human annotators so you know what to trust.

    Annotations & evaluation

This site documents the reference implementation of LeMat-Synth v1.0 (NeurIPS AI4Mat 2025) — and the extensible codebase underneath it, for building extraction studies in your own domain.

The LeMat-Synth pipeline: papers in, structured synthesis and performance data out


Get started in a minute

Requires Python 3.11+ and uv.

git clone https://github.com/LeMaterial/lematerial-llm-synthesis.git
cd lematerial-llm-synthesis

uv venv -p 3.11 --seed
uv sync && uv pip install -e .

cp .env.example .env
echo "GEMINI_API_KEY=your_key_here" >> .env

A free Gemini API key is enough for the default pipeline. Add ANTHROPIC_API_KEY to read data off plots, and MISTRAL_API_KEY for OCR on scanned PDFs.

Full installation guide

# One paper
lemat-synth extract paper.pdf

# A whole folder, with performance curves read from the figures
lemat-synth batch papers/ output_dir=results/ \
    domain=catalysis with_performance=true

Results land in results/<paper_id>/<material>.json.

CLI reference

from llm_synthesis.transformers.synthesis_extraction.dspy_synthesis_extraction import (
    DspySynthesisExtractor,
    make_dspy_synthesis_extractor_signature,
)
from llm_synthesis.utils import clean_text
from llm_synthesis.utils.dspy_utils import get_llm_from_name

extractor = DspySynthesisExtractor(
    signature=make_dspy_synthesis_extractor_signature(
        instructions="Extract the complete synthesis procedure for this material."
    ),
    lm=get_llm_from_name("gemini-2.0-flash"),
)

synthesis = extractor.forward(input=(clean_text(paper_text), "Fe2O3"))
print(synthesis.synthesis_method, synthesis.steps)

Python API guide

The extracted corpus is already published — no API key, no cost:

from datasets import load_dataset

synth = load_dataset("LeMaterial/LeMat-Synth", split="train")

The dataset is gated on HuggingFace: request access once, then hf auth login.

Dataset access

Do a small run first

Cost scales with the number of materials, not papers. Start with max_papers=5 before pointing the pipeline at a whole corpus.

What a result file looks like
{
  "material": "Ru/MgO(110)",
  "synthesis": {
    "target_compound": "Ru/MgO(110)",
    "target_compound_type": "functional materials & catalysts",
    "synthesis_method": "wet impregnation",
    "starting_materials": [
      {"name": "RuCl3·xH2O", "amount": 0.21, "unit": "g", "purity": "99.9%"}
    ],
    "steps": [
      {"step_number": 1, "action": "dissolve",
       "conditions": {"temperature": 25, "temp_unit": "C"}},
      {"step_number": 2, "action": "calcine",
       "conditions": {"temperature": 500, "temp_unit": "C",
                      "duration": 4, "time_unit": "h", "atmosphere": "Ar"}}
    ]
  },
  "performance": {
    "plot_data": [{
      "series_name": "Ru/MgO(110)",
      "coordinates": [[350, 12.4], [400, 41.9], [450, 78.2]],
      "x_axis_label": "Temperature", "x_axis_unit": "°C",
      "y_axis_label": "NH3 conversion", "y_axis_unit": "%"
    }]
  },
  "evaluation": {
    "scores": {"overall_score": 4.2, "structural_completeness_score": 4.5},
    "confidence_level": "high"
  }
}

Every field is explained in Output Format.


Learn by running

Seven notebooks take you from reading LeMat-Synth data to producing it, and finally to changing what gets produced. Each states its API keys and cost up front, and runs unchanged locally or on Google Colab.

  • Use the data


    Explore the published dataset and assemble a paper corpus of your own — HuggingFace access only, no cost.

    Tutorials 1–2

  • Extract


    Run the CLI over a folder, pull synthesis and performance out of a single paper, and score the result with the judge.

    Tutorials 3–5

  • Extend


    Change the ontology, then point the whole pipeline at a scientific domain it has never seen.

    Tutorials 6–7

Browse the tutorials


Case studies

Three domain studies ship with the repository, each a thin script over the shared DomainConfig + BatchRunner pair.

Domain Extracts
Thermocatalysis Synthesis + NH₃-conversion curves, with a multi-VLM benchmark against human ground truth Read
Superconductors Synthesis + Tc, read from text and geometrically from ρ(T) plots Read
Porous materials Synthesis + adsorption isotherms for MOFs, zeolites and COFs Read

Building a fourth — electrochemistry, battery cycling, thermoelectrics — means assembling four pieces and handing them to BatchRunner. You never edit the pipeline.

Build your own case study


Find your way around

I want to… Go to
Install and run my first extraction Quickstart
Use the published data instead of extracting Dataset Access
See every CLI setting CLI Reference
Understand a result file Output Format
Build a pipeline in Python Python API · API Reference
Switch LLMs, or run dataset-scale jobs Configuration & Models
Change what gets extracted Architecture
Contribute or use ground-truth annotations Annotations
Fix something that broke Troubleshooting

Contributing

Contributions are welcome — new extractors, new domains, and especially new human annotations, which are what make quality measurable. Read CONTRIBUTING.md for the workflow, or start the annotator app:

streamlit run examples/scripts/data_curation/annotator_app.py

Citation

If you use LeMat-Synth in your research, please cite:

@article{lederbauer2025lemat,
  title={LeMat-Synth: a multi-modal toolbox to curate broad synthesis procedure
         databases from scientific literature},
  author={Lederbauer, Magdalena and Betala, Siddharth and Li, Xiyao and
          Jain, Ayush and Sehaba, Amine and Channing, Georgia and
          Germain, Gr{\'e}goire and Leonescu, Anamaria and Flaifil, Faris and
          Amayuelas, Alfonso and Nozadze, Alexandre and Schmid, Stefan P. and
          Zaki, Mohd and Ethirajan, Sudheesh Kumar and Pan, Elton and
          Franckel, Mathilde and Duval, Alexandre and Krishnan, N. M. Anoop and
          Gleason, Samuel P.},
  journal={arXiv preprint arXiv:2510.26824},
  year={2025}
}

Released under the Apache License 2.0.