「clef」構造化意思決定モデル:必要VRAM 80GB〜

2026年10月3日

「clef」構造化意思決定モデル:必要VRAM 80GB〜

基本情報

項目 内容
リポジトリ Cloudflare/clef
まとめページ Qwen3.8 のまとめ(記事9本)
公開元のまとめ Alibaba(Qwen) のモデルとライセンスのまとめ
公開日 2026-10-01
ライセンス apache-2.0
配布形式 safetensors
出典の種類 公開元の一次情報(Cloudflare公式ブログとHFリポジトリで裏付けあり)

情報を集めた時点で、当サイトのコードが確定させた値です。日付はJSTで表示しています。

当サイトで確かめたこと

  • 全ての意思決定モデルに出している当サイトの判定問題20問を、配布元のコードをクラウドの GPU(NVIDIA A100 80GB PCIe・ネットワーク遮断)で動かして解かせ、日本語で20問・英語で19問正解しました。

詳しい値と条件は、下の「当サイトでの実測」の節にあります。

概要

Cloudflareは、Qwen3.8-27Bをベースとした27Bパラメータのマルチモーダル意思決定モデル「Clef」を公開しました。このモデルは、テキスト、JSON、画像、動画といった「状態」と、型定義された「質問スキーマ」を入力として受け取り、各選択肢の確率を直接出力するように設計されています。自由形式のテキスト生成や出力のパースを必要とせず、1回のフォワードパスで構造化された意思決定を行うことが可能です。

Clefは、Qwen3.8-27Bをベースにポストトレーニングされており、Cloudflareのブログによれば、状態を読み取ってスキーマに基づいた意思決定を行う「意思決定モデル」として位置づけられています。APIはJevやSystemOneと完全な互換性があり、実務的なワークフローへの統合が容易です。

出典:Clef decision models on the Cloudflare blog

スペック

  • パラメータ数: 27B
  • アーキテクチャ: Qwen3.5アーキテクチャベース(Denseモデル)、ビジョンエンコーダー搭載
  • コンテキスト長: 262,144 トークン(ネイティブ)、最大1,000,000トークンまで拡張可能
  • 入力形式: テキスト、JSON、画像、動画

性能

モデルカードに記載された、意思決定タスクのベンチマーク群「Decision Index」の比較結果を紹介します。ここでは、Clef、軽量版のClef-flash、および既存モデルのJev、Kev 9Bの4列に絞って掲載します。

Decision Index

→ 横にスクロールできます

Benchmark Clef Clef-flash Jev Kev 9B
BFCL (case exact accuracy) 98.5 98.8 95.8 94.5
ToolRet (nDCG@10) 69.2 66.4 65.3 64.3
API-Bank (accuracy) 91.9 93.1 88.2 56.3
BANKING77 (macro-F1) 94.2 90.9 79.7 84.8
CLINC150+OOS (macro-F1) 97.4 66.8 89.3 79.0
RouterBench (selected quality) 79.7 79.9 79.9 80.0
ANLI (macro-F1) 69.8 59.1 74.8 56.3
MMLU (accuracy) 90.3 91.8 91.7 75.3
GPQA Diamond (accuracy) 48.0 51.0 78.3 38.8
ARC-Challenge (accuracy) 97.7 98.3 97.8 93.7
WinoGrande (accuracy) 93.5 97.5 92.0 73.2
HellaSwag (accuracy) 98.2 98.6 94.5 81.9
GSM8K (accuracy) 80.8 67.3 79.9 48.7
CRUXEval (accuracy) 86.7 86.1 73.0 51.2
BBH (accuracy) 73.7 68.9 92.9 65.2
RAGTruth (hallucination F1) 79.4 35.6 76.5 46.2

