Takip et

TypeScript ile AI Ajanı Geliştirme: Python’a Gerek Kalmadı mı?

Gelişen teknolojiyle birlikte yapay zeka (AI) artık sadece bilim kurgu filmlerinin konusu olmaktan çıktı, günlük hayatımızın ayrılmaz bir parçası haline geldi. Özellikle büyük dil modelleri (LLM’ler) sayesinde AI ajanları geliştirme süreci her zamankinden daha erişilebilir durumda. Peki, bu heyecan verici alana adım atmak için illaki Python öğrenmek zorunda mısınız? Ya da yıllardır JavaScript ekosisteminde edindiğiniz tecrübeyi bir kenara mı bırakmalısınız? Kesinlikle hayır! Bu makale, JavaScript ve özellikle de TypeScript geliştiricilerinin, Python’a ihtiyaç duymadan güçlü ve verimli AI ajanları inşa edebileceğini kanıtlıyor. Uzun metinleri ve URL’leri özetleyebilen bir AI Summarizer Agent’ı TypeScript ile nasıl geliştireceğinizi adım adım keşfedeceğiz. Bu yeni dönemde JavaScript geliştiricilerin potansiyelini gözler önüne serecek bu rehberle, AI dünyasına hızlı ve etkili bir giriş yapmaya hazır olun.

Geleneksel olarak yapay zeka ve makine öğrenimi denildiğinde akla ilk gelen dil Python olmuştur. Geniş kütüphane desteği, aktif topluluğu ve veri bilimi araçları, Python’u bu alanda tartışmasız bir lider haline getirdi. Ancak bu durum, JavaScript ekosisteminin son yıllardaki inanılmaz yükselişiyle değişmeye başladı. Node.js’in sunucu tarafı programlamayı mümkün kılması, TypeScript’in büyük ölçekli uygulamalarda tip güvenliği ve geliştirici deneyimini artırması, JavaScript’i AI dünyası için de cazip bir alternatif haline getirdi. Artık front-end, back-end ve hatta mobil uygulama geliştirmenin yanı sıra, aynı dili ve ekosistemi kullanarak güçlü yapay zeka çözümleri geliştirmek mümkün. Bu durum, özellikle mevcut JavaScript ve TypeScript geliştiricileri için büyük bir avantaj sunuyor. Yeni bir dil öğrenme bariyerini ortadan kaldırarak, doğrudan AI projelerine odaklanmalarına olanak tanıyorlar. Bu makalede ele alacağımız “AI Summarizer Agent” projesi de tam olarak bu potansiyeli somutlaştıran bir örnek teşkil ediyor. Belki de bir haber sitesinin makalelerini otomatik özetlemek, bir araştırma makalesinin ana fikirlerini hızlıca çıkarmak veya bir müşteri hizmetleri yazışmasının özetini anında almak istiyorsunuz. İşte bu gibi senaryolarda, TypeScript ile geliştireceğiniz özetleyici ajanınız size inanılmaz bir esneklik ve güç sunacaktır. Artık sadece istemci tarafında etkileşimli kullanıcı arayüzleri oluşturmakla kalmayacak, aynı zamanda sunucu tarafında karmaşık yapay zeka operasyonlarını da kendi dilinizde yönetecek ve böylece tam yığın (full-stack) yapay zeka geliştiricisi olma yolunda önemli bir adım atacaksınız. Bu makale boyunca, hem teorik temelleri anlayacak hem de pratik kod örnekleri ile kendi özetleyici ajanı projenizi hayata geçireceksiniz. Dolayısıyla, heyecan verici bir yolculuğa hazır olun!

Temel Kavramlar: Yapay Zeka Ajanları ve Metin Özetleme Nasıl Çalışır?

Yapay zeka dünyasına adım atarken, “AI Ajanı” terimi sıklıkla karşımıza çıkar. Peki, tam olarak nedir bir AI ajanı? Basitçe ifade etmek gerekirse, bir AI ajanı, belirli bir ortamda algılama, düşünme ve hareket etme yeteneğine sahip otonom bir yazılım parçasıdır. Girdi olarak veri alır, bu verileri işler, bir karar verir veya bir eylem gerçekleştirir ve sonuç olarak bir çıktı üretir. Bizim bağlamımızda, bir “AI Summarizer Agent” ise uzun metinleri veya URL içeriklerini anlayarak bunların temel fikirlerini, en önemli noktalarını koruyarak daha kısa ve öz bir versiyonunu oluşturan bir ajandır. Bu ajanlar, özellikle bilgi yüklemesinin yoğun olduğu günümüz dünyasında, değerli zamanımızdan tasarruf etmemizi sağlayan kritik araçlardır.

Bir özetleyici ajanın kalbinde ise Büyük Dil Modelleri (LLM’ler) yatar. OpenAI’nin GPT serisi, Google’ın Gemini’si veya Anthropic’in Claude’u gibi modeller, milyarlarca kelime üzerinde eğitilmiş devasa sinir ağlarıdır. Bu modeller, insan dilini anlama, üretme, çevirme ve özetleme gibi karmaşık görevleri başarıyla yerine getirebilirler. Bizim özetleyici ajanımız, bu LLM’leri bir API aracılığıyla kullanarak metinleri analiz edecek ve özetleyecek. Temelde, modelden “bu metni özetle” veya “bu URL’deki makalenin ana fikrini bana ver” gibi bir komut (prompt) isteriz. Model, eğitildiği devasa veri setinden öğrendikleriyle bu isteği işler ve bize en uygun özeti geri döndürür. Metin özetleme, genellikle iki ana kategoriye ayrılır: Çıkarımsal (Extractive) Özetleme ve Soyutsal (Abstractive) Özetleme. Çıkarımsal özetleme, orijinal metindeki en önemli cümleleri veya kelime gruplarını doğrudan alarak bir özet oluşturur. Bu yöntem, özgünlüğü korurken bazen akıcılıkta sorunlar yaşatabilir. Soyutsal özetleme ise, orijinal metni anladıktan sonra kendi kelimeleriyle tamamen yeni bir özet oluşturur. Bu yöntem, daha insan benzeri ve akıcı özetler üretirken, modelin konuyu doğru anlaması ve yeni ifadelerle aktarması daha büyük bir zorluktur. Modern LLM’ler genellikle soyutsal özetleme yeteneğine sahiptir.

