Flutter自然语言处理插件langchain_tiktoken的使用
Flutter自然语言处理插件langchain_tiktoken的使用
langchain_tiktoken
langchain_tiktoken
是一个用于与 OpenAI 模型一起使用的 BPE(字对编码)分词器。
- 用途:将文本字符串拆分成 token,因为 GPT 模型以 token 的形式看待文本。知道文本字符串中有多少个 token 可以帮助你判断:
- a) 文本字符串是否过长,无法由文本模型处理。
- b) OpenAI API 调用的成本(按 token 计费)。
不同的模型使用不同的编码。
特性
Tiktoken
类提供了处理文本使用 token 的 API,其中 token 是在文本中常见的字符序列。 tiktoken
包可以做以下事情:
- 将文本编码为 token
- 将 token 解码为文本
- 比较不同编码
- 统计聊天 API 调用中的 token 数量
使用示例
import 'package:langchain_tiktoken/tiktoken.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await TiktokenDataProcessCenter().initData();
}
import 'package:langchain_tiktoken/tiktoken.dart';
// 加载编码
final encoding = encodingForModel("gpt-4");
// 分词文本
print(encoding.encode("tiktoken is great!")); // [83, 1609, 5963, 374, 2294, 0]
// 解码 token
print(encoding.decode([83, 1609, 5963, 374, 2294, 0])); // "tiktoken is great!"
// 或者通过指定编码名称获取 tokenizer
final encoding = getEncoding("cl100k_base");
assert(enc.decode(enc.encode("hello world")) == "hello world");
扩展 tiktoken
你可能希望扩展 Tiktoken
支持新的编码。你可以通过传递现有的模型来做到这一点:
import 'package:langchain_tiktoken/tiktoken.dart';
// 创建基础
final cl100kBase = encodingForModel("cl100k_base");
// 初始化一个新的编码并扩展基参数
final encoding = Tiktoken(
name: "cl100k_im",
patStr: cl100kBase.patStr,
mergeableRanks: cl100kBase.mergeableRanks,
specialTokens: {
...cl100kBase.specialTokens,
"<|im_start|>": 100264,
"<|im_end|>": 100265,
},
);
额外信息
这是用 Dart 编写的 tiktoken 库的 Dart 版本,原版是用 Rust 和 Python 写的。
示例代码
加载编码
// 1. 通过编码名称加载编码
final encoding = getEncoding("cl100k_base");
print(encoding.name) // 'cl100k_base'
// 2. 通过模型名称加载编码
final encoding = encodingForModel("gpt-3.5-turbo");
print(encoding.name) // 'cl100k_base'
将文本转换为 token
final encoding = encodingForModel("gpt-3.5-turbo");
print(encoding.encode("tiktoken is great!")); // [83, 1609, 5963, 374, 2294, 0]
统计 token 数量
/// 返回文本字符串中的 token 数量。
int numTokensFromString(String string, String encodingName) {
final encoding = getEncoding(encodingName);
final numTokens = encoding.encode(string).length;
return numTokens;
}
print(numTokensFromString("tiktoken is great!", "cl100k_base")); // 6
将 token 转换为文本
final encoding = encodingForModel("gpt-3.5-turbo");
print(encoding.decode([83, 1609, 5963, 374, 2294, 0])); // 'tiktoken is great!'
警告
虽然 .decode()
可以应用于单个 token,但要注意对于不在 utf-8 边界上的 token,它可能会丢失信息。
比较编码
/// 打印三种字符串编码的比较结果。
void compareEncodings(String exampleString) {
// 打印示例字符串
print('\nExample string: "$exampleString"');
// 对于每种编码,打印 token 数量、token 整数和 token 字节
for (var encodingName in ["gpt2", "p50k_base", "cl100k_base"]) {
final encoding = getEncoding(encodingName);
final tokenIntegers = encoding.encode(exampleString);
final numTokens = tokenIntegers.length;
final tokenBytes = tokenIntegers.map((token) => encoding.decodeSingleTokenBytes(token));
print("");
print("$encodingName: $numTokens tokens");
print("token integers: $tokenIntegers");
print("token bytes: ${tokenBytes.map(utf8.decode).toList()}");
}
}
compareEncodings("antidisestablishmentarianism");
// 示例字符串: "antidisestablishmentarianism"
// gpt2: 5 tokens
// token integers: [415, 29207, 44390, 3699, 1042]
// token bytes: ['ant', 'idis', 'establishment', 'arian', 'ism']
// p50k_base: 5 tokens
// token integers: [415, 29207, 44390, 3699, 1042]
// token bytes: ['ant', 'idis', 'establishment', 'arian', 'ism']
// cl100k_base: 6 tokens
// token integers: [519, 85342, 34500, 479, 8997, 2191]
// token bytes: ['ant', 'idis', 'establish', 'ment', 'arian', 'ism']
更多关于Flutter自然语言处理插件langchain_tiktoken的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
1 回复