SemanticKernel

以下引用自官方案例

  1. Text模型

    1. 使用Kernel
          FunctionResult functionResult = await kernel.InvokePromptAsync(promptTestDataGeneration);
      CompletionsUsage? usage = FunctionResult.Metadata?["Usage"] as CompletionsUsage;
      //回答消耗的Token
      Console.WriteLine(usage.CompletionTokens);
      //提示词消耗的Token
      Console.WriteLine(usage.PromptTokens);
      //一共消耗的Token
      Console.WriteLine(usage.TotalTokens);
      ```
    2. 直接使用AzureOpenAIChatCompletionService
      	var service = new AzureOpenAIChatCompletionService("deployment", "https://endpoint", "api-key", "model-id", this._httpClient);
      var result = await service.GetChatMessageContentsAsync([], settings, kernel);
      var usage = result[0].Metadata?["Usage"] as CompletionsUsage;
      //回答消耗的Token
      Console.WriteLine(usage.CompletionTokens);
      //提示词消耗的Token
      Console.WriteLine(usage.PromptTokens);
      //一共消耗的Token
      Console.WriteLine(usage.TotalTokens);
      ```
  2. 暂不支持Embedding模型

客制方法

  1. 当前SK仅支持OpenAI和AzureOpenAI的模型调用,如何需要其他模型供应商目前有两种办法解决
  2. 使用OneAPI做一个中转成AzureOpenAI然后使用上述SK的方法使用。
  3. 自定义方法发送请求,使用AddKeyedSingleton注入。
    1. 定义IAzureTextEmbeddingCompletionService接口,引用ITextEmbeddingGenerationService

      public interface IAzureTextEmbeddingCompletionService : ITextEmbeddingGenerationService
      {
      Task<(List<float>, TextEmbeddingUsage)> GenerateEmbeddingsByUsageAsync(IList<string> data, Kernel kernel = null, CancellationToken cancellationToken = default);
      }
    2. 定义AzureTextEmbeddingCompletionService实现IAzureTextEmbeddingCompletionService接口

      public class AzureTextEmbeddingCompletionService : IAzureTextEmbeddingCompletionService
      {
      private readonly SemanticAzureOpenAIConfig config;
      private readonly Dictionary<string, object?> _attributes = new();
      private readonly ModelClient client;
      public IReadOnlyDictionary<string, object> Attributes => _attributes; public AzureTextEmbeddingCompletionService(ModelOptions options)
      {
      config = new SemanticAzureOpenAIConfig()
      {
      ApiKey = options.ApiKey,
      Endpoint = options.Endpoint,
      DeploymentName = "text-embedding-ada-002",
      ApiVersion = options.ModelVersion
      };
      client = new(config.ApiKey, ModelType.AzureOpenAI, config.Endpoint);
      } public async Task<IList<ReadOnlyMemory<float>>> GenerateEmbeddingsAsync(IList<string> data, Kernel kernel = null, CancellationToken cancellationToken = default)
      {
      var result = await client.AzureOpenAI.GenerateEmbeddingsAsync(config.DeploymentName, data.First());
      var list = result.Data[0].Embedding.ToList();
      IList<ReadOnlyMemory<float>> readOnlyMemoryList = list.Select(f => new ReadOnlyMemory<float>(new[] { f })).ToList();
      return readOnlyMemoryList;
      } public async Task<(List<float>, TextEmbeddingUsage)> GenerateEmbeddingsByUsageAsync(IList<string> data, Kernel kernel = null, CancellationToken cancellationToken = default)
      {
      var result = await client.AzureOpenAI.GenerateEmbeddingsAsync(config.DeploymentName, data.First());
      var list = result.Data[0].Embedding.ToList();
      IList<ReadOnlyMemory<float>> readOnlyMemoryList = list.Select(f => new ReadOnlyMemory<float>(new[] { f })).ToList();
      return (list, result.Usage);
      }
      }
      //定义入参类
      public class ModelOptions
      {
      public string AppId { get; set; } public string ApiKey { get; set; } public string ApiSecret { get; set; }
      public string Endpoint { get; set; }
      public string DeploymentName { get; set; }
      public ChatHistory ChatHistory { get; set; } = new ChatHistory(); public string ModelVersion { get; set; }
      }
    3. ModelClient的实现参考对话模型的对接方式实现,原理是一致的这里不详述。(.Net接入AzureOpenAI、OpenAI、通义千问、智谱AI、讯飞星火、文心一言大语言模型。 | FaceMan)

    4. 创建Kernel实例,注入IAzureTextEmbeddingCompletionService服务

      var builder = Kernel.CreateBuilder();
      var options = new ModelOptions()
      {
      Endpoint = "YourEndpoint",
      ApiKey = "YourApiKey",
      DeploymentName = "YourDeploymentName",,
      ChatHistory = "YourChatHistory",//Embedding可不填
      };
      builder.Services.AddKeyedSingleton<IAzureTextEmbeddingCompletionService>("AzureOpenAIEmbedding", new AzureTextEmbeddingCompletionService(options));
    5. 获取Embedding服务,获取Token

      var service = _kernel.GetRequiredService<IAzureTextEmbeddingCompletionService>();
      var res = await service.GenerateEmbeddingsByUsageAsync
      (new List<string> { partitionContent }, cancellationToken: cancellationToken)
      .ConfigureAwait(false);
      // item1 向量,item2消耗的token
      float[] result = res.Item1.ToArray<float>();
      totalToken += res.Item2.TotalTokens;
      Embedding embedding = new Embedding(result);

