Microsoft Agent Framework - 结构化输出

B站影视 港台电影 2025-10-28 13:39 1

摘要:在与大型语言模型(LLM)交互时,我们通常会得到非结构化的文本回复。虽然这对于聊天机器人应用来说很棒,但在许多场景下,我们需要稳定、可预测的格式化数据,例如 JSON。结构化输出确保了 AI 的响应可以直接被应用程序的其他部分(如业务逻辑、API 或 UI 组

前面我们已经对 Agent 的使用有了初步的了解。今天我们来谈谈在 Agent 实际应用中非常有用的一个东西:结构化输出(JSON)。

在与大型语言模型(LLM)交互时,我们通常会得到非结构化的文本回复。虽然这对于聊天机器人应用来说很棒,但在许多场景下,我们需要稳定、可预测的格式化数据,例如 JSON。结构化输出确保了 AI 的响应可以直接被应用程序的其他部分(如业务逻辑、API 或 UI 组件)以编程方式解析和使用,从而大大提高了系统的稳定性和可靠性。

Microsoft Agent Framework 提供了一种强大而简单的方法来强制模型返回特定格式的结构化数据。让我们深入了解如何实现这一点。

首先,你需要定义希望从模型获得的 C# 数据结构。这可以是一个简单的class或record。在这个例子中,我们定义一个PersonInfo类来保存关于一个人的信息。using System.ComponentModel;

namespaceMSAgentFramework.Learn;

publicclassPersonInfo
{
[Description("The name of the person")]
publicstring Name { get; set; }

[Description("The age of the person")]
publicint Age { get; set; }

[Description("The occupation of the person")]
publicstring Occupation { get; set; }
}
Description特性可以为模型提供关于每个属性的额外上下文,从而提高输出质量。接下来,我们需要将 C# 类转换为模型可以理解的 JSON Schema。Microsoft.Agents.AI.AIJsonUtilities类可以轻松完成这项工作。然后,我们将此 Schema 配置到ChatOptions中,并用它来创建using Azure.AI.OpenAI;
using Microsoft.Agents.AI;
using System.ClientModel;
using System.Text.Json;
using MSAgentFramework.Learn;

// 配置 Azure OpenAI 客户端
var azureAiEndpoint = "https://
var apiKey = "

// 1. 从 C# 类创建 JSON Schema
JsonElement schema = AIJsonUtilities.CreateJsonSchema(typeof(PersonInfo));

// 2. 配置 ChatOptions 以使用 JSON 模式
var chatOptions = new ChatOptions
{
ResponseFormat = ChatResponseFormat.ForJsonSchema(
schema: schema,
schemaName: "PersonInfo",
schemaDescription: "Information about a person including their name, age, and occupation")
};

// 3. 创建 Agent 并传入配置
AIAgent agent = new AzureOpenAIClient(
new Uri(azureAiEndpoint),
new ApiKeyCredential(apiKey))
.GetChatClient("gpt-4o-mini")
.CreateAIAgent(new ChatClientAgentOptions
{
Name = "HelpfulAssistant",
Instructions = "You are a helpful assistant.",
ChatOptions = chatOptions
});
通过ChatResponseFormat.ForJsonSchema,我们指示模型必须返回一个符合所提供PersonInfo结构和描述的 JSON 对象。现在,当我们调用 Agent 时,其响应将是一个 JSON 字符串,可以轻松地反序列化为我们的PersonInfoC# 对象。RunAsync// 调用 Agent
var response = await agent.RunAsync("Please provide information about michael jackson, who is a famous singer.");

// response.Text 将包含 JSON 字符串
Console.WriteLine(response.Text);
// 输出:
// {
// "Name": "Michael Jackson",
// "Age": 50,
// "Occupation": "Singer"
// }

// 直接反序列化为 C# 对象
var jsonOption = new JsonSerializerOptions(JsonSerializerDefaults.Web);
var personInfo = response.Deserialize

Console.WriteLine($"Name: {personInfo.Name}, Age: {personInfo.Age}, Occupation: {personInfo.Occupation}");
// 输出:
// Name: Michael Jackson, Age: 50, Occupation: Singer
流式响应 (RunStreamingAsync)

在需要实时显示结果(例如在 UI 中逐字显示)的场景中,流式传输非常有用。你可以异步迭代更新,并在完成后将它们聚合并反序列化。

// 以流式方式调用 Agent
var updates = agent.RunStreamingAsync("Please provide information about joe biden, who is a USA president.");

// 实时处理更新
awaitforeach (var update in updates)
{
Console.Write(update.Text);
}

// 将所有流式更新聚合为最终响应
var finalResponse = await updates.ToAgentRunResponseAsync;

// 反序列化最终的 JSON 结果
var personInfo1 = finalResponse.Deserialize
Console.WriteLine($"Name: {personInfo1.Name}, Age: {personInfo1.Age}, Occupation: {personInfo1.Occupation}");
// 输出:
// Name: Joe Biden, Age: 81, Occupation: USA President

通过使用 Microsoft Agent Framework 的结构化输出功能,你可以构建更健壮、更可靠的 AI 应用。它将 LLM 的灵活性与强类型数据的可预测性相结合,使你能够轻松地将 AI 的输出集成到任何 .NET 应用程序的工作流中。这不仅减少了因解析格式不一致而导致的运行时错误,还简化了代码,使开发过程更加高效。

来源:opendotnet

相关推荐