You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C# Semantic Kernel中获取Token使用量?

获取Semantic Kernel流式调用Azure OpenAI的Token使用量

调用GetStreamingChatMessageContentsAsync本身不会直接返回Token统计数据,但可以通过以下两种方式获取每次提问的Token使用量:

方法一:通过Semantic Kernel的ChatMessageContent Metadata获取

在Semantic Kernel的最新版本中,流式返回的ChatMessageContent对象的Metadata属性会包含底层Azure OpenAI响应的Usage信息(通常在最后一个流式响应块中)。你可以在遍历流式内容时检查该属性:

using Microsoft.SemanticKernel;
using Azure.AI.OpenAI;

// 初始化Kernel和ChatCompletionService
var kernel = Kernel.CreateBuilder()
    .AddAzureOpenAIChatCompletion("部署名称", "Azure OpenAI端点", "API密钥")
    .Build();
var chatCompletionService = kernel.GetRequiredService<IChatCompletionService>();

var chatHistory = new ChatHistory();
chatHistory.AddUserMessage("请解释Semantic Kernel的插件机制");

await foreach (var content in chatCompletionService.GetStreamingChatMessageContentsAsync(chatHistory))
{
    // 处理流式返回的内容
    Console.Write(content.Content);

    // 检查并提取Token使用量
    if (content.Metadata.TryGetValue("Usage", out var usageObj) && usageObj is ChatCompletionsUsage usage)
    {
        Console.WriteLine($"\n--- Token统计 ---");
        Console.WriteLine($"提问Token数: {usage.PromptTokens}");
        Console.WriteLine($"回答Token数: {usage.CompletionTokens}");
        Console.WriteLine($"总Token数: {usage.TotalTokens}");
    }
}

注意:此功能依赖Semantic Kernel对Azure OpenAI响应的封装,需确保使用最新版本的Microsoft.SemanticKernel.Connectors.OpenAI NuGet包。

方法二:直接使用Azure.AI.OpenAI原生客户端

如果Semantic Kernel的封装未暴露Token使用量,可以直接使用Azure.AI.OpenAI包的ChatCompletionsClient发起流式请求,获取完整的StreamingChatCompletionsResponse,其中包含Usage属性。之后可以将响应内容整合到Semantic Kernel的插件工作流中:

using Azure.AI.OpenAI;

var client = new ChatCompletionsClient(new Uri("Azure OpenAI端点"), new Azure.AzureKeyCredential("API密钥"));

var chatCompletionsOptions = new ChatCompletionsOptions()
{
    DeploymentName = "部署名称",
    Messages =
    {
        new ChatMessage(ChatRole.User, "请解释Semantic Kernel的插件机制")
    },
    Stream = true
};

await foreach (var response in client.GetChatCompletionsStreamingAsync(chatCompletionsOptions))
{
    foreach (var choice in response.Choices)
    {
        Console.Write(choice.Delta.Content);
    }

    // 最后一个响应块会包含Usage信息
    if (response.Usage != null)
    {
        Console.WriteLine($"\n--- Token统计 ---");
        Console.WriteLine($"提问Token数: {response.Usage.PromptTokens}");
        Console.WriteLine($"回答Token数: {response.Usage.CompletionTokens}");
        Console.WriteLine($"总Token数: {response.Usage.TotalTokens}");
    }
}

关于插件场景的说明

当使用自制插件时,Token用量会包含:

  • 用户提问的Token数
  • 系统提示词中关于插件描述、参数定义的Token数
  • AI生成的插件调用指令(若有)的Token数
  • AI最终回答的Token数
    这些都会被统计在Usage的PromptTokens和CompletionTokens中。

内容的提问来源于stack exchange,提问作者buchipper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 22:17:23