Cloudflare Workers AI — エッジでAI推論を無料実行
約8分で読めます
Cloudflare Workers AI — エッジでAI推論を無料実行
Cloudflare Workers AIは、エッジ(世界300以上の拠点)でAI推論を実行できるサービスだ。無料枠が毎日10,000ニューロン(推論単位)あり、Llama、Mistral、Stable Diffusion等のオープンモデルをサーバーレスで動かせる。APIキー管理もCloudflare側で完結する。
Workers AI vs 他社AI推論サービス比較
| 項目 | Workers AI | AWS Bedrock | Google Vertex AI | Replicate |
|---|---|---|---|---|
| 無料枠 | 10,000ニューロン/日 | なし | $300クレジット | なし |
| 対応モデル | 50+ | 20+ | 30+ | 1000+ |
| エッジ実行 | あり(300+拠点) | リージョン | リージョン | なし |
| セットアップ | 即時 | IAM設定必要 | GCP設定必要 | 即時 |
| レイテンシ | 最低(エッジ) | 低 | 低 | 中 |
| GPU管理 | 不要 | 不要 | 不要 | 不要 |
テキスト生成 — LlamaをエッジでLLM実行
基本的なテキスト生成Worker
// src/index.ts
export default {
async fetch(request: Request, env: Env): Promise<Response> {
const { prompt } = await request.json<{ prompt: string }>();
const response = await env.AI.run('@cf/meta/llama-3.1-8b-instruct', {
messages: [
{ role: 'system', content: 'あなたは親切な日本語アシスタントです。' },
{ role: 'user', content: prompt }
],
max_tokens: 512,
temperature: 0.7,
});
return Response.json(response);
},
} satisfies ExportedHandler<Env>;
interface Env {
AI: Ai;
}
ストリーミングレスポンス対応
export default {
async fetch(request: Request, env: Env): Promise<Response> {
const { prompt } = await request.json<{ prompt: string }>();
const stream = await env.AI.run('@cf/meta/llama-3.1-8b-instruct', {
messages: [{ role: 'user', content: prompt }],
max_tokens: 1024,
stream: true,
});
return new Response(stream, {
headers: {
'Content-Type': 'text/event-stream',
'Cache-Control': 'no-cache',
},
});
},
} satisfies ExportedHandler<Env>;
画像生成 — Stable Diffusionをエッジで実行
export default {
async fetch(request: Request, env: Env): Promise<Response> {
const { prompt } = await request.json<{ prompt: string }>();
const image = await env.AI.run('@cf/stabilityai/stable-diffusion-xl-base-1.0', {
prompt,
num_steps: 20,
});
return new Response(image, {
headers: { 'Content-Type': 'image/png' },
});
},
} satisfies ExportedHandler<Env>;
テキスト分類・感情分析
export default {
async fetch(request: Request, env: Env): Promise<Response> {
const { text } = await request.json<{ text: string }>();
// 感情分析
const sentiment = await env.AI.run('@cf/huggingface/distilbert-sst-2-int8', {
text,
});
// テキスト埋め込み(ベクトル化)
const embedding = await env.AI.run('@cf/baai/bge-base-en-v1.5', {
text: [text],
});
return Response.json({
sentiment,
embedding_dimensions: embedding.data[0].length,
});
},
} satisfies ExportedHandler<Env>;
Wrangler設定とデプロイ
# wrangler.toml
name = "ai-worker"
main = "src/index.ts"
compatibility_date = "2026-04-01"
[ai]
binding = "AI"
[vars]
ALLOWED_ORIGINS = "https://example.com"
# レート制限(無料枠保護)
[[unsafe.bindings]]
name = "RATE_LIMITER"
type = "ratelimit"
namespace_id = "1"
simple = { limit = 100, period = 60 }
# デプロイ
npx wrangler deploy
# ローカルテスト
npx wrangler dev
# モデル一覧確認
npx wrangler ai models
利用可能な主要モデル
| モデル | 用途 | 無料枠消費 | 速度 |
|---|---|---|---|
| @cf/meta/llama-3.1-8b-instruct | テキスト生成 | 中 | 速い |
| @cf/meta/llama-3.1-70b-instruct | 高品質テキスト生成 | 高 | やや遅い |
| @cf/mistral/mistral-7b-instruct | テキスト生成 | 中 | 速い |
| @cf/stabilityai/stable-diffusion-xl-base-1.0 | 画像生成 | 高 | 遅い |
| @cf/baai/bge-base-en-v1.5 | テキスト埋め込み | 低 | 最速 |
| @cf/huggingface/distilbert-sst-2-int8 | 感情分析 | 低 | 最速 |
| @cf/openai/whisper | 音声認識 | 高 | 遅い |
コスト最適化のポイント
無料枠(10,000ニューロン/日)を効率的に使うためのテクニック。
KVキャッシュで同一クエリの再実行を防止
export default {
async fetch(request: Request, env: Env): Promise<Response> {
const { prompt } = await request.json<{ prompt: string }>();
const cacheKey = `ai:${btoa(prompt).slice(0, 64)}`;
// KVキャッシュ確認
const cached = await env.CACHE.get(cacheKey);
if (cached) {
return Response.json(JSON.parse(cached));
}
const result = await env.AI.run('@cf/meta/llama-3.1-8b-instruct', {
messages: [{ role: 'user', content: prompt }],
max_tokens: 512,
});
// 1時間キャッシュ
await env.CACHE.put(cacheKey, JSON.stringify(result), { expirationTtl: 3600 });
return Response.json(result);
},
} satisfies ExportedHandler<Env>;
関連記事
A
Agentive 編集部
AIエージェントを実際に使い倒す個人開発者。サイト制作の自動化を実践しながら、その知見を発信しています。