Workers AI: Yüksek Lisans Çıkarımı ve Vizyon Modelleri Doğrudan Uçta
Workers AI, çıkarım taleplerinde yıldan yıla %4000 artış kaydetti 2026'nın 1. çeyreğine kadar. Metin, görüntü ve konuşma modellerinin doğrudan nasıl çalıştırılacağını öğrenin 200 ms'nin altında gecikme süresiyle, özel GPU'su olmayan Çalışanlarınızda.
Yapay Zeka Çıkarımı Uç Noktaya Taşındı
2023 yılına kadar Büyük Dil Modelini çalıştırmak neredeyse zorunluydu harici bir API (OpenAI, Anthropic, Google) ile iletişim kurun veya pahalı GPU'lar dağıtın özel altyapı üzerinde. Bu merkezi uç noktalara yönelik ağ gecikmesi her isteğe 200-800 ms ekledi ve GPU maliyetleri Düşük hacimli uygulamalar.
İşçi Yapay Zekası bu senaryoyu değiştirdi. Cloudflare dağıtıldı Dünya çapında düzinelerce veri merkezinde yapay zeka çıkarım donanımı (özel GPU'lar). Modeller, Worker'ınızı çalıştıran aynı donanım üzerinde çalışır; ağ, harici sağlayıcılara gidiş-dönüş. Sonuç gecikme çıkarımıdır azaltıldı, altyapı yönetimi olmadan tüketim üzerinden faturalandırıldı.
Ne Öğreneceksiniz
- Workers AI'da bulunan şablonlar: Yüksek Lisans, vizyon, konuşma, yerleştirme
- Llama 3.1 ve yanıt akışıyla metin oluşturma
- Görüş modelleri: LLaVA ile görüntü analizi
- Whisper ile konuşmayı metne dönüştürme
- Anlamsal arama için metin yerleştirmeleri
- AI Ağ Geçidi: AI isteklerinin önbelleğe alınması, hız sınırlandırılması ve gözlemlenebilirliği
- Sınırlar, maliyetler ve optimizasyon stratejileri
Mevcut Modellere Genel Bakış
Workers AI, çıkarım için optimize edilmiş çeşitli açık kaynaklı modeller sunar
Cloudflare donanımında. Modeller önekle belirtilir
@cf/ o @hf/ (Sarılan Yüz barındırılıyor):
| Kategori | Ana modeller | Kullanım örneği |
|---|---|---|
| Metin Üretimi | @cf/meta/llama-3.1-8b-instruct, @cf/mistral/mistral-7b-instruct-v0.2 | Chatbot, özet, Soru-Cevap, kod oluşturma |
| Metin Oluşturma (Büyük) | @cf/meta/llama-3.3-70b-instruct-fp8-fast | Karmaşık akıl yürütme, gelişmiş analiz |
| Görüş | @cf/llava-hf/llava-1.5-7b-hf, @cf/unum/uform-gen2-qwen-500m | Resim yazısı, görsel Soru-Cevap |
| Konuşmayı Metne Dönüştürme | @cf/openai/whisper, @cf/openai/whisper-large-v3-turbo | Ses transkripsiyonu |
| Metin Gömmeleri | @cf/baai/bge-base-en-v1.5, @cf/baai/bge-large-en-v1.5 | Anlamsal arama, benzerlik, RAG |
| Görüntü Sınıflandırması | @cf/microsoft/resnet-50 | Görüntü sınıflandırması |
| Çeviri | @cf/meta/m2m100-1.2b | 100'den fazla dile çeviri |
| Görüntü Üretimi | @cf/stabilityai/stable-diffusion-xl-base-1.0 | Metinden resme |
Yapılandırma: wrangler.toml'da AI Bağlama
Workers AI'yi kullanmak için bağlamayı eklemeniz yeterli [ai] konfigürasyonda:
# wrangler.toml
name = "ai-worker"
main = "src/worker.ts"
compatibility_date = "2024-09-23"
# Binding per Workers AI
[ai]
binding = "AI"
Bağlamanın TypeScript türü arayüzde bildirilmelidir Env:
// types.ts - dichiarazione del binding AI
interface Env {
AI: Ai; // Tipo fornito da @cloudflare/workers-types
}
Lama 3.1 ile Metin Oluşturma
En yaygın kullanım durumu şablonla metin oluşturmaktır talimat-cevap. Bir sohbet uç noktasının nasıl uygulanacağını görelim:
// src/worker.ts - endpoint di chat con Llama 3.1
export default {
async fetch(request: Request, env: Env): Promise<Response> {
if (request.method !== 'POST' || new URL(request.url).pathname !== '/chat') {
return new Response('POST /chat required', { status: 400 });
}
const { messages, stream = false } = await request.json<ChatRequest>();
// Valida l'input
if (!Array.isArray(messages) || messages.length === 0) {
return Response.json({ error: 'messages array required' }, { status: 400 });
}
if (stream) {
// Streaming response: il modello restituisce token man mano
const aiStream = await env.AI.run('@cf/meta/llama-3.1-8b-instruct', {
messages,
stream: true,
max_tokens: 1024,
temperature: 0.7,
});
// Trasforma lo stream AI in Server-Sent Events
return new Response(aiStream, {
headers: {
'Content-Type': 'text/event-stream',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive',
},
});
}
// Risposta sincrona: attende il completion completo
const result = await env.AI.run('@cf/meta/llama-3.1-8b-instruct', {
messages,
max_tokens: 1024,
temperature: 0.7,
});
return Response.json({
response: (result as AiTextGenerationOutput).response,
usage: {
// Workers AI non espone ancora i token counts nella risposta base
model: '@cf/meta/llama-3.1-8b-instruct',
},
});
},
};
interface ChatRequest {
messages: Array<{ role: 'system' | 'user' | 'assistant'; content: string }>;
stream?: boolean;
}
interface Env {
AI: Ai;
}
Sistem istemi yardımcısını uygulayan daha eksiksiz bir örnek ve sağlam hata yönetimi:
// src/assistant-worker.ts
const SYSTEM_PROMPT = `Sei un assistente tecnico esperto in cloud computing e edge computing.
Rispondi in modo conciso e tecnico. Se non conosci la risposta, dillo chiaramente.
Non inventare informazioni. Rispondi sempre in italiano a meno che l'utente non scriva in un'altra lingua.`;
export default {
async fetch(request: Request, env: Env): Promise<Response> {
if (request.method !== 'POST') {
return new Response('Method Not Allowed', { status: 405 });
}
let body: AssistantRequest;
try {
body = await request.json<AssistantRequest>();
} catch {
return Response.json({ error: 'Invalid JSON body' }, { status: 400 });
}
if (!body.question?.trim()) {
return Response.json({ error: 'question field is required' }, { status: 400 });
}
try {
const result = await env.AI.run('@cf/meta/llama-3.1-8b-instruct', {
messages: [
{ role: 'system', content: SYSTEM_PROMPT },
{ role: 'user', content: body.question },
],
max_tokens: 2048,
temperature: 0.3, // Bassa temperatura per risposte piu deterministiche
}) as AiTextGenerationOutput;
return Response.json({
answer: result.response,
model: '@cf/meta/llama-3.1-8b-instruct',
timestamp: new Date().toISOString(),
});
} catch (err) {
console.error('AI inference error:', err);
return Response.json(
{ error: 'AI inference failed', details: (err as Error).message },
{ status: 500 }
);
}
},
};
interface AssistantRequest {
question: string;
}
interface Env {
AI: Ai;
}
Görme Modelleri: Görüntü Analizi
Görme modelleri, girdi görüntülerini bir soruyla birlikte analiz etmenize olanak tanır metinsel. Bu, içerik denetimi ve bilgi çıkarma için kullanışlıdır taranan belgelerden ve erişilebilirlik özelliklerinden:
// src/vision-worker.ts - analisi immagini con LLaVA
export default {
async fetch(request: Request, env: Env): Promise<Response> {
if (request.method !== 'POST') {
return new Response('Method Not Allowed', { status: 405 });
}
// Accetta immagine come Base64 o URL
const body = await request.json<VisionRequest>();
let imageData: number[];
if (body.imageUrl) {
// Scarica l'immagine e converti in array di byte
const imgResponse = await fetch(body.imageUrl);
if (!imgResponse.ok) {
return Response.json({ error: 'Failed to fetch image' }, { status: 400 });
}
const buffer = await imgResponse.arrayBuffer();
imageData = Array.from(new Uint8Array(buffer));
} else if (body.imageBase64) {
// Decodifica Base64
const binaryString = atob(body.imageBase64);
imageData = Array.from({ length: binaryString.length }, (_, i) =>
binaryString.charCodeAt(i)
);
} else {
return Response.json({ error: 'imageUrl or imageBase64 required' }, { status: 400 });
}
const prompt = body.prompt ?? 'Descrivi questa immagine in dettaglio in italiano.';
const result = await env.AI.run('@cf/llava-hf/llava-1.5-7b-hf', {
image: imageData,
prompt,
max_tokens: 512,
}) as AiTextGenerationOutput;
return Response.json({
description: result.response,
prompt,
model: '@cf/llava-hf/llava-1.5-7b-hf',
});
},
};
interface VisionRequest {
imageUrl?: string;
imageBase64?: string;
prompt?: string;
}
interface Env {
AI: Ai;
}
Fısıltı ile Konuşmayı Metne Dönüştürme
Workers AI, ses transkripsiyonu için Whisper'ı içerir. Model sesi kabul ediyor
formatta ArrayBuffer ve zaman damgalı transkripti döndürür
isteğe bağlı:
// src/transcribe-worker.ts - Speech-to-text con Whisper
export default {
async fetch(request: Request, env: Env): Promise<Response> {
if (request.method !== 'POST') {
return new Response('Method Not Allowed', { status: 405 });
}
const contentType = request.headers.get('Content-Type') ?? '';
// Accetta audio come multipart/form-data o application/octet-stream
let audioBuffer: ArrayBuffer;
if (contentType.includes('multipart/form-data')) {
const formData = await request.formData();
const audioFile = formData.get('audio') as File | null;
if (!audioFile) {
return Response.json({ error: 'audio field required in form data' }, { status: 400 });
}
audioBuffer = await audioFile.arrayBuffer();
} else {
// Raw binary audio
audioBuffer = await request.arrayBuffer();
}
if (audioBuffer.byteLength === 0) {
return Response.json({ error: 'Empty audio data' }, { status: 400 });
}
// Limita a 25MB (limite Whisper)
if (audioBuffer.byteLength > 25 * 1024 * 1024) {
return Response.json({ error: 'Audio file too large (max 25MB)' }, { status: 413 });
}
const result = await env.AI.run('@cf/openai/whisper', {
audio: Array.from(new Uint8Array(audioBuffer)),
}) as AiSpeechRecognitionOutput;
return Response.json({
text: result.text,
wordCount: result.text.split(/\s+/).filter(Boolean).length,
model: '@cf/openai/whisper',
});
},
};
interface Env {
AI: Ai;
}
Anlamsal Arama için Metin Gömmeleri
Gömmeler anlamsal anlamı temsil eden sayısal vektörlerdir bir metnin. Workers AI, anlamsal arama için optimize edilmiş BGE modellerini içerir. Vectorize (Cloudflare'in vektör veritabanı) ile birleştirildiğinde, oluşturmanıza olanak tanır RAG boru hattı tamamen kenarda:
// src/embedding-worker.ts - generazione embeddings + ricerca semantica
export default {
async fetch(request: Request, env: Env): Promise<Response> {
const url = new URL(request.url);
if (url.pathname === '/embed' && request.method === 'POST') {
const { texts } = await request.json<EmbedRequest>();
if (!Array.isArray(texts) || texts.length === 0) {
return Response.json({ error: 'texts array required' }, { status: 400 });
}
// BGE genera embedding di 768 dimensioni (base) o 1024 (large)
const result = await env.AI.run('@cf/baai/bge-base-en-v1.5', {
text: texts,
}) as AiTextEmbeddingsOutput;
return Response.json({
embeddings: result.data,
dimensions: result.data[0]?.length ?? 0,
count: result.data.length,
model: '@cf/baai/bge-base-en-v1.5',
});
}
if (url.pathname === '/search' && request.method === 'POST') {
const { query, topK = 5 } = await request.json<SearchRequest>();
// 1. Genera l'embedding per la query
const queryEmbed = await env.AI.run('@cf/baai/bge-base-en-v1.5', {
text: [query],
}) as AiTextEmbeddingsOutput;
// 2. Ricerca semantica su Vectorize
const results = await env.VECTORIZE.query(queryEmbed.data[0], {
topK,
returnMetadata: 'all',
});
return Response.json({
query,
results: results.matches.map((match) => ({
id: match.id,
score: match.score,
metadata: match.metadata,
})),
});
}
return new Response('Not Found', { status: 404 });
},
};
interface EmbedRequest {
texts: string[];
}
interface SearchRequest {
query: string;
topK?: number;
}
interface Env {
AI: Ai;
VECTORIZE: VectorizeIndex;
}
AI Ağ Geçidi: Gözlemlenebilirlik ve Önbelleğe Alma
Cloudflare AI Ağ Geçidi bu şeffaf bir vekildir evet AI çağrılarının ilerisinde konumlar (hem Workers AI hem de OpenAI gibi harici sağlayıcılar). Anlamsal önbelleğe alma, hız sınırlama, günlüğe kaydetme ve otomatik geri dönüş ekler:
// src/worker-with-gateway.ts - Workers AI via AI Gateway
export default {
async fetch(request: Request, env: Env): Promise<Response> {
const { prompt } = await request.json<{ prompt: string }>();
// Usa il gateway invece del binding diretto
// Il gateway aggiunge: caching, retry, logging, rate limiting
const response = await fetch(
`https://gateway.ai.cloudflare.com/v1/${env.CF_ACCOUNT_ID}/${env.AI_GATEWAY_ID}/workers-ai/@cf/meta/llama-3.1-8b-instruct`,
{
method: 'POST',
headers: {
'Authorization': `Bearer ${env.CF_API_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
messages: [{ role: 'user', content: prompt }],
max_tokens: 512,
}),
}
);
if (!response.ok) {
const error = await response.text();
return Response.json({ error }, { status: response.status });
}
const result = await response.json();
return Response.json(result);
},
};
interface Env {
AI: Ai;
CF_ACCOUNT_ID: string;
CF_API_TOKEN: string;
AI_GATEWAY_ID: string;
}
Alternatif olarak, ağ geçidini doğrudan wrangler.toml dosyasının AI bağlamasında yapılandırabilirsiniz:
# wrangler.toml con AI Gateway
[ai]
binding = "AI"
# Il gateway viene usato automaticamente per tutte le chiamate
# Configurato nella dashboard Cloudflare
Sınırlamalar ve Maliyet Hususları
| Modeli | Ücretsiz (Nöron Birimleri) | Ücretli (1K nöron başına $) | Tipik gecikme |
|---|---|---|---|
| Lama 3.1 8B | 10K NU/gün ücretsiz | 0,011 ABD doları / 1 bin NU | ~500ms-2s (jetonlara bağlıdır) |
| Lama 3.3 70B FP8 | Ücretli plana dahil | 0,050 ABD doları / 1 bin NU | ~1-5s |
| Fısıltı | 10K NU/gün ücretsiz | 0,011 ABD doları / 1 bin NU | ~dakikada 1-3s ses |
| BGE yerleştirmeleri | 10K NU/gün ücretsiz | 0,011 ABD doları / 1 bin NU | ~50-200ms |
| Kararlı Difüzyon XL | 10K NU/gün ücretsiz | 0,020 ABD doları / resim | ~3-10s |
Zaman Aşımları ve CPU Sınırları
Workers AI, Worker'ın normal CPU bütçesinin (30'lu ücretli plan) dışında çalışır. Ancak Llama 70B gibi büyük modellerin tamamlanması 5-15 saniye sürebilmektedir. cevap ver. Bu durumlarda mutlaka kullanın. akış jetonları ilerledikçe döndürmek ve istemcinin HTTP zaman aşımını aşmamak için. Uzun çıkarımlar için bir kuyruk (İşçi Kuyrukları) kullanmayı düşünün ve durumu bildirin Bittiğinde müşteri.
Üretim Modeli: Kenardaki RAG
Gittikçe yaygınlaşan bir model, RAG (Geri Alma-Artırılmış Nesil) Tamamen uçta: Geri alma için Vectorize, yerleştirme ve oluşturma için Workers AI.
// src/rag-worker.ts - RAG completo all'edge
export default {
async fetch(request: Request, env: Env): Promise<Response> {
if (request.method !== 'POST') return new Response('POST only', { status: 405 });
const { question } = await request.json<{ question: string }>();
// Step 1: Genera l'embedding della domanda
const queryEmbedding = await env.AI.run('@cf/baai/bge-base-en-v1.5', {
text: [question],
}) as AiTextEmbeddingsOutput;
// Step 2: Recupera i chunk rilevanti dal vector store
const relevant = await env.DOCS.query(queryEmbedding.data[0], {
topK: 3,
returnMetadata: 'all',
});
// Step 3: Costruisce il contesto dai chunk recuperati
const context = relevant.matches
.map((m) => m.metadata?.['text'] as string ?? '')
.filter(Boolean)
.join('\n\n---\n\n');
// Step 4: Genera la risposta con il contesto
const answer = await env.AI.run('@cf/meta/llama-3.1-8b-instruct', {
messages: [
{
role: 'system',
content: `Rispondi alla domanda basandoti SOLO sul contesto fornito.
Se il contesto non contiene informazioni sufficienti, dillo esplicitamente.
Contesto:
${context}`,
},
{ role: 'user', content: question },
],
max_tokens: 1024,
temperature: 0.1,
}) as AiTextGenerationOutput;
return Response.json({
question,
answer: answer.response,
sources: relevant.matches.map((m) => ({
id: m.id,
score: m.score,
title: m.metadata?.['title'],
})),
});
},
};
interface Env {
AI: Ai;
DOCS: VectorizeIndex;
}
Sonuçlar ve Sonraki Adımlar
İşçilerin yapay zekası, yapay zeka çıkarımlarına erişimde bir paradigma değişikliğini temsil ediyor: Yönetilecek GPU yok, entegre edilecek harici sağlayıcı yok, faturalandırma yok cömert ücretsiz katmanla tüketim için. 2026'nın ilk çeyreğine kadar yıllık %4000'lik büyüme şunu yansıtıyor: daha basit bir yol arayan geliştiriciler tarafından hızlı bir şekilde benimsenmesi ürünlerinde yapay zekaya yöneliyor.
Workers AI + Vectorize + Dayanıklı Nesneler kombinasyonu ( konuşma geçmişi) tamamen eksiksiz yapay zeka asistanları oluşturmanıza olanak tanır Cloudflare platformunda, dışa bağımlılık olmadan.
Serideki Sonraki Yazılar
- Madde 6: Vercel Edge Runtime — Gelişmiş Ara Yazılım, Coğrafi Konum ve A/B Testi: Vercel, Next.js ile uç çalışma süresini nasıl kullanıyor? özelleştirme ve özellik bayrakları için.
- Madde 7: Sınırda Coğrafi Yönlendirme - Kişiselleştirme GDPR İçeriği ve Uyumluluğu: Ana sunucuya dokunmadan coğrafi tabanlı mantık oluşturun.
- Madde 8: Cloudflare'de Önbellek API'si ve Geçersiz Kılma Stratejileri İşçiler: TTL, bayatlama sırasında yeniden doğrulama ve anahtar başına temizleme özellikli programlanabilir CDN.







