Phase 13: Tools & Protocols

Paralel Araç Aramaları ve Araçlarla Akışlama

Üç bağımsız hava durumu bakışları seriye üç dönüş yoludur. Onları paralel olarak çalıştırın ve toplam zaman en yavaş tek çağrıya düşer. Her sınır sağlayıcısı şimdi tek bir dönüşte birden fazla araç çağrısı yayınlar. Ödül gerçek; tesisat inceliktir. Bu ders iki yarıya da geçer: paralel fan-out ve akışlı argüman yeniden birleştirme, id-korrelasyon tuzağına vurgu.

Type: Build

Languages: Python (stdlib, thread pool + streaming harness)

Prerequisites: Phase 13 · 02 (function calling deep dive)

Time: ~75 minutes

Öğrenme Hedefleri

  • Nedenini açıkla parallel_tool_calls: truevar ve ne zaman devre dışı bırakılır.
  • Geçerli fan-out sırasında akışlı argüman parçalarını doğru araç çağrı kimliğine ilişkilendirin.
  • Bölümsel yeniden toplayın argumentsİpuçları erken analiz etmeden tamamlanmış JSON'a çevirir.
  • Üç şehir hava durumu referansını çalıştırın ve sıralı ve paralel gecikme gösterilsin.

Sorun

Paralel aramalar olmadan, "Bengaluru, Tokyo ve Zürih'te hava nasıl" diye cevap veren bir ajan şöyle yapar:

user -> LLM
LLM -> call get_weather(Bengaluru)
host -> run executor, reply with result
LLM -> call get_weather(Tokyo)
host -> run executor, reply with result
LLM -> call get_weather(Zurich)
host -> run executor, reply with result
LLM -> final text answer

Üç LLM geri dönüş yolculuğu, her biri de uygulayıcının gecikmesini ödüyor.

Paralel aramalar:

user -> LLM
LLM -> call get_weather(Bengaluru); call get_weather(Tokyo); call get_weather(Zurich)
host -> run all three executors concurrently, reply with three results
LLM -> final text answer

Bir LLM geri dönüş yolculuğu. İcra süresi toplam değil, üçünün en iyisidir. OpenAI, Anthropic ve Gemini'deki üretim referansları fan-out iş yüklerinde %60 ila 70% duvar saati azaltmayı gösterir.

Üç çağrı tamamlandığında sonuçlarınız eşleşmeyi taşımalıdır.tool_call_idGemini 3'ün gerçek dünyadaki bir sorunun çözülmesi için benzersiz kimlikler ekledi.

Anlaşım

paralelliği sağlayan

  • OpenAI. parallel_tool_calls: trueÖntanımlı olarak açıldı.falseSeri zorlama.
  • Anthropic.Dönüştürme yoluyladisable_parallel_tool_use: false(Standard Claude 3.5 ve üstü) ayar trueSeri için.
  • Gemini.Her zaman paralel olabilir .tool_config.function_calling_config.mode = "AUTO"model karar versin.

Araçların sıralama bağımlılıkları olduğunda paralelleri devre dışı bırak (create_fileO zaman ...write_file), bir çağrının çıkışı diğerinin girişini bilgilendirdiğinde veya hız sınırlayıcı fan-out'u idare edemediğinde.

İd ilişkisi

Model gönderdiği her çağrıda bir idEv sahibi gönderdiği her sonuç aynı kimliği içermelidir.

  • OpenAI. tool_call_idHer araç rolü mesajında.
  • Anthropic. tool_use_idHer birindetool_result- Blok.
  • Gemini. idHer birindefunctionResponse(Gemini 3 ve üst; Gemini 2 isimle eşleşirken aynı isimli paralel aramalar için kırıldı).

Aynı anda aramalar yapılıyor

