Microsoft Agent Framework, jetzt als Release Candidate
- Matt
Wer im letzten Jahr Agenten in .NET bauen wollte, stand vor der Wahl zwischen Semantic Kernel und AutoGen, wobei beide von Microsoft kamen und beide dasselbe Problem lösen sollten. Diese Doppelung ist jetzt beendet: Das Microsoft Agent Framework führt beide zusammen und hat den Release Candidate erreicht.
Der einfache Fall
Ein Agent ist im Kern ein Chat-Client mit Anweisung und Werkzeugen:
using Microsoft.Agents.AI;
AIAgent agent = new OpenAIClient(key)
.GetChatClient("gpt-4o-mini")
.AsIChatClient()
.CreateAIAgent(
instructions: "Du beantwortest Fragen zur Rechnungsstellung. Kurz und ohne Floskeln.",
tools: [AIFunctionFactory.Create(OffeneRechnungen)]);
var antwort = await agent.RunAsync("Wie viele offene Rechnungen hat Kunde 40815?");
Console.WriteLine(antwort);
Man erkennt die Bausteine wieder. AsIChatClient und AIFunctionFactory sind dieselben wie bei Microsoft.Extensions.AI, das Agent Framework setzt darauf auf statt daneben. Das ist der wichtigste Unterschied zu Semantic Kernel, das seine eigene Welt aus Kernel, Plugins und Konnektoren mitbrachte.
Zustand über mehrere Runden
Das eigentlich Neue gegenüber blossem Tool Calling ist der Faden:
var thread = agent.GetNewThread();
await agent.RunAsync("Zeig mir die offenen Rechnungen von Kunde 40815.", thread);
await agent.RunAsync("Und davon die aus dem letzten Quartal.", thread);
Der zweite Aufruf weiß, wovon der erste sprach. Das musste man vorher selbst verwalten, inklusive der Frage, wann der Verlauf zu lang wird.
Für Oberflächen gibt es RunStreamingAsync, und typisierte Ergebnisse liefert RunAsync<T>(), was das Herausparsen von JSON aus Prosa erspart.
Was es nicht löst
Der Rahmen macht das Bauen einfach, nicht das Betreiben. Wie viele Modellaufrufe eine Nutzeranfrage auslöst, wann ein Agent im Kreis läuft und was passiert, wenn ein Werkzeug drei Sekunden braucht, bleibt die eigene Verantwortung. Beim Tool Calling war das noch offensichtlich, weil man die Schleife sah. Ein Agent versteckt sie.
Der zweite Punkt bleibt derselbe wie eh und je: Was ein Agent aufrufen darf, entscheidet ein Sprachmodell auf Basis von Text, der vom Nutzer stammt. Ein Agent mit Schreibrechten ohne Bestätigung dazwischen ist keine gute Idee, egal wie ausgereift der Rahmen ist.
Ob ich umsteige
Bei Neuem ja, weil die Konvergenz das Argument für Semantic Kernel erledigt hat. Bestehendes würde ich nicht anfassen, solange es läuft. Ein Release Candidate ist kein GA, und die Namen einzelner Methoden haben sich zwischen den Vorabversionen bereits verschoben.