Skip to content

Latest commit

 

History

History
355 lines (233 loc) · 16.4 KB

20230706_05.md

File metadata and controls

355 lines (233 loc) · 16.4 KB

PostgreSQL 或PolarDB 使用插件pg_tiktoken - 使用 OpenAI tiktoken库文本向量化(tokenization) - 使用分词算法BPE - NLP 自然语言处理

作者

digoal

日期

2023-07-06

标签

PostgreSQL , PolarDB , pg_tiktoken , openAI , nlp , token , 向量 , 分词


背景

tiktoken库. OpenAI的一个名为GPT-2的语言生成模型,它可以将自然语言文本转换为令牌(token)的形式。GPT-2是一个基于深度学习的模型,它使用了Transformer网络结构,并使用大量的文本数据进行训练。在处理文本时,GPT-2可以自动将输入文本分解为单词、标点符号和其他符号,并将它们表示为向量形式的令牌。这使得GPT-2非常适合用于自然语言处理任务,如语言翻译、文本生成、自动问答等。

GPT-2使用向量形式的令牌(token)来表示自然语言文本的单词、标点符号和其他符号,这些向量被称为“词向量”(word embeddings)。GPT-2使用预训练的词向量来表示每个令牌,这些词向量是在大量的文本数据上训练得到的。在使用GPT-2处理文本时,它会将输入文本中的每个单词、标点符号和其他符号都转换成对应的向量表示,并按照一定的顺序组合起来,形成一个令牌序列。这个令牌序列可以被输入到GPT-2的深度学习模型中进行处理,模型会根据序列中的每个令牌预测下一个可能出现的令牌,从而实现文本生成、自动问答等自然语言处理任务。

GPT-2中的词向量是通过“词嵌入”(word embedding)技术得到的。词嵌入是一种将单词映射到向量空间中的技术,它可以将单词之间的语义关系转化为向量空间中的几何关系。例如,在经过词嵌入之后,类似的单词会在向量空间中更加接近,而不同的单词则会在向量空间中更加远离。这种向量空间中的几何关系可以帮助GPT-2更好地理解自然语言文本中的语义。

使用向量形式的令牌(token)可以帮助深度学习模型更好地处理自然语言文本。具体来说,向量形式的令牌具有以下优点:

方便处理:将文本转换为向量形式的令牌可以方便地在计算机上进行处理,因为向量可以被存储在内存中并进行快速计算。

保留语义信息:向量形式的令牌通常会捕捉到单词之间的语义关系,因此可以帮助深度学习模型更好地理解自然语言文本中的语义信息。例如,使用词向量可以将类似的单词映射到相似的向量空间位置,从而帮助模型更好地理解文本中的意思。

提高模型性能:使用向量形式的令牌可以帮助深度学习模型更好地捕捉到文本中的规律和模式,从而提高模型的性能。例如,在自然语言处理任务中,使用词向量可以帮助模型更好地预测下一个可能出现的单词,从而实现文本生成、机器翻译等任务。

总的来说,向量形式的令牌是自然语言处理中非常重要的概念,它可以帮助深度学习模型更好地处理自然语言文本,并提高模型的性能。

古典分词算法:

bpe算法和tiktoken库的关系:

Byte Pair Encoding(BPE)算法和tiktoken库之间有一定关系。

BPE算法是一种用于处理自然语言文本的压缩算法,它可以将文本中的字符或子字符串逐步合并,形成更大的“词块”(word pieces)。这些词块可以被视为一种类似于单词的单位,用于构建自然语言处理模型。与传统的基于单词的模型相比,使用词块可以处理未知的单词,并且可以更好地捕捉到复杂的语言结构,从而提高模型的性能。

tiktoken库是一个基于BPE算法的开源文本令牌化器,它可以将自然语言文本转换为词块,并在此基础上生成相应的词汇表。tiktoken库可以在许多自然语言处理任务中使用,例如机器翻译、文本生成等。