如何拿到接口返回的消耗token的更多相关文章

  1. httprunner学习3-extract提取token值参数关联(上个接口返回的token,传给下个接口请求参数)

    前言 如何将上个接口的返回token,传给下个接口当做请求参数?这是最常见的一个问题了. 解决这个问题其实很简单,我们只需取出token值,设置为一个中间变量a,下个接口传这个变量a就可以了.那么接下 ...

  2. Postman----登录接口返回的reponse中token值传递给其他接口的一个简单接口测试示例

    注: 在进行接口测试时,我们都需要使用登录,并且其他的接口都要在登录后进行,那么必不可少的会使用到将登录接口的reponse返回结果中的某些参数值需要进行返回,并传递给其他接口,这样才可以进行登录后的 ...

  3. C#进阶系列——WebApi 接口返回值不困惑:返回值类型详解

    前言:已经有一个月没写点什么了,感觉心里空落落的.今天再来篇干货,想要学习Webapi的园友们速速动起来,跟着博主一起来学习吧.之前分享过一篇 C#进阶系列——WebApi接口传参不再困惑:传参详解  ...

  4. WebApi 接口返回值类型详解 ( 转 )

    使用过Webapi的园友应该都知道,Webapi的接口返回值主要有四种类型 void无返回值 IHttpActionResult HttpResponseMessage 自定义类型 此篇就围绕这四块分 ...

  5. WebApi接口返回值不困惑:返回值类型详解

    前言:已经有一个月没写点什么了,感觉心里空落落的.今天再来篇干货,想要学习Webapi的园友们速速动起来,跟着博主一起来学习吧.作为程序猿,我们都知道参数和返回值是编程领域不可分割的两大块,此前分享了 ...

  6. WebApi 接口返回值不困惑:返回值类型详解。IHttpActionResult、void、HttpResponseMessage、自定义类型

    首先声明,我还没有这么强大的功底,只是感觉博主写的很好,就做了一个复制,请别因为这个鄙视我,博主网址:http://www.cnblogs.com/landeanfen/p/5501487.html ...

  7. (转)C# WebApi 接口返回值不困惑:返回值类型详解

    原文地址:http://www.cnblogs.com/landeanfen/p/5501487.html 正文 前言:已经有一个月没写点什么了,感觉心里空落落的.今天再来篇干货,想要学习Webapi ...

  8. [转]C#进阶系列——WebApi 接口返回值不困惑:返回值类型详解

    本文转自:http://www.cnblogs.com/landeanfen/p/5501487.html 阅读目录 一.void无返回值 二.IHttpActionResult 1.Json(T c ...

  9. C#进阶系列——WebApi接口返回值类型详解

    阅读目录 一.void无返回值 二.IHttpActionResult 1.Json(T content) 2.Ok(). Ok(T content) 3.NotFound() 4.其他 5.自定义I ...

  10. WebService如何封装XML请求 以及解析接口返回的XML

    原 WebService如何封装XML请求 以及解析接口返回的XML 置顶 2019年08月16日 15:00:47 童子泛舟 阅读数 28 标签: XML解析WebService第三方API 更多 ...

