Paralel İşlev Çağrıları
Modelin aynı anda birden çok işlev çağırdığı yanıtları işleyin, bunları asyncio ile paralel olarak çalıştırın ve sonuçları tek bir takip API çağrısında toplu olarak gönderin.
Paralel İşlev Çağrıları, CoddyKit'te ücretsiz bir AI Engineering Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, AI Engineering Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. AI Engineering Academy kursu toplamda 4 dersten oluşur.
Paralel İşlev Çağrısı Nedir?
OpenAI'ın modelleri, yanıt için birkaç bağımsız kaynaktan bilgi gerektiğinde tek bir yanıtta birden fazla işlevi aynı anda çağırabilir. Her biri öncekinin tamamlanmasını bekleyen araç çağrılarını sırayla zincirlemek yerine model, birden çok araç çağrısını aynı anda üretir. Uygulamanız bunları paralel olarak çalıştırır ve tüm sonuçları birlikte geri göndererek gecikmeyi büyük ölçüde azaltır.
Paralel Araç Çağrılarını Tanıma
Model paralel araç çağrıları yaptığında yanıt iletisi, birden fazla giriş içeren bir tool_calls listesi barındırır. Her girişte benzersiz bir id, işlev adı ve bağımsız değişkenler bulunur. Sonraki API çağrısını yapmadan önce bunların tümünü işlemek zorundasınız — model yaptığı her araç çağrısı için sonuç bekler.
from openai import OpenAI
import json
client = OpenAI()
# A question that naturally requires two independent lookups
response = client.chat.completions.create(
model='gpt-4o',
messages=[{'role': 'user', 'content': 'Compare the weather in London and Tokyo right now.'}],
tools=tools
)
message = response.choices[0].message
print('Number of tool calls:', len(message.tool_calls))
# Might print: Number of tool calls: 2
for tc in message.tool_calls:
print(f' {tc.function.name}({tc.function.arguments})')
# get_current_weather({"location": "London"})
# get_current_weather({"location": "Tokyo"})asyncio ile Araç Çağrılarını Çalıştırma
asyncio.gather() kullanarak birden çok araç çağrısını eşzamanlı çalıştırın. Her araç işlevi ayrı bir ortak yordamda çalışır ve tüm ortak yordamlar tamamlandığında bütün sonuçlar toplanır. Her araç çağrısı bir ağ isteği yaptığında bu yöntem, sıralı çalıştırmadan çok daha hızlıdır.
import asyncio
import json
async def execute_tool_call_async(tool_call) -> tuple:
'''Execute a single tool call and return (tool_call_id, result).'''
name = tool_call.function.name
args = json.loads(tool_call.function.arguments)
# Async version of your tool (uses httpx, aiohttp, etc.)
if name == 'get_current_weather':
result = await async_get_weather(**args)
elif name == 'get_stock_price':
result = await async_get_stock(**args)
else:
result = f'Unknown tool: {name}'
return tool_call.id, str(result)
async def execute_all_parallel(tool_calls) -> list:
'''Execute all tool calls concurrently.'''
tasks = [execute_tool_call_async(tc) for tc in tool_calls]
results = await asyncio.gather(*tasks, return_exceptions=True)
return resultsTüm Sonuçları Birlikte Geri Gönderme
Tüm paralel araç çağrılarını çalıştırdıktan sonra her sonucu konuşmaya ayrı bir role='tool' iletisi olarak ekleyin. Her ileti, kendisiyle eşleşen tool_call_id değerini içermelidir. Modelin tüm sonuçları tek bir tutarlı yanıtta birleştirebilmesi için hepsini tek bir sonraki API çağrısında gönderin.
async def run_parallel_tool_calls(user_message: str) -> str:
messages = [{'role': 'user', 'content': user_message}]
response = client.chat.completions.create(
model='gpt-4o', messages=messages, tools=tools
)
assistant_message = response.choices[0].message
messages.append(assistant_message) # Add assistant's tool_calls
if response.choices[0].finish_reason == 'tool_calls':
# Execute all tool calls in parallel
results = await execute_all_parallel(assistant_message.tool_calls)
# Add all results to conversation
for tool_call_id, result in results:
messages.append({
'role': 'tool',
'tool_call_id': tool_call_id,
'content': result
})
# One more API call to synthesize results
final = client.chat.completions.create(model='gpt-4o', messages=messages)
return final.choices[0].message.content
return assistant_message.contentEşzamanlı Araçlar için ThreadPoolExecutor Kullanma
Araç işlevleriniz eşzamanlıysa (httpx yerine requests kullanıyorsa) bunları yine de concurrent.futures.ThreadPoolExecutor ile paralel çalıştırabilirsiniz. Kurulumu daha kolaydır ancak tamamen eşzamansız koda göre biraz daha verimsizdir.
from concurrent.futures import ThreadPoolExecutor, as_completed
import json
def execute_all_with_threads(tool_calls) -> list:
results = []
with ThreadPoolExecutor(max_workers=len(tool_calls)) as executor:
future_to_id = {
executor.submit(execute_tool_call, tc): tc.id
for tc in tool_calls
}
for future in as_completed(future_to_id):
tool_call_id = future_to_id[future]
try:
result = future.result(timeout=15)
except Exception as e:
result = f'Tool failed: {str(e)}'
results.append((tool_call_id, str(result)))
return resultsTek Tek Araç Hatalarını Ele Alma
Araç çağrılarını paralel olarak çalıştırırken biri başarısız olurken diğerleri başarılı olabilir. Tek bir hatanın diğerlerini engellemesine asla izin vermeyin. Bazı ortak yordamlar istisna oluştursa bile tüm sonuçları toplamak için asyncio.gather() içinde return_exceptions=True kullanın. Modelin tüm sonuçları almasını ve kısmi hatalar hakkında akıl yürütebilmesini sağlamak için istisnaları hata dizelerine dönüştürün.
async def safe_execute_all(tool_calls) -> list:
tasks = [execute_tool_call_async(tc) for tc in tool_calls]
raw_results = await asyncio.gather(*tasks, return_exceptions=True)
results = []
for tc, result in zip(tool_calls, raw_results):
if isinstance(result, Exception):
results.append((tc.id, f'Tool error: {str(result)}'))
else:
tool_call_id, output = result
results.append((tool_call_id, output))
return resultsModeller Paralel Çağrıları Ne Zaman Kullanır?
Model, gereken bilgilerin bağımsız şekilde toplanabileceğini belirlediğinde paralel araç çağrıları yapar — bir sonuç diğerine bağlı değildir. Örnek olarak birden çok hisse senedi sembolü için fiyatları alma, birden çok şehirde hava durumunu öğrenme veya birden çok veritabanı tablosunu sorgulama verilebilir. Sonuçlar birbirine bağlı olduğunda sıralı çağrılar yapılır — önce bir kullanıcı kimliğini arama, ardından bu kimlik için siparişleri alma.
Paralel Çağrılarda Hız Sınırlama
Çok sayıda araç çağrısını paralel çalıştırmak, dış API'leri eşzamanlı isteklerle aşırı yükleyebilir. Eşzamanlı araç çağrılarının en fazla sayısını sınırlamak için bir semaphore kullanın. Böylece API hız sınırlarına uyarken tamamen sıralı işlemeye göre daha verimli çalışmaya devam edersiniz.
import asyncio
async def rate_limited_execute_all(tool_calls, max_concurrent: int = 5) -> list:
semaphore = asyncio.Semaphore(max_concurrent)
async def limited_call(tc):
async with semaphore:
return await execute_tool_call_async(tc)
tasks = [limited_call(tc) for tc in tool_calls]
results = await asyncio.gather(*tasks, return_exceptions=True)
return [
(tc.id, str(r) if not isinstance(r, Exception) else f'Error: {r}')
for tc, r in zip(tool_calls, results)
]Sıralı ve Paralel Çağrıları Zincirleme
Gerçek dünyadaki aracı iş akışları genellikle sıralı ve paralel çağrıları birlikte kullanır. Model önce lookup_user(email) çağrısını yapabilir, ardından döndürülen user_id değerini kullanarak get_orders(user_id) ve get_preferences(user_id) çağrılarını paralel gerçekleştirebilir. Hangi çağrıların paralelleştirilebileceğini (bağımsız) ve hangilerinin sıralı olması gerektiğini (bağımlı) algılayacak dış döngüyü uygulayın.
async def multi_round_agent(user_message: str) -> str:
messages = [{'role': 'user', 'content': user_message}]
MAX_ROUNDS = 5
for _ in range(MAX_ROUNDS):
response = client.chat.completions.create(
model='gpt-4o', messages=messages, tools=tools
)
choice = response.choices[0]
messages.append(choice.message)
if choice.finish_reason == 'stop':
return choice.message.content # Done
if choice.finish_reason == 'tool_calls':
# Execute all tool calls in parallel (may be 1 or many)
results = await safe_execute_all(choice.message.tool_calls)
for tc_id, result in results:
messages.append({'role': 'tool', 'tool_call_id': tc_id, 'content': result})
# Loop continues for potentially sequential next call
return 'Max rounds reached.'Gecikme Azalmasını Ölçme
Paralel araç çağrıları gecikmeyi büyük ölçüde azaltabilir. Üç araç çağrısının her biri sıralı çalıştırmada 500 ms sürerse toplam süre 1500 ms olur. Bunları paralel çalıştırmak süreyi yaklaşık 500 ms'ye düşürür — bu da 3 kat hızlanma demektir. Eşzamanlılık ek yükünü ve hız sınırı kısıtlamalarını dikkate alarak, kendi senaryonuzda sıralı ve paralel çalıştırmayı her zaman ölçüp karşılaştırın.
import time
import asyncio
async def benchmark_parallel_vs_sequential():
tool_calls = [...] # 5 independent tool calls
# Sequential
start = time.time()
for tc in tool_calls:
await execute_tool_call_async(tc)
sequential_time = time.time() - start
# Parallel
start = time.time()
await asyncio.gather(*[execute_tool_call_async(tc) for tc in tool_calls])
parallel_time = time.time() - start
print(f'Sequential: {sequential_time:.2f}s')
print(f'Parallel: {parallel_time:.2f}s')
print(f'Speedup: {sequential_time/parallel_time:.1f}x')Paralel Araç Çağrılarında Hata Ayıklama
Paralel araç çağrısı sorunlarında hata ayıklarken istek-yanıt döngüsünün tamamını günlüğe kaydedin: modelin tüm tool_calls değerlerini içeren iletisini, konuşmaya eklenen her sonucu ve modelin son yanıtını. Bir araç sonucu eksikse veya sırası bozulmuşsa model tutarsız yanıtlar üretebilir. tool_call_id değerini ilişkilendirme anahtarı olarak kullanan yapılandırılmış günlük kaydı, sorunları izlemeyi çok kolaylaştırır.
Hızlı Kontrol
OpenAI ile paralel işlev çağrısı konusundaki anlayışınızı sınayın.
Ders Özeti
Bu derste şunları öğrendiniz: paralel araç çağrıları tool_calls listesinde birden çok girdi olarak görünür, asyncio.gather bunları en yüksek hız için eşzamanlı olarak yürütür ve her sonuç modele geri gönderilirken kendisiyle eşleşen tool_call_id değerine ihtiyaç duyar. Sırada, düz İngilizce sorguları SQL'e çevirmek için işlev çağrımını kullanan bir doğal dil veritabanı arayüzü oluşturacağız.
Sıkça Sorulan Sorular
“Paralel İşlev Çağrıları” dersi ücretsiz mi?
Evet — “Paralel İşlev Çağrıları” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve AI Engineering Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. AI Engineering Academy kursu toplamda 4 dersten oluşur.
“Paralel İşlev Çağrıları” dersinde ne öğreneceğim?
Modelin aynı anda birden çok işlev çağırdığı yanıtları işleyin, bunları asyncio ile paralel olarak çalıştırın ve sonuçları tek bir takip API çağrısında toplu olarak gönderin. AI Engineering Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
AI Engineering Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te AI Engineering Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“Paralel İşlev Çağrıları” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu AI Engineering Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her AI Engineering Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- API İçin İşlev Şemaları Tanımlama
- Uygulamanızda Araç Çağrılarını İşleme
- Paralel İşlev Çağrıları
- Doğal Dil Veritabanı Arayüzü Oluşturma