Merhaba,
Bu içeriğimizde, Semantic Kernel’da Multi-agent Orchestration yaklaşımı ile tek bir yapay zekâ agent’ının ötesine geçip, birden fazla agent’ın görev paylaşımı yaparak nasıl birlikte çalışma yapabileceklerini teorik olarak değerlendiriyor olacağız.
Multi-agent Orchestration Nedir?
Multi-agent Orchestration, birden fazla yapay zekâ agent’ının veya yazılım bileşeninin koordineli bir biçimde çalıştırılması ve yönetilmesi sürecidir.
Neden önemlidir?
Günümüzün karmaşık ve çok yönlü ihtiyaçları, iş süreçleri ve senaryolarında geleneksel tek agent’lı sistemler tüm görevlere yetenekleri açısından sınırlı kaldıklarından dolayı yetişememektedirler. Her biri, özel becerilere ve rollere sahip olan ve tek bir alana odaklanmış ve o alanda uzmanlaşmış birden fazla agent’ın bir araya gelip çalışması, çok yönlü ihtiyaçların giderilmesi açısından daha verimli ve güvenilir olmaktadır. Özellikle finans analizleri, tıbbi teşhisler, strateji planlamaları vs. gibi karmaşık ve hassas süreçlerde farklı perspektifler ve görev bölüşümleri kritik arz etmektedir. Bu tarz durumlarda özellikle alanında uzman ve sadece alanının bilinç ve sorumluluğuyla hareket eden agent’ların bir araya getirilip, gerekirse istişare ortamının kurulması ihtiyacına karşı gerçek bir çözüm sunmaktadır. İşte, orkestrasyon sayesinde birden fazla agent çatışmaksızın ve bilgi kaybetmeksizin birlikte çalışabilmekte ve süreci tıpkı insanlar gibi (ve insan ekipleri gibi) yürüterek, çalışma sergileyebilmektedirler.
Temel Özellikleri Nelerdir?
Multi-agent Orchestration yaklaşımı, agent’lar arasında şu temel özelliklere dayanmaktadır;
- Rol Tabanlı Agent’lar
Her bir agent; veri analizi, planlama, içerik üretimi vs. gibi belirli bir uzmanlık alanına odaklıdır. - Koordinasyon Katmanı
Semantic Kernel yahut AutoGen gibi araçlar, bu agent’ların görev sırasını, bilgi akışını ve önceliklerini yönetmekten sorumludurlar. - Context Paylaşımı
Agent’lar arasında paylaşılan context sayesinde bilgi kaybı olmadan iletişim kurulmaktadır. - Esneklik
Agent’lar gerektiğinde dinamik olarak eklenip, çıkarılabilmektedirler.
Orchestration Desenleri
Multi-agent Orchestration için farklı işbirliği senaryolarına özel düşünülmüş ve tasarlanmış çeşitli pattern’lar mevcuttur. Bu pattern’ların davranışları, Semantic Kernel’ın bir parçası olarak varlık göstermekte ve kolayca extend edilip, özelleştirilebilir bir vaziyette bizlere sunulmaktadır. Şimdi gelin bu pattern’ların davranışlarını tek tek hem teorik hem de pratik açılardan değerlendirmeye başlayalım.
Tabi, orchestration desenlerini .NET üzerinde deneyimleyebilmek için öncelikle aşağıda bahsedilen birkaç kütüphanenin yüklenmesi gerekmektedir.
- Microsoft.SemanticKernel
- Microsoft.SemanticKernel.Agents.Core
Semantic Kernel içinde agent tabanlı sistemler oluşturmak için temel sınıfları ve işlevleri sağlayan bir kütüphanedir.- Microsoft.SemanticKernel.Agents.Orchestration
Birden fazla agent’ın koordinasyonunu ve iş akışını yönetmek için kullanılan kütüphanedir. Agent’lar arası iletişim ve görev sıralamasını düzenlemektedir.- Microsoft.SemanticKernel.Agents.Runtime.InProcess
Agent’ların aynı süreç (process) içinde çalışmasını sağlayan bir runtime ortamı sunmaktadır. Hafif ve yerel uygulamalar için optimize edilmiştir.
-
Sequential Orchestration
İlk değerlendireceğimiz davranış pattern’lar arasındaki en basit ve anlaşılır olan Sequential Orchestration’dır. Bu pattern’da, agent’lar arasında sıralı bir işlem hattı oluşturmamız sağlanmaktadır.Böylece;
– Agent’lar sırayla (sequential) çalışırlar.
– Bir agent’ın çıktısı, bir sonraki agent’ın girdisi olur.
– Süreç, zincirleme bir akış (pipeline) gibi ilerler.Sequential Orchestration, basit ve deterministik bir akış sağlar. Yani bir işlem, sürekli aynı yönde aynı servisler üzerinden gerçekleştirilir. Genellikle metin işleme, veri hazırlama ve içerik üretimi gibi akışlarda bu davranış tercih edilmektedir.
Nasıl çalışmaktadır?
Kullanıcı veya sistem bir hedef belirler.
– 1. Adım : Agent 1, ilk görevi işler ve çıktıyı üretir.
– 2. Adım : Agent 2, Agent 1’in ürettiği çıktıyı alır ve görevi doğrultusunda işler.
– 3. Adım : Agent 3, Agent 2’nin ürettiği çıktıyı alır ve görevi doğrultusunda işler.
– Sonuç : Tüm adımlar tamamlandığında, finalde çıktı kullanıcıya sunulur.Misal olarak yukarıdaki şemaya göz atarsak eğer; bir belge özetleme, çevirme ve neticeyi kalite amaçlı kontrol etme sürecinin örneklendirildiğini görmekteyiz. Tüm bu süreç alanında uzman, sadece o alana odaklanmış agent’lar tarafından, sıralı bir şekilde ve sürekli aynı sırada olacak şekilde Sequential Orchestration yaklaşımıyla yürütülmektedir.
Örnek kullanımı görmek için tıklayınız
using Microsoft.SemanticKernel; using Microsoft.SemanticKernel.Agents; using Microsoft.SemanticKernel.Agents.Orchestration; using Microsoft.SemanticKernel.Agents.Orchestration.Sequential; using Microsoft.SemanticKernel.Agents.Runtime.InProcess; using Microsoft.SemanticKernel.ChatCompletion; using OpenAI; using System.ClientModel; var builder = WebApplication.CreateBuilder(args); builder.Services.AddKernel(); builder.Services.AddOpenAIChatCompletion( modelId: "qwen/qwen3-next-80b-a3b-instruct", openAIClient: new OpenAIClient( credential: new ApiKeyCredential(key: "sk-or-v1-5c09ffdba5961*******7547123d0be39"), options: new OpenAIClientOptions() { Endpoint = new Uri("https://openrouter.ai/api/v1") } ) ); var app = builder.Build(); app.MapGet("/run", async (Kernel kernel) => { ChatCompletionAgent coder = new ChatCompletionAgent { Name = "coderAgent", Instructions = "Sen kod yazıyorsun.", Kernel = kernel, Description = "Kod yazan agent." }; ChatCompletionAgent analyst = new ChatCompletionAgent { Name = "analyst", Instructions = "Sen yazılan kodu analiz ediyorsun.", Kernel = kernel, Description = "Kod analiz eden agent." }; SequentialOrchestration orchestration = new(coder, analyst) { LoggerFactory = LoggerFactory.Create(builder => builder.AddConsole()), StreamingResponseCallback = async (response, final) => { if (response.AuthorName != null) { Console.WriteLine($"\n[{response.AuthorName}]: {response.Content}"); } else { Console.WriteLine($"[System]: {response.Content}"); } } }; InProcessRuntime runtime = new(); await runtime.StartAsync(); OrchestrationResult<string> result = await orchestration.InvokeAsync( "1'den 100'e kadar olan tüm sayıları ekrana yazan C# kodunu yaz ve analiz ederek değerlendir.", runtime); string text = await result.GetValueAsync(TimeSpan.FromSeconds(120)); await runtime.RunUntilIdleAsync(); return text; }); app.Run();
-
Concurrent Orchestration
Concurrent Orchestration, birden fazla agent’ın eşzamanlı (concurrent) olarak aynı görev üzerinde çalıştırılmasını ve görevlerin paralel biçimde yürütülmesini sağlayan bir davranış sağlamaktadır. Her agent, girdiyi bağımsız olarak işleyecek ve sonuçları toplayarak bir araya getirecektir.
Bu yaklaşım tıpkı insanlar arasında yapılan beyin fırtınası, topluluk muhakemesi yahut oylama sistemi gibi farklı bakış açılarının veya çözümlerinin değerli olduğu senaryolar için oldukça uygundur.
Sequential pattern’da işler sırayla yapılırken, concurrent yaklaşımında ise agent’lar aynı anda farklı işleri üstlenebilmektedirler.
Yukarıdaki şemayı incelersek, birden fazla agent ile mevcut bir soruna karşı farklı çözümler üretildiğini ve nihai olarak da üretilen sonuçların toplanarak analiz edildiğini görmekteyiz. Bunun dışında, agent’ların aynı anda birden fazla işi de paylaşabilecekleri bir senaryo üzerinden davranış da sergilenebileceğinin bilincinde olunmalıdır.Çalışma mantığı :
– Görev Dağıtımı : Orkestratör, farklı agent’lara aynı anda görevler atar.
– Eşzamanlı Çalışma : Agent’lar birbirlerinden bağımsız şekilde kendi görevlerini yerine getirirler.
– Sonuç Toplama : Orkestratör, bu agent’ların ürettiği çıktıları birleştirir veya en iyisini geçer.
– Final Çıktı : Kullanıcıya bütünleşik nihai sonuç sunulur.Örnek kullanımı görmek için tıklayınız
using Microsoft.SemanticKernel; using Microsoft.SemanticKernel.Agents; using Microsoft.SemanticKernel.Agents.Orchestration; using Microsoft.SemanticKernel.Agents.Orchestration.Concurrent; using Microsoft.SemanticKernel.Agents.Runtime.InProcess; using OpenAI; using System.ClientModel; var builder = WebApplication.CreateBuilder(args); builder.Services.AddKernel(); builder.Services.AddOpenAIChatCompletion( modelId: "qwen/qwen3-next-80b-a3b-instruct", openAIClient: new OpenAIClient( credential: new ApiKeyCredential(key: "sk-or-v1-5c09ff***7547123d0be39"), options: new OpenAIClientOptions() { Endpoint = new Uri("https://openrouter.ai/api/v1") } ) ); var app = builder.Build(); app.MapGet("/run", async (Kernel kernel) => { ChatCompletionAgent physicist = new ChatCompletionAgent { Name = "physicist", Instructions = "Fizik konusunda uzmansın. Sorulara fizik perspektifinden cevap veriyorsun.", Kernel = kernel, Description = "Fizik konusunda uzman agent." }; ChatCompletionAgent chemist = new ChatCompletionAgent { Name = "chemist", Instructions = "Kimya konusunda uzmansın. Sorulara kimya perspektifinden cevap veriyorsun.", Kernel = kernel, Description = "Kimya konusunda uzman agent." }; ConcurrentOrchestration orchestration = new(physicist, chemist) { LoggerFactory = LoggerFactory.Create(builder => builder.AddConsole()), StreamingResponseCallback = async (response, final) => { if (response.AuthorName != null) { Console.WriteLine($"\n[{response.AuthorName}]: {response.Content}"); } else { Console.WriteLine($"[System]: {response.Content}"); } } }; InProcessRuntime runtime = new(); await runtime.StartAsync(); OrchestrationResult<string[]> result = await orchestration.InvokeAsync( "Sıcaklık nedir?", runtime); string[] texts = await result.GetValueAsync(TimeSpan.FromSeconds(120)); await runtime.RunUntilIdleAsync(); return string.Join(" | ", texts); }); app.Run();
-
Group Chat Orchestration
Bu davranışta ise isteğe bağlı olarak bir insan katılımcısını da içerebilecek şekilde agent’lar arasında işbirliğine dayalı bir konuşma ve istişare modeli ortaya koyulmaktadır. Bu modelde, tüm sohbet akışını koordine edecek olan bir grup sohbet yöneticisi bulunmaktadır. Bu yönetici, hangi agent’ın bir sonraki adımda yanıt vermesi gerektiğini ve ne zaman insan girdisi istenebileceğini belirlemektedir. Klasik toplantıları, tartışmaları ve işbirliğine dayalı problem çözme süreçlerini simüle etmek için oldukça güçlü bir pattern’dır.
Group Chat’te, agent’lar eşit katılımcılar gibi davranmaktadırlar. Agent’lar arasındaki sohbet ve istişare süreci adı üzerinde bir ‘sohbet odası’ havasında cereyan etmektedir. Esasında bu bir ortak iletişim kanalıdır desek yanlış olmaz. Bu kanal/sohbet odası üzerinde agent’lar fikir üretebilir, birbirlerinin çıktısına tepki verebilir, aralarında tartışabilir ve müzakere de bulunabilirler. Orkestratör (bu da bir nevi moderatör olan agent’tır), gerektiğinde süreci yönlendirir ve nihai çıktıyı derler.
Çalışma mantığı :
– Girdi Paylaşımı : Kullanıcıdan gelen görev/mesaj tüm agent’larla paylaşılır.
– Sohbet Aşaması : Agent’lar sanki bir ‘grup sohbetinde’ imiş gibi birbirlerine yanıt üretir, fikirlerini söyler veya eleştiride bulunurlar.
– Moderasyon : Bir orkestratör sorumluluğunu üstlenmiş olan agent tartışmayı düzenler. Olası çatışmaları çözmek ve konuyu odakta tutmak için çaba sarf eder.
– Sonuç Toplama : En iyi fikirler, çözümler veya özetler derlenerek kullanıcıya sunulur.Bu davranış, özellikle yaratıcı içerik üretimi ve stratejik planlama süreçleri gibi beyin fırtınası etkinliklerini yapay zekâ destekli uygulamak için oldukça elverişlidir. Bunların dışında bir konunun farklı yönlerini analiz etmek, farklı çözümleri tartışıp en iyisini seçmek ve farklı uzmanlıklara göre agent’lar arasında tartışma yaratmak için idealdir.
Örnek kullanımı görmek için tıklayınız
using Microsoft.SemanticKernel; using Microsoft.SemanticKernel.Agents; using Microsoft.SemanticKernel.Agents.Orchestration; using Microsoft.SemanticKernel.Agents.Orchestration.GroupChat; using Microsoft.SemanticKernel.Agents.Runtime.InProcess; using OpenAI; using System.ClientModel; var builder = WebApplication.CreateBuilder(args); builder.Services.AddKernel(); builder.Services.AddOpenAIChatCompletion( modelId: "qwen/qwen3-next-80b-a3b-instruct", openAIClient: new OpenAIClient( credential: new ApiKeyCredential(key: "sk-or-v1-5c09***547123d0be39"), options: new OpenAIClientOptions() { Endpoint = new Uri("https://openrouter.ai/api/v1") } ) ); var app = builder.Build(); app.MapGet("/run", async (Kernel kernel) => { ChatCompletionAgent writer = new ChatCompletionAgent { Name = "writer", Instructions = """ Uzun yıllara dayanan deneyime sahip bir metin yazarısın. Özlü anlatımın ve mizah anlayışınızla tanınıyorsunuz. Amacın, alanında uzman biri olarak metni geliştirmek ve en iyi metne karar vermektir. Her yanıt için yalnızca tek bir öneri sunmalısın. Elindeki hedefe odaklanın. Çılgın ve boş sohbetlerle zaman kaybetme! Bir fikri geliştirirken önerileri göz önünde bulundur. """, Kernel = kernel, Description = "Bir metin yazarı agent." }; ChatCompletionAgent editor = new ChatCompletionAgent { Name = "editor", Instructions = """ Metin yazarlığı konusunda fikirleri olan bir sanat yönetmenisin. Amacın, verilen metnin basılmaya uygun olup olmadığını belirlemektir. Eğer uygunsa, "Onaylıyorum" dersin. Uygun değilse, örnek vermeden önerilen metnin nasıl iyileştirilebileceğine dair fikir verirsin. """, Kernel = kernel, Description = "Editör agent." }; GroupChatOrchestration orchestration = new(new RoundRobinGroupChatManager { MaximumInvocationCount = 5 }, writer, editor) { LoggerFactory = LoggerFactory.Create(builder => builder.AddConsole()), StreamingResponseCallback = async (response, final) => { if (response.AuthorName != null) { Console.WriteLine($"\n[{response.AuthorName}]: {response.Content}"); } else { Console.WriteLine($"[System]: {response.Content}"); } } }; InProcessRuntime runtime = new(); await runtime.StartAsync(); OrchestrationResult<string> result = await orchestration.InvokeAsync( "Uygun fiyatlı ve sürüşü keyifli TOGG otomobili için slogan yaratın!", runtime); string texts = await result.GetValueAsync(TimeSpan.FromSeconds(120)); await runtime.RunUntilIdleAsync(); return string.Join(" | ", texts); }); app.Run();
-
Handoff Orchestration
Handoff Orchestration, multi-agent sistemlerinde bir agent’ın görevini tamamladıktan sonra, çıktısını başka bir agent’a ‘devretmesi’ (handoff) prensibine dayalı bir orkestrasyon desenidir.
Burada dikkat edilmesi gereken nokta şudur ki; Sequential Orchestration’da önceden belirlenmiş sıraya göre ilerleme söz konusuyken, Handoff Orchestration’da ise agent’lar sırasıyla değil, ihtiyaca göre devreye girerek ilerleme katedilmektedir. Görev akışı önceden sabitlenmiş değildir, dinamik olarak belirlenmektedir! Haliyle bu davranış için bir deterministik tutumun olmadığını söyleyebiliriz.
Bu yaklaşımda her agent, konuşmayı uygun uzmanlığa sahip başka bir agent’a devredeceği için görevin doğru agent’lar tarafından ele alınması sağlanmış olacaktır. Haliyle konunun bağlamına göre yönlendirmede bulunulması gereken müşteri desteği gibi dinamik yönlendirmenin gerektiği senaryolarda bu pattern oldukça elverişlidir. Ayrıca, sorunun türüne göre ilgili uzman agent’a aktarım gereken durumlarda, farklı departman/işlevler arasında süreç devirlerinde veya hastalık bulgularına göre doğru uzman hekime (agent’a) yönlendirmede bu davranış tercih edilebilir.
Örnek kullanımı görmek için tıklayınız
Bu modelin örneğinde Plugin’lerden istifade edeceğimizden dolayı öncelikle aşağıdaki gibi plugin’leri tanımlayalım;
public sealed class OrderRefundPlugin { [KernelFunction] public string ProcessReturn(string orderId, string reason) => $"'{orderId}' numaralı siparişin para iadesi başarıyla sağlanmıştır."; }
public sealed class OrderReturnPlugin { [KernelFunction] public string ProcessReturn(string orderId, string reason) => $"'{orderId}' numaralı siparişinizin iadesi başarıyla sağlanmıştır."; }
public sealed class OrderStatusPlugin { [KernelFunction] public string CheckOrderStatus(string orderId) => $"'{orderId}' numaralı siparişiniz kargoya verilmiştir. 2-3 gün içerisinde tarafınıza ulaşacaktır."; }
Ardından bu plugin’ler eşliğinde çalışmayı aşağıdaki gibi gerçekleştirelim;
using _4_Handoff_Orchestration.Plugins; using Microsoft.SemanticKernel; using Microsoft.SemanticKernel.Agents; using Microsoft.SemanticKernel.Agents.Orchestration; using Microsoft.SemanticKernel.Agents.Orchestration.Handoff; using Microsoft.SemanticKernel.Agents.Runtime.InProcess; using OpenAI; using System.ClientModel; var builder = WebApplication.CreateBuilder(args); builder.Services.AddKernel(); builder.Services.AddOpenAIChatCompletion( modelId: "qwen/qwen3-next-80b-a3b-instruct", openAIClient: new OpenAIClient( credential: new ApiKeyCredential(key: "sk-or-v1-5c09***47123d0be39"), options: new OpenAIClientOptions() { Endpoint = new Uri("https://openrouter.ai/api/v1") } ) ); var app = builder.Build(); app.MapGet("/run", async (Kernel kernel) => { ChatCompletionAgent triageAgent = new ChatCompletionAgent { Name = "triageAgent", Instructions = "Sorunları sınıflandıran müşteri destek agent'ısın.", Kernel = kernel, Description = "Müşteri taleplerini karşılayan agent." }; ChatCompletionAgent statusAgent = new ChatCompletionAgent { Name = "statusAgent", Instructions = "Sipariş durumu süreçlerini işleyen bir agent'sın.", Kernel = kernel, Description = "Sipariş durumunu kontrol eden müşteri destek agent'ı." }; statusAgent.Kernel.Plugins.AddFromObject(new OrderStatusPlugin(), nameof(OrderStatusPlugin)); ChatCompletionAgent returnAgent = new ChatCompletionAgent { Name = "returnAgent", Instructions = "Sipariş iade taleplerini yöneten agent'sın.", Kernel = kernel, Description = "Sipariş iadelerini yöneten müşteri destek agent'ı." }; returnAgent.Kernel.Plugins.AddFromObject(new OrderReturnPlugin(), nameof(OrderReturnPlugin)); ChatCompletionAgent refundAgent = new ChatCompletionAgent { Name = "refundAgent", Instructions = "Sipariş için geri ödeme iade taleplerini yöneten agent'sın.", Kernel = kernel, Description = "Sipariş için geri ödemeleri yöneten müşteri destek agent'ı." }; refundAgent.Kernel.Plugins.AddFromObject(new OrderRefundPlugin(), nameof(OrderRefundPlugin)); HandoffOrchestration orchestration = new(OrchestrationHandoffs .StartWith(triageAgent) .Add(triageAgent, statusAgent, returnAgent, refundAgent) .Add(statusAgent, triageAgent, "Sorun sipariş durumuyla ilgili değilse bu agent'a yönlendir.") .Add(returnAgent, triageAgent, "Sorun iade ile ilgili değilse bu agent'a yönlendir.") .Add(refundAgent, triageAgent, "Sorun geri ödeme ile ilgili değilse bu agent'a yönlendir."), triageAgent, statusAgent, returnAgent, refundAgent) { LoggerFactory = LoggerFactory.Create(builder => builder.AddConsole()), StreamingResponseCallback = async (response, final) => { if (response.AuthorName != null) { Console.WriteLine($"\n[{response.AuthorName}]: {response.Content}"); } else { Console.WriteLine($"[System]: {response.Content}"); } } }; InProcessRuntime runtime = new(); await runtime.StartAsync(); OrchestrationResult<string> result = await orchestration.InvokeAsync( "'123' numaralı siparişimle ilgili bilgi istiyorum.", runtime); string texts = await result.GetValueAsync(TimeSpan.FromSeconds(120)); result = await orchestration.InvokeAsync( "'123' numaralı siparişimin geri ödeme durumunu öğrenmek istiyorum!", runtime); texts += $"\n{(await result.GetValueAsync(TimeSpan.FromSeconds(120)))}"; await runtime.RunUntilIdleAsync(); return string.Join(" | ", texts); }); app.Run();
-
Magentic Orchestration
Magentic Orchestration, multi-agent sistemlerde orkestrasyonun ‘çekim gücü’ (magnetic) mantığıyla yürütüldüğü bir yaklaşımdır. Burada kastedilen şey, birden fazla hedefin/görevin olduğu ve bu hedefleri/görevleri çözmeye aday birden fazla agent’ın bulunduğu durumlarda orkestratörün, görevin doğasına en uygun agent’a veya agent grubuna ‘çekim’ esasına göre yönlendirme yapmasıdır. Yani agent’ların uzmanlık alanları ile görevlerin gereksinimleri arasında bir ‘manyetik eşleşme’ sağlanır.
Magentic Orchestration, AutoGen tarafından icat edilen MagenticOne modeline göre tasarlanmış bir davranışa sahiptir.
Yukarıdaki şemada; kullanıcı veya sistemden gelen bir görevin, orkestratör tarafından alınıp nasıl çözüldüğü planlanmaktadır. Task Ledger (Görev Defteri), görevle ilgili bilgileri kaydetmekte ve böylece hangi görev hangi agent’a verilecek sorusunun temel bilgi zeminini hazırlamaktadır. Progress Ledger (İlerleme Defteri) ise görevin ilerlemesini takip etmekte ve ‘görev tamam mı?’, ‘verimsiz döngü var mı?’, ‘ilerleme sağlanıyor mu?’ vs. şeklinde sorular eşliğinde görevin o anki ihtiyaçlara göre doğru agent’a yönlendirilebilmesi için agent seçim sürecini yürütmektedir. Ve şemada geriye kalan ifadeler ‘eğer ilerleme yoksa, başka agent’a ‘handoff’ yap’, ‘eğer çok fazla tıkanıklık (stall) durumu meydana gelirse, yeni karar mekanizmasını devreye sok’, ‘eğer görev tamamlanırsa, sonucu rapor et’ vs. şeklinde kontrol akışlarına karşılık gelmektedir.Kullanım örneği : Bir kullanıcı tarafından farklı makine öğrenimi modellerinin enerji verimliliği ile CO₂ emisyonlarını karşılaştıran kapsamlı bir raporu talep ettiğini varsayalım. Magentic manager, önce ilgili verileri toplaması için bir araştırma agent’ını görevlendirmekte, ardından analiz ve hesaplama işlerini bir kodlayıcı agent’a devretmektedir. Yönetici, araştırma ve hesaplamaların birden fazla turunu koordine etmekte ve bulguları bir araya getirerek, nihai çıktıyı ayrıntılı, yapılandırılmış bir rapor olarak sunmaktadır.
Örnek kullanımı görmek için tıklayınız
Not!
.NET’te bu yaklaşımı sergileyebilmek için ilgili projeye Microsoft.SemanticKernel.Agents.Magentic kütüphanesinin yüklenmesi gerekmektedir.
using Microsoft.SemanticKernel; using Microsoft.SemanticKernel.Agents; using Microsoft.SemanticKernel.Agents.Magentic; using Microsoft.SemanticKernel.Agents.Orchestration; using Microsoft.SemanticKernel.Agents.Runtime.InProcess; using Microsoft.SemanticKernel.ChatCompletion; using Microsoft.SemanticKernel.Connectors.OpenAI; using OpenAI; using System.ClientModel; var builder = WebApplication.CreateBuilder(args); builder.Services.AddKernel(); builder.Services.AddOpenAIChatCompletion( modelId: "qwen/qwen3-next-80b-a3b-instruct", openAIClient: new OpenAIClient( credential: new ApiKeyCredential(key: "sk-or-v1-5c0****47123d0be39"), options: new OpenAIClientOptions() { Endpoint = new Uri("https://openrouter.ai/api/v1") } ) ); var app = builder.Build(); app.MapGet("/run", async (Kernel kernel) => { ChatCompletionAgent researchAgent = new ChatCompletionAgent { Name = "researchAgent", Instructions = "Bir araştırmacısın. Ek hesaplama ve nicel analize gerek kalmadan bilgiye ulaşabilmektesin.", Kernel = kernel, Description = "Web aramalarına erişimi olan yardımcı bir agent." }; ChatCompletionAgent coderAgent = new ChatCompletionAgent { Name = "coderAgent", Instructions = "Soruları kod kullanarak çözmektesin. Detaylı analiz ve hesaplama süreçleri sağlıyorsun.", Kernel = kernel, Description = "Verileri işlemek ve analiz etmek için kod yazan ve çalıştıran agent." }; StandardMagenticManager manager = new(kernel.GetRequiredService<IChatCompletionService>(), new OpenAIPromptExecutionSettings()) { MaximumInvocationCount = 5, }; MagenticOrchestration orchestration = new(manager, researchAgent, coderAgent) { LoggerFactory = LoggerFactory.Create(builder => builder.AddConsole()), StreamingResponseCallback = async (response, final) => { if (response.AuthorName != null) { Console.WriteLine($"\n[{response.AuthorName}]: {response.Content}"); } else { Console.WriteLine($"[System]: {response.Content}"); } } }; InProcessRuntime runtime = new(); await runtime.StartAsync(); OrchestrationResult<string> result = await orchestration.InvokeAsync( """ Farklı makine öğrenimi model mimarilerinin enerji verimliliği üzerine bir rapor hazırlıyorum. ResNet-50, BERT-base ve GPT-2 modellerinin standart veri kümeleri üzerinde (örneğin; ResNet için ImageNet, BERT için GLUE, GPT-2 için WikiText) tahmini eğitim ve çıkarım (inference) enerji tüketimlerini karşılaştır! Daha sonra, her biri için CO₂ emisyonlarını tahmin et. Her modelin Azure Standard_NC6s_v3 sanal makinesi üzerinde 24 saay boyunca eğitildiğini varsay. """, runtime); string texts = await result.GetValueAsync(TimeSpan.FromSeconds(120)); await runtime.RunUntilIdleAsync(); return string.Join(" | ", texts); }); app.Run();
Magentic & Group Chat & Handoff Orchestration Karşılaştırması
Şimdi burada Magentic Orchestration’ın Group Chat ve Handoff Orchestration yaklaşımlarından fakının ne olduğunu sorabilirsiniz. Bunun için bu üçünü aşağıdaki tabloda mukayese etmek yerinde olacaktır;
Group Chat Orchestration | Handoff Orchestration | Magentic Orchestration | |
---|---|---|---|
İşleyiş | Agent’lar aynı ‘oda’da tartışır, fikir üretir, birbirlerine yanıt verirler. | Görev bir agent tarafından başlatılır, sonra dinamik olarak en uygun agent’a devredili. | Görev, özelliklerine göre doğal olarak en uygun agent(lar)a yönlendirilir. Sanki bir çekim kuvveti varmış gibi… |
Odak Noktası | Kolektif aklı amaç edinir. Farklı bakış açıları etkileşerek zengin sonuç çıkarır. | Dinamik ve seri görev akışını amaç edinir. | Görev – agent uyumunu gözetir. Doğru işi doğru agent’a vermeye odaklanır. |
Kontrol | Genellikle bir moderatör agent’ı tarafından tartışma düzenlenir. | Görevin hangi agent’a devredileceğine ya agent’ların iç mantığı ya da bir orkestratör karar verir. | Orkestratör, görev ile agent yetkinliklerini eşleştiren bir ‘eşleşme algoritması’ gibi davranır. |
Örnek | Beyin fırtınası; herkes aynı konuda fikir sunar. Nihai olarak ortak sonuç toplanır. | Müşteri destek hattı; çağrı konusuna göre müşteri teknik, finansal ya da hukuksal meselelerle ile ilgili agent’a aktarılır. | Araştırma platformu; istatiksel sorular analiz agent’ına, görsel talepler grafik agent’ına yönlendirilir. |
Kısa Karşılaştırma Tablosu | |||
---|---|---|---|
Özellik | Group Chat Orchestration | Handoff Orchestration | Magentic Orchestration |
Akış Tipi | Eşzamanlı sohbet | Dinamik görev devri | Görev-agent eşleştirmesi |
Kontrol Mekanizması | Moderatör/grup dinamiği | Dinamik karar (agent veya orkestratör) | Eşleşme algoritması veya orkestratör |
Odak | Kolektif tartışma | Görevin el değiştirmesi | Görevin doğru uzmana çekilmesi |
Avantaj | Zengin, yaratıcı sonuç | Esnek görev yölendirme | Akıllı, verimli görev dağıtımı |
Risk | Gürültü, konu dağılması | Fazla el değiştirme, gecikme | Yanlış eşleşme, uzman hatası |
Nihai olarak,
İçerik sürecinde, Semantic Kernel ile multi-agent davranışlarını ortak altyapılar sayesinde rahatlıkla gerçekleştirebildiğimizi ve gözlemlediğimiz bu yaklaşımlar eşliğinde, hem gereksinimlere göre gerekli işlevsellikleri devreye sokabildiğimizi hem de gerektiği taktirde iş mantığını baştan sona yeniden yazmak gibi zahmetlere katlanmaksızın desenler arasında kolayca geçişler yapabildiğimizi görmüş bulunuyor, ayrıca Semantic Kernel’ın, agent’lar arasındaki iletişim süreçlerinde hangi davranış olursa olsun koordinasyon ve sonuçların toplanmasına dair karmaşıklığı ortadan kaldırarak yalnız hedeflere odaklanmaya olanak tanıdığını gözlemlemiş bulunuyoruz.
İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…
Not : Örnek çalışmaya aşağıdaki GitHub adresinden erişebilirsiniz.
https://github.com/gncyyldz/SK_Multi_Agent_Orchestration_Example