Neden TypeScript? Modern AI Geliştirme İçin Güçlü Bir Seçim Mi?

TypeScript, JavaScript’in süper kümesidir ve özellikle büyük ölçekli ve karmaşık uygulamalar geliştirmek için tasarlanmıştır. AI ajanları geliştirmede neden bu kadar güçlü bir seçenek olduğunu anlamak, JavaScript geliştiricileri için önemli bir motivasyon kaynağıdır. İlk olarak, Tip Güvenliği en büyük avantajıdır. TypeScript’in statik tip kontrolü sayesinde, geliştirme aşamasında olası hataları yakalamak, kodun daha öngörülebilir olmasını sağlamak ve büyük ekiplerde iş birliğini kolaylaştırmak mümkündür. Bir AI ajanı geliştirirken, API’lerden gelen veri yapılarının doğru olduğundan emin olmak veya farklı modüller arasında veri akışını yönetmek gibi konularda tip güvenliği, geliştirme sürecini önemli ölçüde hızlandırır ve hataları azaltır. Python dinamik tipli bir dil olduğu için bu tür hatalar genellikle çalışma zamanında ortaya çıkar ve tespiti daha zor olabilir. İkinci olarak, Ölçeklenebilirlik ve Refactoring Kolaylığı TypeScript’in ayrılmaz özellikleridir. Bir AI projesi büyüdükçe, yeni özellikler eklendikçe veya mevcut kodda değişiklikler yapıldıkça, TypeScript’in sağladığı yapısal faydalar sayesinde kod tabanını yönetmek çok daha kolay hale gelir. Bu durum, projenin sürdürülebilirliği ve uzun vadeli başarısı için kritik öneme sahiptir.

Ayrıca, Node.js Ekosistemi, TypeScript’i AI geliştirme için mükemmel bir platform haline getirir. Node.js’in asenkron, olay tabanlı mimarisi, özellikle ağ istekleri (LLM API’leri ile iletişim gibi) ve I/O işlemleri açısından oldukça verimlidir. Bu da AI ajanımızın birden çok isteği eş zamanlı olarak yönetebilmesini ve performanstan ödün vermeden çalışabilmesini sağlar. NPM (Node Package Manager) aracılığıyla erişilebilen devasa paket deposu, veri işleme, web kazıma (web scraping), API entegrasyonu ve hatta bazı makine öğrenimi kütüphaneleri için hazır çözümler sunar. Bu, geliştiricilerin tekerleği yeniden icat etmek yerine, doğrudan projenin temel mantığına odaklanmasına olanak tanır. Bir diğer önemli avantaj ise mevcut JavaScript Geliştiriciler İçin Düşük Öğrenme Eğrisidir. Halihazırda JavaScript bilgisine sahip geliştiriciler, TypeScript’e geçiş yaparken çok daha az zorluk yaşarlar. Syntax (sözdizimi) büyük ölçüde aynıdır ve eklenen tip sistemi hızlıca öğrenilebilir. Bu durum, ekiplerin hızla AI projelerine adapte olmasını ve değer üretmesini sağlar. Son olarak, Performans da göz ardı edilmemelidir. Node.js, Google Chrome’un kullandığı güçlü V8 JavaScript motoru üzerinde çalışır. Bu motor, JavaScript kodunu oldukça optimize bir şekilde derleyip çalıştırır. Her ne kadar ham hesaplama gücü gerektiren bazı makine öğrenimi görevleri için Python’ın C/C++ tabanlı kütüphaneleri (NumPy, SciPy) daha uygun olsa da, çoğu AI ajanı senaryosunda (özellikle LLM API’leri ile etkileşimde) Node.js’in asenkron yapısı ve V8 motorunun performansı fazlasıyla yeterlidir. Geliştirici deneyimi açısından, aynı dili hem front-end hem de back-end (ve AI mantığı) için kullanmak, bağlam geçişlerini azaltır, kod paylaşımını kolaylaştırır ve genel verimliliği artırır. Tüm bu nedenler göz önüne alındığında, TypeScript, modern ve ölçeklenebilir AI ajanları geliştirmek için kesinlikle güçlü ve rekabetçi bir seçenektir.

Adım Adım AI Özetleyici Ajanı Geliştirme: İlk Kodumuzu Yazalım!

Şimdi teoriden pratiğe geçme zamanı! Kendi AI özetleyici ajanımızı TypeScript kullanarak nasıl geliştireceğimizi adım adım göreceğiz. İlk olarak, projemizi kurmalı ve temel bir metin özetleme işlevini nasıl entegre edeceğimizi öğrenmeliyiz. Bu bölümde, LLM API’leri ile nasıl etkileşim kuracağımızı, temel bir prompt’u nasıl oluşturacağımızı ve sonuçları nasıl yöneteceğimizi kod örnekleriyle göstereceğiz.

Gerekli Araçlar ve Proje Kurulumu

Başlamak için bazı temel araçlara ihtiyacımız var:

  • Node.js: Sunucu tarafında TypeScript kodumuzu çalıştırmak için gerekli.
  • npm (Node Package Manager) veya Yarn: Bağımlılıkları yönetmek için.
  • TypeScript: Statik tiplerle kod yazmak için.
  • Bir Metin Düzenleyici: VS Code gibi.
  • LLM API Erişimi: OpenAI, Anthropic, Google Gemini gibi bir sağlayıcıdan API anahtarı. Biz bu örnekte OpenAI API’sini kullanacağız.