因此,可以说tiktoken库利用了BPE算法的特性,将其应用于自然语言处理中,从而提高了模型的性能和效率。

BPE 算法原理及使用指南【深入浅出】

理解NLP最重要的编码方式 — Byte Pair Encoding (BPE),这一篇就够了

pg_tiktoken 扩展

使用 OpenAI 的“tiktoken”库有效标记 PostgreSQL 数据库中的数据

该扩展可以使用 OpenAI 的 tiktoken pg_tiktoken库对 PostgreSQL 数据库中的数据进行快速高效的标记化。

本主题提供有关安装扩展、利用其标记化和标记管理功能以及将扩展与 ChatGPT 模型集成的指南。

什么是token?

语言模型以称为标记的单位处理文本。标记可以短至单个字符,也可以长至完整的单词,例如“a”或“apple”。在一些语言中,标记可以包括少于单个字符或者甚至超出单个单词。

例如,考虑“Neon is serverless Postgres.”这句话。它可以分为七个标记:[“Ne”、“on”、“is”、“server”、“less”、“Post”、“gres”]

pg_tiktoken 函数

它pg_tiktoken提供了两个功能:

  • tiktoken_encode:接受文本输入并返回标记化输出,使您能够无缝标记化文本数据。
  • tiktoken_count:计算给定文本中的标记数量。此功能可帮助您遵守文本长度限制,例如 OpenAI 语言模型设置的长度限制。

安装 pg_tiktoken 扩展

您可以通过在 Neon SQL 编辑器中或从连接到 Neon 的客户端pg_tiktoken运行以下语句来安装扩展。CREATE EXTENSIONpsql

CREATE EXTENSION pg_tiktoken  

有关使用 Neon SQL 编辑器的信息,请参阅使用 Neon 的 SQL 编辑器进行查询。有关将psql客户端与 Neon 一起使用的信息,请参阅使用 psql 连接。

使用 tiktoken_encode 函数

该tiktoken_encode函数对文本输入进行标记并返回标记化的输出。该函数接受编码名称和 OpenAI 模型名称作为第一个参数,以及要标记化的文本作为第二个参数,如下所示:

SELECT tiktoken_encode('text-davinci-003', 'The universe is a vast and captivating mystery, waiting to be explored and understood.');  
  
tiktoken_encode   
--------------------------------------------------------------------------------  
 {464,6881,318,257,5909,290,3144,39438,10715,11,4953,284,307,18782,290,7247,13}  
(1 row)  

该函数使用字节对编码 (BPE)算法对文本进行标记。

使用 tiktoken_count 函数

该tiktoken_count函数计算文本中标记的数量。该函数接受编码名称和 OpenAI 模型名称作为第一个参数,接受文本作为第二个参数,如下所示:

neondb=> SELECT tiktoken_count('text-davinci-003', 'The universe is a vast and captivating mystery, waiting to be explored and understood.');  
  
 tiktoken_count   
----------------  
             17  
(1 row)  

测试 pg_tiktoken

以下测试再安装了rust环境的macOS中完成.

cd ~  
  
  
# install pgx  
cargo install --locked cargo-pgx  
cargo pgx init  
  
...  
   Installing Postgres v14.8 to /Users/digoal/.pgx/14.8/pgx-install  
   Installing Postgres v12.15 to /Users/digoal/.pgx/12.15/pgx-install  
   Installing Postgres v13.11 to /Users/digoal/.pgx/13.11/pgx-install  
   Installing Postgres v11.20 to /Users/digoal/.pgx/11.20/pgx-install  
   Installing Postgres v15.3 to /Users/digoal/.pgx/15.3/pgx-install  
   Validating /Users/digoal/.pgx/11.20/pgx-install/bin/pg_config  
 Initializing data directory at /Users/digoal/.pgx/data-11  
   Validating /Users/digoal/.pgx/12.15/pgx-install/bin/pg_config  
 Initializing data directory at /Users/digoal/.pgx/data-12  
   Validating /Users/digoal/.pgx/13.11/pgx-install/bin/pg_config  
 Initializing data directory at /Users/digoal/.pgx/data-13  
   Validating /Users/digoal/.pgx/14.8/pgx-install/bin/pg_config  
 Initializing data directory at /Users/digoal/.pgx/data-14  
   Validating /Users/digoal/.pgx/15.3/pgx-install/bin/pg_config  
 Initializing data directory at /Users/digoal/.pgx/data-15  
...  
  
  
cd /Users/digoal/.pgx/data-15  
vi postgresql.conf  
  
listen_addresses = 'localhost'		  
port = 28815				  
max_connections = 100			  
unix_socket_directories = '., /tmp'	  
shared_buffers = 1GB			  
dynamic_shared_memory_type = posix	  
vacuum_cost_delay = 0			  
bgwriter_delay = 10ms			  
bgwriter_lru_maxpages = 500		  
bgwriter_lru_multiplier = 5.0		  
max_parallel_workers_per_gather = 0	  
synchronous_commit = off		  
wal_writer_delay = 10ms		  
max_wal_size = 1GB  
min_wal_size = 80MB  
random_page_cost = 1.1			  
log_destination = 'csvlog'		  
logging_collector = on		  
log_truncate_on_rotation = on		  
log_timezone = 'Asia/Shanghai'  
datestyle = 'iso, mdy'  
timezone = 'Asia/Shanghai'  
lc_messages = 'C'			  
lc_monetary = 'C'			  
lc_numeric = 'C'			  
lc_time = 'C'				  
default_text_search_config = 'pg_catalog.simple'  
  
  
/Users/digoal/.pgx/15.3/pgx-install/bin/pg_ctl start -D /Users/digoal/.pgx/data-15  
  
  
# build and install pg_tiktoken  
git clone --depth 1 https://github.com/kelvich/pg_tiktoken  
cd pg_tiktoken  
  
export PATH=/Users/digoal/.pgx/15.3/pgx-install/bin:$PATH  
cargo pgx install  
  
  
  
  
  
  
IT-C02YW2EFLVDL:data-15 digoal$ whoami  
digoal  
  
  
  
psql -h 127.0.0.1 -p 28815 -U digoal postgres  
  
  
  
  
postgres=# create extension pg_tiktoken ;  
CREATE EXTENSION  
  
  
postgres=# select tiktoken_count('p50k_edit', 'A long time ago in a galaxy far, far away');  
 tiktoken_count  
----------------  
             11  
(1 row)  
  
postgres=# select tiktoken_encode('cl100k_base', 'A long time ago in a galaxy far, far away');  
                  tiktoken_encode  
----------------------------------------------------  
 {32,1317,892,4227,304,264,34261,3117,11,3117,3201}  
(1 row)  
  
  
  
postgres=# \df  
                                   List of functions  
 Schema |      Name       | Result data type |        Argument data types        | Type  
--------+-----------------+------------------+-----------------------------------+------  
 public | tiktoken_count  | bigint           | encoding_selector text, text text | func  
 public | tiktoken_encode | bigint[]         | encoding_selector text, text text | func  
(2 rows)  
  
postgres=# select tiktoken_encode('cl100k_base', '你好.中国');  
    tiktoken_encode  
------------------------  
 {57668,53901,13,59795}  
(1 row)  
  
postgres=# select tiktoken_encode('cl100k_base', '你好, 我是德哥, 勤劳勇敢的中国人.');  
                                                  tiktoken_encode  
-------------------------------------------------------------------------------------------------------------------  
 {57668,53901,11,50534,239,21043,17599,115,20648,98,11,4996,233,97,8239,111,53508,229,8067,95,9554,59795,17792,13}  
(1 row)  
  
postgres=# select tiktoken_encode('r50k_base', '你好, 我是德哥, 勤劳勇敢的中国人.');  
                                                                tiktoken_encode  
-----------------------------------------------------------------------------------------------------------------------------------------------  
 {19526,254,25001,121,11,10545,230,239,42468,36181,115,161,241,98,11,10263,233,97,27950,111,47947,229,46763,95,21410,40792,32368,121,21689,13}  
(1 row)  
  
postgres=# select tiktoken_encode('r50k_base', '你好, 我是德哥, 勤劳勇敢的中国人, hello world.');  
                                                                      tiktoken_encode  
------------------------------------------------------------------------------------------------------------------------------------------------------------  
 {19526,254,25001,121,11,10545,230,239,42468,36181,115,161,241,98,11,10263,233,97,27950,111,47947,229,46763,95,21410,40792,32368,121,21689,11,23748,995,13}  
(1 row)  

使用docker环境编译pg_tiktoken (以ARM64镜像为例)

1、下载镜像, 启动并进入容器

# 拉取镜像, 第一次拉取一次即可.    
docker pull registry.cn-hangzhou.aliyuncs.com/digoal/opensource_database:pg14_with_exts_arm64    
    
# 启动容器    
docker run -d -it -P --cap-add=SYS_PTRACE --cap-add SYS_ADMIN --privileged=true --name pg --shm-size=1g registry.cn-hangzhou.aliyuncs.com/digoal/opensource_database:pg14_with_exts_arm64    
    
# 进入容器    
docker exec -ti pg bash    

2、打包pg_tiktoken

如果cargo timeout, 先换国内的源: https://learnku.com/rust/t/45296

# vi ~/.cargo/config

[source.crates-io]
registry = "https://github.com/rust-lang/crates.io-index"
replace-with = 'ustc'
[source.ustc]
registry = "https://mirrors.ustc.edu.cn/crates.io-index"
# registry = "git://mirrors.ustc.edu.cn/crates.io-index"
# 如果所处的环境中不允许使用 git 协议,可以把上面的地址改为
# registry = "https://mirrors.ustc.edu.cn/crates.io-index"
[net]
git-fetch-with-cli = true
# install pgx  
cargo install --locked cargo-pgx  
cargo pgx init  
  
# build and install pg_tiktoken  
cd /tmp  
git clone --depth 1 https://github.com/kelvich/pg_tiktoken  
cd pg_tiktoken  
cargo pgx package --features pg14  

3、拷贝到当前PG 14指定目录, 在容器中安装pg_tiktoken.

cp target/release/pg_tiktoken-pg14/usr/share/postgresql/14/extension/pg_tiktoken--0.0.1.sql /usr/share/postgresql/14/extension/  
cp target/release/pg_tiktoken-pg14/usr/share/postgresql/14/extension/pg_tiktoken.control /usr/share/postgresql/14/extension/  
cp target/release/pg_tiktoken-pg14/usr/lib/postgresql/14/lib/pg_tiktoken.so $PGHOME/lib/  
  
psql  
create extension pg_tiktoken;  

4、将编译好的文件拷贝到制作这个docker image的dir中:

《arm64 , 使用Dockerfile+docker build制作PolarDB | PostgreSQL 开源docker镜像, 集成大量插件方便学习, 并推送到阿里云镜像服务》

docker cp pg:/tmp/pg_tiktoken/target/release/pg_tiktoken-pg14/usr/share/postgresql/14/extension/pg_tiktoken--0.0.1.sql ~/pg14/  
docker cp pg:/tmp/pg_tiktoken/target/release/pg_tiktoken-pg14/usr/share/postgresql/14/extension/pg_tiktoken.control ~/pg14/  
docker cp pg:/tmp/pg_tiktoken/target/release/pg_tiktoken-pg14/usr/lib/postgresql/14/lib/pg_tiktoken.so ~/pg14/  

参考

https://neon.tech/docs/extensions/pg_tiktoken

https://github.com/kelvich/pg_tiktoken

https://github.com/zurawiki/tiktoken-rs

https://github.com/openai/tiktoken

https://zhuanlan.zhihu.com/p/424631681

https://zhuanlan.zhihu.com/p/448147465

digoal's wechat