Clef 클라우드플레어의 Jev 대체 오픈웨이트 의사 결정 모델 공개
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
두 모델 비교
| 항목 | 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에 전달한다. 선택지 로짓에 질문별 softmax를 적용하고, 이를 API 답변 형태로 변환한다. 일반적인 텍스트 생성 결과를 JSON으로 파싱하는 방식과 구현 경로가 다르다.
확률은 모델이 선택지에 부여한 점수다. 0.95라는 응답이 실제 서비스에서 항상 95%의 정답률을 보장한다는 뜻은 아니다. 운영 임계값은 별도로 검증해야 한다.
오픈웨이트
오픈웨이트 공개는 확인됐다. 두 저장소에 기반 모델 가중치, 의사결정 헤드 가중치, 토크나이저·프로세서와 추론 코드가 있다.
| 공개 파일 | 역할 |
|---|---|
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
- 댓글을 불러오는 중이에요.