首页 > 其他分享 >如何拿到接口返回的消耗token

如何拿到接口返回的消耗token

时间:2024-04-02 13:34:19浏览次数:30  
标签:set 接口 拿到 usage token result var new public

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);
      

标签:set,接口,拿到,usage,token,result,var,new,public
From: https://www.cnblogs.com/FaceMan/p/18110372

相关文章

  • 接口测试实战--postman做接口测试
    下面是用Python+flask写的接口,用来做接口测试fromflaskimportFlask,jsonify,requestapp=Flask(__name__)users=[{'id':1,'name':'tom','age':25},{'id':2,'name':'bob','age':30},{......
  • 京西商城——用户注册和获取用户信息接口开发
    user/views.pyfromdjango.httpimportHttpResponsefromrest_framework.viewsimportAPIViewfromapps.user.modelsimportUserfromapps.user.serializersimportUserSerializerfromutils.ResponseMessageimportUserResponseclassUserView(APIView):......
  • php获取淘宝详情api接口
    要获取淘宝商品的详情信息,你可以使用淘宝开放平台的接口。具体步骤如下:在淘宝开放平台(https://open.taobao.com)注册开发者账号。创建一个应用,获取appkey和appsecret。使用API中的taobao.item.get接口,传入商品ID以及appkey,即可获取商品的详情信息。示例代码如下(使用淘宝......
  • 什么原因让你想当程序员?只是顺利拿到 20k 无压力?
    部门捞人,前后端可投,点击通道即可:https://jinshuju.net/f/o38ijj第一点,钱多,即便非顶尖人才也能有较好的收入第二点,需求大,容易找到工作因为大多数人都是没背景、学历不高、颜值不高、人脉不广的第三点,现代社会,人情交际已经成了一些人的拖累,有的人甚至说出“见的人越多,就越喜欢计......
  • 身份证实名认证接口会返回什么?javascript身份核验接口示例
    身份证实名认证接口是通过核验身份证号、姓名、证件头像等一系列的要素信息进行用户身份验证,那么,身份证实名认证接口一般在核验完成后会返回什么参数信息呢?下面翔云API小编为大家答疑解惑!一般情况下,身份核验只会返回一致或者不一致的结果,不一致的情况下会返回那些参数不一致,以翔......
  • Microsoft.AspNetCore.SignalR.Client中传送用户Token
    Microsoft.AspNetCore.SignalR.Client的.Net客户端传送Token的最佳方法!如下将Authorization标头添加到HubConnectionBuilder中,如下所示:对于不记名令牌->HubConnection=newHubConnectionBuilder().WithUrl($"https://10.0.2.2:5001/chatHub",(opts)=>......
  • 为什么以太网的接收需要cmd fifo而ddr3的native接口可以不需要?
    1.以太网存在crc校验和其他的校验,直到这一帧完全传递完才知道是否需要这些数据;2.ddr3每次处理的数据是固定的(安全起见,防止4k边界问题,暂不设置可变burstlength),所以只需要:写入:通过fifo的计数设置满足burst长度时读出fifo写入ddr3,然后根据突发的周期标志修改cmd提供的地址即可......
  • 通过企业微信API接口发送消息(通过postman或者企业微信开发者中心《服务端API调试工具
    如何创建一个与企业后台互动的自建应用添加自建应用登录企业微信管理后台->应用管理->自建下创建应用,填写必要的logo,应用名称,在可见范围中选择部门/成员获取应用的相关信息agentid和secret;应用里创建完毕可出现在选择了可见范围的成员的企业微信终端上。使用Postman调试api......
  • token、jwt 和 jwt刷新token
     概念涉及到身份验证和授权的机制。Token概念:在网络通信中,Token是一个用于身份验证和授权的令牌。它通常是一个字符串,由服务端生成并发送给客户端,客户端在后续的请求中携带该令牌以证明自己的身份。Token可以是任意形式的字符串,比如随机生成的字符串、加密后的......
  • 0day卡号极团管理系统某接口存在SQL注入漏洞
     0x01阅读须知        技术文章仅供参考,此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用......