公開元の測定によれば、ClefはBFCL(関数の選択と引数の組み立ての正確性)において98.5%という極めて高いスコアを記録しており、エージェントとしてのツール利用能力に非常に優れています。また、BANKING77やCLINC150+OOSといった分類タスクにおいても、比較対象の中で最高値をマークしています。一方で、GPQA Diamond(科学の難問)では48.0%に留まり、Jevの78.3%と比較すると、専門的な科学知識を必要とする推論タスクでは及ばない面があります。BBH(推論タスク)においてもJevが優勢です。

次に、ビジネス実務を模した「Workflow evals」の結果です。

Workflow evals

→ 横にスクロールできます

Workflow Metric Clef Clef-flash Jev
Invoice processing Exact actions 64.7 57.1 61.8
Invoice processing Primary action 86.2 73.3 83.1
Customer service Exact actions 76.3 77.0 76.0
Security incidents Exact actions 62.9 61.7 61.7

請求書処理(Invoice processing)やセキュリティインシデント対応などの実務的なワークフローにおいて、Clefは既存のJevを上回る精度を示しています。特に請求書処理の主要アクションの特定では86.2%と高い数値を記録しています。

なお、ClefのベースモデルであるQwen3.8-27B自体の性能も極めて高く、公開元のベンチマークでは、SWE-bench Pro(実リポジトリの修正)で61.7%、LiveCodeBench v6(競技プログラミング)で90.3%を記録するなど、コーディングやエージェントタスクにおいて同規模のモデルを圧倒する性能を持っています。Clefはこの強力な基盤の上に、構造化出力に特化した学習を施したモデルです。

得意なこと・想定用途

Clefは、与えられた入力「状態(state)」と型定義された「質問スキーマ(questions)」に基づき、あらかじめ決められた選択肢に対する確率を計算して返す意思決定タスクを得意としています。テキストやJSONデータだけでなく、画像や動画フレームも状態として同時に入力できるため、マルチモーダルな情報をもとにした分類や判定が可能です。

質問スキーマでは、真偽判定を行う noul 型、複数の選択肢から選ぶ choice 型、段階的な評価を行う score 型といった形式がサポートされています。モデル内部では、バックボーンであるQwen3.8-27B(ビジョンエンコーダー含む)の最終隠し状態を小さなトランスフォーマーヘッド(joint schema head)が読み取り、全質問の選択肢に対するスコア(対数確率)を1回のフォワードパスで一括して計算します。

この仕組みにより、従来のLLMで必要だった自由形式テキストの生成や、出力結果をJSON等に変換するための複雑なパース処理が一切不要となります。具体的には、以下のような実務用途が想定されています。

  • 請求書や領収書の自動判定: 画像やテキスト形式の請求書データから、支払い状況や金額の条件判定を行います。
  • カスタマーサポートのルーティング: ユーザーからの問い合わせ本文をもとに、担当部署(請求担当、技術担当など)の振り分けや緊急度(即日対応、今週中など)を判定します。
  • セキュリティインシデントの分類: 障害報告やログメッセージから、サービス停止の有無などを自動で識別します。

また、既存の意思決定システムであるJevやSystemOneのAPI(POST /v1/systemone)と完全な互換性を持っているため、これらのフォーマットに対応した既存ワークフローへそのまま組み込んで運用できます。

類似モデルとの違い

当サイトで過去に取り上げたQwen3.8-27B派生モデルと比較すると、Clefは明確に異なるアプローチを採用しています。

「OrcaSAQ-2-27B」テキスト生成モデル:当サイトでの回答例・必要VRAM 16GB〜は、54GBある元のモデルを16GBのGPU 1枚で動作させることを目的に、独自の量子化技術(SAQ2)で平均3.21bitまで圧縮したテキストモデルです。これに対してClefは、パラメータを圧縮して軽量化するのではなく、バックボーンにビジョンエンコーダーを残したまま構造化意思決定ヘッドを追加し、マルチモーダル入力に対応させたモデルとなっています。

