
LeMat-Synth
Turn materials science papers into machine-readable science — synthesis recipes, performance curves and quality scores, extracted at scale by LLMs and VLMs.
What you get
-
Synthesized materials
Every material a paper actually makes, identified by chemical formula and separated from the ones it merely cites.
-
Structured procedures
Step-by-step recipes — reagents, amounts, temperatures, durations, atmospheres — normalised into a controlled Pydantic ontology.
-
Performance data
Quantitative values read straight off the paper's plots by a VLM, then linked back to the material each curve belongs to.
-
A quality score
An LLM judge rates every extraction on five dimensions, benchmarked against human annotators so you know what to trust.
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.

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.
# 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.
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)
The extracted corpus is already published — no API key, no cost:
The dataset is gated on HuggingFace: request access once, then hf auth login.
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
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.
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:
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.