Proje dizinini oluşturun ve terminalinizde aşağıdaki komutları çalıştırarak projenizi başlatın:


mkdir ai-summarizer-agent
cd ai-summarizer-agent
npm init -y
npm install typescript @types/node openai dotenv
npx tsc --init
    

Bu komutlar:

  1. ai-summarizer-agent adında bir klasör oluşturur.
  2. Klasöre geçiş yapar.
  3. package.json dosyasını oluşturur.
  4. typescript, Node.js için tip tanımları (@types/node), OpenAI API istemcisi (openai) ve çevre değişkenlerini yönetmek için (dotenv) paketlerini yükler.
  5. tsconfig.json dosyasını oluşturur, bu TypeScript yapılandırma dosyasıdır.

Şimdi tsconfig.json dosyasında birkaç küçük ayar yapmamız gerekiyor. Özellikle "outDir": "./dist" ve "rootDir": "./src" satırlarını uncomment edip, "module": "commonjs", "target": "es2020" gibi modern değerleri atayabiliriz. Ayrıca, OpenAI API anahtarımızı güvenli bir şekilde saklamak için projenizin kök dizinine .env adında bir dosya oluşturun ve içine şu satırı ekleyin (kendi anahtarınızla değiştirin):


OPENAI_API_KEY=sizin_openai_api_anahtarınız_buraya
    

Temel Metin Özetleme İşlevi

Şimdi src klasörünü oluşturalım ve içine index.ts adında bir dosya ekleyelim. Bu dosya, ana özetleme mantığımızı içerecek. LLM'lerle etkileşim kurarken en önemli kavramlardan biri "prompt engineering" yani "komut mühendisliği"dir. Modele ne kadar net ve yönlendirici bir komut verirsek, o kadar iyi sonuçlar alırız. İşte temel bir özetleme işlevi için TypeScript kodu:


// src/index.ts
import OpenAI from "openai";
import dotenv from "dotenv";

// .env dosyasındaki çevre değişkenlerini yükle
dotenv.config();

const openai = new OpenAI({
    apiKey: process.env.OPENAI_API_KEY, // API anahtarınızı .env dosyasından alın
});

/**
 * Verilen metni özetler.
 * @param text Özetlenecek uzun metin.
 * @returns Metnin özeti veya hata mesajı.
 */
async function summarizeText(text: string): Promise {
    try {
        const completion = await openai.chat.completions.create({
            model: "gpt-3.5-turbo", // Kullanmak istediğiniz modeli belirtin
            messages: [
                { role: "system", content: "Sen profesyonel bir metin özetleme asistanısın. Aldığın metni ana hatlarıyla, en önemli noktaları koruyarak kısa ve öz bir şekilde özetle." },
                { role: "user", content: Aşağıdaki metni özetle:\n\n${text} },
            ],
            temperature: 0.7, // Yaratıcılık seviyesi (0.0-1.0 arası)
            max_tokens: 150,   // Üretilecek maksimum token sayısı
        });

        // Olası boşlukları kontrol et ve özeti döndür
        if (completion.choices && completion.choices.length > 0 && completion.choices[0].message && completion.choices[0].message.content) {
            return completion.choices[0].message.content.trim();
        } else {
            return "Özet oluşturulamadı.";
        }
    } catch (error) {
        console.error("Özetleme sırasında bir hata oluştu:", error);
        return Hata: ${error instanceof Error ? error.message : String(error)};
    }
}

