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.
In diesem Lernschritt erfahren Sie, wie Sie eine strukturierte Ausgabe mit einem Agenten erzeugen, der auf dem Azure OpenAI Chat Completion-Service basiert.
Von Bedeutung
Nicht alle Agenttypen unterstützen strukturierte Ausgabe. Dieser Schritt verwendet eine ChatClientAgent, die strukturierte Ausgabe unterstützt.
Voraussetzungen
Für Voraussetzungen und die Installation von NuGet-Paketen siehe den Schritt Erstellen und Ausführen eines einfachen Agenten in diesem Tutorial.
Erstellen eines Agents mit strukturierter Ausgabe
Dies ChatClientAgent basiert auf jeder IChatClient Implementierung.
Der ChatClientAgent nutzt die Unterstützung für strukturierte Ausgaben, die vom zugrunde liegenden Chatclient bereitgestellt wird.
Beim Erstellen des Agents haben Sie die Möglichkeit, die Standardinstanz ChatOptions bereitzustellen, die für den zugrunde liegenden Chatclient verwendet werden soll.
Mit dieser ChatOptions Instanz können Sie eine bevorzugte ChatResponseFormatInstanz auswählen.
Es stehen verschiedene Optionen zur ResponseFormat Verfügung:
- Eine integrierte ChatResponseFormat.Text Eigenschaft: Die Antwort wird im Klartext sein.
- Eine integrierte Eigenschaft: Die Antwort ist ein JSON-Objekt ChatResponseFormat.Json ohne ein bestimmtes Schema.
- Eine benutzerdefinierte ChatResponseFormatJson Instanz: Die Antwort ist ein JSON-Objekt, das einem bestimmten Schema entspricht.
In diesem Beispiel wird ein Agent erstellt, der eine strukturierte Ausgabe in Form eines JSON-Objekts erzeugt, das einem bestimmten Schema entspricht.
Die einfachste Möglichkeit zum Erstellen des Schemas besteht darin, einen Typ zu definieren, der die Struktur der vom Agent gewünschten Ausgabe darstellt, und dann die AIJsonUtilities.CreateJsonSchema Methode zum Erstellen eines Schemas aus dem Typ verwenden.
using System.Text.Json;
using System.Text.Json.Serialization;
using Microsoft.Extensions.AI;
public class PersonInfo
{
public string? Name { get; set; }
public int? Age { get; set; }
public string? Occupation { get; set; }
}
JsonElement schema = AIJsonUtilities.CreateJsonSchema(typeof(PersonInfo));
Anschließend können Sie eine ChatOptions Instanz erstellen, die dieses Schema für das Antwortformat verwendet.
using Microsoft.Extensions.AI;
ChatOptions chatOptions = new()
{
ResponseFormat = ChatResponseFormat.ForJsonSchema(
schema: schema,
schemaName: "PersonInfo",
schemaDescription: "Information about a person including their name, age, and occupation")
};
Diese ChatOptions Instanz kann beim Erstellen des Agents verwendet werden.
using System;
using Azure.AI.OpenAI;
using Azure.Identity;
using Microsoft.Agents.AI;
using OpenAI;
AIAgent agent = new AzureOpenAIClient(
new Uri("https://<myresource>.openai.azure.com"),
new DefaultAzureCredential())
.GetChatClient("gpt-4o-mini")
.AsAIAgent(new ChatClientAgentOptions()
{
Name = "HelpfulAssistant",
Instructions = "You are a helpful assistant.",
ChatOptions = chatOptions
});
Warnung
DefaultAzureCredential ist praktisch für die Entwicklung, erfordert aber sorgfältige Überlegungen in der Produktion. Berücksichtigen Sie in der Produktion die Verwendung bestimmter Anmeldeinformationen (z. B. ManagedIdentityCredential), um Latenzprobleme, unbeabsichtigte Abfragen von Anmeldeinformationen und potenzielle Sicherheitsrisiken durch Ausweichmechanismen zu vermeiden.
Jetzt können Sie den Agenten einfach mit Textinformationen starten, die er zum Ausfüllen der strukturierten Ausgabe verwenden kann.
var response = await agent.RunAsync("Please provide information about John Smith, who is a 35-year-old software engineer.");
Die Agentantwort kann dann mithilfe der PersonInfo Methode für das Antwortobjekt in die Deserialize<T> Klasse deserialisiert werden.
var personInfo = response.Deserialize<PersonInfo>(JsonSerializerOptions.Web);
Console.WriteLine($"Name: {personInfo.Name}, Age: {personInfo.Age}, Occupation: {personInfo.Occupation}");
Beim Streaming wird die Agent-Antwort als eine Reihe von Updates gestreamt, und Sie können die Antwort nur deserialisieren, nachdem alle Updates empfangen wurden. Sie müssen alle Updates in einer einzigen Antwort zusammenstellen, bevor Sie sie deserialisieren.
var updates = agent.RunStreamingAsync("Please provide information about John Smith, who is a 35-year-old software engineer.");
personInfo = (await updates.ToAgentResponseAsync()).Deserialize<PersonInfo>(JsonSerializerOptions.Web);
Tipp
Vollständige Runnable-Beispiele finden Sie in den .NET-Beispielen .
Streamingbeispiel
Tipp
Vollständige Runnable-Beispiele finden Sie in den .NET-Beispielen .
In diesem Lernschritt erfahren Sie, wie Sie eine strukturierte Ausgabe mit einem Agenten erzeugen, der auf dem Azure OpenAI Chat Completion-Service basiert.
Von Bedeutung
Nicht alle Agenttypen unterstützen strukturierte Ausgabe.
Agent unterstützt die strukturierte Ausgabe, wenn es mit kompatiblen Chat-Clients verwendet wird.
Voraussetzungen
Die erforderlichen Komponenten und die Installation von Paketen finden Sie im Schritt "Erstellen und Ausführen eines einfachen Agents " in diesem Lernprogramm.
Erstellen eines Agents mit strukturierter Ausgabe
Diese Agent basiert auf jeder Chat-Client-Implementierung, die strukturierte Ausgabe unterstützt.
Der Agent verwendet den response_format Parameter, um das gewünschte Ausgabeschema anzugeben.
Beim Erstellen oder Ausführen des Agents können Sie ein Pydantisches Modell bereitstellen, das die Struktur der erwarteten Ausgabe definiert.
Verschiedene Antwortformate werden basierend auf den zugrunde liegenden Chatclientfunktionen unterstützt.
In diesem Beispiel wird ein Agent erstellt, der eine strukturierte Ausgabe in Form eines JSON-Objekts erzeugt, das einem Pydantischen Modellschema entspricht.
Definieren Sie zunächst ein Pydantisches Modell, das die Struktur der gewünschten Ausgabe aus dem Agent darstellt:
from pydantic import BaseModel
class PersonInfo(BaseModel):
"""Information about a person."""
name: str | None = None
age: int | None = None
occupation: str | None = None
Jetzt können Sie einen Agent mit dem Azure OpenAI-Chatclient erstellen:
from agent_framework.azure import AzureOpenAIChatClient
from azure.identity import AzureCliCredential
# Create the agent using Azure OpenAI Chat Client
agent = AzureOpenAIChatClient(credential=AzureCliCredential()).as_agent(
name="HelpfulAssistant",
instructions="You are a helpful assistant that extracts person information from text."
)
Jetzt können Sie den Agent mit textbezogenen Informationen ausführen und das strukturierte Ausgabeformat mithilfe des response_format Parameters angeben:
response = await agent.run(
"Please provide information about John Smith, who is a 35-year-old software engineer.",
response_format=PersonInfo
)
Die Agentantwort enthält die strukturierte Ausgabe in der value Eigenschaft, auf die direkt als Pydantische Modellinstanz zugegriffen werden kann:
if response.value:
person_info = response.value
print(f"Name: {person_info.name}, Age: {person_info.age}, Occupation: {person_info.occupation}")
else:
print("No structured data found in response")
Beim Streaming gibt agent.run(..., stream=True) ein ResponseStream zurück. Der integrierte Finalizer des Datenstroms verarbeitet automatisch die strukturierten Ausgabedaten, sodass Sie nach Echtzeitaktualisierungen durchlaufen können und dann get_final_response() aufrufen, um das geparste Ergebnis abzurufen.
# Stream updates in real time, then get the structured result
stream = agent.run(query, stream=True, options={"response_format": PersonInfo})
async for update in stream:
print(update.text, end="", flush=True)
# get_final_response() returns the AgentResponse with the parsed value
final_response = await stream.get_final_response()
if final_response.value:
person_info = final_response.value
print(f"Name: {person_info.name}, Age: {person_info.age}, Occupation: {person_info.occupation}")
Wenn Sie keine einzelnen Streamingupdates verarbeiten müssen, können Sie die Iteration vollständig überspringen – get_final_response() verwendet automatisch den Datenstrom:
stream = agent.run(query, stream=True, options={"response_format": PersonInfo})
final_response = await stream.get_final_response()
if final_response.value:
person_info = final_response.value
print(f"Name: {person_info.name}, Age: {person_info.age}, Occupation: {person_info.occupation}")
Vollständiges Beispiel
# Copyright (c) Microsoft. All rights reserved.
import asyncio
from agent_framework.openai import OpenAIResponsesClient
from pydantic import BaseModel
"""
OpenAI Responses Client with Structured Output Example
This sample demonstrates using structured output capabilities with OpenAI Responses Client,
showing Pydantic model integration for type-safe response parsing and data extraction.
"""
class OutputStruct(BaseModel):
"""A structured output for testing purposes."""
city: str
description: str
async def non_streaming_example() -> None:
print("=== Non-streaming example ===")
agent = OpenAIResponsesClient().as_agent(
name="CityAgent",
instructions="You are a helpful agent that describes cities in a structured format.",
)
query = "Tell me about Paris, France"
print(f"User: {query}")
result = await agent.run(query, options={"response_format": OutputStruct})
if structured_data := result.value:
print("Structured Output Agent:")
print(f"City: {structured_data.city}")
print(f"Description: {structured_data.description}")
else:
print(f"Failed to parse response: {result.text}")
async def streaming_example() -> None:
print("=== Streaming example ===")
agent = OpenAIResponsesClient().as_agent(
name="CityAgent",
instructions="You are a helpful agent that describes cities in a structured format.",
)
query = "Tell me about Tokyo, Japan"
print(f"User: {query}")
# Stream updates in real time using ResponseStream
stream = agent.run(query, stream=True, options={"response_format": OutputStruct})
async for update in stream:
if update.text:
print(update.text, end="", flush=True)
print()
# get_final_response() returns the AgentResponse with structured output parsed
result = await stream.get_final_response()
if structured_data := result.value:
print("Structured Output (from streaming with ResponseStream):")
print(f"City: {structured_data.city}")
print(f"Description: {structured_data.description}")
else:
print(f"Failed to parse response: {result.text}")
async def main() -> None:
print("=== OpenAI Responses Agent with Structured Output ===")
await non_streaming_example()
await streaming_example()
if __name__ == "__main__":
asyncio.run(main())