また、「Hemmingway-1」日常文章特化の言語モデル:必要VRAM 12GB〜・GGUF版ありは、電子メールやメッセージなど、人が書いたような日常文章を直接生成することに特化したモデルです。一方のClefは、自然言語テキストの文章生成を行わず、あらかじめ定義された質問の選択肢に対する確率値(確率分布)のみを出力します。文章の作成を目的とするHemmingway-1に対し、Clefは分類や意思決定の自動化に特化している点が大きな違いです。

動作環境

動作環境の目安(Local Model Watch 算出) — パラメータ数 27.4B

手持ちのVRAM 選べる量子化 ファイルサイズ 必要メモリの目安
A100 / H100 80GB クラス BF16 51.0GB 61.1GB

推論エンジンの対応状況(各プロジェクトのソースにあるモデル登録表とアーキテクチャ名を当サイトが機械的に照合。2026-10-03 時点): llama.cpp: 登録あり、vLLM: 登録あり、MLX (mlx-lm): 登録あり。

必要メモリは配布ファイルの実サイズに実行時のオーバーヘッド(KVキャッシュ等)を20%見込んだ概算で、文脈長・バッチサイズ・推論エンジンによって増減します。公開元の公称値ではなく、当サイトがファイルサイズから機械的に算出した値です。 他のモデルとの比較はVRAM別の早見表を参照してください。 量子化の名前の読み方は用語集にあります。

手元で動かせるか

現時点では Ollama・LM Studio・llama.cpp で動かせません(GGUF版を確認できていない)。

公開元の配布は safetensors のみです。ただし llama.cpp の登録表にはこのモデルのアーキテクチャ名があるため、GGUFへの変換自体は可能な状態で、変換版が公開されれば動くようになります。公開元と実績のある量子化担当以外による変換版は 4 件あります。現時点で動かすなら transformers(PyTorch)・vLLM で読み込む形になり、必要メモリは上の表のとおりです。

ライセンス apache-2.0(商用利用可): 商用利用を含めて自由に利用・改変・再配布できます。再配布時にライセンス文と変更点の告知が必要で、特許の許諾条項があります。

配布形式・当サイトが見つけた変換版・各推論エンジンの登録表を突き合わせた判定です。「確認できていない」は当サイトが見つけていないという意味で、存在しないことの断定ではありません。ライセンスの要約は法的助言ではないため、実際の利用にあたっては公開元の原文を確認してください。

当サイトでの実測

当サイトのサーバー(GPUなし)で、このモデルのファイルを実際に読み込み・動かして確かめた値です。モデルカードの記載ではなく、当サイトが測った結果です。測り方と全モデルの一覧は観測データにまとめています。

意思決定モデルとしての評価(当サイトの判定問題)

全ての意思決定モデルに出しているのと同じ、当サイトが書いた11の状況・20問の判定問題(はい/いいえ・名前付きの選択肢・順序のある段階。日本語と英語)を解かせました。このモデルの判定の部分は llama.cpp で動かせないため、配布元のコード(joint_schema_model.py とその SystemOne 互換の関数)を、クラウドの GPU を借りて、ネットワークを遮断したコンテナの中で動かしました。どの問いも判定の規則を文に書いて答えが1つに決まるようにし、正誤はコードが判定しています(はい/いいえは「はい」の確率が0.5以上なら「はい」、選択肢と段階は確率が最も高いもの)。ベンチマークの問題ではなく、モデルの総合的な性能の順位でもありません。

条件は Modal・NVIDIA A100 80GB PCIe(ピーク時の VRAM 51.4GB)・BF16・transformers 5.18.0・torch 2.14.1+cu130・配布元の版 2f3de3dd85 です。1回の判定の時間は、1つの状況(1〜3問)を配布元の関数に渡してから返るまでをその GPU で測った値で、手元の GPU の速さの目安ではなく、当サイトの CPU で測った時間とも比べられません。

→ 横にスクロールできます

