easydu2002 / chat_gpt_oicq

ChatGPT qq机器人 谁不想拥有一只可爱的猫娘呢~
MIT License
285 stars 38 forks source link

关于token计算规则的疑惑 #7

Closed Lukangkang123 closed 1 year ago

Lukangkang123 commented 1 year ago

因为问的问题一般比回答短,按理说completion花费的token应该比prompt少,但是我这边prompt花费的token几乎全比completion多。目前我猜测它是把前文也当做一部分prompt输入到模型了。不过我不知道它到底会保留前文的几轮对话呢?有没有超参数可以改一下以节省token呢?

1671085324585
easydu2002 commented 1 year ago

IP7KNVVH}CG XR4229O4GHY 我也有些疑惑了,再看看文档去(

easydu2002 commented 1 year ago

首先可以确认的是,completion花费的未必比prompt少, 回答的内容也正常占用token

程序默认会保留前一轮对话,我起初以为有个参数可以设置tokens的使用限制(max_tokens),然而并不是...

另见 https://openai.com/api/pricing/#faq-completions-pricing

标准计算公式应该是 发送的消息占用的tokens * max(n, best_of) + max_tokens,

max(n, best_of) 在程序中为 1,这个是默认的

max_tokens是动态计算的,这里只是规定上限,程序中默认是256,具体多少取决于回复消息占用的token,把completion平均一下不会有超过这个限制的,实际上大多数回答都很难超过这个限制

所以这样算的话,按程序实现,token占用算法应该是 本轮对话+上轮对话的占用的tokens + 回复内容占用的tokens

easydu2002 commented 1 year ago

再减少的话,再往下节省应该很难了,最占用token的地方是对话记录,默认是保留一轮的,如果设置不跟踪会话整体体验就会不好。。

当前版本可以通过配置 officialAPI.maxTrackCount 来控制保留几轮对话,可以尝试设置为0

Lukangkang123 commented 1 year ago

再减少的话,再往下节省应该很难了,最占用token的地方是对话记录,默认是保留一轮的,如果设置不跟踪会话整体体验就会不好。。

当前版本可以通过配置 officialAPI.maxTrackCount 来控制保留几轮对话,可以尝试设置为0

感谢回复!我看了保留对话的代码,想问下这行代码,是不是有错误?[chatgpt-official.ts#L59] (https://github.com/easydu2002/chat_gpt_oicq/blob/060e9d5c4d72e2b5bf6213369db1dadff4124a56/src/handler/chatgpt-official.ts#L59) 感觉应该是保留问题和回答,这里保留了两次回答。所以就会出现这样的情况 a40e1eaf7e2d9be767c17cd288653aa

另外,我想问下能不能实现个通过命令设置api key的功能?就类似设置token那样设置api key

easydu2002 commented 1 year ago

想问下这行代码,是不是有错

确实有问题,更新了下,没测试环境,不确定是否可行,有问题晚上再改了~

另外,我想问下能不能实现个通过命令设置api key的功能?就类似设置token那样设置api key

周末会加,也欢迎提pr~

hypergraphUniverse commented 1 year ago

我刚才也在看代码,确实重复了。看起来我之前统计的数据可能会更短一点,也许一次对话平均需要的token更少?

(这个是 #3 里面我给的600token的猫娘问答消费,还没修这个问题的版本) 图片

easydu2002 commented 1 year ago

再减少的话,再往下节省应该很难了,最占用token的地方是对话记录,默认是保留一轮的,如果设置不跟踪会话整体体验就会不好。。 当前版本可以通过配置 officialAPI.maxTrackCount 来控制保留几轮对话,可以尝试设置为0

感谢回复!我看了保留对话的代码,想问下这行代码,是不是有错误?[chatgpt-official.ts#L59] (

https://github.com/easydu2002/chat_gpt_oicq/blob/060e9d5c4d72e2b5bf6213369db1dadff4124a56/src/handler/chatgpt-official.ts#L59

) 感觉应该是保留问题和回答,这里保留了两次回答。所以就会出现这样的情况 a40e1eaf7e2d9be767c17cd288653aa 另外,我想问下能不能实现个通过命令设置api key的功能?就类似设置token那样设置api key

想问下这行代码,是不是有错

会话记录已修复 8bed0eb

另外,我想问下能不能实现个通过命令设置api key的功能?就类似设置token那样设置api key

/token setkey [key] 即可 05224c1

easydu2002 commented 1 year ago

我刚才也在看代码,确实重复了。看起来我之前统计的数据可能会更短一点,也许一次对话平均需要的token更少?

(这个是 #3 里面我给的600token的猫娘问答消费,还没修这个问题的版本) 图片

确实重复了,记录的会话全是机器人的,已经修复了 8bed0eb

Lukangkang123 commented 1 year ago

再减少的话,再往下节省应该很难了,最占用token的地方是对话记录,默认是保留一轮的,如果设置不跟踪会话整体体验就会不好。。 当前版本可以通过配置 officialAPI.maxTrackCount 来控制保留几轮对话,可以尝试设置为0

感谢回复!我看了保留对话的代码,想问下这行代码,是不是有错误?[chatgpt-official.ts#L59] ( https://github.com/easydu2002/chat_gpt_oicq/blob/060e9d5c4d72e2b5bf6213369db1dadff4124a56/src/handler/chatgpt-official.ts#L59

) 感觉应该是保留问题和回答,这里保留了两次回答。所以就会出现这样的情况 a40e1eaf7e2d9be767c17cd288653aa 另外,我想问下能不能实现个通过命令设置api key的功能?就类似设置token那样设置api key

想问下这行代码,是不是有错

会话记录已修复 8bed0eb

另外,我想问下能不能实现个通过命令设置api key的功能?就类似设置token那样设置api key

/token setkey [key] 即可 05224c1

多谢! 我刚刚提交了一个支持多用户不同会话功能的pull request,你有空看一下吧~