如何拿到接口返回的消耗token
SemanticKernel
以下引用自官方案例
- Text模型
- 使用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);
```
- 直接使用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);
```
- 使用Kernel
- 暂不支持Embedding模型
客制方法
- 当前SK仅支持OpenAI和AzureOpenAI的模型调用,如何需要其他模型供应商目前有两种办法解决
- 使用OneAPI做一个中转成AzureOpenAI然后使用上述SK的方法使用。
- 自定义方法发送请求,使用AddKeyedSingleton注入。
定义IAzureTextEmbeddingCompletionService接口,引用ITextEmbeddingGenerationService
public interface IAzureTextEmbeddingCompletionService : ITextEmbeddingGenerationService
{
Task<(List<float>, TextEmbeddingUsage)> GenerateEmbeddingsByUsageAsync(IList<string> data, Kernel kernel = null, CancellationToken cancellationToken = default);
}
定义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; }
}
ModelClient的实现参考对话模型的对接方式实现,原理是一致的这里不详述。(.Net接入AzureOpenAI、OpenAI、通义千问、智谱AI、讯飞星火、文心一言大语言模型。 | FaceMan)
创建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));
获取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的更多相关文章
- httprunner学习3-extract提取token值参数关联(上个接口返回的token,传给下个接口请求参数)
前言 如何将上个接口的返回token,传给下个接口当做请求参数?这是最常见的一个问题了. 解决这个问题其实很简单,我们只需取出token值,设置为一个中间变量a,下个接口传这个变量a就可以了.那么接下 ...
- Postman----登录接口返回的reponse中token值传递给其他接口的一个简单接口测试示例
注: 在进行接口测试时,我们都需要使用登录,并且其他的接口都要在登录后进行,那么必不可少的会使用到将登录接口的reponse返回结果中的某些参数值需要进行返回,并传递给其他接口,这样才可以进行登录后的 ...
- C#进阶系列——WebApi 接口返回值不困惑:返回值类型详解
前言:已经有一个月没写点什么了,感觉心里空落落的.今天再来篇干货,想要学习Webapi的园友们速速动起来,跟着博主一起来学习吧.之前分享过一篇 C#进阶系列——WebApi接口传参不再困惑:传参详解 ...
- WebApi 接口返回值类型详解 ( 转 )
使用过Webapi的园友应该都知道,Webapi的接口返回值主要有四种类型 void无返回值 IHttpActionResult HttpResponseMessage 自定义类型 此篇就围绕这四块分 ...
- WebApi接口返回值不困惑:返回值类型详解
前言:已经有一个月没写点什么了,感觉心里空落落的.今天再来篇干货,想要学习Webapi的园友们速速动起来,跟着博主一起来学习吧.作为程序猿,我们都知道参数和返回值是编程领域不可分割的两大块,此前分享了 ...
- WebApi 接口返回值不困惑:返回值类型详解。IHttpActionResult、void、HttpResponseMessage、自定义类型
首先声明,我还没有这么强大的功底,只是感觉博主写的很好,就做了一个复制,请别因为这个鄙视我,博主网址:http://www.cnblogs.com/landeanfen/p/5501487.html ...
- (转)C# WebApi 接口返回值不困惑:返回值类型详解
原文地址:http://www.cnblogs.com/landeanfen/p/5501487.html 正文 前言:已经有一个月没写点什么了,感觉心里空落落的.今天再来篇干货,想要学习Webapi ...
- [转]C#进阶系列——WebApi 接口返回值不困惑:返回值类型详解
本文转自:http://www.cnblogs.com/landeanfen/p/5501487.html 阅读目录 一.void无返回值 二.IHttpActionResult 1.Json(T c ...
- C#进阶系列——WebApi接口返回值类型详解
阅读目录 一.void无返回值 二.IHttpActionResult 1.Json(T content) 2.Ok(). Ok(T content) 3.NotFound() 4.其他 5.自定义I ...
- WebService如何封装XML请求 以及解析接口返回的XML
原 WebService如何封装XML请求 以及解析接口返回的XML 置顶 2019年08月16日 15:00:47 童子泛舟 阅读数 28 标签: XML解析WebService第三方API 更多 ...
随机推荐
- Redis原理再学习01:数据结构-跳跃表skiplist
跳跃表skiplist 简介 你一定比较好奇Redis里面的 sorted set 是怎么实现的,底层到底是什么?它的排序功能就是用到了这个skiplist-跳跃表. 什么是跳跃表? 跳跃表可以看做是 ...
- nuxt调用weixin-js-sdk
在nuxt中调用weixin-js-sdk与在vue中有所不同. 通常在vue中用 import wx from 'weixin-js-sdk' 调用weixin-js-sdk,但在nuxt中会出现w ...
- django学习第十天---ajax请求和JsonResponse
AJAX 它是js的功能,特点:异步请求,局部刷新 简单请求示例 基于jquery的ajax请求 异步请求,不会刷新页面,页面上用户之前输入的数据都不会丢失 <p>下面是ajax请求< ...
- 04、RS232 协议介绍
从之前的学习,我们知道了 SECS-I 使用的 RS232 来进行数据的传输,那我们也初略的了解下 RS232. 这一篇不用看也可以. 这是最低的协议层.它定义了设备上的物理接口.它是基于RS-232 ...
- JAVA对象的生命周期(二)-对象的创建
目录 对象创建的几种方式 类加载检查. 内存分配 初始化零值 设置对象头 执行init方法 对象创建的几种方式 new clone newInstance 反序列化 String s = " ...
- 【Azure 应用服务】应用代码中需要使用客户端证书访问服务接口,部署在应用服务后报错不能找到证书(Cannot find the X.509 certificate)
问题描述 在应用中,需要访问另一个服务接口,这个接口需要使用客户端证书进行认证.在代码中使用 System.Security.Cryptography.X509Certificates 加载Windo ...
- RocketMQ(5) 订阅关系的一致性规范
多个消费者组订阅了多个Topic,并且每个消费者组里的多个消费者实例的订阅关系应该保持一致. 例如下消费关系, 不同的消费组,消费不同的队列,相同的消费组订阅相同的队列,tag 错误示例: 一个消费者 ...
- Codeforces Round 169 (Div. 2)C. Little Girl and Maximum Sum(差分、贪心)
目录 题面 链接 题意 题解 代码 总结 题面 链接 C. Little Girl and Maximum Sum 题意 给q个[l,r]将所有这些区间里面的数相加和最大. 可以进行的操作是任意排列数 ...
- .Net Core中使用DiagnosticSource进行日志记录
System.Diagnostics.DiagnosticSource 是一个可以对代码进行检测的模块,可以丰富地记录程序中地日志,包括可序列化的类型(例如 HttpResponseMessage 或 ...
- 摆脱鼠标操作 - vscode - vim - 官方说明文档 github上的,防止打不开,这里发一个
Key - command done - command done with VS Code specific customization ️ - some variations of the com ...