Flutter自然语言处理插件langchain_tiktoken的使用

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

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 回复

更多关于Flutter自然语言处理插件langchain_tiktoken的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中集成并使用langchain_tiktoken(假设这是一个提供自然语言处理功能的Flutter插件,虽然实际中可能没有这个具体名称的插件,但我会根据通常的NLP插件使用方式提供一个示例)的示例代码。

首先,你需要确保你的Flutter项目已经设置好,并且已经安装了必要的依赖。由于langchain_tiktoken可能是一个假想的插件名称,我将使用一个假设的NLP插件名称nlp_plugin作为替代,并展示如何集成和使用它。

1. 添加依赖

在你的pubspec.yaml文件中添加NLP插件的依赖(这里使用nlp_plugin作为示例):

dependencies:
  flutter:
    sdk: flutter
  nlp_plugin: ^1.0.0  # 假设的版本号

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

2. 导入插件

在你的Dart文件中导入该插件:

import 'package:nlp_plugin/nlp_plugin.dart';

3. 使用插件进行自然语言处理

以下是一个假设的示例,展示如何使用该插件进行文本分词(Tokenization)和词性标注(POS Tagging):

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

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

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

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('NLP Plugin Demo'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              TextField(
                decoration: InputDecoration(
                  labelText: 'Enter Text',
                ),
                onChanged: (text) async {
                  setState(() {
                    resultText = await processText(text);
                  });
                },
              ),
              SizedBox(height: 20),
              Text(
                resultText,
                style: TextStyle(fontSize: 18),
              ),
            ],
          ),
        ),
      ),
    );
  }

  Future<String> processText(String text) async {
    // 假设插件提供了一个名为tokenizeAndTag的方法
    NLPResult result = await NLPPlugin.tokenizeAndTag(text);
    // 假设NLPResult是一个包含分词和词性标注结果的类
    List<Token> tokens = result.tokens;
    String output = '';
    for (Token token in tokens) {
      output += '${token.word} (${token.posTag})\n';
    }
    return output;
  }
}

// 假设NLPResult和Token类的定义如下(实际使用时需要根据插件的文档进行调整)
class NLPResult {
  List<Token> tokens;

  NLPResult({required this.tokens});
}

class Token {
  String word;
  String posTag;

  Token({required this.word, required this.posTag});
}

注意:上面的代码示例是基于假设的插件接口和类定义。在实际使用中,你需要根据langchain_tiktoken(或你实际使用的NLP插件)的文档来调整代码。特别是NLPPlugin.tokenizeAndTag方法和NLPResultToken类的定义可能会有所不同。

由于langchain_tiktoken可能不是一个真实存在的Flutter插件,你可能需要寻找一个实际的NLP插件,如flutter_nlp或其他NLP相关的Flutter包,并根据其文档进行相应的集成和使用。

回到顶部