// Örnek kullanım
async function main() {
    const longText = Yapay zeka teknolojileri son yıllarda büyük bir ivme kazanarak hayatımızın hemen her alanına entegre olmaya başlamıştır. Özellikle Büyük Dil Modelleri (LLM'ler), doğal dil işleme alanında devrim niteliğinde ilerlemeler kaydetmiştir. Bu modeller, milyarlarca parametre üzerinde eğitilerek, insan dilini anlama, üretme, çevirme ve karmaşık metin analizleri yapma yeteneğine sahiptir. OpenAI'nin GPT serisi, Google'ın PaLM ve Gemini modelleri, Meta'nın Llama'sı ve Anthropic'in Claude'u bu modellerin en bilinen örneklerindendir.
    Bu gelişmeler, yazılım geliştiricilerine, özellikle de JavaScript ve TypeScript ekosisteminde çalışanlara, yeni kapılar açmıştır. Geleneksel olarak yapay zeka denildiğinde Python akla gelse de, Node.js'in sunucu tarafı yetenekleri ve TypeScript'in tip güvenliği, bu alanda güçlü ve ölçeklenebilir çözümler geliştirmeyi mümkün kılmaktadır. JavaScript geliştiricileri, aynı dili kullanarak hem front-end hem de back-end ve AI mantığını entegre edebilme avantajına sahiptir. Bu, geliştirme sürecini hızlandırır, kod tabanını basitleştirir ve ekipler arası işbirliğini güçlendirir.
    Bir AI ajanı, çevresinden bilgi algılayabilen, bu bilgiyi işleyip karar verebilen ve belirli hedeflere ulaşmak için eylemler gerçekleştirebilen otonom bir sistemdir. Metin özetleyici ajanlar da bu kategoride yer alır ve uzun metinlerin veya belgelerin ana fikirlerini, en önemli bilgilerini koruyarak daha kısa formlara dönüştürme görevi üstlenirler. Bu yetenek, bilgi çağında aşırı yüklenmiş bireyler ve kuruluşlar için zaman tasarrufu ve verimlilik artışı sağlar. Haber makaleleri, araştırma raporları, toplantı tutanakları veya uzun e-postalar gibi birçok farklı metin türü için özetleme ajanları paha biçilmez bir değer sunar.
    Bu makale, TypeScript'in AI ajanları geliştirmede nasıl güçlü bir araç olduğunu göstermeyi hedefliyor. Pratik kod örnekleri ve gerçek dünya senaryolarıyla, JavaScript geliştiricilerin Python öğrenme zorunluluğu olmadan modern yapay zeka uygulamaları geliştirebileceğini kanıtlayacağız.;

    console.log("Orijinal Metin Uzunluğu:", longText.length, "karakter");
    console.log("Özetleme başlatılıyor...");
    const summary = await summarizeText(longText);
    console.log("\n--- Özet ---");
    console.log(summary);
    console.log("Özet Uzunluğu:", summary.length, "karakter");
}

main();
    

Bu kodu çalıştırmak için önce TypeScript'i JavaScript'e derlemeniz gerekir, ardından Node.js ile çalıştırabilirsiniz:


npx tsc # src/index.ts dosyasını dist/index.js olarak derler
node dist/index.js
    

Bu adımlarla, başarılı bir şekilde ilk AI özetleme ajanınızı çalıştırmış olacaksınız. summarizeText fonksiyonundaki system mesajı, modele rolünü ve beklentileri açıklarken, user mesajı ise özetlenecek metni iletir. temperature parametresi, modelin yanıtının ne kadar yaratıcı veya deterministik olacağını kontrol ederken, max_tokens ise özetin maksimum uzunluğunu sınırlar. Bu parametrelerle oynayarak, farklı özetleme stilleri elde edebilirsiniz.

URL ve Uzun Metinleri Özetleme: Web Verilerini Nasıl İşleriz?

Sadece düz metinleri özetlemekle kalmayıp, internet üzerindeki URL'lerden gelen içeriği de özetleyebilmek, AI ajanımızın yeteneklerini büyük ölçüde artıracaktır. Bu bölümde, bir URL'den web içeriğini nasıl çekip işleyeceğimizi ve bu uzun içerikleri özetleyici ajanımıza nasıl besleyeceğimizi ele alacağız. Özellikle haber siteleri, blog yazıları veya araştırma makaleleri gibi kaynaklardan bilgi edinmek isteyenler için bu özellik hayati öneme sahiptir.

Web Kazıma (Web Scraping) ve Metin Çıkarma

Bir URL'den içerik çekmek için "web kazıma" tekniklerine başvurmamız gerekecek. TypeScript/Node.js ekosisteminde bu iş için kullanabileceğimiz birkaç harika kütüphane bulunmaktadır:

  • axios: HTTP istekleri yapmak için popüler bir kütüphane.
  • cheerio: Sunucu tarafında jQuery benzeri bir API ile HTML'yi parse etmek ve DOM'da gezinmek için harika. Hafif ve hızlıdır.
  • puppeteer: Headless Chrome/Chromium'u kontrol eden bir kütüphane. JavaScript ile render edilen sayfaları kazımak için daha güçlü ama daha ağırdır.

Basit bir özetleyici için axios ve cheerio ikilisi genellikle yeterlidir. Öncelikle bu paketleri projemize ekleyelim:


npm install axios cheerio @types/cheerio
    

Şimdi src/index.ts dosyamızı güncelleyerek bir URL'den metin çekme işlevini ekleyelim:


// src/index.ts (önceki kodun devamı)
import axios from "axios";
import * as cheerio from "cheerio"; // cheerio'yu böyle import etmek gerekiyor

// ... (summarizeText fonksiyonu ve diğer import'lar burada) ...

/**
 * Verilen URL'den ana metin içeriğini çeker.
 * @param url İçeriği çekilecek URL.
 * @returns Çekilen metin veya hata mesajı.
 */
async function fetchContentFromUrl(url: string): Promise {
    try {
        const { data } = await axios.get(url);
        const $ = cheerio.load(data);

        // Web sayfasındaki metin içeriğini çıkarmak için çeşitli stratejiler kullanılabilir.
        // Genellikle 

,

,

gibi etiketler hedeflenir. // Daha sofistike senaryolar için içerik alanını daha iyi hedeflemek gerekebilir (örneğin ana makale div'i). let pageText = ""; $('p, h1, h2, h3, h4, h5, h6, li').each((i, element) => { pageText += $(element).text() + "\n"; }); // Çekilen metni temizle (fazla boşluklar, yeni satırlar vb.) pageText = pageText.replace(/\s\s+/g, ' ').trim(); return pageText; } catch (error) { console.error(URL içeriği çekilirken hata oluştu: ${url}, error); return ""; } } // ... (main fonksiyonu) ... async function main() { // ... (önceki longText özetleme kısmı) ... console.log("\n--- URL Özetleme ---"); const targetUrl = "https://www.nature.com/articles/d41586-023-03058-2"; // Örnek bir makale URL'si console.log(URL'den içerik çekiliyor: ${targetUrl}); const urlContent = await fetchContentFromUrl(targetUrl); if (urlContent.length > 0) { console.log("Çekilen içerik uzunluğu:", urlContent.length, "karakter"); // Uzun metinleri parçalara ayırma (Chunking) stratejisi // LLM'lerin token limitleri vardır. Uzun makaleler bu limiti aşabilir. // Basit bir chunking: ilk N karakteri al. Gerçek uygulamada daha akıllı chunking yapılmalı. const maxSummaryContentLength = 4000; // LLM'nin token limitine uygun bir karakter sınırı const contentToSummarize = urlContent.length > maxSummaryContentLength ? urlContent.substring(0, maxSummaryContentLength) + "..." // Kısaltma ekleyelim : urlContent; console.log("Özetlenecek içerik uzunluğu (kısaltılmış):", contentToSummarize.length, "karakter"); console.log("URL içeriği özetleniyor..."); const urlSummary = await summarizeText(contentToSummarize); console.log("\n--- URL Özeti ---"); console.log(urlSummary); console.log("URL Özeti Uzunluğu:", urlSummary.length, "karakter"); } else { console.log("URL'den içerik çekilemedi veya boş."); } } main();

Bu kod bloğunda, fetchContentFromUrl fonksiyonu belirtilen URL'ye bir GET isteği gönderir, dönen HTML'yi cheerio ile yükler ve ardından

,

,

gibi yaygın etiketlerdeki metin içeriğini toplar. Bu metin daha sonra temizlenir ve özetleme için hazır hale getirilir. Özellikle uzun makaleler söz konusu olduğunda, LLM'lerin token limitleri devreye girer. Örneğin, GPT-3.5-turbo'nun genellikle 4096 veya 16385 token gibi limitleri vardır. Bu yüzden, maxSummaryContentLength gibi bir değerle metni kısaltma (chunking) stratejisi uyguladık. Gerçek bir senaryoda, bu parçalama işlemini daha akıllıca yapmak, örneğin metni cümle veya paragraf bazında bölmek ve her parçayı ayrı ayrı özetleyip sonra bu özetleri birleştirmek gerekebilir. Bu, "Recursive Summarization" veya "Map-Reduce" gibi tekniklerle yapılabilir.
Uzman İpucu: Web siteleri sürekli değişebilir ve basit bir cheerio seçicisi her zaman mükemmel çalışmayabilir. Daha sağlam web kazıma için, sayfanın ana içeriğini dinamik olarak algılayan (örneğin,
etiketi veya belirli bir CSS sınıfı) veya hatta Puppeteer gibi tarayıcı otomasyon araçları kullanarak JavaScript ile oluşturulan içeriği de çekebilen daha gelişmiş stratejiler düşünmelisiniz. Ayrıca, bazı web siteleri kazımayı engellemek için önlemler alabilir; bu durumda etik kurallara ve web sitesinin robots.txt dosyasına uymanız önemlidir.

Bu bölümle birlikte, AI ajanımız artık sadece düz metinleri değil, aynı zamanda internetten dinamik olarak çekilen web sayfalarını da özetleyebilme yeteneğine sahip oldu. Bu, ajanın kullanım alanlarını büyük ölçüde genişleten ve gerçek dünya senaryolarında daha fazla değer yaratmasını sağlayan kritik bir adımdır. Örneğin, bir araştırmacı belirli bir konu hakkında yeni makaleleri otomatik olarak özetleyebilir, bir içerik pazarlamacısı rakip blog yazılarını hızla analiz edebilir veya bir haber portalı, gelen haberleri anında özetleyerek kullanıcılarına sunabilir. İşte TypeScript'in ve Node.js'in gücü burada ortaya çıkıyor: tek bir dil ve ekosistemle hem veri çekimi hem de karmaşık yapay zeka işlemleri başarıyla yürütülebiliyor.

Performans ve Maliyet Optimizasyonu: AI Ajanınızı Daha Verimli Hale Getirme

Bir AI ajanı geliştirirken sadece işlevsellik değil, aynı zamanda performans ve maliyet de kritik öneme sahiptir. Özellikle LLM API'leri token bazında ücretlendirildiği için, her isteğin ve her kullanılan token'ın maliyeti vardır. Bu bölümde, özetleyici ajanımızı daha verimli hale getirmek ve operasyonel maliyetlerini düşürmek için uygulayabileceğimiz stratejileri ele alacağız.

API Kullanımını Optimize Etme ve Token Yönetimi

API isteklerinin sayısı ve her isteğin boyutu, toplam maliyeti doğrudan etkiler. İşte optimize etmek için bazı yaklaşımlar:

  • Toplu İstekler (Batching): Mümkünse, benzer özetleme görevlerini tek bir API isteğinde birleştirmeye çalışın. Bazı LLM sağlayıcıları bu tür toplu işlemlere izin verir veya farklı girişleri tek bir prompt içinde uygun formatta sunarak bu yaklaşım taklit edilebilir.
  • Önbellekleme (Caching): Daha önce özetlenmiş bir metin veya URL tekrar özetlenmek istendiğinde, LLM'ye tekrar istek göndermek yerine önbellekteki (bir veritabanı veya Redis gibi bir hafıza önbelleği) özeti geri döndürün. Bu, hem maliyeti düşürür hem de yanıt süresini önemli ölçüde hızlandırır.
  • Prompt Mühendisliği ile Token Azaltma: Prompt'unuz ne kadar uzun olursa, o kadar çok token kullanırsınız. Modele verdiğiniz talimatların kısa, öz ve net olduğundan emin olun. Ayrıca, özetlenecek metni gereksiz kısımlardan arındırmak (örneğin, reklamlar, menüler) token kullanımını azaltacaktır. Örneğin, web scraping yaparken sadece makale içeriğini hedeflemek, tüm sayfa HTML'sini değil.
  • Gereksiz Verilerden Arınma: Özetlenecek metni LLM'ye göndermeden önce, metinden gereksiz karakterleri, boşlukları, HTML etiketlerini veya özel karakterleri temizleyin. Bu, hem okunabilirliği artırır hem de token israfını önler.

Asenkron İşlemler ve Hata Yönetimi

Node.js'in asenkron yapısı, birden fazla işlemi eş zamanlı olarak yürütmek için idealdir. Örneğin, birden fazla URL'yi aynı anda çekmek veya birden fazla metni özetlemek isteyebilirsiniz. Promise.all bu tür senaryolar için mükemmel bir araçtır:


// src/utils.ts veya ayrı bir dosya
async function summarizeMultipleTexts(texts: string[]): Promise {
    const summaryPromises = texts.map(text => summarizeText(text)); // summarizeText önceki fonksiyon
    try {
        const summaries = await Promise.all(summaryPromises);
        return summaries;
    } catch (error) {
        console.error("Çoklu özetleme sırasında bir hata oluştu:", error);
        // Hatalı olanları uygun şekilde ele alabilirsiniz, örneğin boş string veya hata mesajı döndürerek
        return texts.map(() => "Hata oluştu, özetlenemedi.");
    }
}

// Örnek kullanım
async function runMultipleSummaries() {
    const articles = [
        "Bu ilk uzun makale metnidir...",
        "İkinci bir makale de buraya gelecek...",
        "Üçüncü ve son makale metni...",
    ];

    const summaries = await summarizeMultipleTexts(articles);
    summaries.forEach((s, i) => {
        console.log(\nMakale ${i + 1} Özeti:\n${s});
    });
}
// main fonksiyonunuzdan runMultipleSummaries() çağırabilirsiniz
    

Hata Yönetimi ve Yeniden Denemeler (Retry Mechanisms): API istekleri ağ sorunları, limit aşımı veya sunucu hataları nedeniyle başarısız olabilir. Bu durumlar için sağlam hata yönetimi ve yeniden deneme mekanizmaları eklemek, ajanın dayanıklılığını artırır. Bir istek başarısız olduğunda, belirli bir gecikmeyle (exponential backoff) tekrar denemek iyi bir stratejidir.

Mobil Uyumluluk ve UI/UX İpuçları

Eğer AI özetleyici ajanınızı bir web uygulaması aracılığıyla sunmayı planlıyorsanız, mobil uyumluluk modern web geliştirmenin olmazsa olmazıdır. Responsive tasarım prensiplerini uygulamak, farklı ekran boyutlarında kullanıcı deneyimini optimize eder.


/* style.css */
body {
    font-family: Arial, sans-serif;
    margin: 0;
    padding: 20px;
    background-color: #f4f7f6;
}

.container {
    max-width: 900px;
    margin: 0 auto;
    background-color: #fff;
    padding: 30px;
    border-radius: 8px;
    box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1);
}

.summary-output {
    background-color: #e9ecef;
    padding: 15px;
    border-radius: 5px;
    white-space: pre-wrap; /* Metin taşmasını engeller */
    word-wrap: break-word; /* Uzun kelimeleri böler */
}

/* Mobil cihazlar için responsive ayarlar */
@media (max-width: 768px) {
    .container {
        padding: 15px;
        margin: 10px;
    }
    h2 {
        font-size: 1.5em;
    }
    p {
        font-size: 0.9em;
    }
}

@media (max-width: 480px) {
    .container {
        border-radius: 0;
        box-shadow: none;
    }
    textarea, input {
        width: 100% !important; /* Mobil görünümde tam genişlik */
    }
}
    

Kullanıcı arayüzünde (eğer bir UI'nız varsa) şu noktalara dikkat edebilirsiniz:

  • Görsel Geri Bildirim: Özetleme işlemi zaman alabileceği için kullanıcıya bir yükleme animasyonu veya ilerleme göstergesi sunun.
  • Girdi Boyut Sınırları: Kullanıcılara özetleyebilecekleri maksimum metin veya URL boyutu hakkında bilgi verin.
  • Hata Mesajları: Kullanıcı dostu ve açıklayıcı hata mesajları sağlayın.

Bu optimizasyonlar, AI ajanınızın sadece işlevsel olmasını sağlamakla kalmaz, aynı zamanda maliyet etkin, hızlı ve kullanıcılar için keyifli bir deneyim sunmasına yardımcı olur. Büyük ölçekli uygulamalarda bu tür optimizasyonlar, projenin başarısı için vazgeçilmezdir.

İleri Düzey Konular: Ajana Bellek ve Bağlam Ekleme

Temel bir özetleyici ajan oluşturduktan sonra, sıra ajanı daha "akıllı" hale getirmeye gelir. Sıradan bir API çağrısı yapmaktan öteye geçerek, ajana belleği, bağlamı ve daha sofistike davranışları nasıl kazandırabileceğimizi bu bölümde inceleyeceğiz. Bu, özellikle etkileşimli veya çok adımlı görevlerde ajanların performansını ve kullanışlılığını önemli ölçüde artırır.

Gelişmiş Prompt Teknikleri ve Ajan Zincirleri

Tek bir prompt ile özetleme yapmak iyi bir başlangıçtır, ancak daha karmaşık görevler için genellikle birden fazla LLM çağrısını birleştirmek gerekir. Buna "ajan zincirleri" veya "prompt zincirleme" denir. Örneğin, bir metni özetlemeden önce, metnin içeriğine göre bir dizi soru sorarak önemli anahtar kelimeleri veya kavramları çıkarabilir, ardından bu anahtar kelimelerle zenginleştirilmiş bir özetleme prompt'u oluşturabilirsiniz. Bu, modelin daha odaklı ve ilgili bir özet üretmesini sağlar.

Bir başka ileri düzey prompt tekniği de ajana bir "persona" (kişilik) atamaktır. Örneğin, "Sen bir yatırım analistisin, bu şirket raporunu finansal riskler açısından özetle" veya "Sen bir tarihçisin, bu olayın kültürel etkilerini özetle" gibi talimatlar, modelin çıktısını belirli bir bakış açısına göre şekillendirmesini sağlar.


// src/advancedSummarizer.ts
// ... (OpenAI import ve dotenv.config() gibi temel ayarlar) ...

/**
 * Belirli bir perspektiften metni özetler.
 * @param text Özetlenecek metin.
 * @param perspective Özetleme için kullanılacak bakış açısı (örneğin "Yatırım Analisti", "Hukuk Uzmanı").
 * @returns Perspektife özel özet.
 */
async function summarizeWithPerspective(text: string, perspective: string): Promise {
    try {
        const completion = await openai.chat.completions.create({
            model: "gpt-4-turbo-preview", // Daha gelişmiş modeller daha iyi bağlam anlar
            messages: [
                { role: "system", content: Sen ${perspective} rolündesin. Aldığın metni, ${perspective} bakış açısıyla, ana hatlarıyla ve o alana özgü önemli noktaları vurgulayarak kısa ve öz bir şekilde özetle. },
                { role: "user", content: Aşağıdaki metni özetle:\n\n${text} },
            ],
            temperature: 0.5,
            max_tokens: 200,
        });

        if (completion.choices && completion.choices.length > 0 && completion.choices[0].message && completion.choices[0].message.content) {
            return completion.choices[0].message.content.trim();
        } else {
            return "Özet oluşturulamadı.";
        }
    } catch (error) {
        console.error("Perspektifli özetleme sırasında hata oluştu:", error);
        return Hata: ${error instanceof Error ? error.message : String(error)};
    }
}

// Örnek kullanım
async function runAdvancedSummarizer() {
    const financialReport = XYZ Corp'un 2023 yılı finansal raporu, şirketin gelirlerinde %15'lik bir artış gösterdiğini, ancak artan operasyonel maliyetler nedeniyle net kâr marjının %2 düştüğünü ortaya koydu. Şirket, yeni ürün geliştirme ve pazar genişlemesine önemli yatırımlar yaptı. Ancak, küresel ekonomik belirsizlikler ve artan faiz oranları, gelecek dönem için temkinli bir görünüm sunuyor. Yönetim kurulu, maliyet kontrol önlemleri ve verimlilik artışı stratejileri üzerinde duruyor.;

    console.log("\n--- Finansal Perspektiften Özet ---");
    const financialSummary = await summarizeWithPerspective(financialReport, "Yatırım Analisti");
    console.log(financialSummary);

    const newsArticle = Son yapılan araştırmalar, küresel ısınmanın deniz seviyelerini beklenenden daha hızlı yükselttiğini gösteriyor. Bilim insanları, buzullardaki erimenin hızlanması ve okyanusların ısınması nedeniyle önümüzdeki yüzyılda kıyı şehirlerinin ciddi risk altında olduğunu belirtiyor. Acil önlemler alınmazsa, milyonlarca insanın yaşam alanı tehdit altına girecek.;

    console.log("\n--- Çevre Aktivisti Perspektifinden Özet ---");
    const environmentalSummary = await summarizeWithPerspective(newsArticle, "Çevre Aktivisti");
    console.log(environmentalSummary);
}

runAdvancedSummarizer();
    

Vector Veritabanları ve RAG (Retrieval-Augmented Generation)

LLM'lerin bir dezavantajı, eğitim verilerinde olmayan güncel bilgilere erişememeleridir. Ayrıca, çok uzun metinleri (token limitlerini aşan) doğrudan işlemekte zorlanırlar. Bu sorunları çözmek için "Retrieval-Augmented Generation" (RAG) mimarisi ve "Vector Veritabanları" devreye girer. RAG, bir LLM'nin yanıt üretmeden önce harici bir bilgi tabanından (örneğin, belgeler, veritabanları, web sayfaları) ilgili bilgileri almasını sağlar. Bu sayede model, güncel ve spesifik verilere dayanarak daha doğru ve bağlama uygun yanıtlar üretebilir.

Bir RAG sisteminde:

  1. Uzun metinler veya belgeler küçük "parçalara" (chunks) ayrılır.
  2. Bu parçalar, "embedding modelleri" kullanılarak sayısal vektörlere dönüştürülür (anlamsal temsiller).
  3. Bu vektörler, Pinecone, Weaviate, ChromaDB gibi bir "vector veritabanına" kaydedilir.
  4. Bir kullanıcı bir sorgu (veya özetlenecek metin) gönderdiğinde, bu sorgu da vektöre dönüştürülür.
  5. Sorgu vektörü, veritabanındaki diğer vektörlerle karşılaştırılarak en benzer (anlamsal olarak ilgili) parçalar bulunur.
  6. Bu ilgili parçalar, orijinal sorguyla birlikte LLM'ye bir prompt olarak gönderilir.
  7. LLM, bu bağlam bilgisiyle zenginleştirilmiş prompt'u kullanarak bir özet veya yanıt üretir.

Bu yaklaşım, ajana harici ve güncel bir "bellek" kazandırır. TypeScript ekosisteminde LangChain.js veya LlamaIndex.ts gibi kütüphaneler, bu tür karmaşık RAG mimarilerini kurmayı kolaylaştıran güçlü araçlardır. Bu kütüphaneler, farklı LLM'leri, embedding modellerini, vector veritabanlarını ve zincirleme adımlarını bir araya getiren soyutlamalar sunar. Örneğin, bir doküman setini indeksleyip daha sonra bu set içindeki belirli bir konuyu özetleyen bir ajan geliştirebilirsiniz.

Bu ileri düzey konular, özetleyici ajanın sadece genel bilgilerle değil, aynı zamanda çok spesifik ve güncel verilerle çalışmasını sağlayarak ajanın yeteneklerini bambaşka bir seviyeye taşır. TypeScript geliştiricileri, bu kütüphanelerin sağladığı esneklik ve entegrasyon kolaylığı sayesinde, Python'daki benzer araçlardan geri kalmadan güçlü ve akıllı AI ajanları oluşturabilirler.

Sonuç: JavaScript'in AI Arenasındaki Yeri ve Gelecek Perspektifi

Bu makale boyunca, JavaScript ve özellikle TypeScript'in yapay zeka ajanı geliştirmedeki potansiyelini ve gücünü derinlemesine inceledik. Geleneksel olarak Python'ın hakim olduğu bu alanda, TypeScript'in tip güvenliği, ölçeklenebilirliği ve Node.js ekosisteminin asenkron performansıyla ne kadar rekabetçi bir alternatif olabileceğini gördük. Artık JavaScript geliştiricileri, yeni bir dil öğrenme bariyerini aşarak, mevcut yetenek setlerini kullanarak güçlü AI ajanları inşa edebilirler.

AI Summarizer Agent örneğimizle, basit bir metin özetleme işlevinden başlayarak, URL'lerden içerik çekmeye, performans ve maliyet optimizasyonuna, hatta ajana bellek ve bağlam eklemeye kadar birçok ileri düzey konuya değindik. Web kazıma tekniklerinden prompt mühendisliğine, asenkron programlamadan mobil uyumluluğa kadar birçok farklı disiplini bir araya getiren bu süreç, TypeScript'in çok yönlülüğünü ve modern AI uygulamaları için ne kadar uygun olduğunu gösterdi. Yapay zeka ajanları geliştirme süreci karmaşık olabilir, ancak TypeScript'in sağladığı araçlar, kütüphaneler (OpenAI API istemcisi, Cheerio, LangChain.js) ve ekosistem sayesinde bu süreç çok daha yönetilebilir ve keyifli hale geliyor. Gelecekte, TypeScript'in AI arenasında daha da önemli bir rol oynayacağı kesin. Özellikle web tabanlı AI uygulamalarının yükselişiyle birlikte, JavaScript'in her alanda kendini kanıtlamış bir dil olması, bu entegrasyonu daha da hızlandıracaktır. Bu nedenle, JavaScript geliştiricileri için yapay zeka dünyasına adım atmak hiç bu kadar kolay ve heyecan verici olmamıştı.

Sıkça Sorulan Sorular (SSS)

1. Neden Python yerine TypeScript ile AI ajanı geliştirmeliyim?

Cevap: Eğer zaten bir JavaScript geliştiriciyseniz, yeni bir dil öğrenme eğrisini ortadan kaldırır. TypeScript'in tip güvenliği ve Node.js'in performanslı asenkron yapısı, büyük ölçekli ve bakım gerektiren AI uygulamaları için mükemmel bir temel sağlar. Ayrıca, full-stack bir JavaScript geliştiricisi olarak hem front-end hem de back-end ve AI mantığını tek bir dilde yönetebilirsiniz, bu da geliştirme sürecini basitleştirir ve hızlandırır.

2. TypeScript'in AI kütüphane desteği Python kadar iyi mi?

Cevap: Geleneksel makine öğrenimi (örneğin derin öğrenme modellerinin eğitimi) için Python'ın TensorFlow, PyTorch gibi kütüphaneleri hala daha kapsamlıdır. Ancak, büyük dil modelleri (LLM'ler) ile çalışırken (API'ler aracılığıyla), TypeScript'in desteği oldukça güçlüdür. OpenAI, Anthropic gibi popüler LLM sağlayıcılarının resmi veya topluluk destekli TypeScript/JavaScript kütüphaneleri mevcuttur. Ayrıca LangChain.js ve LlamaIndex.ts gibi AI orkestrasyon kütüphaneleri de TypeScript'i desteklemektedir.

3. Özetleyici ajanın maliyetini nasıl düşürebilirim?

Cevap: Maliyeti düşürmek için çeşitli stratejiler uygulayabilirsiniz: Prompt'larınızı kısa ve öz tutarak token kullanımını azaltın. Özetlenecek metinleri LLM'ye göndermeden önce gereksiz kısımlardan temizleyin. Daha önce özetlenmiş metinler için önbellekleme (caching) kullanın. Eğer birden fazla özetleme göreviniz varsa, API'nin toplu istek özelliklerini (varsa) veya Promise.all kullanarak eş zamanlı çalıştırarak verimliliği artırın. Daha küçük ve maliyet etkin modelleri (örneğin, GPT-3.5-turbo yerine daha yeni, daha ucuz bir model veya açık kaynaklı modeller) kullanmayı değerlendirin.

4. URL'den içerik çekerken yasal veya etik sorunlar nelerdir?

Cevap: Web kazıma yaparken her zaman yasal ve etik konuları göz önünde bulundurmalısınız. Öncelikle, kazımak istediğiniz sitenin robots.txt dosyasını kontrol edin; bu dosya hangi sayfaların kazınmasına izin verildiğini veya yasaklandığını belirtir. Sitenin kullanım koşullarını okuyun. Çok yoğun isteklerle siteyi yavaşlatmaktan kaçının ve saygılı bir hızda kazıma yapın. Ayrıca, telif hakkı korunan içeriği ticari amaçlarla izinsiz kullanmaktan kaçınmalısınız. Kişisel veri içeren sayfaları kazımak, GDPR gibi veri koruma düzenlemelerine aykırı olabilir.

5. Hangi LLM'leri TypeScript ile kullanabilirim?

Cevap: OpenAI'nin GPT modelleri (GPT-3.5-turbo, GPT-4), Google'ın Gemini modelleri, Anthropic'in Claude modelleri gibi çoğu popüler LLM, genellikle REST API'leri aracılığıyla erişilebilir durumdadır. Bu API'ler, HTTP istemcileri (Axios, Fetch API) aracılığıyla veya sağlayıcıların resmi TypeScript/JavaScript SDK'ları (örneğin, OpenAI'nin openai paketi) ile kolayca entegre edilebilir. Açık kaynaklı modelleri (LLaMA gibi) kullanmak isterseniz, onları bir sunucuda barındırıp kendi API'nizi oluşturarak veya Hugging Face gibi platformların API'leri üzerinden erişerek entegre edebilirsiniz.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Gönder

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.
Exit mobile version