Ev sahibi her çağrı icracı'nı kendi ip, coroutine veya uzaktan çalışan üzerinde çalıştırır. En basit harness bir ip havuzu kullanır; üretim asyncio ile asyncio.gatherTamamlama sırası öngörülemez kimlik tanımlayıcıdır.

Genel bir hata: cevaplama sonuçları, tamamlama sırası yerine çağrı listesi sırası ile. Bu genellikle çalışır çünkü model sadece tool_call_id, ama sonuç düşürülürse veya çoğaltılırsa, sipariş dışı gönderme debugging zorlaştırır.

Akış araç çağrıları

Model akışlar sırasında,argumentsÜç paralel arama için üç parça akışları telde birbirine karışır.

Sağlayıcıya göre şekli:

  • OpenAI.Her parça choices[0].delta.tool_calls[i].function.arguments(Bölüm akrabası)index(Çalışmalar listesinde konum) İndeks başına biriktirir, oku idilk kez görüntülene kadar ve JSON'u analiz ederkenfinish_reason = "tool_calls"- Evet .
  • Anthropic.Akış olayları message_startSonra bir tane .content_block_startTip ile blok başına tool_use(İsim, isim, boş giriş içerir). content_block_deltaolaylar input_json_delta- Çubuklar.content_block_stopHer blokunu kapatıyor.
  • Gemini. streamFunctionCallArguments(Gemini 3 ve üstü) bir functionCallIdGemini 3'den önce akışlar bir seferde bir arama geri gönderdi.

kısmi JSON ve analiz- erken tuzağı

Anlamıyorsun .argumentsBu, tamamlanana kadar.{"city": "BengDoğru kapı, sunucu tarafından gönderilen arama sonu sinyalidir: OpenAI'nin finish_reason = "tool_calls", Anthropic's content_block_stop...veya Geminin akış sonu olayı.json.loadsDaha güçlü bir yaklaşım, yapı tamamlandığında olayları üreten bir eksel JSON analizcisi kullanır; OpenAI'nin akış rehberliği bunu canlı bir "düşünme" göstergesi gösteren UX için önerir. Brace sayımı bir tamamlayıcılık testi olarak güvenilir değildir (sıkı alıntılı dizileri içindeki braces veya kaçan içerik yanlış pozitif neden olur) ve sadece bir resmi hata defektörü heuristik olarak kullanılmalıdır.

Sipariş dışı tamamlama

call_A: fast API, returns first
call_B: slow API, returns second
call_C: median API, returns third

Ev sahibi cevap yine de kimliklerini belirtmelidir:

[{role: "tool", tool_call_id: "call_A", content: ...},
 {role: "tool", tool_call_id: "call_B", content: ...},
 {role: "tool", tool_call_id: "call_C", content: ...}]

Yanıtdaki sipariş, OpenAI veya Anthropic'de doğruluk için önemli değildir.

Benchmark: sıralı vs paralel

  • Kırmızı .code/main.py400, 600 ve 800 ms gecikme ile üç uygulayıcı simüle eder. Sequential onu toplam 1800 ms ile çalışır. Paralel olarak maksimum 400, 600, 800) = 800 ms ile çalışır. Fark sabit, orantısızdır, bu nedenle tasarruf araç sayısıyla birlikte büyür.

Gerçek dünya uyarısı: paralel aramalar aşağı akıntılı API'leri strese düşürür. Tarif sınırlı bir hizmet için 10 yönlü bir fan-out başarısız olur. 13 · 17 aşaması geçit seviyesindeki geri baskıyı kapsar; gelecek aşama için tekrar semantik deneyin planlanıyor.

Akıştı fan-out duvar saati

Eğer model kendi akışlar ise, tüm aramaların tamamlanmasını beklemek yerine, bir çağrı argümanları tamamlandığında çalışmaya başlayabilirsiniz. Bu bir optimizasyon OpenAI belgeleri ama tüm SDK'ler ortaya çıkarmaz. Bu dersdeki harness bunu yapar: simülasyon akışı tam bir argüman nesnesini verdiğinde, ev sahibi bu çağrıyı başlatır.

