Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Önemli
Aracı Çerçevesi'ndeki Aracı Orkestrasyonu özellikleri deneysel aşamadadır. Bunlar etkin geliştirme aşamasındadır ve önizleme veya sürüm adayı aşamasına geçmeden önce önemli ölçüde değişebilir.
Grup sohbeti düzenleme, isteğe bağlı olarak bir insan katılımcısı da dahil olmak üzere aracılar arasında işbirliğine dayalı bir konuşmayı modeller. Grup sohbet yöneticisi akışı koordine eder ve bundan sonra hangi aracının yanıt vermesi gerektiğini ve ne zaman insan girişi istenmesi gerektiğini belirler. Bu düzen toplantıların, tartışmaların veya işbirliğine dayalı sorun çözme oturumlarının benzetiminde güçlüdür.
Desen hakkında daha fazla bilgi edinmek için örneğin, desenin ne zaman kullanılacağı veya iş yükünüzdeki desenden ne zaman kaçınılması gerektiğini öğrenmek için bkz. Grup sohbeti düzenleme.
Genel Kullanım Örnekleri
Farklı departmanları temsil eden temsilciler, bir iş teklifini tartışır, konuşmayı gerektiğinde denetleyen ve bir insanı dahil eden bir yönetici temsilcinin moderatörlüğünde.
Öğrenecekler
- Grup sohbeti için farklı rollere sahip aracıları tanımlama
- Konuşma akışını denetlemek için grup sohbet yöneticisini kullanma
- İnsan katılımcısını konuşmaya dahil etme
- Konuşmayı gözlemleme ve nihai sonucu toplama
Temsilcilerinizi tanımlayın
Grup sohbetindeki her temsilci belirli bir role sahiptir. Bu örnekte, bir metin yazarı ve gözden geçiren tanımlayacağız.
Tavsiye
ChatCompletionAgent burada kullanılır, ancak herhangi bir aracı türünü kullanabilirsiniz.
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Agents;
using Microsoft.SemanticKernel.Agents.Orchestration;
using Microsoft.SemanticKernel.Agents.Orchestration.GroupChat;
using Microsoft.SemanticKernel.Agents.Runtime.InProcess;
// Create a kernel with an AI service
Kernel kernel = ...;
ChatCompletionAgent writer = new ChatCompletionAgent {
Name = "CopyWriter",
Description = "A copy writer",
Instructions = "You are a copywriter with ten years of experience and are known for brevity and a dry humor. The goal is to refine and decide on the single best copy as an expert in the field. Only provide a single proposal per response. You're laser focused on the goal at hand. Don't waste time with chit chat. Consider suggestions when refining an idea.",
Kernel = kernel,
};
ChatCompletionAgent editor = new ChatCompletionAgent {
Name = "Reviewer",
Description = "An editor.",
Instructions = "You are an art director who has opinions about copywriting born of a love for David Ogilvy. The goal is to determine if the given copy is acceptable to print. If so, state that it is approved. If not, provide insight on how to refine suggested copy without example.",
Kernel = kernel,
};
İsteğe bağlı: Aracı Yanıtlarını Gözlemleme
ResponseCallback özelliği aracılığıyla sıra ilerledikçe aracı yanıtlarını yakalamak için bir geri çağırma oluşturabilirsiniz.
ChatHistory history = [];
ValueTask responseCallback(ChatMessageContent response)
{
history.Add(response);
return ValueTask.CompletedTask;
}
Grup Sohbeti Düzenlemeyi Ayarlama
Aracıları, grup sohbet yöneticisini (burada, bir GroupChatOrchestration) ve yanıt geri çağırmasını geçirerek bir RoundRobinGroupChatManager nesne oluşturun. Yönetici akışı denetler; burada, belirli sayıda tur için sıra ile dönüşümlü olarak ilerler.
GroupChatOrchestration orchestration = new GroupChatOrchestration(
new RoundRobinGroupChatManager { MaximumInvocationCount = 5 },
writer,
editor)
{
ResponseCallback = responseCallback,
};
Çalışma Zamanını Başlat
Aracıların yürütülmesini yönetmek için bir çalışma zamanı gereklidir. Burada InProcessRuntime kullanıyoruz ve bunu, orkestrasyonu çağırmadan önce başlatıyoruz.
InProcessRuntime runtime = new InProcessRuntime();
await runtime.StartAsync();
Orchestration'ı başlat
İlk göreviniz ile düzenlemeyi çağırın (örneğin, "Yeni bir elektrikli SUV için bir slogan oluşturun..."). Ajanlar sırayla yanıt verecek ve sonucu iyileştirecektir.
var result = await orchestration.InvokeAsync(
"Create a slogan for a new electric SUV that is affordable and fun to drive.",
runtime);
Sonuçları Topla
Orkestrasyonun tamamlanmasını bekleyin ve nihai çıktıyı alın.
string output = await result.GetValueAsync(TimeSpan.FromSeconds(60));
Console.WriteLine($"\n# RESULT: {text}");
Console.WriteLine("\n\nORCHESTRATION HISTORY");
foreach (ChatMessageContent message in history)
{
this.WriteAgentChatMessage(message);
}
İsteğe bağlı: Çalışma Zamanını Durdur
İşlem tamamlandıktan sonra kaynakları temizlemek için çalışma zamanını durdurun.
await runtime.RunUntilIdleAsync();
Örnek Çıkış
# RESULT: “Affordable Adventure: Drive Electric, Drive Fun.”
ORCHESTRATION HISTORY
# Assistant - CopyWriter: “Charge Ahead: Affordable Thrills, Zero Emissions.”
# Assistant - Reviewer: The slogan is catchy but it could be refined to better ...
# Assistant - CopyWriter: “Electrify Your Drive: Fun Meets Affordability.”
# Assistant - Reviewer: The slogan captures the essence of electric driving and ...
# Assistant - CopyWriter: “Affordable Adventure: Drive Electric, Drive Fun.”
Tavsiye
Örnek kodun tamamına buradan ulaşabilirsiniz
Temsilcilerinizi tanımlayın
Grup sohbetindeki her temsilci belirli bir role sahiptir. Bu örnekte:
- Yazar: Geri bildirime dayalı olarak içerik oluşturur ve düzenler.
- Gözden Geçiren: İçeriği gözden geçirip iyileştirme için geri bildirim sağlar.
Tavsiye
ChatCompletionAgent burada Azure OpenAI ile kullanılır, ancak herhangi bir aracı türünü veya model hizmetini kullanabilirsiniz.
from semantic_kernel.agents import Agent, ChatCompletionAgent
from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion
def get_agents() -> list[Agent]:
writer = ChatCompletionAgent(
name="Writer",
description="A content writer.",
instructions=(
"You are an excellent content writer. You create new content and edit contents based on the feedback."
),
service=AzureChatCompletion(),
)
reviewer = ChatCompletionAgent(
name="Reviewer",
description="A content reviewer.",
instructions=(
"You are an excellent content reviewer. You review the content and provide feedback to the writer."
),
service=AzureChatCompletion(),
)
return [writer, reviewer]
Aracı Yanıtlarını Gözlemleme
Konuşma ilerledikçe, her bir temsilcinin iletisini yazdırmak için bir callback (geri çağırma) tanımlayabilirsiniz.
from semantic_kernel.contents import ChatMessageContent
def agent_response_callback(message: ChatMessageContent) -> None:
print(f"**{message.name}**\n{message.content}")
Grup Sohbeti Düzenlemeyi Ayarlama
Ajanları, bir grup sohbet yöneticisini (bu durumda bir GroupChatOrchestration) ve yanıt geri çağırmayı geçirerek bir RoundRobinGroupChatManager nesnesi oluşturun. Yönetici akışı denetler; burada, belirli sayıda tur için sıra ile dönüşümlü olarak ilerler.
from semantic_kernel.agents import GroupChatOrchestration, RoundRobinGroupChatManager
agents = get_agents()
group_chat_orchestration = GroupChatOrchestration(
members=agents,
manager=RoundRobinGroupChatManager(max_rounds=5), # Odd number so writer gets the last word
agent_response_callback=agent_response_callback,
)
Çalışma Zamanını Başlat
Aracı çalıştırmayı yönetmek için çalışma zamanını başlatın.
from semantic_kernel.agents.runtime import InProcessRuntime
runtime = InProcessRuntime()
runtime.start()
Orchestration'ı başlat
İlk göreviniz ile düzenlemeyi çağırın (örneğin, "Yeni bir elektrikli SUV için bir slogan oluşturun..."). Ajanlar sırayla yanıt verecek ve sonucu iyileştirecektir.
orchestration_result = await group_chat_orchestration.invoke(
task="Create a slogan for a new electric SUV that is affordable and fun to drive.",
runtime=runtime,
)
Sonuçları Topla
Düzenlemenin tamamlanmasını bekleyin.
value = await orchestration_result.get()
print(f"***** Final Result *****\n{value}")
İsteğe bağlı: Çalışma Zamanını Durdur
İşlem tamamlandıktan sonra kaynakları temizlemek için çalışma zamanını durdurun.
await runtime.stop_when_idle()
Örnek Çıkış
**Writer**
"Drive Tomorrow: Affordable Adventure Starts Today!"
**Reviewer**
This slogan, "Drive Tomorrow: Affordable Adventure Starts Today!", effectively communicates the core attributes...
**Writer**
"Embrace the Future: Your Affordable Electric Adventure Awaits!"
**Reviewer**
This revised slogan, "Embrace the Future: Your Affordable Electric Adventure Awaits!", further enhances the message...
**Writer**
"Feel the Charge: Adventure Meets Affordability in Your New Electric SUV!"
***** Result *****
"Feel the Charge: Adventure Meets Affordability in Your New Electric SUV!"
Tavsiye
Örnek kodun tamamına buradan ulaşabilirsiniz.
Uyarı
Ajan düzenlemesi henüz Java SDK'de mevcut değil.
Grup Sohbet Yöneticisi'ni özelleştirme
Kendi GroupChatManageruygulamanızı uygulayarak grup sohbeti akışını özelleştirebilirsiniz. Bu, sonuçların nasıl filtrelendiğini, bir sonraki aracının nasıl seçildiğini ve kullanıcı girişi isteme veya sohbeti ne zaman sonlandırabileceğinizi denetlemenize olanak tanır.
Örneğin, GroupChatManager sınıfını devralarak ve soyut yöntemlerini geçersiz kılarak özel bir yönetici oluşturabilirsiniz.
using Microsoft.SemanticKernel.Agents.Orchestration.GroupChat;
using Microsoft.SemanticKernel.ChatCompletion;
using System.Threading;
using System.Threading.Tasks;
public class CustomGroupChatManager : GroupChatManager
{
public override ValueTask<GroupChatManagerResult<string>> FilterResults(ChatHistory history, CancellationToken cancellationToken = default)
{
// Custom logic to filter or summarize chat results
return ValueTask.FromResult(new GroupChatManagerResult<string>("Summary") { Reason = "Custom summary logic." });
}
public override ValueTask<GroupChatManagerResult<string>> SelectNextAgent(ChatHistory history, GroupChatTeam team, CancellationToken cancellationToken = default)
{
// Randomly select an agent from the team
var random = new Random();
int index = random.Next(team.Members.Count);
string nextAgent = team.Members[index].Id;
return ValueTask.FromResult(new GroupChatManagerResult<string>(nextAgent) { Reason = "Custom selection logic." });
}
public override ValueTask<GroupChatManagerResult<bool>> ShouldRequestUserInput(ChatHistory history, CancellationToken cancellationToken = default)
{
// Custom logic to decide if user input is needed
return ValueTask.FromResult(new GroupChatManagerResult<bool>(false) { Reason = "No user input required." });
}
public override ValueTask<GroupChatManagerResult<bool>> ShouldTerminate(ChatHistory history, CancellationToken cancellationToken = default)
{
// Optionally call the base implementation to check for default termination logic
var baseResult = base.ShouldTerminate(history, cancellationToken).Result;
if (baseResult.Value)
{
// If the base logic says to terminate, respect it
return ValueTask.FromResult(baseResult);
}
// Custom logic to determine if the chat should terminate
bool shouldEnd = history.Count > 10; // Example: end after 10 messages
return ValueTask.FromResult(new GroupChatManagerResult<bool>(shouldEnd) { Reason = "Custom termination logic." });
}
}
Ardından düzenlemede özel yöneticinizi kullanabilirsiniz:
GroupChatOrchestration orchestration = new (new CustomGroupChatManager { MaximumInvocationCount = 5 }, ...);
Tavsiye
Özel grup sohbet yöneticisinin eksiksiz bir örneğini burada bulabilirsiniz
Kendi GroupChatManageruygulamanızı uygulayarak grup sohbeti akışını özelleştirebilirsiniz. Bu, sonuçların nasıl filtrelendiğini, bir sonraki aracının nasıl seçildiğini ve kullanıcı girişi isteme veya sohbeti ne zaman sonlandırabileceğinizi denetlemenize olanak tanır.
Örneğin, GroupChatManager sınıfını devralarak ve soyut yöntemlerini geçersiz kılarak özel bir yönetici oluşturabilirsiniz.
from semantic_kernel.agents import GroupChatManager, BooleanResult, StringResult, MessageResult
from semantic_kernel.contents import ChatMessageContent, ChatHistory
class CustomGroupChatManager(GroupChatManager):
async def filter_results(self, chat_history: ChatHistory) -> MessageResult:
# Custom logic to filter or summarize chat results
summary = "Summary of the discussion."
return MessageResult(result=ChatMessageContent(role="assistant", content=summary), reason="Custom summary logic.")
async def select_next_agent(self, chat_history: ChatHistory, participant_descriptions: dict[str, str]) -> StringResult:
# Randomly select an agent from the participants
import random
next_agent = random.choice(list(participant_descriptions.keys()))
return StringResult(result=next_agent, reason="Custom selection logic.")
async def should_request_user_input(self, chat_history: ChatHistory) -> BooleanResult:
# Custom logic to decide if user input is needed
return BooleanResult(result=False, reason="No user input required.")
async def should_terminate(self, chat_history: ChatHistory) -> BooleanResult:
# Optionally call the base implementation to check for default termination logic
base_result = await super().should_terminate(chat_history)
if base_result.result:
return base_result
# Custom logic to determine if the chat should terminate
should_end = len(chat_history.messages) > 10 # Example: end after 10 messages
return BooleanResult(result=should_end, reason="Custom termination logic.")
Ardından düzenlemede özel yöneticinizi kullanabilirsiniz:
from semantic_kernel.agents import GroupChatOrchestration
group_chat_orchestration = GroupChatOrchestration(manager=CustomGroupChatManager(max_rounds=5), ...)
Tavsiye
Özel grup sohbet yöneticisinin eksiksiz bir örneğini burada bulabilirsiniz
Uyarı
Ajan düzenlemesi henüz Java SDK'de mevcut değil.
Grup Sohbet Yöneticisi İşlev Çağrılarının Sırası
Grup sohbetini düzenlerken, grup sohbeti yöneticisinin yöntemleri konuşmanın her turu için belirli bir sırayla çağrılır:
- ShouldRequestUserInput: Sonraki aracı konuşmadan önce kullanıcı (insan) girişinin gerekli olup olmadığını denetler. Doğruysa, orkestrasyon kullanıcı girişi için duraklatılır. Kullanıcı girişi daha sonra yöneticinin sohbet geçmişine eklenir ve tüm aracılara gönderilir.
- ShouldTerminate: Grup sohbetinin bitip bitmediğini belirler (örneğin, en fazla tur sayısına ulaşılırsa veya özel bir koşul karşılanırsa). Eğer doğru ise, orkestrasyon sonuç filtrelemeye devam eder.
- FilterResults: Yalnızca sohbet sonlandırılıyorsa, konuşmanın son sonuçlarını özetlemek veya işlemek için çağrılır.
- SelectNextAgent: Sohbet sonlandırılmıyorsa, konuşmada yanıt vermesi için sonraki aracıyı seçer.
Bu sıra, konuşma ilerlemeye başlamadan önce kullanıcı girişi ve sonlandırma koşullarının denetlenmesini ve sonuçların yalnızca sonunda filtrelendiğini sağlar. Özel grup sohbet yöneticinizdeki ilgili yöntemleri geçersiz kılarak her adım için mantığı özelleştirebilirsiniz.