モデル 方式 量子化 正解(日本語) 正解(英語) 正解に付けた確率の平均(日本語 / 英語) 1回の判定の時間の中央値(日本語 / 英語) ピーク時のメモリ
clef joint_schema_model.py BF16 20/20 19/20 0.98 / 0.94 190ms / 189ms (GPU: NVIDIA A100 80GB PCIe) VRAM 51.4GB
Kev-4B(参考) kev Q4_K_M 18/20 19/20 0.87 / 0.87 7,616ms / 7,409ms 6.3GB
clef-flash joint_schema_model.py BF16 18/20 18/20 0.88 / 0.88 170ms / 167ms (GPU: NVIDIA L4) VRAM 17.9GB
lev(参考) lev Q4_K_M 16/20 16/20 0.76 / 0.80 14,061ms / 13,186ms 6.0GB
Laya(参考) laya Q8_0 10/20 15/20 0.47 / 0.68 968ms / 678ms 0.9GB
Julia-1(参考) laya Q8_0 13/20 10/20 0.60 / 0.45 136ms / 107ms 0.5GB

日本語では英語より1問多く正解しました(20問中 日本語20問・英語19問)。

ほかの行は同じ条件で測ったほかの意思決定モデルです(「参考」は比較のために測ったモデル)。方式はモデルごとに違い、量子化もそれぞれの配布のものです。

時間に(GPU)とある行はクラウドの GPU で、それ以外は当サイトの CPU で測ったため、その間で時間は比べられません(正解の数は比べられます)。

問いごとの答え

→ 横にスクロールできます

状況 問い 正解 日本語での答え 英語での答え
問い合わせの振り分け このメッセージはどのチームが担当すべきですか。 billing ✓ billing(正解の確率 0.99) ✓ billing(正解の確率 0.99)
問い合わせの振り分け お客様はお金を返すよう求めていますか。 はい ✓ はい(正解の確率 0.99) ✓ はい(正解の確率 0.99)
問い合わせの振り分け このメッセージは、サービスが止まっていることを伝えていますか。 いいえ ✓ いいえ(正解の確率 0.99) ✓ いいえ(正解の確率 0.99)
返品の可否(期限内) 届いた日から今日までが30日以内ですか。 はい ✓ はい(正解の確率 0.99) ✓ はい(正解の確率 0.98)
返品の可否(期限内) この商品は、規定どおりに返品できますか。 はい ✓ はい(正解の確率 0.99) ✓ はい(正解の確率 0.94)
返品の可否(期限切れ) 届いた日から今日までが30日以内ですか。 いいえ ✓ いいえ(正解の確率 0.99) ✓ いいえ(正解の確率 1.00)
返品の可否(期限切れ) この商品は、規定どおりに返品できますか。 いいえ ✓ いいえ(正解の確率 0.99) ✓ いいえ(正解の確率 0.99)
請求書の処理(取引先) この請求書をどう扱いますか。 reject ✓ reject(正解の確率 0.99) ✓ reject(正解の確率 0.99)
請求書の処理(取引先) 請求額は1,000米ドルを超えていますか。 いいえ ✓ いいえ(正解の確率 0.99) ✓ いいえ(正解の確率 0.99)
請求書の処理(金額) この請求書をどう扱いますか。 manager ✓ manager(正解の確率 0.98) ✓ manager(正解の確率 0.99)
請求書の処理(金額) 請求額は1,000米ドルを超えていますか。 はい ✓ はい(正解の確率 0.99) ✓ はい(正解の確率 0.99)
障害の深刻度 この障害の影響はどの程度ですか。 3: すべての利用者に影響 ✓ 3: すべての利用者に影響(正解の確率 0.94) ✓ 3: すべての利用者に影響(正解の確率 0.95)
障害の深刻度 サービスは止まっていますか。 はい ✓ はい(正解の確率 0.98) ✓ はい(正解の確率 0.99)
配送の遅れの段階 この配送の遅れは、基準のどの段階ですか。 2: 中程度の遅れ ✓ 2: 中程度の遅れ(正解の確率 0.90) ✓ 2: 中程度の遅れ(正解の確率 0.93)
レビューの評価(否定の言い回し) 投稿者の全体としての評価はどれですか。 positive ✓ positive(正解の確率 0.98) ✓ positive(正解の確率 0.99)
レビューの評価(否定の言い回し) 投稿者は、また買うと言っていますか。 はい ✓ はい(正解の確率 0.99) ✓ はい(正解の確率 0.99)
不審なメール(指示の書き込み) このメールはどれに分類すべきですか。 phishing ✓ phishing(正解の確率 0.98) ✓ phishing(正解の確率 0.99)
不審なメール(指示の書き込み) このメールは、読み手にパスワードの入力を求めていますか。 はい ✓ はい(正解の確率 0.99) ✓ はい(正解の確率 0.99)
予定の重なり 会議の依頼は、カレンダーの予定と時間が重なりますか。 はい ✓ はい(正解の確率 0.96) ✗ いいえ(正解の確率 0.21)
問い合わせの意図(6択) 利用者がしたいことはどれですか。 change_address ✓ change_address(正解の確率 0.99) ✓ change_address(正解の確率 0.99)

