Flutter文本分词插件flutter_gpt_tokenizer的使用

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

Flutter文本分词插件flutter_gpt_tokenizer的使用

flutter_gpt_tokenizer 是一个帮助你在发送请求到OpenAI之前计算你的ChatGPT提示所需token数量的Flutter插件。它基于OpenAI的tiktoken文件和BPE算法实现,尽管不是官方版本。

功能

  1. encode 你的提示并返回编码后的字节。
  2. count 计算提示中的token数量但不返回编码后的字节。
  3. decode 将编码后的token解码为原始提示。

使用方法

加载和缓存tiktoken文件

首次使用 Tokenizer() 时,会尝试从OpenAI的公共端点加载并缓存特定模型名称的tiktoken文件。

初始化实例BPEWrapper

如果在 Tokenizer() 中找不到特定模型名称的 BPEWrapper 实例,则会在Rust侧读取其tiktoken文件,并构造一个该模型的 BPEWrapper 实例。

示例代码

以下是一个完整的示例应用程序,展示如何使用 flutter_gpt_tokenizer 进行文本编码、计数和解码。

import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:flutter_gpt_tokenizer/flutter_gpt_tokenizer.dart';

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

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final TextEditingController _controller = TextEditingController();

  @override
  void dispose() {
    _controller.dispose();
    Tokenizer().dispose();
    super.dispose();
  }

  List<int>? _encoded;
  String? _decoded;
  int? _count;

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Native Packages'),
        ),
        body: SingleChildScrollView(
          child: Container(
            padding: const EdgeInsets.all(10),
            child: Column(
              children: [
                TextField(
                  controller: _controller,
                  decoration: InputDecoration(
                    border: const OutlineInputBorder(),
                    labelText: 'Text',
                    hintText: "Enter your prompt here",
                    suffixIcon: _buildModelSelector(),
                  ),
                ),
                const SizedBox(height: 10),
                if (_encoded != null)
                  Text(
                    'Encoded: ${_encoded!.toList()}',
                    style: const TextStyle(fontSize: 20),
                  ),
                if (_decoded != null)
                  Text(
                    'Decoded: $_decoded',
                    style: const TextStyle(fontSize: 20),
                  ),
                if (_count != null)
                  Text(
                    'Count: $_count',
                    style: const TextStyle(fontSize: 20),
                  ),
              ],
            ),
          ),
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: _encode,
          child: const Text(
            'Encode',
            style: TextStyle(fontSize: 12),
          ),
        ),
      ),
    );
  }

  void _encode() async {
    final text = _controller.text;
    Tokenizer()
        .encode(
      text,
      modelName: _currentModel,
    )
        .then((encoded) async {
      print("Encoded: $encoded");
      final decoded = await Tokenizer()
          .decode(Uint32List.fromList(encoded), modelName: _currentModel);

      final count = await Tokenizer().count(
        text,
        modelName: _currentModel,
      );

      setState(() {
        _encoded = encoded;
        _decoded = decoded;
        _count = count;
      });
    });

    Tokenizer().encode("$text, copy", modelName: _currentModel).then((encoded) {
      print("Encoded copy: $encoded");
    });
  }

  String _currentModel = "gpt-4";

  Widget _buildModelSelector() {
    return DropdownButton<String>(
      value: _currentModel,
      items: const [
        DropdownMenuItem(
          value: "gpt-4",
          child: Text("gpt-4"),
        ),
        DropdownMenuItem(
          value: "gpt-3.5-turbo",
          child: Text("gpt-3.5-turbo"),
        ),
        DropdownMenuItem(
          value: "text-davinci-003",
          child: Text("text-davinci-003"),
        ),
        DropdownMenuItem(
          value: "text-davinci-edit-001",
          child: Text("text-davinci-edit-001"),
        ),
        DropdownMenuItem(
          value: "davinci",
          child: Text("davinci"),
        ),
      ],
      onChanged: (value) async {
        if (value == null) return;

        print("set tokenizer for: $value");
        setState(() {
          _currentModel = value;
        });
      },
    );
  }
}

注意事项

  • 如果你只想知道提示的token长度,最好使用 Tokenizer().count
  • 确保在不再需要使用 Tokenizer 时调用 Tokenizer().dispose() 以释放资源。

支持的模型

支持的模型包括但不限于 gpt-4, gpt-3.5-turbo, text-davinci-003 等。


这个Markdown文档详细描述了如何使用 `flutter_gpt_tokenizer` 插件来对文本进行分词处理,并提供了完整的示例代码以便开发者快速上手。

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

1 回复

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


当然,下面是一个关于如何使用 flutter_gpt_tokenizer 插件来进行文本分词的示例代码。这个插件主要用于处理大型语言模型(如 GPT)的文本输入,通过分词可以更好地管理文本数据。

首先,确保你已经在 pubspec.yaml 文件中添加了 flutter_gpt_tokenizer 依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_gpt_tokenizer: ^最新版本号  # 请替换为实际的最新版本号

然后,运行 flutter pub get 来获取依赖。

接下来,在你的 Dart 文件中,你可以这样使用 flutter_gpt_tokenizer

import 'package:flutter/material.dart';
import 'package:flutter_gpt_tokenizer/flutter_gpt_tokenizer.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter GPT Tokenizer Demo'),
        ),
        body: TokenizerDemo(),
      ),
    );
  }
}

class TokenizerDemo extends StatefulWidget {
  @override
  _TokenizerDemoState createState() => _TokenizerDemoState();
}

class _TokenizerDemoState extends State<TokenizerDemo> {
  final String textToTokenize = "Flutter is an open-source UI software development kit created by Google.";
  List<String> tokens = [];

  @override
  void initState() {
    super.initState();
    tokenizeText();
  }

  void tokenizeText() async {
    // 创建GPTTokenizer实例
    final tokenizer = GPTTokenizer();

    // 分词
    List<Token> tokenList = await tokenizer.tokenize(textToTokenize);

    // 提取分词结果
    setState(() {
      tokens = tokenList.map((token) => token.text).toList();
    });
  }

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.all(16.0),
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: [
          Text(
            'Original Text:',
            style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
          ),
          SizedBox(height: 8),
          Text(textToTokenize, style: TextStyle(fontSize: 16)),
          SizedBox(height: 24),
          Text(
            'Tokenized Text:',
            style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
          ),
          SizedBox(height: 8),
          Wrap(
            children: List.generate(
              tokens.length,
              (index) => Chip(
                label: Text(tokens[index]),
                backgroundColor: Colors.blueGrey[100],
              ),
            ),
          ),
        ],
      ),
    );
  }
}

代码说明

  1. 依赖引入:在 pubspec.yaml 中添加 flutter_gpt_tokenizer 依赖。
  2. 主应用:创建了一个简单的 Flutter 应用,包含一个 Scaffold 和一个自定义的 TokenizerDemo 小部件。
  3. TokenizerDemo 小部件
    • 包含一个初始文本 textToTokenize
    • initState 方法中调用 tokenizeText 方法进行分词。
    • tokenizeText 方法中,创建一个 GPTTokenizer 实例,并使用其 tokenize 方法对文本进行分词。
    • 将分词结果存储在 tokens 列表中,并在 UI 中显示原始文本和分词结果。

请确保你已经正确配置了 Flutter 环境,并且 flutter_gpt_tokenizer 插件的最新版本已经发布。如果插件 API 有所变动,请参考最新的官方文档进行调整。

回到顶部