Flutter TikTok相关功能插件mishamosher_tiktoken的使用

Flutter TikTok相关功能插件mishamosher_tiktoken的使用

tiktoken 是一个用于与OpenAI模型配合使用的基于BPE(字节对编码)的分词器。

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

  • a) 这个字符串是否太长以至于无法被文本模型处理。
  • b) 一次OpenAI API调用的成本(因为使用量按标记计费)。 不同的模型使用不同的编码。

特性

Tiktoken 类提供了允许你使用标记处理文本的API,这些标记是在文本中找到的常见字符序列。你可以使用 tiktoken 包执行以下操作:

  • 将文本编码为标记
  • 将标记解码为文本
  • 比较不同的编码
  • 计算聊天API调用中的标记数

使用方法

更多示例请参见 /example 文件夹。

初始化

首先,通过 initData() 方法初始化编码数据:

import 'package:flutter/widgets.dart';
import 'package:mishamosher_tiktoken/mishamosher_tiktoken.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await TiktokenDataProcessCenter().initData();
}

加载编码

你可以通过编码名称或模型名称加载编码:

// 1. 通过编码名称加载编码
final encoding = getEncoding("cl100k_base");
print(encoding.name); // 'cl100k_base'

// 2. 通过模型名称加载编码
final encoding = encodingForModel("gpt-3.5-turbo");
print(encoding.name); // 'cl100k_base'

将文本转换为标记

你可以使用 encoding.encode() 方法将文本转换为标记:

final encoding = encodingForModel("gpt-3.5-turbo");
print(encoding.encode("tiktoken is great!")); // [83, 1609, 5963, 374, 2294, 0]

通过计算 encode 方法返回列表的长度来统计标记数量:

/// 返回文本字符串中的标记数量。
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

将标记转换为文本

你可以使用 encoding.decode() 方法将标记转换回文本:

final encoding = encodingForModel("gpt-3.5-turbo");
print(encoding.decode([83, 1609, 5963, 374, 2294, 0])); // 'tiktoken is great!'

警告: 虽然 .decode() 可以应用于单个标记,但请注意,对于不在utf-8边界上的标记可能会导致信息丢失。

对于单个标记,.decode_single_token_bytes() 安全地将单个整数标记转换为其表示的字节:

final encoding = encodingForModel("gpt-3.5-turbo");
final tokens = [83, 1609, 5963, 374, 2294, 0];
final bytes = tokens.map((token) => encoding.decodeSingleTokenBytes(token));
print(bytes.map((e) => utf8.decode(e)).toList()); // ['t', 'ik', 'token', 'is', 'great', '!']

比较编码

不同的编码在分割单词、组合空格和处理非英文字符方面可能有所不同。使用上述方法,我们可以比较不同编码在几个示例字符串上的表现:

/// 打印三种字符串编码的比较结果。
void compareEncodings(String exampleString) {
  // 打印示例字符串
  print('\nExample string: "$exampleString"');
  // 对于每种编码,打印标记数量、标记整数和标记字节
  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");

// Example string: "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 TikTok相关功能插件mishamosher_tiktoken的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter TikTok相关功能插件mishamosher_tiktoken的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter项目中,如果你想使用 mishamosher_tiktoken 插件来实现类似TikTok的功能,首先需要确保你已经将该插件添加到了你的 pubspec.yaml 文件中。以下是如何在Flutter项目中集成和使用 mishamosher_tiktoken 插件的示例代码。

1. 添加依赖

首先,打开你的 pubspec.yaml 文件,并添加 mishamosher_tiktoken 依赖:

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

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

2. 导入插件

在你的 Dart 文件中(例如 main.dart),导入该插件:

import 'package:mishamosher_tiktoken/mishamosher_tiktoken.dart';

3. 使用插件功能

假设 mishamosher_tiktoken 插件提供了类似于TikTok的短视频录制和播放功能,以下是一个基本的示例代码,展示如何使用这些功能(请注意,实际插件的API可能有所不同,这里只是一个假设的示例):

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: TikTokScreen(),
    );
  }
}

class TikTokScreen extends StatefulWidget {
  @override
  _TikTokScreenState createState() => _TikTokScreenState();
}

class _TikTokScreenState extends State<TikTokScreen> {
  TikTokController _tikTokController = TikTokController();

  @override
  void initState() {
    super.initState();
    // 初始化TikTok控制器,比如设置录制时间等
    _tikTokController.initialize(maxRecordingDuration: Duration(seconds: 15));
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('TikTok-like Feature'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            // 录制按钮
            ElevatedButton(
              onPressed: () {
                _tikTokController.startRecording();
              },
              child: Text('Start Recording'),
            ),
            // 停止按钮
            ElevatedButton(
              onPressed: () {
                _tikTokController.stopRecording();
              },
              child: Text('Stop Recording'),
            ),
            // 播放录制好的视频
            Expanded(
              child: TikTokPlayer(
                controller: _tikTokController,
              ),
            ),
          ],
        ),
      ),
    );
  }

  @override
  void dispose() {
    _tikTokController.dispose(); // 释放资源
    super.dispose();
  }
}

// 假设的TikTokPlayer组件,用于播放录制好的视频
class TikTokPlayer extends StatelessWidget {
  final TikTokController controller;

  TikTokPlayer({required this.controller});

  @override
  Widget build(BuildContext context) {
    return AspectRatio(
      aspectRatio: 16 / 9,
      child: VideoPlayerWidget(controller: controller), // 假设这是插件提供的视频播放器组件
    );
  }
}

// TikTokController是一个假设的控制器类,用于管理录制和播放功能
class TikTokController {
  void initialize(Duration maxRecordingDuration) {
    // 初始化逻辑
  }

  void startRecording() {
    // 开始录制逻辑
  }

  void stopRecording() {
    // 停止录制逻辑
  }

  void dispose() {
    // 释放资源逻辑
  }
}

// 假设的VideoPlayerWidget组件,用于显示视频
class VideoPlayerWidget extends StatelessWidget {
  final TikTokController controller;

  VideoPlayerWidget({required this.controller});

  @override
  Widget build(BuildContext context) {
    return Container(
      color: Colors.black,
      child: Center(
        child: Text('Playing Video...'), // 这里应该显示视频内容,但只是假设
      ),
    );
  }
}

注意事项

  1. 实际API可能不同:上述代码是基于假设的API编写的,实际使用时请参考 mishamosher_tiktoken 插件的官方文档。
  2. 权限:录制视频通常需要相机和麦克风权限,请确保在 AndroidManifest.xmlInfo.plist 中正确配置这些权限。
  3. 错误处理:在实际应用中,应添加适当的错误处理逻辑,以处理录制失败、播放失败等情况。

由于 mishamosher_tiktoken 插件的具体实现和API可能会有所不同,因此上述代码仅供参考。在实际项目中,请查阅插件的官方文档和示例代码,以获取准确的使用方法和API。

回到顶部