状況と問いの全文と、正解の根拠は観測データに載せています。

環境構築と実行の手順

ダウンロード(GPU の無い別のコンテナ。配布元のコードは実行しません): Python 3.12・pip install huggingface_hub で、Cloudflare/clef の版 2f3de3dd85f379784083b0814d997ab627200f0c の次のファイルを落としました(pickle の重みは落としません)。

chat_template.jinja
config.json
generation_config.json
joint_head.safetensors
joint_head_config.json
joint_schema_model.py
model-00001-of-00012.safetensors
model-00002-of-00012.safetensors
model-00003-of-00012.safetensors
model-00004-of-00012.safetensors
model-00005-of-00012.safetensors
model-00006-of-00012.safetensors
model-00007-of-00012.safetensors
model-00008-of-00012.safetensors
model-00009-of-00012.safetensors
model-00010-of-00012.safetensors
model-00011-of-00012.safetensors
model-00012-of-00012.safetensors
model.safetensors.index.json
processor_config.json
tokenizer.json
tokenizer_config.json

実行(GPU のコンテナ。ネットワーク遮断・モデルのファイルは読み取り専用): Python 3.12・pip install torch transformers accelerate safetensors pillow torchvision。コンテナで実行したコードの全文(decision_remote.py)です。問いは上と同じ要求の本文を渡しています。

"""
Modal のコンテナの中で動く、意思決定モデルの配布元のコードによる評価(2026-10-02、ユーザーの判断「Clef を Modal で動かす」)。
lmw/lab/gpu_modal.py の decision_run から呼ばれる。**標準ライブラリだけを先頭で読み**、torch・transformers は関数の中で読む。

llama.cpp に判定の方式が無い意思決定モデル(Clef は判定ヘッド joint_head.safetensors を配布元の joint_schema_model.py で
読む)を、配布元の SystemOne 互換の関数(systemone)で動かす。このコンテナは**ネットワーク遮断・Modal の機能なし・
Volume は読み取り専用**で、配布元のコードはここでだけ import する(ダウンロードは remote_code_remote.download が
GPU の無い別のコンテナで行い、そちらでは import しない)。

問題(要求の本文)はホストが組んで渡す(lmw/lab/decision.py の request_body。llama.cpp で測るモデルと同じもの)。
正誤はホストのコード(decision.score)が判定する。ここでは応答をそのまま返し、1回の判定にかかった時間を測るだけ。
"""
import os
import platform
import sys
import time
from datetime import datetime, timezone

MOUNT = "/models"
PYTHON_VERSION = "3.12"
# 実行用のコンテナに入れるパッケージ(記事の手順にも同じ値を載せる)。Clef のカードの記載は torch 2.11・
# transformers 5.10.2 で、画像を読む処理(AutoProcessor)のために pillow・torchvision を入れる
RUN_PACKAGES = ("torch", "transformers", "accelerate", "safetensors", "pillow", "torchvision")

