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.
Die Basis-Agent-Abstraktion macht verschiedene Optionen für die Ausführung des Agents verfügbar. Anrufer können auswählen, dass null, eine oder viele Eingabemeldungen eingegeben werden sollen. Anrufer können auch zwischen Streaming und Nicht-Streaming wählen. Schauen wir uns die verschiedenen Nutzungsszenarien an.
Streaming und Nicht-Streaming
Das Microsoft Agent Framework unterstützt Streaming- und Nicht-Streaming-Methoden zum Ausführen eines Agents.
Verwenden Sie die RunAsync Methode für Nichtstreaming.
Console.WriteLine(await agent.RunAsync("What is the weather like in Amsterdam?"));
Verwenden Sie zum Streaming die RunStreamingAsync Methode.
await foreach (var update in agent.RunStreamingAsync("What is the weather like in Amsterdam?"))
{
Console.Write(update);
}
Verwenden Sie die run Methode für Nichtstreaming.
result = await agent.run("What is the weather like in Amsterdam?")
print(result.text)
Verwenden Sie zum Streaming die run_stream Methode.
async for update in agent.run_stream("What is the weather like in Amsterdam?"):
if update.text:
print(update.text, end="", flush=True)
Agent-Ausführungsoptionen
Die Abstraktion des Basis-Agents ermöglicht das Übergeben eines Optionsobjekts für jede Agentausführung. Die Möglichkeit zum Anpassen einer Ausführung auf Abstraktionsebene ist jedoch ziemlich begrenzt. Agents können erheblich variieren und daher gibt es keine wirklich gängigen Anpassungsoptionen.
Für Fälle, in denen der Anrufer den Typ des Agents kennt, mit dem sie arbeiten, ist es möglich, typspezifische Optionen zu übergeben, um die Ausführung zuzulassen.
Hier ist beispielsweise der Agent ein ChatClientAgent Und es ist möglich, ein ChatClientAgentRunOptions Objekt zu übergeben, das von AgentRunOptions.
Auf diese Weise kann der Aufrufer benutzerdefinierte Optionen ChatOptions bereitstellen, die mit allen Optionen auf Agentebene zusammengeführt werden, bevor sie an die IChatClientChatClientAgent integrierte Funktion übergeben werden.
var chatOptions = new ChatOptions() { Tools = [AIFunctionFactory.Create(GetWeather)] };
Console.WriteLine(await agent.RunAsync("What is the weather like in Amsterdam?", options: new ChatClientAgentRunOptions(chatOptions)));
Python-Agents unterstützen das Übergeben von Schlüsselwortargumenten, um jede Ausführung anzupassen. Die verfügbaren Optionen hängen vom Agenttyp ab, unterstützen aber ChatAgent viele Chatclientparameter, die an beide run Methoden run_stream übergeben werden können.
Allgemeine Optionen für ChatAgent Folgendes:
-
max_tokens: Maximale Anzahl der zu generierenden Token -
temperature: Steuert zufallslos bei der Reaktionsgenerierung -
model: Überschreiben des Modells für diese spezifische Ausführung -
tools: Fügen Sie nur zusätzliche Tools für diese Ausführung hinzu. -
response_format: Angeben des Antwortformats (z. B. strukturierte Ausgabe)
# Run with custom options
result = await agent.run(
"What is the weather like in Amsterdam?",
temperature=0.3,
max_tokens=150,
model="gpt-4o"
)
# Streaming with custom options
async for update in agent.run_stream(
"Tell me a detailed weather forecast",
temperature=0.7,
tools=[additional_weather_tool]
):
if update.text:
print(update.text, end="", flush=True)
Wenn sowohl Standardoptionen auf Agentebene als auch Laufzeitoptionen bereitgestellt werden, haben die Optionen auf Ausführungsebene Vorrang.
Antworttypen
Sowohl Streaming- als auch Nicht-Streaming-Antworten von Agents enthalten alle vom Agent produzierten Inhalte. Inhalte können Daten enthalten, die nicht das Ergebnis (d. h. die Antwort auf die Benutzerfrage) vom Agent sind. Beispiele für andere zurückgegebene Daten sind Funktionstoolaufrufe, Ergebnisse von Funktionstoolaufrufen, Grundursachentext, Statusaktualisierungen und vieles mehr.
Da nicht alle zurückgegebenen Inhalte das Ergebnis sind, ist es wichtig, nach bestimmten Inhaltstypen zu suchen, wenn Sie versuchen, das Ergebnis vom anderen Inhalt zu isolieren.
Um das Textergebnis aus einer Antwort zu extrahieren, müssen alle TextContent Elemente aus allen ChatMessages Elementen aggregiert werden.
Um dies zu vereinfachen, stellen wir eine Text Eigenschaft für alle Antworttypen bereit, die alle TextContentaggregiert.
Für den Nicht-Streaming-Fall wird alles in einem AgentRunResponse Objekt zurückgegeben.
AgentRunResponse ermöglicht den Zugriff auf die erzeugten Nachrichten über die Messages Eigenschaft.
var response = await agent.RunAsync("What is the weather like in Amsterdam?");
Console.WriteLine(response.Text);
Console.WriteLine(response.Messages.Count);
Für den Streamingfall werden Objekte gestreamt, AgentRunResponseUpdate während sie produziert werden.
Jedes Update kann einen Teil des Ergebnisses des Agents und auch verschiedene andere Inhaltselemente enthalten.
Ähnlich wie beim Nicht-Streaming-Fall ist es möglich, die Text Eigenschaft zu verwenden, um den Teil des Ergebnisses abzurufen, der in der Aktualisierung enthalten ist, und einen Drilldown in das Detail über die Contents Eigenschaft durchzuführen.
await foreach (var update in agent.RunStreamingAsync("What is the weather like in Amsterdam?"))
{
Console.WriteLine(update.Text);
Console.WriteLine(update.Contents.Count);
}
Für den Nicht-Streaming-Fall wird alles in einem AgentRunResponse Objekt zurückgegeben.
AgentRunResponse ermöglicht den Zugriff auf die erzeugten Nachrichten über die messages Eigenschaft.
Um das Textergebnis aus einer Antwort zu extrahieren, müssen alle TextContent Elemente aus allen ChatMessage Elementen aggregiert werden.
Um dies zu vereinfachen, stellen wir eine text Eigenschaft für alle Antworttypen bereit, die alle TextContentaggregiert.
response = await agent.run("What is the weather like in Amsterdam?")
print(response.text)
print(len(response.messages))
# Access individual messages
for message in response.messages:
print(f"Role: {message.role}, Text: {message.text}")
Für den Streamingfall werden Objekte gestreamt, AgentRunResponseUpdate während sie produziert werden.
Jedes Update kann einen Teil des Ergebnisses des Agents und auch verschiedene andere Inhaltselemente enthalten.
Ähnlich wie beim Nicht-Streaming-Fall ist es möglich, die text Eigenschaft zu verwenden, um den Teil des Ergebnisses abzurufen, der in der Aktualisierung enthalten ist, und einen Drilldown in das Detail über die contents Eigenschaft durchzuführen.
async for update in agent.run_stream("What is the weather like in Amsterdam?"):
print(f"Update text: {update.text}")
print(f"Content count: {len(update.contents)}")
# Access individual content items
for content in update.contents:
if hasattr(content, 'text'):
print(f"Content: {content.text}")
Nachrichtentypen
Eingaben und Ausgaben von Agents werden als Nachrichten dargestellt. Nachrichten werden in Inhaltselemente unterteilt.
Das Microsoft Agent Framework verwendet die Nachrichten- und Inhaltstypen, die von den Microsoft.Extensions.AI Abstraktionen bereitgestellt werden.
Nachrichten werden durch die ChatMessage Klasse dargestellt, und alle Inhaltsklassen erben von der Basisklasse AIContent .
Es gibt verschiedene AIContent Unterklassen, die verwendet werden, um verschiedene Inhaltstypen darzustellen. Einige werden als Teil der Basisabstraktionen Microsoft.Extensions.AI bereitgestellt, aber Anbieter können bei Bedarf auch eigene Typen hinzufügen.
Hier sind einige beliebte Typen von Microsoft.Extensions.AI:
| Typ | Description |
|---|---|
| TextContent | Textinhalte, die sowohl eingaben, z. B. von einem Benutzer oder Entwickler, als auch von der Ausgabe des Agents sein können. Enthält in der Regel das Textergebnis eines Agents. |
| DataContent | Binäre Inhalte, die sowohl Eingabe als auch Ausgabe sein können. Kann verwendet werden, um Bild-, Audio- oder Videodaten an den Agent (sofern unterstützt) zu übergeben. |
| UriContent | Eine URL, die in der Regel auf gehostete Inhalte verweist, z. B. ein Bild, Audio oder Video. |
| FunctionCallContent | Eine Anforderung eines Rückschlussdiensts zum Aufrufen eines Funktionstools. |
| FunctionResultContent | Das Ergebnis eines Funktionstoolaufrufs. |
Das Python Agent Framework verwendet Nachrichten- und Inhaltstypen aus dem agent_framework Paket.
Nachrichten werden durch die ChatMessage Klasse dargestellt, und alle Inhaltsklassen erben von der Basisklasse BaseContent .
Es gibt verschiedene BaseContent Unterklassen, die verwendet werden, um verschiedene Inhaltstypen darzustellen:
| Typ | Description |
|---|---|
TextContent |
Textinhalte, die sowohl Eingabe als auch Ausgabe des Agents sein können. Enthält in der Regel das Textergebnis eines Agents. |
DataContent |
Binäre Inhalte, die als Daten-URI dargestellt werden (z. B. base64-codierte Bilder). Kann verwendet werden, um Binärdaten an und vom Agent zu übergeben. |
UriContent |
Ein URI, der auf gehostete Inhalte verweist, z. B. ein Bild, eine Audiodatei oder ein Dokument. |
FunctionCallContent |
Eine Anforderung eines KI-Diensts zum Aufrufen eines Funktionstools. |
FunctionResultContent |
Das Ergebnis eines Funktionstoolaufrufs. |
ErrorContent |
Fehlerinformationen bei der Verarbeitung. |
UsageContent |
Tokenverwendungs- und Abrechnungsinformationen vom KI-Dienst. |
Hier erfahren Sie, wie Sie mit verschiedenen Inhaltstypen arbeiten:
from agent_framework import ChatMessage, TextContent, DataContent, UriContent
# Create a text message
text_message = ChatMessage(role="user", text="Hello!")
# Create a message with multiple content types
image_data = b"..." # your image bytes
mixed_message = ChatMessage(
role="user",
contents=[
TextContent("Analyze this image:"),
DataContent(data=image_data, media_type="image/png"),
]
)
# Access content from responses
response = await agent.run("Describe the image")
for message in response.messages:
for content in message.contents:
if isinstance(content, TextContent):
print(f"Text: {content.text}")
elif isinstance(content, DataContent):
print(f"Data URI: {content.uri}")
elif isinstance(content, UriContent):
print(f"External URI: {content.uri}")