Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Penting
Fitur Agent Orchestration dalam Kerangka Kerja Agen sedang dalam tahap eksperimental. Mereka sedang dalam pengembangan aktif dan dapat berubah secara signifikan sebelum maju ke tahap pratinjau atau tahap kandidat rilis.
Orkestrasi obrolan grup memodelkan percakapan kolaboratif di antara agen, secara opsional termasuk peserta manusia. Manajer obrolan grup mengoordinasikan alur, menentukan agen mana yang harus merespons berikutnya dan kapan meminta input manusia. Pola ini sangat kuat untuk mensimulasikan rapat, debat, atau sesi pemecahan masalah kolaboratif.
Untuk mempelajari selengkapnya tentang pola, seperti kapan harus menggunakan pola atau kapan harus menghindari pola dalam beban kerja Anda, lihat Orkestrasi obrolan grup.
Kasus penggunaan umum
Agen yang mewakili departemen yang berbeda membahas proposal bisnis, dengan agen manajer yang memoderasi percakapan dan melibatkan manusia ketika diperlukan:
Apa yang akan Anda Pelajari
- Cara menentukan agen dengan peran yang berbeda untuk obrolan grup
- Cara menggunakan manajer obrolan grup untuk mengontrol alur percakapan
- Cara melibatkan peserta manusia dalam percakapan
- Cara mengamati percakapan dan mengumpulkan hasil akhir
Tentukan Agen Anda
Setiap agen dalam obrolan grup memiliki peran tertentu. Dalam contoh ini, kami menentukan copywriter dan peninjau.
Petunjuk / Saran
digunakan ChatCompletionAgent di sini, tetapi Anda dapat menggunakan jenis agen apa pun.
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,
};
Opsional: Perhatikan Respons Agen
Anda dapat membuat callback untuk menangkap respons agen seiring berjalannya urutan dengan menggunakan properti ResponseCallback.
ChatHistory history = [];
ValueTask responseCallback(ChatMessageContent response)
{
history.Add(response);
return ValueTask.CompletedTask;
}
Menyiapkan Pengaturan Obrolan Grup
Buat GroupChatOrchestration objek, meneruskan agen, manajer obrolan grup (di sini, ), RoundRobinGroupChatManagerdan panggilan balik respons. Manajer mengontrol alur—di sini, ia bergantian secara round-robin untuk sejumlah putaran.
GroupChatOrchestration orchestration = new GroupChatOrchestration(
new RoundRobinGroupChatManager { MaximumInvocationCount = 5 },
writer,
editor)
{
ResponseCallback = responseCallback,
};
Mulai Runtime
Runtime diperlukan untuk mengelola eksekusi agen. Di sini, kita menggunakan InProcessRuntime dan memulainya sebelum memanggil orkestrasi.
InProcessRuntime runtime = new InProcessRuntime();
await runtime.StartAsync();
Memanggil Orkestrasi
Panggil orkestrasi dengan tugas awal Anda (misalnya, "Buat slogan untuk SUV listrik baru..."). Agen akan bergantian merespons, menyempurnakan hasilnya.
var result = await orchestration.InvokeAsync(
"Create a slogan for a new electric SUV that is affordable and fun to drive.",
runtime);
Kumpulkan Hasil
Tunggu hingga orkestrasi selesai dan ambil output akhir.
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);
}
Opsional: Hentikan Runtime
Setelah pemrosesan selesai, hentikan runtime untuk membersihkan sumber daya.
await runtime.RunUntilIdleAsync();
Sampel Output
# 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.”
Petunjuk / Saran
Kode sampel lengkap tersedia di sini
Tentukan Agen Anda
Setiap agen dalam obrolan grup memiliki peran tertentu. Dalam contoh ini:
- Penulis: Membuat dan mengedit konten berdasarkan umpan balik.
- Peninjau: Meninjau konten dan memberikan umpan balik untuk peningkatan.
Petunjuk / Saran
ChatCompletionAgent digunakan di sini bersama Azure OpenAI; namun, Anda dapat menggunakan jenis agen atau layanan model apa pun.
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]
Amati Respons Agen
Anda dapat menentukan panggilan balik untuk mencetak pesan setiap agen saat percakapan berlangsung.
from semantic_kernel.contents import ChatMessageContent
def agent_response_callback(message: ChatMessageContent) -> None:
print(f"**{message.name}**\n{message.content}")
Menyiapkan Pengaturan Obrolan Grup
Buat GroupChatOrchestration objek, meneruskan agen, manajer obrolan grup (dalam hal ini ), RoundRobinGroupChatManagerdan panggilan balik respons. Manajer mengontrol alur—di sini, ia bergantian secara round-robin untuk sejumlah putaran.
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,
)
Mulai Runtime
Mulai runtime untuk mengelola eksekusi agen.
from semantic_kernel.agents.runtime import InProcessRuntime
runtime = InProcessRuntime()
runtime.start()
Memanggil Orkestrasi
Panggil orkestrasi dengan tugas awal Anda (misalnya, "Buat slogan untuk SUV listrik baru..."). Agen akan bergantian merespons, menyempurnakan hasilnya.
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,
)
Kumpulkan Hasil
Tunggu hingga orkestrasi selesai.
value = await orchestration_result.get()
print(f"***** Final Result *****\n{value}")
Opsional: Hentikan Runtime
Setelah pemrosesan selesai, hentikan runtime untuk membersihkan sumber daya.
await runtime.stop_when_idle()
Sampel Output
**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!"
Petunjuk / Saran
Kode sampel lengkap tersedia di sini.
Nota
Orkestrasi agen belum tersedia di Java SDK.
Mengkustomisasi Manajer Obrolan Grup
Anda dapat menyesuaikan alur obrolan grup dengan mengimplementasikan GroupChatManagersendiri . Ini memungkinkan Anda mengontrol bagaimana hasil difilter, bagaimana agen berikutnya dipilih, dan kapan meminta input pengguna atau mengakhiri obrolan.
Misalnya, Anda dapat membuat manajer kustom dengan mewarisi dan GroupChatManager mengambil alih metode abstraknya:
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." });
}
}
Anda kemudian dapat menggunakan manajer kustom Anda dalam orkestrasi:
GroupChatOrchestration orchestration = new (new CustomGroupChatManager { MaximumInvocationCount = 5 }, ...);
Petunjuk / Saran
Contoh lengkap manajer obrolan grup kustom tersedia di sini
Anda dapat menyesuaikan alur obrolan grup dengan mengimplementasikan GroupChatManagersendiri . Ini memungkinkan Anda mengontrol bagaimana hasil difilter, bagaimana agen berikutnya dipilih, dan kapan meminta input pengguna atau mengakhiri obrolan.
Misalnya, Anda dapat membuat manajer kustom dengan mewarisi dan GroupChatManager mengambil alih metode abstraknya:
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.")
Anda kemudian dapat menggunakan manajer kustom Anda dalam orkestrasi:
from semantic_kernel.agents import GroupChatOrchestration
group_chat_orchestration = GroupChatOrchestration(manager=CustomGroupChatManager(max_rounds=5), ...)
Petunjuk / Saran
Contoh lengkap manajer obrolan grup kustom tersedia di sini
Nota
Orkestrasi agen belum tersedia di Java SDK.
Urutan Panggilan Fungsi Manajer Obrolan Grup
Saat mengatur obrolan grup, metode manajer obrolan grup dipanggil dalam urutan tertentu untuk setiap putaran percakapan:
- ShouldRequestUserInput: Memeriksa apakah input pengguna (manusia) diperlukan sebelum agen berikutnya berbicara. Jika benar, orkestrasi dijeda untuk input pengguna. Input pengguna kemudian ditambahkan ke riwayat obrolan manajer dan dikirim ke semua agen.
- ShouldTerminate: Menentukan apakah obrolan grup harus berakhir (misalnya, jika jumlah maksimum putaran tercapai atau kondisi kustom terpenuhi). Jika benar, orkestrasi berlanjut ke pemfilteran hasil.
- FilterResults: Dipanggil hanya jika obrolan dihentikan, untuk meringkas atau memproses hasil akhir percakapan.
- SelectNextAgent: Jika obrolan tidak dihentikan, memilih agen berikutnya untuk merespons di percakapan.
Urutan ini memastikan bahwa kondisi input dan penghentian pengguna diperiksa sebelum memajukan percakapan, dan hasilnya hanya difilter di akhir. Anda dapat menyesuaikan logika untuk setiap langkah dengan mengesampingkan metode yang sesuai di manajer obrolan grup kustom Anda.