def installed_packages() -> list[str]:
    from importlib import metadata
    seen = {}
    for dist in metadata.distributions():
        name = dist.metadata["Name"]
        if name and name.lower() not in seen:
            seen[name.lower()] = f"{name}=={dist.version}"
    return sorted(seen.values(), key=str.lower)

def _keep(answer: dict) -> dict:
    return {k: answer[k] for k in ("type", "choice", "noul", "score", "probabilities", "confidence") if k in answer}

def _log(t0: float, message: str) -> None:
    print(f"[decision {time.time() - t0:6.0f}s] {message}", flush=True)

def run(job: dict) -> dict:
    """
    job: {"dir", "module", "loader", "answer", "warmup": 要求, "requests": {lang: [[状況の id, 要求], ...]}}。
    戻り値は記録の一部({"results", "gpu", "vram_*", "transformers", "torch", "packages", ...})。
    """
    import torch
    import transformers
    os.environ["HF_HUB_OFFLINE"] = "1"
    os.environ["TRANSFORMERS_OFFLINE"] = "1"
    t0 = time.time()
    path = os.path.join(MOUNT, job["dir"])
    gpu = torch.cuda.get_device_name(0)
    _log(t0, f"GPU: {gpu}・transformers {transformers.__version__}・torch {torch.__version__}")
    # 配布元のコード。このコンテナ(ネットワーク遮断)でだけ読む
    sys.path.insert(0, path)
    module = __import__(job["module"])
    model, processor = getattr(module, job["loader"])(path, device="cuda")
    answer = getattr(module, job["answer"])
    torch.cuda.synchronize()
    load_sec = round(time.time() - t0)
    vram_loaded = torch.cuda.memory_allocated()
    _log(t0, f"読み込み {load_sec}秒・VRAM {vram_loaded / 1024 ** 3:.1f}GB")
    torch.cuda.reset_peak_memory_stats()
    answer(model, processor, job["warmup"])  # 1回目は時間を測らない
    results: dict = {}
    for lang, items in job["requests"].items():
        out = {}
        for task_id, body in items:
            torch.cuda.synchronize()
            started = time.perf_counter()
            resp = answer(model, processor, body)
            torch.cuda.synchronize()
            out[task_id] = {"answers": {qid: _keep(a) for qid, a in (resp.get("answers") or {}).items()},
                            "ms": round((time.perf_counter() - started) * 1000, 1),
                            "input_tokens": (resp.get("usage") or {}).get("input_tokens")}
        results[lang] = out
    _log(t0, "全ての状況を解き終えました")
    return {"results": results, "gpu": gpu, "vram_total": int(torch.cuda.get_device_properties(0).total_memory),
            "vram_loaded": int(vram_loaded), "vram_peak": int(torch.cuda.max_memory_allocated()),
            "load_sec": load_sec, "dtype": "bfloat16", "transformers": str(transformers.__version__),
            "torch": str(torch.__version__), "python": platform.python_version(), "packages": installed_packages(),
            "measured_at": datetime.now(timezone.utc).isoformat()}

実行のコンテナに入っていたパッケージ:

accelerate==1.15.0
aiohappyeyeballs==2.6.1
aiohttp==3.12.7
aiosignal==1.3.2
annotated-doc==0.0.5
anyio==4.15.1
attrs==25.3.0
cbor2==5.7.0
certifi==2026.7.22
click==8.5.0
cuda-bindings==13.4.3
cuda-pathfinder==1.8.3
cuda-toolkit==13.0.3.0
filelock==4.0.9
frozenlist==1.6.0
fsspec==2026.9.0
grpclib==0.4.8
h11==0.16.0
h2==4.2.0
hf-xet==1.6.0
hpack==4.1.0
httpcore==1.0.9
httpx==0.28.1
huggingface_hub==1.33.0
hyperframe==6.1.0
idna==3.20
Jinja2==3.1.6
markdown-it-py==4.2.0
MarkupSafe==3.0.3
mdurl==0.1.2
mpmath==1.3.0
multidict==6.4.4
networkx==3.7
numpy==2.5.3
nvidia-cublas==13.1.1.3
nvidia-cuda-cupti==13.0.85
nvidia-cuda-nvrtc==13.0.88
nvidia-cuda-runtime==13.0.96
nvidia-cudnn-cu13==9.24.0.43
nvidia-cufft==12.0.0.61
nvidia-cufile==1.15.1.6
nvidia-curand==10.4.0.35
nvidia-cusolver==12.0.4.66
nvidia-cusparse==12.6.3.3
nvidia-cusparselt-cu13==0.8.1
nvidia-nccl-cu13==2.30.7
nvidia-nvjitlink==13.4.92
nvidia-nvshmem-cu13==3.4.5
nvidia-nvtx==13.0.85
packaging==26.3
pillow==12.3.0
pip==25.1.1
propcache==0.3.1
protobuf==6.31.1
psutil==7.2.2
Pygments==2.21.0
PyYAML==6.0.3
regex==2026.9.29
rich==15.0.0
safetensors==0.8.0
setuptools==84.0.0
shellingham==1.5.4
sympy==1.14.0
tokenizers==0.23.2
torch==2.14.1
torchvision==0.29.1
tqdm==4.70.1
transformers==5.18.0
triton==3.8.0
typer==0.27.2
typing_extensions==4.16.0
uv==0.7.19
wheel==0.45.1
yarl==1.20.0

入手方法

Clefの重みと関連コードは、Hugging FaceのリポジトリからApache-2.0ライセンスのもとで入手可能です。ゲートモデルではないため、特別な同意手続きなしで直接ダウンロードできます。

配布形式は標準的な safetensors 形式で、モデル本体の重み(model-*.safetensors)に加えて、意思決定用のヘッド重み(joint_head.safetensors)およびPython用のスクリプト(joint_schema_model.py)が同梱されています。

動作の前提環境として、Pythonライブラリの torch(2.11でテスト済み)および transformers(5.10.2でテスト済み)が必要です。画像や動画を入力として扱う場合は、画像処理ライブラリの pillow も用意する必要があります。

モデルの取得と読み込みは、huggingface_hub ライブラリの snapshot_download 関数を利用して行います。以下は、モデルをダウンロードして推論を実行するPythonコードの例です。

import sys
import torch
from huggingface_hub import snapshot_download

path = snapshot_download("Cloudflare/clef")
sys.path.insert(0, path)
from joint_schema_model import collate_records, encode_record, load_release_model

model, processor = load_release_model(path, device="cuda")

record = {
    "state": {"invoice": {"vendor": "Acme", "total": 1250.0, "currency": "USD", "status": "overdue"}},
    "questions": {
        "status": {
            "type": "choice",
            "instructions": "What is the invoice status?",
            "criteria": {"paid": "Invoice is paid.", "overdue": "Invoice is past due.", "draft": "Not sent."},
        },
        "large": {"type": "noul", "instructions": "Is the total above 1000 USD?"},
    },
}

encoded = encode_record(processor.tokenizer, record, processor=processor)
batch = collate_records([encoded], processor.tokenizer.pad_token_id, torch.device("cuda"))
with torch.inference_mode():
    logits = model(batch)[0]

for question, question_logits in zip(encoded.questions, logits):
    probabilities = question_logits.float().softmax(-1).tolist()
    print(question.question_id, dict(zip(question.option_ids, probabilities)))

Jev / SystemOne APIと互換のある形式で推論を行いたい場合は、同梱されている systemone 関数を使用することで、POST /v1/systemone リクエストと同様のデータ構造で結果を取得できます。

関連記事

次に読むなら

出典

更新履歴

  • 2026-10-03: 当サイトでの実測(意思決定モデルとしての判定の評価)を追加しました。