随机推荐

  1. Ansible的基本配置

    目录 定义主机和组 主机的定义 主机组的定于 主机组的嵌套 选择主机和组 匹配主机 使用通配符匹配 配置文件优先级 配置文件详解 配置文件段 配置文件参数说明 配置案例 1. 在节点上创建一个普通用户 ...

  2. XXL-Job框架入门介绍

    框架概述 框架主页: https://www.xuxueli.com/xxl-job/ 包含组件: 1.调度中心 2.任务执行器 特点: 1.调度中心,任务执行器独立部署,互不影响. 2.调度中心和任 ...

  3. 【Azure Developer】使用 Microsoft Graph API查看用户状态和登录记录

    问题描述 通过Microsoft Graph的API如何来查看用户信息和登录记录呢? 问题解答 第一步:需要一个授权Token 比如一个拥有查看用户权限的Azure账号,通过Azure CLI 命令获 ...

  4. 【Azure 事件中心】使用Kafka消费Azure EventHub中数据,遇见消费慢的情况可以如何来调节呢?

    问题描述 使用Kafka消费Azure EventHub中数据,遇见消费慢的情况可以如何来调节呢? 问题解答 查看Kafka Consumer的配置参数,其中最只要的一个参数为:max.poll.re ...

  5. 【Azure 应用服务】App Service多个部署槽(Slot)之间,设置Traffic百分比后,如何来判断请求是由那一个槽(Slot)来进行处理呢?

    问题描述 当我们部署应用到App Service后,为了实现对生成的最小影响,通常是把新版本部署在一个预生产的槽中,然后进行验证.另一方面,为了进行A/B验证,需要把生成槽的流量,切入一部分到预生产槽 ...

  6. .Net之多语言配置

    介绍 支持多语言使网站可以覆盖更广泛的受众. ASP.NET Core 提供的服务和中间件可将网站本地化为不同的语言. 本次示例环境:vs2019.net5 配置 无需引用Nuget包即可实现以下功能 ...

  7. C语言之兔子生产问题

    /#include <stdio.h> main() { long fib1 = 1, fib2 = 1, fib;//定义长整型变量,fib1表示当前前一个月的兔子数,fib2表示当前前 ...

  8. Github登录 2FA(Two-Factor Authentication/两因素认证) 浏览器插件-已验证

    Github登录 2FA(Two-Factor Authentication/两因素认证) 浏览器插件-已验证 chrome 装下这个扩展 身份验证器 https://chromewebstore.g ...

  9. C#实现软件开机自启动(不需要管理员权限)

    目录 原理简介 使用方法 完整代码 原理简介 本文参考C#/WPF/WinForm/程序实现软件开机自动启动的两种常用方法,将里面中的第一种方法做了封装成AutoStart类,使用时直接两三行代码就可 ...

  10. day08-2-Thymeleaf

    服务器渲染技术-Thymeleaf 1.基本介绍 官方在线文档:Read online 文档下载:Thymeleaf 3.1 PDF, EPUB, MOBI Thymeleaf 是什么 Thymele ...