大模型系列:OpenAI使用技巧_如何使用tiktoken计算标记数


tiktoken 是由OpenAI开发的快速开源分词器。

给定一个文本字符串(例如,"tiktoken is great!")和一个编码(例如,"cl100k_base"),分词器可以将文本字符串拆分为标记列表(例如,["t", "ik", "token", " is", " great", "!"])。

将文本字符串拆分为标记对于GPT模型非常有用,因为GPT模型以标记的形式处理文本。知道文本字符串中有多少个标记可以告诉您(a)字符串是否过长以至于无法被文本模型处理,以及(b)OpenAI API调用的成本(因为使用量是按标记计价的)。

编码

编码指定如何将文本转换为标记。不同的模型使用不同的编码。

tiktoken支持OpenAI模型使用的三种编码:

编码名称 OpenAI模型
cl100k_base gpt-4, gpt-3.5-turbo, text-embedding-ada-002
p50k_base Codex模型,text-davinci-002text-davinci-003
r50k_base(或gpt2 GPT-3模型,如davinci

您可以使用以下方式通过tiktoken.encoding_for_model()获取模型的编码:

encoding = tiktoken.encoding_for_model('gpt-3.5-turbo')

请注意,p50k_baser50k_base有很大的重叠,并且对于非代码应用,它们通常会给出相同的标记。

根据语言的分词器库

对于cl100k_basep50k_base编码:

对于r50k_basegpt2)编码,分词器在许多语言中都可用。

(OpenAI不对第三方库作任何认可或保证。)

字符串的常见分词方式

在英语中,标记通常的长度范围从一个字符到一个单词(例如,"t"" great"),尽管在某些语言中,标记可能比一个字符更短或比一个单词更长。空格通常与单词的开头分组(例如," is"而不是"is "" "+"is")。您可以在OpenAI Tokenizer或第三方的Tiktokenizer网页应用程序上快速检查字符串的分词方式。

0. 安装 tiktoken

如果需要,可以使用 pip 安装 tiktoken:

# 安装tiktoken库
%pip install --upgrade tiktoken

# 安装openai库
%pip install --upgrade openai

1. 导入 tiktoken

# 导入tiktoken模块,用于分词和标记化处理
import tiktoken

2. 加载一个编码

使用 tiktoken.get_encoding() 按名称加载一个编码。

第一次运行时,需要连接到互联网进行下载。后续运行不需要连接到互联网。



# 获取名为"cl100k_base"的编码格式
encoding = tiktoken.get_encoding("cl100k_base")

使用 tiktok.encoding_for_model() 自动加载给定模型名称的正确编码。



# 为"gpt-3.5-turbo"模型选择编码方式
encoding = tiktoken.encoding_for_model("gpt-3.5-turbo")

3. 使用encoding.encode()将文本转换为标记。

.encode()方法将一个文本字符串转换为一个令牌整数列表。



# 调用encode函数,将字符串"tiktoken is great!"进行编码
encoding.encode("tiktoken is great!")
[83, 1609, 5963, 374, 2294, 0]

通过计算.encode()返回的列表的长度来计算令牌数。

# 定义一个函数,用于计算一个文本字符串中的标记数量
def num_tokens_from_string(string: str, encoding_name: str) -> int:
    # 获取指定编码的编码器
    encoding = tiktoken.get_encoding(encoding_name)
    # 将文本字符串编码为指定编码,并计算编码后的标记数量
    num_tokens = 
