Clef:Cloudflareの代替オープンウェイト意思決定モデルを公開
Cloudflareが意思決定モデル「Clef」を発表しました。APIに対応しており、オープンウェイトとしても確認でき、より高速だとしています。Jevの代わりになるかもしれません。
目次
Clefは、入力の状況と事前に定義した質問・選択肢を受け取り、選択肢ごとの確率を返すCloudflareの意思決定モデル(decision model)です。Cloudflare Workers AIチームが学習した最初のモデル製品群で、ClefとClef-flashが同時に公開されました。
Introducing Clef: Cloudflare's first open-source decision models, now on Worker…
たとえば、コメントとともに「スパムか?」「どのトピックか?」「レビューの優先度はどのくらいか?」と質問します。モデルは開発者が指定した選択肢にスコアを付け、アプリケーションはその結果をもとに次の動作を決めます。
用途は分類とルーティングです。自由に文章を書く汎用チャットモデルの役割とは異なります。Jevと同じく分類のためのものですね。
flowchart TD n1["댓글, 문서 등 선택지"] n2["Clef"] n3["확률과 구조화된 답"] n4["애플리케이션 승인 및 보류 규칙"] n1 --> n2 n2 --> n3 n3 --> n4
2つのモデルの比較
| 項目 | Clef | Clef-flash |
|---|---|---|
| モデル規模 | 27B | 9B |
| 基盤モデル | Qwen/Qwen3.8-27B | Qwen/Qwen3.5-9B |
| Workers AI ID | @cf/cloudflare/clef | @cf/cloudflare/clef-flash |
| Workers AIのコンテキスト | 65,536トークン | 65,536トークン |
| ビジョンエンコーダー | 含む | 含む |
| 公開ライセンス | Apache 2.0 | Apache 2.0 |
| API入力100万トークンあたりの単価 | US$0.24 | US$0.09 |
| 選択の目安 | 精度の差が重要な業務で比較評価する | 遅延とコストが重要な業務でまず評価する |
Cloudflareの説明によると、Qwenベースのモデルで入力を処理した後、内部表現を使って許可された選択肢を並列に評価します。意思決定の段階は非自己回帰方式のため、回答文を トークン単位で生成する過程は省略されます。
公開コードでは、基盤モデルの最後の隠れ状態を専用のJointSchemaHeadに渡します。選択肢のlogitに質問ごとのsoftmaxを適用し、それをAPIの回答形式に変換します。一般的なテキスト生成結果をJSONとしてパースする方式とは実装の経路が異なります。
確率は、モデルが選択肢に付与したスコアです。0.95という応答が、実際のサービスで常に95%の正答率を保証するという意味ではありません。運用のしきい値は別途検証する必要があります。
オープンウェイト
オープンウェイトとしての公開は確認されました。2つのリポジトリに、基盤モデルの重み、意思決定ヘッドの重み、トークナイザー・プロセッサーと推論コードがあります。
| 公開ファイル | 役割 |
|---|---|
model-*.safetensors | 基盤モデルの重み |
model.safetensors.index.json | 重みシャードのインデックス |
joint_head.safetensors | 意思決定ヘッドの重み |
joint_head_config.json | ヘッドの構成 |
joint_schema_model.py | モデルのロード・入力処理・構造化された応答生成 |
| トークナイザーとプロセッサー関連のファイル | テキストと視覚入力の処理 |
LICENSE | Apache 2.0ライセンス原文 |
質問と回答の形式
| 質問の種類 | 用途 | 応答の意味 |
|---|---|---|
noul | 真偽判定 | 真である確率 |
choice | 名前の付いた選択肢の中からの分類 | 選んだ項目、confidence、選択肢ごとの確率 |
score | 順序のある水準評価 | 確率で重み付けした水準スコアと選択肢ごとの確率 |
scoreは必ずしも整数のグレードで返されるわけではない。グレードのインデックスは0から始まり、確率の重み付け値は小数になることがある。Jev/SystemOneのリクエスト・レスポンス形式と互換性があるように提供されている。
以下は理解を助けるための仮想の応答の一部であり、実際のモデル呼び出し結果ではない。
{
"answers": {
"spam": { "type": "noul", "noul": 0.94 },
"topic": {
"type": "choice",
"choice": "advertising",
"confidence": 0.9,
"probabilities": {
"technical": 0.07,
"advertising": 0.9,
"other": 0.03
}
}
}
}
互いに排他的な項目は一つのchoice質問に入れ、同時に成立しうるタグはそれぞれのnoul質問として構成するのが自然だ。たとえば「技術記事であり、かつ広告的な記事」という判定を許すには独立した質問が必要になる。これはスキーマ設計に関する提案である。
マルチモーダルと入力制限
モデルカードのローカル推論経路は、テキスト・JSON・画像・動画フレームを説明している。ただし、ローカルモデルの機能とホスティングAPIの対応範囲は区別して考える必要がある。
調査時点のWorkers AI Clef APIドキュメントにおける制限は次のとおりである。
• 質問はリクエストごとに1〜64個。
• 画像は最大4枚で、PNG・JPEG・WebPに対応。
• リモート画像URLは許可されず、画像をリクエストに含める必要がある。
• 画像ごとに最大4MiB・1,600万ピクセル、デコード後の画像全体で最大8MiB、リクエスト本文は最大13MiB。
• 長いテキストの状態はトークン上限に合わせて切り詰められることがある。
• 入力スキーマで画像フィールドは確認したが、別途の動画フィールドは確認できなかった。
使い方
Next.jsのサーバーからREST APIを呼び出せる。以下は公式エンドポイントと入力スキーマを利用して作成した、ブログのコメント分類の例である。APIトークンとアカウントIDをサーバーの環境変数に設定してから使うコードで、今回の調査では実行していない。
// Next.js 서버 코드에서 사용한다.
export async function classifyBlogComment(commentText: string) {
const account = process.env.CLOUDFLARE_ACCOUNT_ID;
const token = process.env.CLOUDFLARE_API_TOKEN;
if (!account || !token) throw new Error("Cloudflare 환경변수가 필요합니다.");
const payload = {
model: "clef-flash",
state: { comment: commentText },
questions: {
spam: {
type: "noul",
instructions: "댓글이 글과 무관한 광고 또는 반복 스팸인가?",
},
topic: {
type: "choice",
instructions: "댓글의 주된 목적을 분류하라.",
criteria: {
technical: "기술 질문이나 기술 관련 의견",
advertising: "상품·서비스·외부 사이트 홍보",
other: "어느 항목에도 해당하지 않음",
},
},
},
};
const endpoint = new URL(
`https://api.cloudflare.com/client/v4/accounts/${account}/ai/run/@cf/cloudflare/clef-flash`,
);
const result = await fetch(endpoint, {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify(payload),
signal: AbortSignal.timeout(10_000),
cache: "no-store",
});
if (!result.ok) throw new Error(`Clef HTTP 오류: ${result.status}`);
const envelope = await result.json();
if (envelope.success !== true || !envelope.result) {
throw new Error("Clef 응답을 확인할 수 없습니다.");
}
return envelope.result;
}
本番環境での連携には、コメント長の制限、呼び出し量の制限、応答スキーマの検証、失敗時のレビュー待ち処理が追加で必要になる。トークンはサーバーに保管し、ブラウザのバンドルに含めないこと。
公開重みでの自前実行
公式モデルカードでは、単一のH200でtorch 2.11、transformers 5.10.2を用いてテストしたと説明されている。
公開ローダーでモデルを読み込み、systemone関数に質問を渡すことができる。以下のコードは十分なメモリを持つCUDA環境を前提としている。huggingface_hub、safetensors、PyTorchとTransformersがインストールされている必要があり、視覚入力にはPillowも必要になる。
import importlib.util
import sys
from pathlib import Path
from huggingface_hub import snapshot_download
release_dir = Path(snapshot_download(
repo_id="Cloudflare/clef-flash",
revision="17f0b0ad64efb65d273590632833508766b2aae6",
))
module_spec = importlib.util.spec_from_file_location(
"clef_runtime", release_dir / "joint_schema_model.py"
)
runtime = importlib.util.module_from_spec(module_spec)
sys.modules[module_spec.name] = runtime
module_spec.loader.exec_module(runtime)
decision_model, input_processor = runtime.load_release_model(release_dir)
decision = runtime.systemone(decision_model, input_processor, {
"model": "clef-flash",
"state": {"comment": "새 글의 예제 코드를 더 설명해 주세요."},
"questions": {
"technical_question": {
"type": "noul",
"instructions": "댓글이 기술 설명을 요청하고 있는가?",
}
},
})
print(decision["answers"])
公開ローダーと関数シグネチャをもとに作成した例であり、実行検証は行っていない。デフォルトのロードはCUDA・BF16である。ローカルのsystemoneのデフォルトmax_lengthは16,384トークンなので、Workers AIの65,536トークンのコンテキストと同じだと想定してはいけない。
一般的なチャットモデルのロードだけで、Clef専用の意思決定ヘッドが動作すると判断することはできない。Ollama・GGUF・vLLMなどで使うには、そのランタイムがヘッドと質問スキーマを実際に処理するかを確認する必要がある。
オープンウェイトモデルを見る
コメント 1
- コメントを読み込んでいます。