Flutter GPT-4.0 文本处理插件tiktoken_tokenizer_gpt4o_o1的使用

发布于 1周前 作者 zlyuanteng 来自 Flutter

Flutter GPT-4.0 文本处理插件tiktoken_tokenizer_gpt4o_o1的使用


pub package

Tiktoken Tokenizer for GPT-4o, GPT-4, and o1 OpenAI models

这是一个实现Tiktoken分词器的库,该分词器用于OpenAI的模型。它是一个部分的Dart端口,从原始的OpenAI的tiktoken库而来,但具有更友好的API。

尽管在pub.dev上已有其他分词器,但截至2024年11月,它们都不支持GPT-4o和o1模型系列。此插件旨在填补这一空白。

支持的模型包括:

  • Gpt-4
  • Gpt-4o
  • Gpt-4o-mini
  • o1
  • o1-mini
  • o1-preview

此外,重要的是,这仅是一个Dart包(无需任何平台通道即可工作),并且分词操作是同步进行的。

将文本字符串拆分为标记很有用,因为GPT模型以标记的形式查看文本。知道文本字符串中有多少个标记可以告诉你:

  • 某些文本是否对文本模型来说太长了。
  • 一次OpenAI API调用的成本是多少(因为按标记计费)。

示例

要查看其运行情况,请运行示例应用:

如何使用它

// 创建一个Tiktoken实例以供你使用的模型。
var tiktoken = Tiktoken(OpenAiModel.gpt_4);

// 将文本字符串编码为标记。
var encoded = tiktoken.encode("hello world");

// 将标记字符串解码回文本。
var decoded = tiktoken.decode(encoded);

// 计算文本字符串中的标记数量。
int numberOfTokens = tiktoken.count("hello world");

高级使用

你还可以使用静态辅助函数getEncodergetEncoderForModel来获取TiktokenEncoder实例:

var encoder = Tiktoken.getEncoder(TiktokenEncodingType.o200k_base);
var encoder = Tiktoken.getEncoderForModel(OpenAiModel.gpt_4o);

TiktokenEncoder实例提供了对编码过程的更精细控制,因为你现在可以访问更多高级方法:

Uint32List encode(
    String text, {
    SpecialTokensSet allowedSpecial = const SpecialTokensSet.empty(),
    SpecialTokensSet disallowedSpecial = const SpecialTokensSet.all(),
  });

Uint32List encodeOrdinary(String text);

(List<int>, Set<List<int>>) encodeWithUnstable(
    String text, {
    SpecialTokensSet allowedSpecial = const SpecialTokensSet.empty(),
    SpecialTokensSet disallowedSpecial = const SpecialTokensSet.all(),
  });
  
int encodeSingleToken(List<int> bytes);

Uint8List decodeBytes(List<int> tokens); 

String decode(List<int> tokens, {bool allowMalformed = true}); 

Uint8List decodeSingleTokenBytes(int token)

List<Uint8List> decodeTokenBytes(List<int> tokens);

int? get eotToken;

在线分词器

我已经添加了许多测试以确保此Dart实现的正确性,但你也可以通过访问在线Tiktokenizer来比较此包的输出与默认实现的输出:

https://tiktokenizer.vercel.app/?model=gpt-4o

计数单词

词语和标记之间的关系是什么?

每种语言都有不同的词到标记的比例。以下是一些一般规则:

  • 对于英语:1个词大约是1.3个标记
  • 对于西班牙语和法语:1个词大约是2个标记
  • 标点符号、特殊字符和表情符号有多少个标记?
    • 每个标点符号(如, : ; ? !)算作1个标记。
    • 特殊字符(如∝√∅°¬)的范围是从1到3个标记。
    • 表情符号(如😁🙂🤩)的范围是从2到3个标记。

在此包中,我提供了一个单词计数器。你可以这样使用它:

var wordCounter = WordCounter();

// 打印0
print(wordCounter.count(''));

// 打印1
print(wordCounter.count('hello'));

// 打印2
print(wordCounter.count('hello world!'));

更多关于Flutter GPT-4.0 文本处理插件tiktoken_tokenizer_gpt4o_o1的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter GPT-4.0 文本处理插件tiktoken_tokenizer_gpt4o_o1的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,关于Flutter中如何使用tiktoken_tokenizer_gpt4o_o1(假设这是一个用于GPT-4.0文本处理的插件,尽管这个名称看起来是虚构的,我将提供一个类似的代码案例来展示如何在Flutter中使用一个文本处理插件)。在实际应用中,你需要找到并导入正确的插件包名。

以下是一个假设的Flutter插件使用案例,这里我们假设插件名为gpt4_tokenizer,并且它提供了GPT-4.0文本分词功能。

1. 添加依赖

首先,在你的pubspec.yaml文件中添加该插件的依赖项(请替换为实际的插件名称和版本):

dependencies:
  flutter:
    sdk: flutter
  gpt4_tokenizer: ^0.1.0  # 假设的版本号

然后运行flutter pub get来安装依赖。

2. 导入插件并使用

在你的Dart文件中导入该插件并使用其功能。例如,在lib/main.dart中:

import 'package:flutter/material.dart';
import 'package:gpt4_tokenizer/gpt4_tokenizer.dart';  // 导入插件

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String tokenizedText = '';

  void tokenizeText(String text) async {
    // 假设GPTTokenizer是该插件提供的一个类
    GPTTokenizer tokenizer = GPTTokenizer();
    List<String> tokens = await tokenizer.tokenize(text);
    
    setState(() {
      tokenizedText = tokens.join(' ');
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('GPT-4 Text Tokenizer Demo'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              TextField(
                decoration: InputDecoration(
                  labelText: 'Enter text to tokenize',
                ),
                onChanged: (value) {
                  // 这里可以添加即时分词功能,但为了简化,我们用一个按钮触发
                },
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: () {
                  // 获取TextField中的文本(这里为了简化,假设已经有一个文本变量text)
                  String text = 'This is a sample text for GPT-4 tokenization.';
                  tokenizeText(text);
                },
                child: Text('Tokenize Text'),
              ),
              SizedBox(height: 20),
              Text(
                'Tokenized Text:',
                style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
              ),
              Text(
                tokenizedText,
                style: TextStyle(fontSize: 16),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

注意事项

  1. 插件名称和API:上面的代码使用了假设的插件名称gpt4_tokenizer和类GPTTokenizer,以及一个假设的tokenize方法。你需要根据实际的插件文档来替换这些名称和方法。
  2. 异步操作:分词操作可能是异步的,因此我们在tokenizeText方法中使用了asyncawait关键字。
  3. UI更新:使用setState方法来更新UI,这是Flutter中常用的状态管理方法。

在实际开发中,请确保你查阅并遵循插件的官方文档,因为插件的API和用法可能会有所不同。

回到顶部