Ringkasan Utama
Studi arXiv Juli 2026 atas 97,940 model Hugging Face menemukan bahwa AI bill of materials hasil generator otomatis memuat semua field struktural wajib, tetapi kelengkapan model card rata-ratanya hanya 19,51 persen. Intended use, ethical considerations, dan energi hampir tidak pernah terisi. Anggap AIBOM hasil generator sebagai kerangka, lalu tambahkan dokumentasinya secara manual.
Saya pernah membuat AIBOM untuk model yang akan saya pasang di belakang API internal, lalu melihat file CycloneDX valid dengan semua field wajib terisi, dan hampir melampirkannya ke tiket review sebagai bukti. Lalu saya membuka bagian model card. Isinya hampir kosong, padahal file itu tetap lolos validasi.
Post ini membaca satu paper dengan teliti: A Large-Scale Measurement of AI Bill of Materials Completeness in Hugging Face Models (arXiv 2607.17242, Juli 2026), yang menilai AIBOM untuk repositori publik Hugging Face. Semua angka di bawah berasal dari paper itu, diambil dari versi HTML-nya, dan saya sebutkan di mana metodenya membatasi klaimnya. Script dan snippet adalah milik saya, dicek terhadap skema CycloneDX 1.6, bukan terhadap data paper.
Apa yang diukur paper ini, dan bagaimana
Para penulis mengambil snapshot 2.942.466 record model publik lewat Hugging Face Hub API, menyisakan model dengan lebih dari 100 download, dan berakhir dengan 97,940 model untuk dibuatkan AIBOM. Setiap model dibuatkan satu AIBOM memakai OWASP GenAI Security Project AIBOM Generator lewat command-line interface-nya, dan outputnya berupa CycloneDX JSON.
Mereka tidak membuat metrik kelengkapan baru. Mereka memakai skor bawaan generator: lima kategori berbobot dengan total 100 poin, ditambah pengali penalti saat field kritis hilang. Required fields, metadata, dan informasi dasar komponen masing-masing bernilai 20 poin, dokumentasi model card 30, external references 10. Artifact yang gagal di-parse, tidak punya field CycloneDX yang diharapkan, atau tidak punya skor dikeluarkan, dan penulis membandingkan 100 artifact dengan laporan skor generator secara manual untuk memastikan ekstraksinya akurat.
Satu detail yang perlu diketahui sebelum mengutip paper ini: halaman abstract menyebut sekitar 97.5K artifact, sedangkan teks utama menyebut 97,940 model. Saya memakai angka dari teks utama karena tabelnya ada di sana. Halaman abstract arXiv hanya memberi kesimpulan utama, jadi angka per field di post ini berasal dari teks lengkapnya.
Strukturnya lengkap, dan justru itu masalahnya
Table I di paper melaporkan skor keseluruhan rata-rata 54,31 dari 100, median 54,10, minimum 46,60, dan maksimum 68,70 pada 97,940 artifact. Sebarannya sempit: standar deviasinya 4,44. Hampir semua model jatuh di pita tengah yang sama, terlepas dari seberapa baik dokumentasinya.
| Kategori | Bobot (poin) | Rata-rata terisi | Korelasi dengan skor total |
|---|---|---|---|
| Required fields | 20 | 100,00 persen | Dikeluarkan: konstan |
| Metadata | 20 | 40,00 persen | 0,003 |
| Component basic | 20 | 81,75 persen | 0,351 |
| Model card | 30 | 19,51 persen | 0,888 |
| External references | 10 | 68,02 persen | 0,662 |
Lihat kolom terakhir. Required fields 100 persen di setiap artifact, jadi tidak bisa membedakan satu model dari model lain, dan paper mengeluarkannya dari korelasi. Metadata berkorelasi 0,003 dengan skor total, artinya juga tidak memberi informasi apa pun. Kategori model card berkorelasi 0,888 dengan skor keseluruhan: satu kategori itu, dengan rata-rata terendah dari kelima kategori yaitu 19,51 persen, yang membedakan model berdokumentasi baik dari yang buruk. Validator yang hanya memeriksa bomFormat, specVersion, serialNumber, dan version sedang memeriksa bagian yang tidak pernah berubah.
Angka nol: field yang hampir tidak pernah terisi
Table III di paper mencantumkan keterisian per field pada seluruh 97,940 artifact. Saya memilih baris yang penting untuk review keamanan atau compliance. Nama field adalah nama dari paper, dan beberapa di antaranya nama dari generator, bukan nama di skema CycloneDX.
| Field (nama di paper) | Terisi di | Kategori |
|---|---|---|
| licenses | 73,14 persen (71.640 artifact) | Component basic |
| datasets | 39,35 persen (38.542) | Model card |
| hyperparameter | 25,40 persen (24.884) | Model card |
| technicalLimitations | 16,74 persen (16.393) | Model card |
| paper (reference) | 13,50 persen (13.228) | External references |
| safetyRiskAssessment | 9,76 persen (9.555) | Model card |
| meaningfulDescription (diagnostic) | 0,22 persen (211) | Component basic |
| energyConsumption | 0,02 persen (19) | Environmental |
| intendedUse, ethicalConsiderations, modelExplainability, informationAboutTraining | 0,00 persen | Model card |
| standardCompliance, autonomyType | 0,00 persen | Metadata |
Perhatikan polanya. Licence ada di sekitar tiga dari empat artifact, dataset di sekitar dua dari lima, lalu field yang benar-benar ditanyakan reviewer anjlok: technical limitations di 16,74 persen, safety-risk assessment di 9,76 persen, intended use tidak ada sama sekali. Baris meaningfulDescription adalah diagnostik paper sendiri untuk teks placeholder, dan hanya lolos di 211 dari 97,940 artifact. Field description yang ada 99,99 persen waktu ternyata bermakna 0,22 persen waktu.
Di mana dokumentasi memang ada: paper, dataset, dan task
Pertanyaan riset ketiga paper menanyakan bagaimana kelengkapan bervariasi menurut karakteristik repositori, dan jawabannya: dokumentasi datang berkelompok. Hanya 13,50 persen artifact yang mereferensikan paper. Di antara model yang punya, 64,93 persen juga mendeklarasikan dataset, dibanding 35,35 persen pada model tanpa paper. Cakupan technical limitations 49,04 persen untuk model yang punya paper sekaligus dataset, dan 7,16 persen untuk model yang tidak punya keduanya.
Rincian per task di Table IV menunjuk arah yang sama. Text-generation adalah kelompok terbesar dengan 82.591 artifact. Pada yang punya paper dan dataset, link version control mencapai 99,25 persen, technical limitations 61,59 persen, dan cakupan responsible-use atau safety 66,67 persen. Untuk model text-generation tanpa keduanya, ketiga angka itu 49,38, 6,66, dan 9,56 persen. Cakupan environmental mendekati nol di semua task.
Table V menambahkan licence. Model tanpa licence, dataset, maupun paper menunjukkan technical limitations 2,87 persen, safety-risk assessment 1,33 persen, dan cakupan responsible-use 3,66 persen. Bacaan praktisnya: AIBOM tidak menambah dokumentasi, ia hanya mencerminkan apa yang sudah ada di repositori. Kalau penulisnya membuat model card yang teliti, AIBOM mewarisinya. Kalau tidak, generator tidak punya apa-apa untuk diekstrak.
Yang tidak bisa dijawab paper ini
Mulai dari kasus terbaik. Skor tertinggi di seluruh populasi adalah 68,7, dicapai 269 model, kebanyakan varian Llama, Gemma, Qwen, Granite, Phi, Falcon, CodeLlama, BioMistral, dan StableLM, sering dalam format GGUF. Paper tetap menggolongkan semuanya sebagai moderate. Tidak ada model publik di sampel ini yang melewati batas yang oleh skema penilaiannya sendiri disebut baik.
Sekarang batasannya, yang dinyatakan penulis di threats to validity. Construct validity: keberadaan field tidak menjamin kualitas, sebab itu mereka menambahkan pengecekan meaningful-description. Internal validity: pipeline bergantung pada Hugging Face API, generator, dan script parsing, sehingga logika ekstraksi generator bisa memengaruhi hasil. External validity: filter lebih dari 100 download mengeluarkan model berpemakaian rendah, privat, gated, dan non-Hugging-Face, dan praktik serta tool akan berubah.
Saya menambahkan satu bacaan sendiri, yang saya tandai sebagai inferensi. Field yang tepat 0,00 persen di hampir 98.000 artifact, seperti intendedUse dan ethicalConsiderations, lebih mirip field yang memang tidak diisi generator daripada 98.000 penulis yang semuanya tidak menulis apa-apa. Teks yang saya baca tidak memastikan mana yang benar. Apa pun penyebabnya, konsekuensinya sama: Anda tidak bisa mendapatkan field ini dari run default, jadi seseorang harus menulisnya.
Satu generator dan satu hub. Semua angka di sini mengukur apa yang diekstrak OWASP AIBOM Generator dari repositori Hugging Face. Generator lain, atau model dari registry privat, bisa menghasilkan skor yang sangat berbeda, jadi jangan membawa persentase ini ke lingkungan Anda tanpa mengukurnya sendiri.
Menambahkan manual apa yang dikosongkan generator
README generator mendokumentasikan alur command-line dan menyebut outputnya CycloneDX 1.6 JSON. README itu tidak menjelaskan cara skornya dihitung atau field sumber mana dipetakan ke field AIBOM mana, jadi anggap filenya sebagai draft. Blok pertama membuat satu file; blok kedua adalah patch model card yang Anda merge ke dalamnya, hanya memakai nama property yang ada di skema CycloneDX 1.6.
# The generator is a Python CLI, per its README (CycloneDX 1.6 JSON output).
git clone https://github.com/GenAI-Security-Project/aibom-generator.git
cd aibom-generator
pip install -r requirements.txt
# One model in, one BOM out. Files land in sboms/ unless you pass --output.
python3 -m src.cli google-bert/bert-base-uncased --output sboms/bert.json
# Look at the model card, do not just validate the file. An empty result here
# is the paper's finding reproduced on your own model.
# (Assumes the standard CycloneDX 1.6 layout; check it on a real file first.)
jq '.components[] | select(.type == "machine-learning-model")
| .modelCard.considerations' sboms/bert.jsonObjek modelCard di CycloneDX 1.6 punya modelParameters, quantitativeAnalysis, dan considerations. Di bawah considerations skema mendefinisikan users, useCases, technicalLimitations, performanceTradeoffs, ethicalConsiderations, environmentalConsiderations, dan fairnessAssessments. Itulah slot yang ditemukan kosong oleh paper, jadi di sanalah isi tulisan tangan Anda ditaruh. Satu ethical consideration berupa objek dengan name dan mitigationStrategy, sedangkan technicalLimitations berupa daftar string biasa.
// card-patch.json - written by the model owner, not by the generator.
// Property names are the CycloneDX 1.6 modelCard.considerations ones.
// The content below is an illustrative placeholder for a made-up classifier.
{
"users": ["Support agents triaging inbound tickets"],
"useCases": ["Route English-language tickets to one of six queues"],
"technicalLimitations": [
"Not evaluated on non-English text",
"Accuracy degrades on tickets under ten words"
],
"ethicalConsiderations": [
{
"name": "Mis-routing of urgent safety reports",
"mitigationStrategy": "Keyword override sends safety terms to a human queue"
}
]
}
// Merge it into the BOM. Leave environmentalConsiderations out until
// someone has measured energy: energyConsumptions requires activity,
// energyProviders and activityEnergyCost (kWh) in the 1.6 schema.
//
// jq --slurpfile card card-patch.json \
// '(.components[] | select(.type == "machine-learning-model"))
// .modelCard.considerations = $card[0]' \
// sboms/bert.json > sboms/bert.patched.jsonEnergi adalah field yang harus ketat. Di skema 1.6, satu entri energyConsumptions mewajibkan activity, energyProviders, dan activityEnergyCost dalam kWh. Kalau Anda belum mengukur energi training, biarkan field itu tidak ada daripada mengarang angka: field yang absen itu jujur, sedangkan yang dikarang lebih buruk daripada 0,02 persen yang ditemukan paper.
---
# Hugging Face model card header: the generator reads the card, so fix it here too.
license: apache-2.0
datasets:
- stanfordnlp/imdb
base_model: google-bert/bert-base-uncased
library_name: transformers
---
# Intended uses and limitations
Write them in the card text. Metadata alone does not carry them.Perbaiki sumbernya, bukan hanya BOM-nya. Metadata model card Hugging Face mendukung license, datasets, base_model, dan library_name di header YAML, dan teks card adalah tempat intended uses serta limitations. BOM yang ditambal manual akan menyimpang; model card yang lengkap akan terbaca di run generator berikutnya.
Gate berdasarkan kelengkapan, bukan keberadaan
Saran paper untuk pengguna hilir adalah jangan menganggap keberadaan AIBOM sebagai bukti kelengkapan, dan periksa skor per kategori dan per field sebelum reuse, compliance, atau review keamanan. Script ini mengubah saran itu menjadi langkah CI. Script mengasumsikan lokasi standar CycloneDX 1.6 untuk tiap field, yang belum saya verifikasi terhadap layout output generator sebenarnya, jadi jalankan dulu pada satu file nyata sebelum dipasang.
// aibom-audit.mjs - node aibom-audit.mjs sboms/bert.patched.json
import { readFileSync } from "node:fs";
const bom = JSON.parse(readFileSync(process.argv[2], "utf8"));
const model = (bom.components ?? []).find(
(c) => c.type === "machine-learning-model",
);
if (!model) {
console.error("No machine-learning-model component found");
process.exit(2);
}
const card = model.modelCard ?? {};
const cons = card.considerations ?? {};
const nonEmpty = (a) => Array.isArray(a) && a.length > 0;
// Seven checks chosen to match the fields the paper found weakest.
const checks = {
license: nonEmpty(model.licenses),
datasets: nonEmpty(card.modelParameters?.datasets),
useCases: nonEmpty(cons.useCases),
technicalLimitations: nonEmpty(cons.technicalLimitations),
ethicalConsiderations: nonEmpty(cons.ethicalConsiderations),
energy: nonEmpty(cons.environmentalConsiderations?.energyConsumptions),
paperReference: (model.externalReferences ?? []).some((r) =>
/arxiv[.]org|doi[.]org/.test(r.url ?? ""),
),
};
const present = Object.values(checks).filter(Boolean).length;
for (const [name, ok] of Object.entries(checks)) {
console.log((ok ? "ok " : "MISSING ") + name);
}
// The threshold is a policy choice, not the paper's. Set your own.
const MIN_PRESENT = 5;
console.log(present + "/" + Object.keys(checks).length + " present");
process.exit(present >= MIN_PRESENT ? 0 : 1);Saya memilih tujuh pengecekan agar cocok dengan field yang paling lemah menurut paper. Ambang batasnya pilihan saya, bukan paper: build gagal kalau kurang dari lima dari tujuh yang terisi, dan itu kebijakan yang harus Anda tentukan sesuai toleransi risiko sendiri. Model dengan licence dan dataset tetapi tanpa limitations tidak boleh lolos review untuk agent hanya karena strukturnya benar.
Yang dikerjakan hari Senin
Kerjakan berurutan. Langkah pertama hanya sepuluh menit dan memberi tahu apakah sisanya layak dikerjakan.
- Pilih satu model yang sudah di production dan buat AIBOM-nya dengan CLI generator, lalu buka filenya dan cari isi modelCard, bukan sekadar memvalidasinya.
- Jalankan script audit pada file itu dan catat field mana dari tujuh yang hilang, supaya Anda punya angka sendiri, bukan angka paper.
- Tulis considerations yang hilang secara manual dari model card, file licence, dan catatan evaluasi Anda, lalu commit di samping BOM agar reviewer tahu siapa yang menulisnya.
- Pasang audit sebagai langkah CI untuk setiap model baru yang masuk registry, dengan ambang batas pilihan Anda dan pemilik yang jelas untuk pengecualian.
- Biarkan field energi dan fairness kosong sampai ada yang mengukurnya, dan tulis itu di tiket review supaya kekosongan tidak terlihat seperti kelalaian.
AIBOM yang lengkap adalah latihan dokumentasi yang kebetulan punya format file. Formatnya bagian yang murah; paper menunjukkan generator sudah mengerjakan bagian itu untuk semua orang.
Aturan yang saya ambil dari paper ini: AIBOM yang valid hanya membuktikan generator berjalan, bukan bahwa ada yang mendokumentasikan modelnya. Required fields 100 persen di 97,940 dari 97,940 artifact, sementara kelengkapan model card rata-rata 19,51 persen dan menyumbang korelasi 0,888 terhadap skor. Gate pada field model card, tulis yang kurang secara manual, dan biarkan kosong field yang tidak bisa Anda ukur.
Sumber dan bacaan lanjutan
- arXiv 2607.17242: A Large-Scale Measurement of AI Bill of Materials Completeness in Hugging Face Models (abstract)
- arXiv 2607.17242, teks lengkap HTML: tabel, metode, dan threats to validity
- GitHub: OWASP GenAI Security Project AIBOM Generator
- Referensi CycloneDX 1.6 JSON: modelCard dan considerations
- CycloneDX: kapabilitas Machine Learning Bill of Materials (ML-BOM)
- Dokumentasi Hugging Face Hub: model card dan metadata

