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.
Sobald Sie über mehrere Plug-Ins verfügen, benötigen Sie eine Möglichkeit für Ihren KI-Agenten, sie zusammen zu verwenden, um die Notwendigkeit eines Benutzers zu lösen. Hier kommt die Planung an.
Bereits früh führte der Semantische Kernel das Konzept von Planern ein, um die KI aufzufordern, zu wählen, welche Funktionen aufgerufen werden sollen. Seit der Einführung des semantischen Kernels hat OpenAI jedoch eine systemeigene Methode für das Modell zum Aufrufen oder "Aufrufen" einer Funktion eingeführt: Funktionsaufrufe. Andere KI-Modelle wie Gemini, Claude und Mistral haben seitdem Funktionsaufrufe als Kernfunktion übernommen, wodurch es zu einem modellübergreifenden unterstützten Feature wird.
Aufgrund dieser Fortschritte hat sich der semantische Kernel entwickelt, um Funktionsaufrufe als primäre Methode zum Planen und Ausführen von Aufgaben zu verwenden.
Von Bedeutung
Funktionsaufrufe sind nur in OpenAI-Modellen verfügbar, die 0613 oder höher sind. Wenn Sie ein älteres Modell (z. B. 0314) verwenden, gibt diese Funktion einen Fehler zurück. Wir empfehlen die Verwendung der neuesten OpenAI-Modelle, um dieses Feature nutzen zu können.
Wie wird durch Funktionsaufrufe ein "Plan" erstellt?
Am einfachsten ist das Aufrufen von Funktionen lediglich eine Möglichkeit für eine KI, eine Funktion mit den richtigen Parametern aufzurufen. Nehmen Wir beispielsweise an, dass ein Benutzer eine Glühbirne einschalten möchte. Wenn die KI über das richtige Plug-In verfügt, kann sie die Funktion aufrufen, um das Licht zu aktivieren.
| Rolle | Nachricht |
|---|---|
| 🔵 Benutzer | Bitte aktivieren Sie licht Nr. 1 |
| 🔴 Assistant (Funktionsaufruf) | Lights.change_state(1, { "isOn": true }) |
| 🟢 Werkzeug | { "id": 1, "name": "Table Lamp", "isOn": true, "brightness": 100, "hex": "FF0000" } |
| 🔴 Assistent | Die Lampe ist jetzt eingeschaltet |
Aber was passiert, wenn der Benutzer die ID des Lichts nicht kennt? Oder was geschieht, wenn der Benutzer alle Lichter einschalten möchte? Hier kommt die Planung an. Die heutigen LLM-Modelle können Funktionen iterativ aufrufen, um die Notwendigkeit eines Benutzers zu lösen. Dazu wird eine Feedbackschleife erstellt, in der die KI eine Funktion aufrufen kann, das Ergebnis überprüfen und dann entscheiden, was als Nächstes zu tun ist.
Beispielsweise kann ein Benutzer die KI auffordern, eine Glühbirne zu "umschalten". Die KI müsste zuerst den Zustand der Glühbirne überprüfen, bevor Sie entscheiden, ob sie ein- oder ausgeschaltet werden soll.
| Rolle | Nachricht |
|---|---|
| 🔵 Benutzer | Bitte schalten Sie alle Lichter um. |
| 🔴 Assistant (Funktionsaufruf) | Lights.get_lights() |
| 🟢 Werkzeug | { "lights": [ { "id": 1, "name": "Table Lamp", "isOn": true, "brightness": 100, "hex": "FF0000" }, { "id": 2, "name": "Ceiling Light", "isOn": false, "brightness": 0, "hex": "FFFFFF" } ] } |
| 🔴 Assistant (Funktionsaufruf) |
Lights.change_state(1, { "isOn": false })
Lights.change_state(2, { "isOn": true })
|
| 🟢 Werkzeug | { "id": 1, "name": "Table Lamp", "isOn": false, "brightness": 0, "hex": "FFFFFF" } |
| 🟢 Werkzeug | { "id": 2, "name": "Ceiling Light", "isOn": true, "brightness": 100, "hex": "FF0000" } |
| 🔴 Assistent | Die Lichter wurden umgeschaltet |
Hinweis
In diesem Beispiel haben Sie auch parallele Aufrufe von Funktionen gesehen. Hier kann die KI mehrere Funktionen gleichzeitig aufrufen. Dies ist ein leistungsfähiges Feature, mit dem die KI komplexe Aufgaben schneller lösen kann. Es wurde 1106 den OpenAI-Modellen hinzugefügt.
Die automatische Planungsschleife
Das Unterstützen von Funktionsaufrufen ohne semantischen Kernel ist relativ komplex. Sie müssen eine Schleife schreiben, die folgendes erreichen würde:
- Erstellen von JSON-Schemas für jede Ihrer Funktionen
- Stellen Sie dem LLM den vorherigen Chatverlauf und die Funktionsschemata zur Verfügung
- Analysieren Sie die Antwort des LLM, um zu ermitteln, ob er mit einer Nachricht antworten oder eine Funktion aufrufen möchte.
- Wenn die LLM eine Funktion aufrufen möchte, müssen Sie den Funktionsnamen und die Parameter aus der Antwort des LLM analysieren.
- Aufrufen der Funktion mit den richtigen Parametern
- Zurückgeben der Ergebnisse der Funktion, damit die LLM bestimmen kann, was als Nächstes ausgeführt werden soll
- Wiederholen Sie die Schritte 2 bis 6, bis die LLM entscheidet, dass sie die Aufgabe abgeschlossen hat oder Hilfe vom Benutzer benötigt.
Im semantischen Kernel vereinfachen wir die Verwendung von Funktionsaufrufen, indem diese Schleife für Sie automatisiert wird. Auf diese Weise können Sie sich auf die Erstellung der Plug-Ins konzentrieren, die erforderlich sind, um die Anforderungen Ihres Benutzers zu lösen.
Hinweis
Das Verständnis der Funktionsweise der Funktionsaufrufschleife ist für die Erstellung von leistungsfähigen und zuverlässigen KI-Agents unerlässlich. Ausführliche Informationen zur Funktionsweise der Schleife finden Sie im Artikel zum Aufrufen von Funktionen .
Verwenden von automatischen Funktionsaufrufen
Um automatische Funktionsaufrufe im semantischen Kernel zu verwenden, müssen Sie die folgenden Schritte ausführen:
- Registrieren des Plug-Ins beim Kernel
- Erstellen eines Ausführungseinstellungsobjekts, das die KI angibt, Funktionen automatisch aufzurufen
- Aufrufen des Chatabschlussdiensts mit dem Chatverlauf und dem Kernel
Tipp
Im folgenden Codebeispiel wird der LightsPlugin, der hier definiert ist, verwendet.
using System.ComponentModel;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;
using Microsoft.SemanticKernel.Connectors.OpenAI;
// 1. Create the kernel with the Lights plugin
var builder = Kernel.CreateBuilder().AddAzureOpenAIChatCompletion(modelId, endpoint, apiKey);
builder.Plugins.AddFromType<LightsPlugin>("Lights");
Kernel kernel = builder.Build();
var chatCompletionService = kernel.GetRequiredService<IChatCompletionService>();
// 2. Enable automatic function calling
OpenAIPromptExecutionSettings openAIPromptExecutionSettings = new()
{
FunctionChoiceBehavior = FunctionChoiceBehavior.Auto()
};
var history = new ChatHistory();
string? userInput;
do {
// Collect user input
Console.Write("User > ");
userInput = Console.ReadLine();
// Add user input
history.AddUserMessage(userInput);
// 3. Get the response from the AI with automatic function calling
var result = await chatCompletionService.GetChatMessageContentAsync(
history,
executionSettings: openAIPromptExecutionSettings,
kernel: kernel);
// Print the results
Console.WriteLine("Assistant > " + result);
// Add the message from the agent to the chat history
history.AddMessage(result.Role, result.Content ?? string.Empty);
} while (userInput is not null)
import asyncio
from semantic_kernel import Kernel
from semantic_kernel.connectors.ai import FunctionChoiceBehavior
from semantic_kernel.connectors.ai.chat_completion_client_base import ChatCompletionClientBase
from semantic_kernel.connectors.ai.open_ai import (
AzureChatCompletion,
AzureChatPromptExecutionSettings,
)
from semantic_kernel.contents import ChatHistory
from semantic_kernel.functions import kernel_function
async def main():
# 1. Create the kernel with the Lights plugin
kernel = Kernel()
kernel.add_service(AzureChatCompletion())
kernel.add_plugin(
LightsPlugin(),
plugin_name="Lights",
)
chat_completion: AzureChatCompletion = kernel.get_service(type=ChatCompletionClientBase)
# 2. Enable automatic function calling
execution_settings = AzureChatPromptExecutionSettings()
execution_settings.function_choice_behavior = FunctionChoiceBehavior.Auto()
# Create a history of the conversation
history = ChatHistory()
userInput = None
while True:
# Collect user input
userInput = input("User > ")
# Terminate the loop if the user says "exit"
if userInput == "exit":
break
# Add user input to the history
history.add_user_message(userInput)
# 3. Get the response from the AI with automatic function calling
result = await chat_completion.get_chat_message_content(
chat_history=history,
settings=execution_settings,
kernel=kernel,
)
# Print the results
print("Assistant > " + str(result))
# Add the message from the agent to the chat history
history.add_message(result)
# Run the main function
if __name__ == "__main__":
asyncio.run(main())
OpenAIAsyncClient client = new OpenAIClientBuilder()
.credential(new AzureKeyCredential(AZURE_CLIENT_KEY))
.endpoint(CLIENT_ENDPOINT)
.buildAsyncClient();
// Import the LightsPlugin
KernelPlugin lightPlugin = KernelPluginFactory.createFromObject(new LightsPlugin(),
"LightsPlugin");
// Create your AI service client
ChatCompletionService chatCompletionService = OpenAIChatCompletion.builder()
.withModelId(MODEL_ID)
.withOpenAIAsyncClient(client)
.build();
// Create a kernel with Azure OpenAI chat completion and plugin
Kernel kernel = Kernel.builder()
.withAIService(ChatCompletionService.class, chatCompletionService)
.withPlugin(lightPlugin)
.build();
// Add a converter to the kernel to show it how to serialise LightModel objects into a prompt
ContextVariableTypes
.addGlobalConverter(
ContextVariableTypeConverter.builder(LightModel.class)
.toPromptString(new Gson()::toJson)
.build());
// Enable planning
InvocationContext invocationContext = new InvocationContext.Builder()
.withReturnMode(InvocationReturnMode.LAST_MESSAGE_ONLY)
.withToolCallBehavior(ToolCallBehavior.allowAllKernelFunctions(true))
.build();
// Create a history to store the conversation
ChatHistory history = new ChatHistory();
// Initiate a back-and-forth chat
Scanner scanner = new Scanner(System.in);
String userInput;
do {
// Collect user input
System.out.print("User > ");
userInput = scanner.nextLine();
// Add user input
history.addUserMessage(userInput);
// Prompt AI for response to users input
List<ChatMessageContent<?>> results = chatCompletionService
.getChatMessageContentsAsync(history, kernel, invocationContext)
.block();
for (ChatMessageContent<?> result : results) {
// Print the results
if (result.getAuthorRole() == AuthorRole.ASSISTANT && result.getContent() != null) {
System.out.println("Assistant > " + result);
}
// Add the message from the agent to the chat history
history.addMessage(result);
}
} while (userInput != null && !userInput.isEmpty());
Wenn Sie automatische Funktionsaufrufe verwenden, werden alle Schritte in der automatischen Planungsschleife für Sie behandelt und dem ChatHistory Objekt hinzugefügt. Nachdem die Funktionsaufrufschleife abgeschlossen ist, können Sie das ChatHistory Objekt überprüfen, um alle vom semantischen Kernel bereitgestellten Funktionsaufrufe und Ergebnisse anzuzeigen.
Was ist mit den Planern "Stepwise" und "Handlebars" geschehen?
Die Planer "Stepwise" und "Handlebars" wurden als veraltet markiert und aus dem Semantic Kernel-Paket entfernt. Diese Planner werden in Python, .NET oder Java nicht mehr unterstützt.
Es wird empfohlen, Funktionsaufrufe zu verwenden, die sowohl leistungsstärker als auch für die meisten Szenarien einfacher zu verwenden sind.
Um vorhandene Lösungen zu aktualisieren, folgen Sie unserem Schrittweisen Planner-Migrationshandbuch.
Tipp
Verwenden Sie für neue KI-Agents Funktionsaufrufe anstelle der veralteten Planner. Es bietet bessere Flexibilität, integrierte Toolunterstützung und eine einfachere Entwicklungsumgebung.
Nächste Schritte
Nachdem Sie nun verstehen, wie Planner im semantischen Kernel funktionieren, erfahren Sie mehr darüber, wie Sie Ihren KI-Agent beeinflussen, damit sie Aufgaben im Auftrag Ihrer Benutzer am besten planen und ausführen können.