Flutter文本分词插件flutter_gpt_tokenizer的使用
Flutter文本分词插件flutter_gpt_tokenizer的使用
flutter_gpt_tokenizer
是一个帮助你在发送请求到OpenAI之前计算你的ChatGPT提示所需token数量的Flutter插件。它基于OpenAI的tiktoken
文件和BPE算法实现,尽管不是官方版本。
功能
encode
你的提示并返回编码后的字节。count
计算提示中的token数量但不返回编码后的字节。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
更多关于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],
),
),
),
],
),
);
}
}
代码说明
- 依赖引入:在
pubspec.yaml
中添加flutter_gpt_tokenizer
依赖。 - 主应用:创建了一个简单的 Flutter 应用,包含一个
Scaffold
和一个自定义的TokenizerDemo
小部件。 - TokenizerDemo 小部件:
- 包含一个初始文本
textToTokenize
。 - 在
initState
方法中调用tokenizeText
方法进行分词。 tokenizeText
方法中,创建一个GPTTokenizer
实例,并使用其tokenize
方法对文本进行分词。- 将分词结果存储在
tokens
列表中,并在 UI 中显示原始文本和分词结果。
- 包含一个初始文本
请确保你已经正确配置了 Flutter 环境,并且 flutter_gpt_tokenizer
插件的最新版本已经发布。如果插件 API 有所变动,请参考最新的官方文档进行调整。