記事一覧

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つのモデルの比較

    項目ClefClef-flash
    モデル規模27B9B
    基盤モデルQwen/Qwen3.8-27BQwen/Qwen3.5-9B
    Workers AI ID@cf/cloudflare/clef@cf/cloudflare/clef-flash
    Workers AIのコンテキスト65,536トークン65,536トークン
    ビジョンエンコーダー含む含む
    公開ライセンスApache 2.0Apache 2.0
    API入力100万トークンあたりの単価US$0.24US$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モデルのロード・入力処理・構造化された応答生成
    トークナイザーとプロセッサー関連のファイルテキストと視覚入力の処理
    LICENSEApache 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などで使うには、そのランタイムがヘッドと質問スキーマを実際に処理するかを確認する必要がある。

    オープンウェイトモデルを見る

    Cloudflare/clef · Hugging Face

    コメント 1

    1. コメントを読み込んでいます。