Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Erforschung des semantischen Kerns
Tipp
Detaillierte API-Dokumentation zu dieser Diskussion finden Sie unter:
Chat-Vollständigung im Semantischen Kernel
Der Chatabschluss ist grundsätzlich ein Protokoll für eine chatbasierte Interaktion mit einem KI-Modell, in dem der Chatverlauf verwaltet und dem Modell mit jeder Anforderung präsentiert wird. Semantische Kernel-KI-Dienste bieten ein einheitliches Framework für die Integration der Chat-Abschlussfunktionen verschiedener KI-Modelle.
Eine ChatCompletionAgent kann jeden dieser KI-Dienste nutzen, um Antworten zu generieren, unabhängig davon, ob sie an einen Benutzer oder einen anderen Agent gerichtet sind.
So bereiten Sie Ihre Entwicklungsumgebung vor
Um mit der Entwicklung einer ChatCompletionAgentfortzufahren, konfigurieren Sie Ihre Entwicklungsumgebung mit den entsprechenden Paketen.
Fügen Sie dem Projekt das Microsoft.SemanticKernel.Agents.Core-Paket hinzu:
dotnet add package Microsoft.SemanticKernel.Agents.Core --prerelease
Installieren Sie das Paket semantic-kernel:
pip install semantic-kernel
Von Bedeutung
Je nachdem, welcher AI-Dienst Sie als Teil des ChatCompletionAgentDiensts verwenden, müssen Sie möglicherweise zusätzliche Pakete installieren. Bitte überprüfen Sie auf der folgenden Seite nach dem erforderlichen Extra.
<dependency>
<groupId>com.microsoft.semantic-kernel</groupId>
<artifactId>semantickernel-agents-core</artifactId>
<version>[LATEST]</version>
</dependency>
Erstellen eines ChatCompletionAgent
Ein ChatCompletionAgent basiert im Wesentlichen auf KI-Diensten. Das Erstellen einer ChatCompletionAgent beginnt daher mit dem Erstellen einer Kernel Instanz, die einen oder mehrere Chat-Vervollständigungsdienste enthält, und anschließend den Agent mit einem Verweis auf diese Kernel Instanz instanziieren.
// Initialize a Kernel with a chat-completion service
IKernelBuilder builder = Kernel.CreateBuilder();
builder.AddAzureOpenAIChatCompletion(/*<...configuration parameters>*/);
Kernel kernel = builder.Build();
// Create the agent
ChatCompletionAgent agent =
new()
{
Name = "SummarizationAgent",
Instructions = "Summarize user input",
Kernel = kernel
};
Es gibt zwei Möglichkeiten zur Erstellung eines ChatCompletionAgent:
1. Durch direkte Bereitstellung des Chatabschlussdiensts
from semantic_kernel.agents import ChatCompletionAgent
# Create the agent by directly providing the chat completion service
agent = ChatCompletionAgent(
service=AzureChatCompletion(), # your chat completion service instance
name="<agent name>",
instructions="<agent instructions>",
)
2. Indem Sie zuerst einen Kernel erstellen, den Dienst hinzufügen und dann den Kernel bereitstellen
# Define the kernel
kernel = Kernel()
# Add the chat completion service to the kernel
kernel.add_service(AzureChatCompletion())
# Create the agent using the kernel
agent = ChatCompletionAgent(
kernel=kernel,
name="<agent name>",
instructions="<agent instructions>",
)
Die erste Methode ist nützlich, wenn Sie bereits über einen Chatabschlussdienst verfügen. Die zweite Methode ist vorteilhaft, wenn Sie einen Kernel benötigen, der mehrere Dienste oder zusätzliche Funktionen verwaltet.
// Initialize a Kernel with a chat-completion service
var chatCompletion = OpenAIChatCompletion.builder()
.withOpenAIAsyncClient(client) // OpenAIAsyncClient with configuration parameters
.withModelId(MODEL_ID)
.build();
var kernel = Kernel.builder()
.withAIService(ChatCompletionService.class, chatCompletion)
.build();
// Create the agent
var agent = ChatCompletionAgent.builder()
.withKernel(kernel)
.build();
KI-Dienstauswahl
Nicht anders als bei der direkten Nutzung von Semantic Kernel-AI-Diensten unterstützt ein ChatCompletionAgent die Spezifikation eines Dienstauswahlschalters. Ein Dienstselektor identifiziert, welchen AI-Dienst zu verwenden, wenn die Kernel mehrere enthält.
Hinweis
Wenn mehrere KI-Dienste vorhanden sind und keine Dienstauswahl bereitgestellt wird, wird die gleiche Standardlogik für den Agenten angewendet, den Sie bei der Verwendung von KI-Diensten außerhalb der Agent Framework
IKernelBuilder builder = Kernel.CreateBuilder();
// Initialize multiple chat-completion services.
builder.AddAzureOpenAIChatCompletion(/*<...service configuration>*/, serviceId: "service-1");
builder.AddAzureOpenAIChatCompletion(/*<...service configuration>*/, serviceId: "service-2");
Kernel kernel = builder.Build();
ChatCompletionAgent agent =
new()
{
Name = "<agent name>",
Instructions = "<agent instructions>",
Kernel = kernel,
Arguments = // Specify the service-identifier via the KernelArguments
new KernelArguments(
new OpenAIPromptExecutionSettings()
{
ServiceId = "service-2" // The target service-identifier.
})
};
from semantic_kernel.connectors.ai.open_ai import (
AzureChatCompletion,
AzureChatPromptExecutionSettings,
)
# Define the Kernel
kernel = Kernel()
# Add the AzureChatCompletion AI Service to the Kernel
kernel.add_service(AzureChatCompletion(service_id="service1"))
kernel.add_service(AzureChatCompletion(service_id="service2"))
settings = AzureChatPromptExecutionSettings(service_id="service2")
# Create the agent
agent = ChatCompletionAgent(
kernel=kernel,
name="<agent name>",
instructions="<agent instructions>",
arguments=KernelArguments(settings=settings)
)
Das Feature ist derzeit in Java nicht verfügbar.
Mit ChatCompletionAgent konversieren
Die Kommunikation mit Ihrem ChatCompletionAgent basiert auf einer ChatHistory Instanz und unterscheidet sich nicht von der Interaktion mit einem Chat-Completion-KI-Dienst .
Sie können den Agent einfach mit Ihrer Benutzernachricht aufrufen.
// Define agent
ChatCompletionAgent agent = ...;
// Generate the agent response(s)
await foreach (ChatMessageContent response in agent.InvokeAsync(new ChatMessageContent(AuthorRole.User, "<user input>")))
{
// Process agent response(s)...
}
Sie können auch eine AgentThread verwenden, um eine Unterhaltung mit Ihrem Agenten zu führen.
Hier verwenden wir ChatHistoryAgentThread.
Die ChatHistoryAgentThread kann über ihren Konstruktor auch ein optionales ChatHistory Objekt als Eingabe annehmen, wenn eine frühere Unterhaltung fortgesetzt wird. (nicht angezeigt)
// Define agent
ChatCompletionAgent agent = ...;
AgentThread thread = new ChatHistoryAgentThread();
// Generate the agent response(s)
await foreach (ChatMessageContent response in agent.InvokeAsync(new ChatMessageContent(AuthorRole.User, "<user input>"), thread))
{
// Process agent response(s)...
}
Es gibt mehrere Möglichkeiten, mit ChatCompletionAgentzu sprechen.
Am einfachsten können Sie get_responseanrufen und warten:
# Define agent
agent = ChatCompletionAgent(...)
# Generate the agent response
response = await agent.get_response(messages="user input")
# response is an `AgentResponseItem[ChatMessageContent]` object
Wenn Sie möchten, dass der Agent einen Unterhaltungsverlauf zwischen Aufrufen aufrechterhält, können Sie ihm ChatHistoryAgentThread wie folgt übergeben:
# Define agent
agent = ChatCompletionAgent(...)
# Generate the agent response(s)
response = await agent.get_response(messages="user input")
# Generate another response, continuing the conversation thread from the first response.
response2 = await agent.get_response(messages="user input", thread=response.thread)
# process agent response(s)
Durch Aufrufen der invoke-Methode wird ein AsyncIterable von AgentResponseItem[ChatMessageContent] zurückgegeben.
# Define agent
agent = ChatCompletionAgent(...)
# Define the thread
thread = ChatHistoryAgentThread()
# Generate the agent response(s)
async for response in agent.invoke(messages="user input", thread=thread):
# process agent response(s)
Die ChatCompletionAgent unterstützt auch Streaming, bei dem die invoke_stream-Methode einen AsyncIterable von StreamingChatMessageContent zurückgibt:
# Define agent
agent = ChatCompletionAgent(...)
# Define the thread
thread = ChatHistoryAgentThread()
# Generate the agent response(s)
async for response in agent.invoke_stream(messages="user input", thread=thread):
# process agent response(s)
ChatCompletionAgent agent = ...;
// Generate the agent response(s)
agent.invokeAsync(new ChatMessageContent<>(AuthorRole.USER, "<user input>")).block();
Sie können auch eine AgentThread verwenden, um eine Unterhaltung mit Ihrem Agenten zu führen.
Hier verwenden wir ChatHistoryAgentThread.
Das ChatHistoryAgentThread kann auch ein ChatHistory-Objekt als Eingabe über dessen Konstruktor verwenden, wenn eine vorherige Unterhaltung fortgesetzt wird. (nicht angezeigt)
// Define agent
ChatCompletionAgent agent = ...;
AgentThread thread = new ChatHistoryAgentThread();
// Generate the agent response(s)
agent.invokeAsync(new ChatMessageContent<>(AuthorRole.USER, "<user input>"), thread).block();
Verarbeiten von Zwischennachrichten mit einem ChatCompletionAgent
Der semantische Kernel ChatCompletionAgent wurde entwickelt, um einen Agent aufzurufen, der Benutzerabfragen oder -fragen erfüllt. Während des Aufrufs kann der Agent Tools ausführen, um die endgültige Antwort abzuleiten. Um auf zwischengeschaltete Nachrichten zuzugreifen, die während dieses Prozesses erstellt werden, können Caller eine Rückruffunktion bereitstellen, die Instanzen von FunctionCallContent oder FunctionResultContent behandelt.
Die Rückrufdokumentation für das
ChatCompletionAgentwird in Kürze verfügbar sein.
Konfigurieren des on_intermediate_message Rückrufs innerhalb agent.invoke(...) oder agent.invoke_stream(...) ermöglicht es dem Anrufer, Zwischennachrichten zu empfangen, die während des Prozesses der Erstellung der endgültigen Antwort des Agents generiert wurden.
import asyncio
from typing import Annotated
from semantic_kernel.agents.chat_completion.chat_completion_agent import ChatCompletionAgent, ChatHistoryAgentThread
from semantic_kernel.connectors.ai.open_ai.services.azure_chat_completion import AzureChatCompletion
from semantic_kernel.contents import FunctionCallContent, FunctionResultContent
from semantic_kernel.contents.chat_message_content import ChatMessageContent
from semantic_kernel.functions import kernel_function
# Define a sample plugin for the sample
class MenuPlugin:
"""A sample Menu Plugin used for the concept sample."""
@kernel_function(description="Provides a list of specials from the menu.")
def get_specials(self) -> Annotated[str, "Returns the specials from the menu."]:
return """
Special Soup: Clam Chowder
Special Salad: Cobb Salad
Special Drink: Chai Tea
"""
@kernel_function(description="Provides the price of the requested menu item.")
def get_item_price(
self, menu_item: Annotated[str, "The name of the menu item."]
) -> Annotated[str, "Returns the price of the menu item."]:
return "$9.99"
# This callback function will be called for each intermediate message
# Which will allow one to handle FunctionCallContent and FunctionResultContent
# If the callback is not provided, the agent will return the final response
# with no intermediate tool call steps.
async def handle_intermediate_steps(message: ChatMessageContent) -> None:
for item in message.items or []:
if isinstance(item, FunctionCallContent):
print(f"Function Call:> {item.name} with arguments: {item.arguments}")
elif isinstance(item, FunctionResultContent):
print(f"Function Result:> {item.result} for function: {item.name}")
else:
print(f"{message.role}: {message.content}")
async def main() -> None:
agent = ChatCompletionAgent(
service=AzureChatCompletion(),
name="Assistant",
instructions="Answer questions about the menu.",
plugins=[MenuPlugin()],
)
# Create a thread for the agent
# If no thread is provided, a new thread will be
# created and returned with the initial response
thread: ChatHistoryAgentThread = None
user_inputs = [
"Hello",
"What is the special soup?",
"How much does that cost?",
"Thank you",
]
for user_input in user_inputs:
print(f"# User: '{user_input}'")
async for response in agent.invoke(
messages=user_input,
thread=thread,
on_intermediate_message=handle_intermediate_steps,
):
print(f"# {response.role}: {response}")
thread = response.thread
if __name__ == "__main__":
asyncio.run(main())
Das Folgende zeigt die Beispielausgabe des Agentenaufrufprozesses:
User: 'Hello'
AuthorRole.ASSISTANT: Hi there! How can I assist you today?
User: 'What is the special soup?'
Function Call:> MenuPlugin-get_specials with arguments: {}
Function Result:>
Special Soup: Clam Chowder
Special Salad: Cobb Salad
Special Drink: Chai Tea
for function: MenuPlugin-get_specials
AuthorRole.ASSISTANT: The special soup today is Clam Chowder. Would you like to know anything else from the menu?
User: 'How much does that cost?'
Function Call:> MenuPlugin-get_item_price with arguments: {"menu_item":"Clam Chowder"}
Function Result:> $9.99 for function: MenuPlugin-get_item_price
AuthorRole.ASSISTANT: The Clam Chowder costs $9.99. Would you like to know more about the menu or anything else?
User: 'Thank you'
AuthorRole.ASSISTANT: You're welcome! If you have any more questions, feel free to ask. Enjoy your day!
Das Feature ist derzeit in Java nicht verfügbar.
Deklarative Spezifikation
Die Dokumentation zur Verwendung deklarativer Spezifikationen wird in Kürze verfügbar sein.
Von Bedeutung
Dieses Feature befindet sich in der experimentellen Phase. Features in dieser Phase befinden sich in der Entwicklung und können sich ändern, bevor Sie zur Vorschau- oder Veröffentlichungskandidatenstufe wechseln.
Die ChatCompletionAgent Instanziierung kann direkt aus einer deklarativen YAML-Spezifikation erfolgen. Mit diesem Ansatz können Sie die Kerneigenschaften, Anweisungen und verfügbaren Funktionen (Plug-Ins) des Agents strukturiert und portierbar definieren. Mithilfe von YAML können Sie den Namen, die Beschreibung, die Anweisungsaufforderung, den Toolsatz und die Modellparameter in einem einzigen Dokument beschreiben, wodurch die Konfiguration des Agents leicht überwacht und reproduzierbar werden kann.
Hinweis
Alle tools oder Funktionen, die im deklarativen YAML angegeben sind, müssen zum Zeitpunkt der Erstellung des Agents bereits in der Kernelinstanz vorhanden sein. Der Agent Loader erstellt keine neuen Funktionen aus der Spezifikation; stattdessen sucht er die referenzierten Plug-Ins und Funktionen durch ihre Bezeichner im Kernel. Wenn ein erforderliches Plug-In oder eine erforderliche Funktion nicht im Kernel vorhanden ist, wird während der Agent-Konstruktion ein Fehler ausgelöst.
Beispiel: Erstellen einer ChatCompletionAgent aus einer YAML-Spezifikation
import asyncio
from typing import Annotated
from semantic_kernel import Kernel
from semantic_kernel.agents import AgentRegistry, ChatHistoryAgentThread
from semantic_kernel.agents.chat_completion.chat_completion_agent import ChatCompletionAgent
from semantic_kernel.connectors.ai.open_ai import OpenAIChatCompletion
from semantic_kernel.functions import kernel_function
# Define a plugin with kernel functions
class MenuPlugin:
@kernel_function(description="Provides a list of specials from the menu.")
def get_specials(self) -> Annotated[str, "Returns the specials from the menu."]:
return """
Special Soup: Clam Chowder
Special Salad: Cobb Salad
Special Drink: Chai Tea
"""
@kernel_function(description="Provides the price of the requested menu item.")
def get_item_price(
self, menu_item: Annotated[str, "The name of the menu item."]
) -> Annotated[str, "Returns the price of the menu item."]:
return "$9.99"
# YAML spec for the agent
AGENT_YAML = """
type: chat_completion_agent
name: Assistant
description: A helpful assistant.
instructions: Answer the user's questions using the menu functions.
tools:
- id: MenuPlugin.get_specials
type: function
- id: MenuPlugin.get_item_price
type: function
model:
options:
temperature: 0.7
"""
USER_INPUTS = [
"Hello",
"What is the special soup?",
"What does that cost?",
"Thank you",
]
async def main():
kernel = Kernel()
kernel.add_plugin(MenuPlugin(), plugin_name="MenuPlugin")
agent: ChatCompletionAgent = await AgentRegistry.create_from_yaml(
AGENT_YAML, kernel=kernel, service=OpenAIChatCompletion()
)
thread: ChatHistoryAgentThread | None = None
for user_input in USER_INPUTS:
print(f"# User: {user_input}")
response = await agent.get_response(user_input, thread=thread)
print(f"# {response.name}: {response}")
thread = response.thread
await thread.delete() if thread else None
if __name__ == "__main__":
asyncio.run(main())
Dieses Feature ist nicht verfügbar.
Vorgehensweise
Ein End-to-End-Beispiel für eine ChatCompletionAgentfinden Sie unter: