İçeriğe geç

Tool Definitions Caching: 50 Tool'lu Agent'ta Strateji

Modern agent'larda 20-50 tool var. Her tool definition ortalama 200-500 token. Toplam 10-25K token sadece tool listesi. Bu derste tool cache stratejilerini, dinamik tool seçimini ve sıralama trick'lerini öğreneceksin.

Şükrü Yusuf KAYA
14 dakikalık okuma
İleri

Tool Definitions: Cache'in Gizli Kazancı

Bir LLM agent'ı 50 tool'a sahip olsun (CRM, takvim, mail, dosya, kod, web, vb.). Her tool def 300 token = 15K token sadece tool listesi. Bu, çoğu uygulamada en büyük cache adayı.

Tool Cache'in Önemi#

Production agent'larda yapı:
[System: 2K] [Tools: 15K] ← burası genelde unutuluyor [KB: 30K] [History: 5K] [Query: 100]
Tools'u cache'lememek %25-30 cache miss demek. Üstüne bir de "exact prefix" gereği — bir tool eklersen tüm tools yeniden write.

Strateji 1: Sabit Tool Listesi + cache_control Son Tool'a#

En basit yöntem (Modül 3'te gördük):
python
TOOLS = [
{"name": "tool_1", "description": "...", "input_schema": {...}},
{"name": "tool_2", "description": "...", "input_schema": {...}},
# ...
{
"name": "tool_N",
"description": "...",
"input_schema": {...},
"cache_control": {"type": "ephemeral", "ttl": "1h"}, # ← son
},
]
# Tüm tools cache'lenir
Sabit liste + tek breakpoint
Avantaj: Basit, çalışır. Dezavantaj: Tools'u dinamik seçemiyorsun (örn. user role'üne göre).

Strateji 2: Tool Sırasını Stabilize Etme#

Tools listesini Python set'ten oluşturursan sıra değişebilir → cache miss:
python
# ❌ KÖTÜ — sıralama belirsiz
tools = list(tool_registry.values()) # dict ordering Python'da insertion order ama dependency olabilir
 
# ✅ İYİ — deterministik sıra
tools = sorted(tool_registry.values(), key=lambda t: t["name"])
Tool listesini deterministik sırala

Strateji 3: Tool Set'leri (Hierarchical Cache)#

Eğer farklı user'lara farklı tools gösterecekse, set'lere böl:
python
# Tool set'lerini sabit tut
BASE_TOOLS = [...] # herkes için (10 tool)
ADMIN_TOOLS = [...] # sadece admin (5 tool)
DEV_TOOLS = [...] # sadece geliştirici (8 tool)
 
def get_tools_for(user):
tools = list(BASE_TOOLS) # kopyala
if user.is_admin:
tools += ADMIN_TOOLS
if user.is_dev:
tools += DEV_TOOLS
# Cache_control'ü son tool'a koy
tools[-1] = {**tools[-1], "cache_control": {"type": "ephemeral"}}
return tools
 
# 4 user kategori = 4 ayrı cache pool (kullanıcı sayısı milyon olsa bile)
Tool set'lerini stabilize et
Hierarchical Pooling
Anahtar fikir: user-spesifik tool listesi olmaması, user kategorisine göre fixed set'ler olması. 1M user → 1M cache pool yok; 4 user category → 4 cache pool.

Strateji 4: Tool Description Stabilizasyonu#

Bazen tool description'ları dinamik üretiliyor (örn. internationalization):
python
# ❌ KÖTÜ — locale ile tool description değişir
def get_search_tool(locale):
if locale == "tr":
return {"name": "search", "description": "Ürün ara"}
elif locale == "en":
return {"name": "search", "description": "Search products"}
 
# ✅ İYİ — tek dilde, locale user message'a
def get_search_tool():
return {"name": "search", "description": "Search products in catalog"}
 
# Kullanıcı locale'i her zaman user mesajında belirt
user_msg = f"[Locale: {user.locale}]\n{query}"
# Asistan bu locale'i okur, tools'ta değil
Tool description'ları monolingual tut

Strateji 5: Tool Schema'larını JSON Stabilize Etme#

Tool input_schema'sı bazen JSON üretilirken farklı sıralanır:
python
import json
 
def stable_tool_schema(schema):
"""JSON schema'sını deterministik string'leştir."""
return json.loads(json.dumps(schema, sort_keys=True))
 
TOOLS = [
{
"name": "search",
"description": "...",
"input_schema": stable_tool_schema({
"type": "object",
"properties": {"query": {"type": "string"}, "limit": {"type": "integer"}},
"required": ["query"],
}),
},
]
JSON schema stabilization

Anti-Pattern: Tool'u Her Çağrıda Filtrelemek#

python
# ❌ KÖTÜ — query'ye göre relevant tools seç
def get_relevant_tools(query):
# Embedding similarity ile en alakalı 10 tool'u seç
relevant = vector_db.search(query, k=10)
return relevant
# Her query farklı tool subset'i → cache miss daimi
 
# ✅ İYİ — tüm tool'ları her zaman gönder
TOOLS = [...] # 50 tool
# 15K token cache'lenmiş; LLM zaten alakasız tool'ları çağırmaz
Tool subsetting → cache killer
Modern LLM'ler 50-100 tool'u sorunsuz değerlendirebiliyor. Alakasız tool'ları çağırmıyorlar. Subsetting'in eski mantığı (context limit'e sığsın diye) artık geçerli değil.

✓ Pekiştir#

Bir Sonraki Derste#

Modül 4 bitirme sınavı. Bilgini test et, geçince Modül 5'e (Context Engineering Prensipleri) ilerle.

Sık Sorulan Sorular

Genelde hayır. Modern modeller (Claude 3.5+, GPT-4o) 100+ tool'la çalışabiliyor. Bazı edge case'lerde 'tool confusion' olur (benzer 2 tool arasında karar). Önerim: tool description'larını net ayır ve test et.

Yorumlar & Soru-Cevap

(0)
Yorum yazmak için giriş yap.
Yorumlar yükleniyor...

İlgili İçerikler

Bağlantılı Pillar Konular

Bu yazının bağlandığı pillar konular