Kullan

code/main.pyİlk üç simülasyonlu hava çağrısı kullanılarak sıradan ve paralel olarak çalışır.concurrent.futures.ThreadPoolExecutorİkinci yarıda sahte bir akış tepkisi tekrarlanıyor.arguments bir akışta birbirine geçiyor ve her bir ID ile yeniden birleştirirStreamAccumulator- Yüksek lisans yok, ağ yok, sadece yeniden monte edilme mantığı.

Neye bakılır:

  • Sıradan zamanlayıcı 1.8 saniye, paralel zamanlayıcı 0.8 saniye aynı sahte gecikmelerde.
  • Akkumülatör, her çağrının JSON'u tamamlandığında sadece bir kimlik için tamponlama yaparak ve analiz ederek düzensiz gelen parçaları ele alır.
  • İd argümanları biterken, tüm akışlar biterken değil.

Gönder

Bu ders bize çok yararlı .outputs/skill-parallel-call-safety-check.md. Bir araç rejistrisini göz önüne alarak, hangi araçların paralelleştirilmesi güvenli, hangi araçların sipariş bağımlılıkları olduğu ve aşağıdaki oran sınırlarını aşacak becerileri denetleme her araçla birlikte gözden geçirilmiş bir kayıt iade etmek parallel_safeBayraklar.

Egzersizler

  1. Çık .code/main.pyparalel-sökensel oranın yaklaşık olarak max/sum(gerçek çalışmalar, ip programlaması, serileşme ve harness overhead nedeniyle idealden biraz sapmaktadır). Hangi gecikme dağılımında paralel çalışmayı durdurur?
  1. Akkumaylateri, tamponu düşürerek ve bir cancelledBu davayı açıkça hangi tedarikçi belgeledi?content_block_stopSemantik ve OpenAI'nin finish_reason: "length"davranış.
  1. İçeği ile değiştirin .asyncio.gatherAsync'de küçük kazançlar görmelisin çünkü bağlam değiştirme maliyeti daha düşük, ama sadece uygulayıcılar gerçek I/O yaparsa.
  1. İki alet seçin ki paralelleşmemeleri gerekir (örneğin create_fileO zaman ...write_file Ekleordering_dependencyBu, gelecekte ajan mühendisliği aşamasında resmileştirilen bağımlılık bilincili programlama için en az makinedir.
  1. OpenAI'nin paralel fonksiyon çağrıları bölümünü ve Anthropic'in disable_parallel_tool_useAntropic paralelliği devre dışı bırakmayı önerdiği tek gerçek dünya araç türünü belirleyin.

Anahtar Terimler

TermWhat people sayWhat it actually means
Parallel tool calls"Fan-out in one turn"Model emits multiple tool calls in a single assistant message
parallel_tool_calls"OpenAI's flag"Enable or disable multi-call emission
disable_parallel_tool_use"Anthropic's inverse"Opt-out flag; default is parallel enabled
Tool call id"Correlation handle"Per-call identifier the result message must echo
Accumulator"Stream buffer"Per-id string buffer for partial arguments chunks
Out-of-order completion"Fastest first"Parallel calls finish in unpredictable order; ids are the glue
Dependency graph"Ordering constraints"Tools whose outputs feed into inputs of other tools; cannot parallelize
Parse-early trap"JSON.parse exploded"Attempting to parse an incomplete arguments string
streamFunctionCallArguments"Gemini 3 feature"Streamed argument chunks with unique id per call
Completion-order reply"Don't wait for all"Reply with results as they arrive, keyed by id

Daha Fazla Okumak

This free lesson is part of the AI Engineering from Scratch curriculum. Read the full explanation, run the lesson code, and verify the result in the interactive reader or from the repository source.

Browse the complete course catalog or open this lesson on GitHub.