この記事の要点
• CloudflareのエッジネットワークでLLM推論を実行し、低レイテンシを実現
• Workers AIでLlama・Mistral等のオープンソースモデルをサーバーレス実行
• Cloudflare Agentsで複雑なAIワークフローをエッジで自動化
AI/LLMアプリケーションの課題は、推論サーバーのコスト・レイテンシ・スケーラビリティです。Cloudflare AgentsとWorkers AIは、エッジネットワーク上でLLM推論・エージェント実行をサーバーレス提供し、グローバルなAIアプリケーションを低コストで構築できます。本記事では、Cloudflare Agents/Workers AIの特徴と実践的な利用方法を解説します。
Cloudflare Workers AIとは
Cloudflare Workers AIは、Cloudflareのエッジネットワーク上でLLM推論・画像生成・音声認識等のAIモデルを実行するサーバーレスプラットフォームです。開発者はインフラ管理なしに、APIを通じてAI機能を利用できます。
主要な特徴
- エッジ実行: 世界300都市以上のデータセンターでAI推論を実行
- 低レイテンシ: ユーザーに最も近いエッジでモデルを実行し、応答時間を最小化
- サーバーレス: インフラ管理・GPU設定不要、従量課金制
- 豊富なモデル: Llama・Mistral・Stable Diffusion等のオープンソースモデルを標準装備
- Workers統合: Cloudflare Workersと統合し、エッジでフルスタックAIアプリを構築
- ストリーミング: LLM出力をリアルタイムでストリーミング
ポイント: Workers AIは、AWS Lambda等のサーバーレスプラットフォームと異なり、グローバルなエッジネットワークでAIモデルを実行するため、レイテンシが大幅に低減されます。
Cloudflare Agentsとは
Cloudflare Agentsは、Workers AI上でLLMエージェントを実行するフレームワークです。複数のツール(API呼び出し・データベースクエリ・外部サービス連携等)を組み合わせて、複雑なAIワークフローをエッジで自動化できます。
主要な特徴
- ツール統合: 外部API・Cloudflare D1・KV・R2等と連携
- ReAct/Function Callingサポート: LLMが自律的にツールを選択・実行
- ステートフル実行: Durable Objectsで会話履歴・コンテキストを保持
- 並列実行: 複数のエージェントタスクを同時実行
- Webフレームワーク統合: Hono・Next.js等と組み合わせてフルスタックアプリを構築
ポイント: Cloudflare Agentsは、LangChain等のエージェントフレームワークと似た機能をエッジで提供します。サーバーを立てずにエージェントアプリを構築できます。
アーキテクチャ
flowchart TB
subgraph Client["クライアント"]
A1["Webブラウザ/API"]
end
subgraph Edge["Cloudflare Edge (300+ Cities)"]
B1["Cloudflare Workers"]
B2["Workers AI<br/>(LLM推論)"]
B3["Cloudflare Agents<br/>(エージェント実行)"]
B4["D1 (SQLite)"]
B5["KV (Key-Value)"]
B6["R2 (Object Storage)"]
end
subgraph External["外部サービス"]
C1["API/データソース"]
end
A1 --> B1
B1 --> B2
B1 --> B3
B3 --> B2
B3 --> B4
B3 --> B5
B3 --> B6
B3 --> C1
- Cloudflare Workers: HTTPリクエストを受け取り、エージェントを起動
- Workers AI: LLM推論を実行(Llama・Mistral等)
- Cloudflare Agents: ツールを呼び出し、複雑なワークフローを実行
- D1/KV/R2: データベース・キャッシュ・ストレージとしてエッジで利用
インストールとセットアップ
Wranglerのインストール
# Wrangler(Cloudflare CLIツール)をインストール
npm install -g wrangler
# ログイン
wrangler login
プロジェクト作成
# Workers AIプロジェクトを作成
npm create cloudflare@latest my-ai-app -- --template workers-ai
cd my-ai-app
# 依存関係をインストール
npm install
実践メモ: Wranglerは設定ファイル(wrangler.toml)を自動生成し、デプロイ・ローカル開発を簡素化します。
Workers AIでLLM推論
基本的なLLM推論
// src/index.ts
export interface Env {
AI: any;
}
export default {
async fetch(request: Request, env: Env): Promise<Response> {
// Workers AIでLlama 2を実行
const response = await env.AI.run('@cf/meta/llama-2-7b-chat-int8', {
prompt: 'Explain quantum computing in simple terms',
});
return new Response(JSON.stringify(response), {
headers: { 'Content-Type': 'application/json' },
});
},
};
# ローカルで実行
npm run dev
# デプロイ
npm run deploy
ポイント: env.AI.run() でモデルを指定するだけで、エッジで推論が実行されます。GPU設定・Dockerイメージ等は不要です。
ストリーミングレスポンス
// ストリーミングでLLM出力を返す
export default {
async fetch(request: Request, env: Env): Promise<Response> {
const stream = await env.AI.run(
'@cf/meta/llama-2-7b-chat-int8',
{
prompt: 'Write a short story about a robot',
stream: true,
}
);
return new Response(stream, {
headers: {
'Content-Type': 'text/event-stream',
'Cache-Control': 'no-cache',
},
});
},
};
ユーザーは生成されたテキストをリアルタイムで受け取れます。
複数プロンプトのバッチ処理
// 複数プロンプトを並列実行
export default {
async fetch(request: Request, env: Env): Promise<Response> {
const prompts = [
'Summarize the latest AI trends',
'Explain Rust programming',
'Describe quantum computing',
];
const results = await Promise.all(
prompts.map((prompt) =>
env.AI.run('@cf/meta/llama-2-7b-chat-int8', { prompt })
)
);
return new Response(JSON.stringify(results), {
headers: { 'Content-Type': 'application/json' },
});
},
};
実践メモ: Workers AIは並列実行に最適化されており、複数のプロンプトを同時処理してもレイテンシが増加しません。
Cloudflare Agentsでエージェント実行
基本的なエージェント
// エージェントにツールを追加
import { Ai } from '@cloudflare/ai';
export default {
async fetch(request: Request, env: Env): Promise<Response> {
const ai = new Ai(env.AI);
// ツール定義
const tools = [
{
name: 'get_weather',
description: 'Get current weather for a city',
parameters: {
type: 'object',
properties: {
city: { type: 'string', description: 'City name' },
},
required: ['city'],
},
},
];
// エージェント実行
const response = await ai.run('@cf/meta/llama-2-7b-chat-int8', {
messages: [
{
role: 'user',
content: 'What is the weather in Tokyo?',
},
],
tools,
});
// ツール呼び出しを処理
if (response.tool_calls) {
const toolCall = response.tool_calls[0];
if (toolCall.function.name === 'get_weather') {
const args = JSON.parse(toolCall.function.arguments);
const weather = await fetchWeather(args.city);
// 結果をLLMに返す
const finalResponse = await ai.run('@cf/meta/llama-2-7b-chat-int8', {
messages: [
{
role: 'user',
content: 'What is the weather in Tokyo?',
},
{
role: 'assistant',
tool_calls: response.tool_calls,
},
{
role: 'tool',
content: JSON.stringify(weather),
},
],
});
return new Response(finalResponse.response);
}
}
return new Response(response.response);
},
};
async function fetchWeather(city: string) {
// 天気APIを呼び出し(ダミー)
return { city, temperature: 22, condition: 'sunny' };
}
D1データベースとの統合
// D1(SQLite)とエージェントを統合
export interface Env {
AI: any;
DB: D1Database;
}
export default {
async fetch(request: Request, env: Env): Promise<Response> {
const ai = new Ai(env.AI);
const tools = [
{
name: 'query_users',
description: 'Query users from database',
parameters: {
type: 'object',
properties: {
name: { type: 'string', description: 'User name' },
},
},
},
];
const response = await ai.run('@cf/meta/llama-2-7b-chat-int8', {
messages: [
{
role: 'user',
content: 'Find user Alice in the database',
},
],
tools,
});
if (response.tool_calls) {
const toolCall = response.tool_calls[0];
if (toolCall.function.name === 'query_users') {
const args = JSON.parse(toolCall.function.arguments);
// D1でクエリ実行
const result = await env.DB.prepare(
'SELECT * FROM users WHERE name = ?'
).bind(args.name).all();
return new Response(JSON.stringify(result.results));
}
}
return new Response(response.response);
},
};
注意: エージェントが実行するツールは、信頼できる入力のみを受け付けるようにしてください。SQLインジェクション等のセキュリティリスクに注意が必要です。
利用可能なモデル
Workers AIは、以下のオープンソースモデルを標準提供しています。
LLM(テキスト生成)
@cf/meta/llama-2-7b-chat-int8: Llama 2 7B(チャット最適化)@cf/mistral/mistral-7b-instruct-v0.1: Mistral 7B Instruct@cf/meta/llama-3-8b-instruct: Llama 3 8B Instruct
画像生成
@cf/stabilityai/stable-diffusion-xl-base-1.0: Stable Diffusion XL
音声認識
@cf/openai/whisper: Whisper(音声→テキスト)
埋め込み
@cf/baai/bge-base-en-v1.5: BGE Embedding
ポイント: モデルは定期的に追加されています。最新のモデルリストは公式ドキュメントで確認してください。
Workers AIとOpenAI APIの比較
| 項目 | Workers AI | OpenAI API |
|---|---|---|
| 実行場所 | Cloudflareエッジ | OpenAI中央サーバー |
| レイテンシ | 低い(エッジ実行) | 高い(地理的距離に依存) |
| モデル | オープンソースモデル | GPT-4・GPT-3.5等 |
| 料金 | 従量課金(低価格) | 従量課金(高価格) |
| カスタマイズ | 限定的 | Fine-tuning可能 |
| プライバシー | Cloudflareのみ | OpenAIに送信 |
低レイテンシ・低コストを重視するならWorkers AI、最高精度のモデルを使うならOpenAI APIを選択します。
Workers AIとAWS Bedrockの比較
| 項目 | Workers AI | AWS Bedrock |
|---|---|---|
| 実行場所 | エッジ | リージョン |
| セットアップ | シンプル | 複雑 |
| モデル | オープンソース中心 | Claude・Llama等豊富 |
| 統合 | Workers統合 | AWSサービス統合 |
| スケーリング | 自動 | 自動 |
Cloudflareエコシステムを使うならWorkers AI、AWSエコシステムならBedrockを選択します。
実践的なユースケース
1. チャットボット
// D1でチャット履歴を保存
export default {
async fetch(request: Request, env: Env): Promise<Response> {
const { message, userId } = await request.json();
// 過去のメッセージを取得
const history = await env.DB.prepare(
'SELECT role, content FROM messages WHERE user_id = ? ORDER BY created_at DESC LIMIT 10'
).bind(userId).all();
const messages = [
...history.results.reverse(),
{ role: 'user', content: message },
];
// LLMで応答生成
const response = await env.AI.run('@cf/meta/llama-2-7b-chat-int8', {
messages,
});
// メッセージを保存
await env.DB.prepare(
'INSERT INTO messages (user_id, role, content) VALUES (?, ?, ?)'
).bind(userId, 'user', message).run();
await env.DB.prepare(
'INSERT INTO messages (user_id, role, content) VALUES (?, ?, ?)'
).bind(userId, 'assistant', response.response).run();
return new Response(response.response);
},
};
2. 画像生成API
// Stable Diffusionで画像生成
export default {
async fetch(request: Request, env: Env): Promise<Response> {
const { prompt } = await request.json();
const image = await env.AI.run(
'@cf/stabilityai/stable-diffusion-xl-base-1.0',
{
prompt,
}
);
return new Response(image, {
headers: { 'Content-Type': 'image/png' },
});
},
};
3. RAG(Retrieval-Augmented Generation)
// Vectorizeでベクトル検索、LLMで回答生成
export interface Env {
AI: any;
VECTORIZE: VectorizeIndex;
}
export default {
async fetch(request: Request, env: Env): Promise<Response> {
const { query } = await request.json();
// クエリを埋め込みベクトルに変換
const queryVector = await env.AI.run('@cf/baai/bge-base-en-v1.5', {
text: query,
});
// ベクトル検索で関連ドキュメントを取得
const results = await env.VECTORIZE.query(queryVector.data[0], {
topK: 3,
});
const context = results.matches.map((m) => m.metadata.text).join('\n');
// LLMで回答生成
const response = await env.AI.run('@cf/meta/llama-2-7b-chat-int8', {
messages: [
{
role: 'system',
content: `Answer the question based on the following context:\n${context}`,
},
{
role: 'user',
content: query,
},
],
});
return new Response(response.response);
},
};
詳細なRAG実装については、RAG 2025 - 最新の検索拡張生成技術を参照してください。
まとめ
Cloudflare AgentsとWorkers AIは、エッジネットワーク上でLLM推論・エージェント実行をサーバーレス提供し、低レイテンシ・低コスト・グローバル配信を実現します。Cloudflare Workers統合により、フルスタックAIアプリをエッジで構築できます。
Cloudflare Agents/Workers AIを選ぶべきケース
- グローバルにユーザーがいるアプリで低レイテンシを実現したい
- サーバーレスでAI機能を提供したい
- Cloudflareエコシステム(Workers・D1・KV・R2)を使っている
- オープンソースモデルで十分な精度が得られる
- 従量課金で低コストにAIアプリを運用したい
CloudflareはエッジAIに積極的に投資しており、Workers AIのモデル・機能は今後さらに拡充される予定です。エッジでのAI実行は、次世代のWebアプリケーションの標準になると予想されます。