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.