如何在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
相关产品推荐
相关产品推荐

