当前位置: 首页 > news >正文

ChatGPT如何计算token数?

GPT 不是适用于某一门语言的大型语言模型,它适用于几乎所有流行的自然语言。所以 GPT 的 token 需要 兼容 几乎人类的所有自然语言,那意味着 GPT 有一个非常全的 token 词汇表,它能表达出所有人类的自然语言。如何实现这个目的呢?

答案是通过 unicode 编码。

Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。

以下的网址可以计算一个语料的tokens数目:

https://platform.openai.com/tokenizericon-default.png?t=N7T8https://platform.openai.com/tokenizer

有两个问题:

  • 汉字是怎么编码的?
  • 编码和模型是否相关?

虽然 GPT-3.5 的代码和模型权重并未开源,但是 tokenizer 部分是开源到 GitHub - openai/tiktoken: tiktoken is a fast BPE tokeniser for use with OpenAI's models.tiktoken is a fast BPE tokeniser for use with OpenAI's models. - GitHub - openai/tiktoken: tiktoken is a fast BPE tokeniser for use with OpenAI's models.icon-default.png?t=N7T8https://github.com/openai/tiktoken 的,这是一个  BPE(Byte-Pair Encoding tokenization)方法的 tokenizer。

关于第一个问题,ChatGPT 是一个多语言模型,因此编码的问题不局限于汉字。tiktoken 的词表绝大多数是英文子词,并包含少量 unicode token 和表示字节的 token,以 UTF-8 的形式表示多语言。

关于第二个问题,不同的 OpenAI 模型采用了不同的编码方式。

  • GPT-4、GPT-3.5-turbo 等模型采用的是 cl100k_base,词表 100k 大小。
  • text-davinci 系列采用的是 p50k_base,词表大小 50k。
  • 还有一些其他模型采用了 r50k_base。
  • 更早的 GPT-2 有单独的编码方式,也开源在 HuggingFace。

https://github.com/openai/tiktoken/blob/main/tiktoken/model.pyicon-default.png?t=N7T8https://github.com/openai/tiktoken/blob/main/tiktoken/model.py作用:

用tiktoken进行token计数

​OpenAI的模型都有token限制。有时在将文本传递给API之前,需要计算字符串中的token数量,以确保不超过该限制。其中,一个需要计算token数量的技术是“检索增强生成(Retrieval Augmented Generation)”,通过对文档语料库运行搜索(或嵌入搜索)来回答用户的问题,提取最有可能的内容,并将其作为上下文涵盖在prompt中。成功实现这种模式的关键是,在token限制内包含尽可能多的相关上下文,因此需要能够计算token数量。OpenAI提供了一个名为tiktoken(https://github.com/openai/tiktoken)的Python库来实现这一功能。如果你深入研究这个库,就会发现它目前包括五种不同的切分方案:r50k_base、p50k_base、p50k_edit、cl100k_base和gpt2。其中,cl100k_base是最相关的,它是GPT-4和当前ChatGPT使用的经济型gpt-3.5-turbo模型的tokenizer。text-davinci-003 使用的是p50k_base 。在tiktoken/model.py 的MODEL_TO_ENCODING 词典中可以找到模型与tokenizer的完整映射。

相关文章:

  • 在Windows系统平台下部署运行服务端Idea工程的jar服务
  • 摄像头画面作为电脑桌面背景
  • 14:00面试,14:08就出来了,问的问题有点变态。。。
  • 【小白专用】php pdo sqlsrv 类,php连接sqlserver
  • 如何用 CleanMyMac 来保护 Mac 隐私
  • pyCharm 创建一个FastApi web项目,实现接口调用
  • English phrase
  • SQL server 数据库 sql常用语句
  • Achronix提供由FPGA赋能的智能网卡(SmartNIC)解决方案来打破智能网络性能极限
  • node.js mongoose aggregate
  • 用户管理第2节课-idea 2023.2 后端--删除表,从零开始
  • Skywalking系列之最新版9.2.0-JavaAgent本地构建
  • 【Docker】以service形式离线安装卸载的docker、compose服务
  • 暴雪来袭!AI智能视频监控如何保障雪天出行
  • 微信小程序更新机制
  • JavaScript 如何正确处理 Unicode 编码问题!
  • [译]CSS 居中(Center)方法大合集
  • 【5+】跨webview多页面 触发事件(二)
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • Android组件 - 收藏集 - 掘金
  • create-react-app项目添加less配置
  • go语言学习初探(一)
  • Phpstorm怎样批量删除空行?
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 聊聊flink的TableFactory
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 如何胜任知名企业的商业数据分析师?
  • 微信支付JSAPI,实测!终极方案
  • 线上 python http server profile 实践
  • 一文看透浏览器架构
  • #DBA杂记1
  • #Ubuntu(修改root信息)
  • (30)数组元素和与数字和的绝对差
  • (bean配置类的注解开发)学习Spring的第十三天
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (三) diretfbrc详解
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • (转)程序员技术练级攻略
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .NET Framework .NET Core与 .NET 的区别
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • .NET6 命令行启动及发布单个Exe文件
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • .NET微信公众号开发-2.0创建自定义菜单