🔧 Skill Nedir?
AI ajanları bağlamında, bir skill (aynı zamanda olarak adlandırılır tool or function) paketlenmiş, tekrar kullanılabilir bir yetenektir; LLM bunu bağlam penceresinin dışındaki dünyayla etkileşim için çağırabilir. Skills, dil anlayışı ile gerçek dünya eylemi arasındaki boşluğu kapatır.
Her skill dört bileşene sahiptir:
- Name — LLM'in skill'e referans vermek için kullandığı benzersiz bir tanımlayıcı (örn.,
web_search) - Description — skill'in ne yaptığını ve ne zaman kullanılacağını açıklayan doğal dil metni; LLM bunu hangi zaman skill'in çağrılacağına karar vermek için okur
- Girdi şeması — Argümanların yapılandırılmış tanımı (JSON Schema); model göreve göre bunları doldurur
- Implementation — Gerçek çalışan kod: bir API çağrısı, veritabanı sorgusu, shell komutu veya başka herhangi bir operasyon
Örnek: A get_weather skill açıklaması "Bir şehir için güncel hava durumunu getirir" olan, kabul eder { "city": "string" } girdi olarak ve bir hava durumu API'sini çağırır. LLM API anahtarını veya HTTP çağrısını asla görmez — sadece sonucu metin olarak alır.
⚙️ Araç Çağırma Nasıl Çalışır
Bir ajanın skills erişimi olduğunda, LLM onları doğrudan çağırmaz — bunun yerine requests yapılandırılmış bir çıktı üreterek bir çağrı yapar. Runtime (uygulama kodunuz) gerçek çağrıyı yürütür ve sonucu döndürür. Tam döngü şöyle:
- Araç kaydı — Kodunuz modele kullanılabilir skills listesini, açıklamaları ve şemaları gönderir
- Model muhakemesi — LLM görevi ve kullanılabilir araçları okur, hangi aracı hangi argümanlarla çağıracağına karar verir
- Araç çağrı isteği — Model yapılandırılmış bir "tool call" mesajı çıktılar (örn.,
{ "tool": "web_search", "args": { "query": "current Gemini models" } }) - Execution — Runtime kodunuz gerçek fonksiyonu, API'yi veya servisi çağırır
- Sonuç enjeksiyonu — Sonuç konuşma bağlamına tekrar eklenir
- Sürekli muhakeme — Model sonucu okur ve ya başka bir araç çağırır, takip soru sorar ya da nihai cevabı üretir
Bu döngü bir tur içinde birçok kez tekrarlanabilir. Karmaşık bir ajan görevi, nihai bir cevap üretilmeden önce ardışık olarak 10–20 araca çağrı yapabilir.
📊 Skills vs Plugins vs MCP Sunucuları
Terminoloji hızla evrildi. Kavramların tarihsel ilişkisi şöyle:
| Era | Name | Nasıl çalışıyordu | Status |
|---|---|---|---|
| 2023 | ChatGPT Plugins | OpenAPI spec ile kullanıcı tarafından kurulabilen uzantılar; ChatGPT onları HTTP ile çağırdı | Kaldırıldı (GPTs + tools ile değiştirildi) |
| 2023 | OpenAI Function Calling | API düzeyinde JSON Schema tanımları; model yapılandırılmış fonksiyon çağrısı üretir, kodunuz bunu yürütür | Aktif — yeniden adlandırıldı "tool use" |
| 2023– | Tool Use / Skills | Fonksiyon çağırmaya eşdeğer; Anthropic "tool use" terimini icat etti, diğerleri "skills" veya "functions" diyor | Aktif — mevcut standart |
| 2024– | MCP Sunucuları | Standardize edilmiş protokol (Anthropic, Dec 2024) tool sunucularını paketlemek ve dağıtmak için; herhangi bir MCP client herhangi bir MCP server ile bağlanabilir | Aktif — büyüyen ekosistem |
Ana fark: Geleneksel tool use uygulama kodunuz içinde tanımlanır. MCP sunucuları standart bir protokol üzerinden araçlar sunan bağımsız süreçlerdir — bunlar farklı AI istemcileri (Claude Desktop, Cursor, VS Code, özel ajanlar) arasında tekrar kullanılabilir. Daha fazla bilgi: MCP Nedir.
🗂️ Araç Kategorileri ve Risk Seviyeleri
Tüm araçlar aynı riski taşımaz. Risk seviyesine göre gruplandırma, ajanınızın için tanımlama yapmaya yardımcı olur eylem alanı ve insan-döngüde onay noktalarının nereye eklenmesi gerektiği:
| Category | Examples | Risk | Recommendation |
|---|---|---|---|
| Read-only | web_search, read_file, get_weather, list_dir | Low | Otonom olarak izin verin; tüm çağruları kaydedin |
| Yazma (yerel) | write_file, create_dir, edit_code | Medium | Sandboxlanmış bir çalışma dizinine sınırlayın |
| Ağ / Harici | send_email, post_to_slack, call_api | Orta–Yüksek | Geri alınamaz gönderimler için HITL onayı |
| OS / Shell | run_command, execute_script, install_package | High | Kapsayıcı ortama sınırlandırın; HITL gerekli |
| Destructive | delete_file, drop_table, revoke_access | Critical | Her zaman açık insan onayı gerektirir |
🏗️ İyi Bir Skill'in Anatomisi
Bir skill için en önemli tasarım kararı onun description. LLM hangi aracı çağıracağına karar vermek için açıklamaları okur — kötü yazılmış bir açıklama yanlış araç seçimine, eksik çağrılara veya belirsiz argümanlara yol açar.
Açıklamayı etkili kılan nedir
- Ne zaman kullanılacağını açıkça belirtin — "Kullanıcı gerçek zamanlı veri veya güncel olaylar hakkında soru sorduğunda bu aracı kullanın" ifadesi, "Web'de arama yapar" ifadesinden daha iyidir
- Yapmadığını belirtin — "30 günden eski tarihsel verileri döndürmez"
- Çıktı formatını tanımlayın — "Başlık, url ve snippet alanlarına sahip JSON dizisi döndürür"
- 200 kelimenin altında tutun — ~200 token'dan uzun açıklamalar, birçok araç kayıtlı olduğunda modelin dikkatini zorlayabilir
Şema tasarım ilkeleri
- Gerekli vs isteğe bağlı — Alanları gerçekten gerekli değilse required olarak işaretlemeyin; varsayılanlı isteğe bağlı alanlar model hatalarını azaltır
- Kısıtlı değerler için enum kullanın —
"format": {"enum": ["json", "markdown", "text"]}halüsinasyona uğramış değerleri önler - Idempotent araçları tercih edin — Güvenle yeniden denenebilen araçlar (okumalar, aramalar), tek seferlik eylemlerden (gönderimler, silmeler) daha güvenlidir
- Yapılandırılmış veri döndürün — JSON cevapları modelin yapılandırmamış metin blob'larına göre muhakeme yapmasını kolaylaştırır
💡 Gerçek Dünya Örnekleri
| Skill adı | Ne yapar | Ana argümanlar | Risk |
|---|---|---|---|
web_search | Bir arama motorunu sorgulayın ve en iyi sonuçları döndürün | query: string, num_results?: number | Low |
read_file | Çalışma dizininden bir dosya okuyun | path: string, offset?: number, limit?: number | Low |
write_file | Bir dosya oluşturun veya üzerine yazın | path: string, content: string | Medium |
run_tests | Proje test süitini çalıştırın ve sonuçları döndürün | filter?: string | Medium |
browser_screenshot | Bir URL'ye gidin ve ekran görüntüsü döndürün | url: string | Medium |
send_email | Bir veya birden fazla alıcıya e-posta gönderin | to: string[], subject: string, body: string | Yüksek — her zaman HITL |
run_shell | İstediğiniz bir shell komutunu yürütün | command: string, cwd?: string | Yüksek — sandbox gerekli |
✅ En İyi Uygulamalar
Minimum izinler
Her ajana, onun belirli görevi için ihtiyaç duyduğu araçları verin. Sadece SSS cevaplayan bir ajanın write_file or send_email. Eylem alanı ne kadar küçükse, ajan manipüle edilirse patlama yarıçapı o kadar küçük olur. Bakınız: Aşırı Ajans.
Tüm araç çağrılarını denetleyin
Her araç çağrısını argümanları ve sonucu ile birlikte kaydedin. Bu hata ayıklama, maliyet tahsisi ve anormal davranışların tespiti için (örn., bir ajanın ~/.ssh/ sadece proje dizinine erişmesi gerekirken) önemli olur. LangSmith gibi AgentOps platformları bunu kolaylaştırır.
Geri alınamaz eylemler için insan-döngüsü
Geri alınması zor veya imkansız olan herhangi bir eylem — mesaj gönderme, veri silme, satın alma — yürütmeden önce açık insan onayı gerektirmelidir. HITL kontrollerini sadece prompt'a değil, ajan runtime'ınıza yerleştirin. Promtlar geçersiz kılınabilir; kod kılınamaz.
Tool poisoning'e dikkat edin
Eğer ajanların dinamik olarak MCP sunucuları kurmasına veya keşfetmesine izin verirseniz, kötü niyetli bir sunucu gizli talimatlar içeren bir açıklama ile bir araç kaydedebilir. Araçları ajanınuzun kaydına eklemeden önce her zaman açıklamaları inceleyin. Bakınız: Tool Poisoning.
Açık hata dönüşleri yazın
Bir araç başarısız olduğunda, modelin kurtarması veya yükseltmesi için yeterli bağlamı içeren yapılandırılmış bir hata döndürün — ham istisna yığını değil. Örnek: { "error": "rate_limited", "retry_after": 5 }. İyi tanımlanmış bir hata, ajanın yeniden denemesine, yedek bir aracı kullanmasına veya kullanıcıyı zarifçe bilgilendirmesine olanak verir.