<think>我们讨论的是Spring AI中OpenAI大模型如何处理输入文本的分词问题。OpenAI大模型(如GPT系列使用字节对编码(Byte Pair Encoding, BPE)或类似的分词方法。在Spring AI中,当你通过OpenAiChatClient发送请求时,文本在发送到OpenAI API之前会被OpenAI的分词器(tokenizer)处理。 具体过程: 1. 用户输入文本通过Spring AI的OpenAiChatClient发送。 2. 在底层,Spring AI使用OpenAI的API,因此文本会被OpenAI的分词器处理(通常是基于模型的分词器,例如GPT-3.5-turbo使用cl100k_base分词器)。 3. 分词器将文本分割成多个子词(subwords)或标记(tokens),这些标记是模型能够理解的单位。 在Spring AI中,开发者通常不需要直接处理分词过程,因为这是由OpenAI API自动完成的。但是,了解分词机制对于控制输入长度(避免超过模型的token限制)非常重要。 如果需要提前知道文本的token量,可以使用Spring AI提供的TokenCountEstimator(在0.8.0版本后引入)或使用OpenAI官方提供的tiktoken库(Java版本有类似实现,如com.knuddels:jtokkit)。 示例:使用Spring AI的TokenCountEstimator ```java // 假设已经配置了OpenAiChatClient OpenAiChatClient chatClient = ...; int tokenCount = chatClient.estimateTokenCount("Hello, how are you?"); ``` 或者,如果使用jtokkit库: ```java EncodingRegistry registry = Encodings.newDefaultEncodingRegistry(); Encoding encoding = registry.getEncoding(EncodingType.CL100K_BASE); List<Integer> tokens = encoding.encode("Hello, how are you?"); int tokenCount = tokens.size(); ``` 注意:不同模型使用不同的分词器,因此需要根据模型选择正确的分词器。 总结:Spring AI本身不进行分词,而是依赖OpenAI API的分词器。但为了方便控制输入长度,Spring AI提供了token计估计工具。 §§相关问题§§ 1. 在Spring AI中,如何准确计算输入文本的token量以避免超过模型的最大token限制? 2. 不同OpenAI模型(如GPT-3.5和GPT-4)使用的分词器有何区别? 3. 除了使用Spring AI的TokenCountEstimator,还有哪些Java库可以用于OpenAI模型的分词? 4. 在Spring AI应用中,如何处理由于输入文本过长导致的token超限错误? 5. 如何为Spring AI的OpenAI客户端配置自定义的分词处理策略?</think>在Spring AI中调用OpenAI大模型时,文本分词过程主要发生在模型内部,由OpenAI的API自动处理。以下是关键机制和注意事项: ### 分词机制解析 1. **OpenAI模型自身处理** - 使用字节对编码(BPE)分词器 - 基于模型的tokenizer(如GPT-3用`gpt-3.5-turbo`,GPT-4用`cl100k_base`) - 自动将文本拆分为子词单元(subword tokens) ```java // Spring AI调用示例(无需手动分词) OpenAiChatClient client = new OpenAiChatClient(apiKey); String response = client.call("请解释量子力学"); // 自动分词处理 ``` 2. **分词特点** - 中文按字分词(每个汉字通常1个token) - 英文按单词/子词拆分(如 "unbelievable" → "un", "believ", "able") - 特殊符号和标点单独处理 - 空格保留为分割符(`▁`字符表示) 3. **Token计规则** - 中文文本:平均1个汉字≈1.2-1.5 tokens - 英文文本:1个单词≈1-3 tokens - 可通过官方工具检查:https://platform.openai.com/tokenizer ### Spring AI中的注意事项 1. **长度限制** - 需自行控制输入长度(模型有token上限) ```java // 估算token(需引入tiktoken库) int tokenCount = TokenCountEstimator.estimate("你的文本"); ``` 2. **预处理建议** - 移除多余空格/换行符 - 统一全角/半角字符 - 避免特殊Unicode字符 3. **分词监控** - 启用详细日志查看请求/响应 ```properties # application.properties logging.level.org.springframework.ai=DEBUG ``` ### 完整调用流程 ```mermaid graph LR A[用户输入文本] --> B(Spring AI客户端) B --> C{OpenAI API} C --> D[自动BPE分词] D --> E[模型处理] E --> F[生成响应] F --> G[返回Spring AI] G --> H[最终输出] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数智笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值