gpt-tokenizer 1.0.2 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/data/bpeRanks.d.ts +50003 -0
- package/cjs/data/bpeRanks.js +7 -0
- package/cjs/data/bpeRanks.js.map +1 -0
- package/cjs/data/encoder.d.ts +50260 -0
- package/cjs/data/encoder.js +7 -0
- package/cjs/data/encoder.js.map +1 -0
- package/cjs/{getBpe.js → getData.js} +6 -2
- package/cjs/getData.js.map +1 -0
- package/cjs/main.d.ts +28 -1
- package/cjs/main.js +208 -14
- package/cjs/main.js.map +1 -1
- package/cjs/main.test.js +86 -0
- package/cjs/main.test.js.map +1 -0
- package/cjs/utils.d.ts +22 -6
- package/cjs/utils.js +29 -1
- package/cjs/utils.js.map +1 -1
- package/esm/data/bpeRanks.d.ts +50003 -0
- package/esm/data/bpeRanks.js +5 -0
- package/esm/data/bpeRanks.js.map +1 -0
- package/esm/data/encoder.d.ts +50260 -0
- package/esm/data/encoder.js +5 -0
- package/esm/data/encoder.js.map +1 -0
- package/esm/getData.js +16 -0
- package/esm/getData.js.map +1 -0
- package/esm/main.d.ts +28 -1
- package/esm/main.js +196 -1
- package/esm/main.js.map +1 -1
- package/esm/{encoder.test.js → main.test.js} +2 -2
- package/esm/main.test.js.map +1 -0
- package/esm/package.json +1 -0
- package/esm/utils.d.ts +22 -6
- package/esm/utils.js +29 -1
- package/esm/utils.js.map +1 -1
- package/package.json +8 -4
- package/src/data/bpeRanks.js +4 -0
- package/src/data/encoder.js +4 -0
- package/src/getData.ts +34 -0
- package/src/{encoder.test.ts → main.test.ts} +1 -1
- package/src/main.ts +266 -1
- package/src/utils.js +61 -0
- package/cjs/encoder.d.ts +0 -16
- package/cjs/encoder.js +0 -201
- package/cjs/encoder.js.map +0 -1
- package/cjs/encoder.test.js +0 -86
- package/cjs/encoder.test.js.map +0 -1
- package/cjs/getBpe.js.map +0 -1
- package/esm/encoder.d.ts +0 -16
- package/esm/encoder.js +0 -188
- package/esm/encoder.js.map +0 -1
- package/esm/encoder.test.js.map +0 -1
- package/esm/getBpe.js +0 -12
- package/esm/getBpe.js.map +0 -1
- package/src/encoder.ts +0 -252
- package/src/getBpe.ts +0 -23
- package/src/utils.ts +0 -36
- /package/cjs/{encoder.test.d.ts → getData.d.ts} +0 -0
- /package/cjs/{getBpe.d.ts → main.test.d.ts} +0 -0
- /package/esm/{encoder.test.d.ts → getData.d.ts} +0 -0
- /package/esm/{getBpe.d.ts → main.test.d.ts} +0 -0
package/cjs/encoder.test.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"encoder.test.js","sourceRoot":"","sources":["../src/encoder.test.ts"],"names":[],"mappings":"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"}
|
package/cjs/getBpe.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"getBpe.js","sourceRoot":"","sources":["../src/getBpe.ts"],"names":[],"mappings":";;;;;AAAA,4CAAmB;AACnB,gDAAuB;AACvB,mCAAwC;AAExC,MAAM,OAAO,GAAG,YAAE,CAAC,YAAY,CAC7B,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,mBAAmB,CAAC,EACzC,MAAM,CACP,CAAA;AACD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;AAEjC,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAC7C,CAAC;KACE,KAAK,CAAC,OAAO,CAAC;KACd,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;KAClC,IAAI,CAAC,GAAG,CAAC,CACb,CAAA;AAED,MAAM,QAAQ,GAAG,IAAA,eAAO,EAAC,SAAS,EAAE,IAAA,aAAK,EAAC,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAA;AAE/D,YAAE,CAAC,aAAa,CACd,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,uBAAuB,CAAC,EAC7C,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CACzB,CAAA"}
|
package/esm/encoder.d.ts
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @returns {false | number} false if token limit is exceeded, otherwise the number of tokens
|
|
3
|
-
*/
|
|
4
|
-
export declare function isWithinTokenLimit(text: string, tokenLimit: number, cache?: Map<string, string>): false | number;
|
|
5
|
-
export declare function encode(text: string, cache?: Map<string, string>): number[];
|
|
6
|
-
export declare function decodeToken(token: number): string;
|
|
7
|
-
export declare function endsWithIncompleteUtfPairSurrogate(string: string): boolean;
|
|
8
|
-
export declare function decodeGenerator(tokens: Iterable<number>): Generator<string, void, undefined>;
|
|
9
|
-
/**
|
|
10
|
-
* Decode tokens asynchronously and yield the decoded strings, one by one.
|
|
11
|
-
* Will not yield for tokens that include a high surrogate, but wait for the next token.
|
|
12
|
-
* @param {AsyncIterable<number>} tokens
|
|
13
|
-
* @returns {AsyncGenerator<string, void, undefined>}
|
|
14
|
-
*/
|
|
15
|
-
export declare function decodeAsyncGenerator(tokens: AsyncIterable<number>): AsyncGenerator<string, void, undefined>;
|
|
16
|
-
export declare function decode(tokens: number[]): string;
|
package/esm/encoder.js
DELETED
|
@@ -1,188 +0,0 @@
|
|
|
1
|
-
/* eslint-disable unicorn/prefer-spread */
|
|
2
|
-
/* eslint-disable unicorn/prefer-code-point */
|
|
3
|
-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment, @typescript-eslint/prefer-ts-expect-error
|
|
4
|
-
// @ts-ignore
|
|
5
|
-
import bpeRanksData from '../data/bpeRanks.json';
|
|
6
|
-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment, @typescript-eslint/prefer-ts-expect-error
|
|
7
|
-
// @ts-ignore
|
|
8
|
-
import encoderData from '../data/encoder.json';
|
|
9
|
-
import { dictZip, getCharCode, getCharFromCode, getPairs, range, splitToken, } from './utils';
|
|
10
|
-
const encoder = encoderData;
|
|
11
|
-
const bpeRanks = bpeRanksData;
|
|
12
|
-
const decoder = dictZip(Object.values(encoder), Object.keys(encoder));
|
|
13
|
-
const textEncoder = new TextEncoder();
|
|
14
|
-
const textDecoder = new TextDecoder();
|
|
15
|
-
// eslint-disable-next-line no-magic-numbers
|
|
16
|
-
const UPPER_BYTE_VALUE = 2 ** 8;
|
|
17
|
-
function createByteToUnicodeMap() {
|
|
18
|
-
const asciiRange = range(getCharCode('!'), getCharCode('~') + 1);
|
|
19
|
-
const latin1Range1 = range(getCharCode('¡'), getCharCode('¬') + 1);
|
|
20
|
-
const latin1Range2 = range(getCharCode('®'), getCharCode('ÿ') + 1);
|
|
21
|
-
const initialCodePoints = [...asciiRange, ...latin1Range1, ...latin1Range2];
|
|
22
|
-
const mappedCodePoints = [...initialCodePoints];
|
|
23
|
-
let newCodePointOffset = 0;
|
|
24
|
-
for (let byteValue = 0; byteValue < UPPER_BYTE_VALUE; byteValue++) {
|
|
25
|
-
if (!initialCodePoints.includes(byteValue)) {
|
|
26
|
-
initialCodePoints.push(byteValue);
|
|
27
|
-
mappedCodePoints.push(UPPER_BYTE_VALUE + newCodePointOffset);
|
|
28
|
-
newCodePointOffset += 1;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
const unicodeChars = mappedCodePoints.map(getCharFromCode);
|
|
32
|
-
return new Map(initialCodePoints.map((x, i) => [x, unicodeChars[i]]));
|
|
33
|
-
}
|
|
34
|
-
const pat = /'s|'t|'re|'ve|'m|'ll|'d| ?\p{L}+| ?\p{N}+| ?[^\s\p{L}\p{N}]+|\s+(?!\S)|\s+/gu;
|
|
35
|
-
const byteEncoder = createByteToUnicodeMap();
|
|
36
|
-
const byteDecoder = new Map([...byteEncoder].map(([k, v]) => [v, k]));
|
|
37
|
-
function bpe(token, cache = new Map()) {
|
|
38
|
-
if (cache.has(token)) {
|
|
39
|
-
return cache.get(token);
|
|
40
|
-
}
|
|
41
|
-
let word = splitToken(token);
|
|
42
|
-
let pairs = getPairs(word);
|
|
43
|
-
if (pairs.length === 0) {
|
|
44
|
-
return token;
|
|
45
|
-
}
|
|
46
|
-
// eslint-disable-next-line no-constant-condition
|
|
47
|
-
while (true) {
|
|
48
|
-
const minPairs = new Map();
|
|
49
|
-
pairs.forEach((pair) => {
|
|
50
|
-
const rank = bpeRanks[pair.join(',')];
|
|
51
|
-
minPairs.set(
|
|
52
|
-
// eslint-disable-next-line no-magic-numbers
|
|
53
|
-
typeof rank === 'undefined' || Number.isNaN(rank) ? 10e10 : rank, pair);
|
|
54
|
-
});
|
|
55
|
-
const keys = [...minPairs.keys()];
|
|
56
|
-
const bigram = minPairs.get(Math.min(...keys));
|
|
57
|
-
if (!bigram || !(bigram.join(',') in bpeRanks)) {
|
|
58
|
-
break;
|
|
59
|
-
}
|
|
60
|
-
const [first, second] = bigram;
|
|
61
|
-
let newWord = [];
|
|
62
|
-
let i = 0;
|
|
63
|
-
while (i < word.length) {
|
|
64
|
-
const j = word.indexOf(first, i);
|
|
65
|
-
if (j === -1) {
|
|
66
|
-
newWord = newWord.concat(word.slice(i));
|
|
67
|
-
break;
|
|
68
|
-
}
|
|
69
|
-
newWord = newWord.concat(word.slice(i, j));
|
|
70
|
-
i = j;
|
|
71
|
-
if (word[i] === first && i < word.length - 1 && word[i + 1] === second) {
|
|
72
|
-
newWord.push(first + second);
|
|
73
|
-
i += 2;
|
|
74
|
-
}
|
|
75
|
-
else {
|
|
76
|
-
newWord.push(word[i]);
|
|
77
|
-
i += 1;
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
word = newWord;
|
|
81
|
-
if (word.length === 1) {
|
|
82
|
-
break;
|
|
83
|
-
}
|
|
84
|
-
else {
|
|
85
|
-
pairs = getPairs(word);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
const result = word.join(' ');
|
|
89
|
-
cache.set(token, result);
|
|
90
|
-
return result;
|
|
91
|
-
}
|
|
92
|
-
function* encodeGenerator(text, cache = new Map()) {
|
|
93
|
-
for (let [token] of text.matchAll(pat)) {
|
|
94
|
-
token = [...textEncoder.encode(token)]
|
|
95
|
-
.map((x) => byteEncoder.get(x) ?? '')
|
|
96
|
-
.join('');
|
|
97
|
-
const newTokens = bpe(token, cache)
|
|
98
|
-
.split(' ')
|
|
99
|
-
.map((x) => encoder[x]);
|
|
100
|
-
yield newTokens;
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* @returns {false | number} false if token limit is exceeded, otherwise the number of tokens
|
|
105
|
-
*/
|
|
106
|
-
export function isWithinTokenLimit(text, tokenLimit, cache = new Map()) {
|
|
107
|
-
const tokenGenerator = encodeGenerator(text, cache);
|
|
108
|
-
let count = 0;
|
|
109
|
-
for (const tokens of tokenGenerator) {
|
|
110
|
-
count += tokens.length;
|
|
111
|
-
if (count > tokenLimit) {
|
|
112
|
-
return false;
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
return count;
|
|
116
|
-
}
|
|
117
|
-
export function encode(text, cache = new Map()) {
|
|
118
|
-
return [...encodeGenerator(text, cache)].flat(1);
|
|
119
|
-
}
|
|
120
|
-
export function decodeToken(token) {
|
|
121
|
-
const decodedToken = decoder[token];
|
|
122
|
-
if (typeof decodedToken === 'undefined') {
|
|
123
|
-
return '';
|
|
124
|
-
}
|
|
125
|
-
const decodedBytes = splitToken(decodedToken).map((x) => byteDecoder.get(x));
|
|
126
|
-
return textDecoder.decode(new Uint8Array(decodedBytes), {
|
|
127
|
-
stream: true,
|
|
128
|
-
});
|
|
129
|
-
}
|
|
130
|
-
const HIGH_SURROGATE_START = 55296;
|
|
131
|
-
const HIGH_SURROGATE_END = 56319;
|
|
132
|
-
export function endsWithIncompleteUtfPairSurrogate(string) {
|
|
133
|
-
if (string.length === 0)
|
|
134
|
-
return false;
|
|
135
|
-
// Check if the last character is a high surrogate
|
|
136
|
-
const lastCharCode = string.charCodeAt(string.length - 1);
|
|
137
|
-
return (lastCharCode >= HIGH_SURROGATE_START && lastCharCode <= HIGH_SURROGATE_END);
|
|
138
|
-
}
|
|
139
|
-
export function* decodeGenerator(tokens) {
|
|
140
|
-
let buffer = '';
|
|
141
|
-
for (const token of tokens) {
|
|
142
|
-
buffer += decodeToken(token);
|
|
143
|
-
if (buffer.length === 0 || endsWithIncompleteUtfPairSurrogate(buffer)) {
|
|
144
|
-
// Keep the high surrogate in the buffer and continue with the next token
|
|
145
|
-
// eslint-disable-next-line no-continue
|
|
146
|
-
continue;
|
|
147
|
-
}
|
|
148
|
-
else {
|
|
149
|
-
yield buffer;
|
|
150
|
-
// reset buffer
|
|
151
|
-
buffer = '';
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
// Yield any remaining characters in the buffer
|
|
155
|
-
if (buffer.length > 0) {
|
|
156
|
-
yield buffer;
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
/**
|
|
160
|
-
* Decode tokens asynchronously and yield the decoded strings, one by one.
|
|
161
|
-
* Will not yield for tokens that include a high surrogate, but wait for the next token.
|
|
162
|
-
* @param {AsyncIterable<number>} tokens
|
|
163
|
-
* @returns {AsyncGenerator<string, void, undefined>}
|
|
164
|
-
*/
|
|
165
|
-
export async function* decodeAsyncGenerator(tokens) {
|
|
166
|
-
let buffer = '';
|
|
167
|
-
for await (const token of tokens) {
|
|
168
|
-
buffer += decodeToken(token);
|
|
169
|
-
if (buffer.length === 0 || endsWithIncompleteUtfPairSurrogate(buffer)) {
|
|
170
|
-
// Keep the high surrogate in the buffer and continue with the next token
|
|
171
|
-
// eslint-disable-next-line no-continue
|
|
172
|
-
continue;
|
|
173
|
-
}
|
|
174
|
-
else {
|
|
175
|
-
yield buffer;
|
|
176
|
-
// reset buffer
|
|
177
|
-
buffer = '';
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
// Yield any remaining characters in the buffer
|
|
181
|
-
if (buffer.length > 0) {
|
|
182
|
-
yield buffer;
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
export function decode(tokens) {
|
|
186
|
-
return [...decodeGenerator(tokens)].join('');
|
|
187
|
-
}
|
|
188
|
-
//# sourceMappingURL=encoder.js.map
|
package/esm/encoder.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"encoder.js","sourceRoot":"","sources":["../src/encoder.ts"],"names":[],"mappings":"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"}
|
package/esm/encoder.test.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"encoder.test.js","sourceRoot":"","sources":["../src/encoder.test.ts"],"names":[],"mappings":"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"}
|
package/esm/getBpe.js
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import fs from 'fs';
|
|
2
|
-
import path from 'path';
|
|
3
|
-
import { dictZip, range } from './utils';
|
|
4
|
-
const bpeFile = fs.readFileSync(path.join(__dirname, '../data/vocab.bpe'), 'utf8');
|
|
5
|
-
const lines = bpeFile.split('\n');
|
|
6
|
-
const bpeMerges = lines.slice(1, -1).map((x) => x
|
|
7
|
-
.split(/(\s+)/)
|
|
8
|
-
.filter((e) => e.trim().length > 0)
|
|
9
|
-
.join(','));
|
|
10
|
-
const bpeRanks = dictZip(bpeMerges, range(0, bpeMerges.length));
|
|
11
|
-
fs.writeFileSync(path.join(__dirname, '../data/bpeRanks.json'), JSON.stringify(bpeRanks));
|
|
12
|
-
//# sourceMappingURL=getBpe.js.map
|
package/esm/getBpe.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"getBpe.js","sourceRoot":"","sources":["../src/getBpe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAExC,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAC7B,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,mBAAmB,CAAC,EACzC,MAAM,CACP,CAAA;AACD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;AAEjC,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAC7C,CAAC;KACE,KAAK,CAAC,OAAO,CAAC;KACd,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;KAClC,IAAI,CAAC,GAAG,CAAC,CACb,CAAA;AAED,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAA;AAE/D,EAAE,CAAC,aAAa,CACd,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,uBAAuB,CAAC,EAC7C,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CACzB,CAAA"}
|
package/src/encoder.ts
DELETED
|
@@ -1,252 +0,0 @@
|
|
|
1
|
-
/* eslint-disable unicorn/prefer-spread */
|
|
2
|
-
/* eslint-disable unicorn/prefer-code-point */
|
|
3
|
-
|
|
4
|
-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment, @typescript-eslint/prefer-ts-expect-error
|
|
5
|
-
// @ts-ignore
|
|
6
|
-
import bpeRanksData from '../data/bpeRanks.json'
|
|
7
|
-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment, @typescript-eslint/prefer-ts-expect-error
|
|
8
|
-
// @ts-ignore
|
|
9
|
-
import encoderData from '../data/encoder.json'
|
|
10
|
-
import {
|
|
11
|
-
dictZip,
|
|
12
|
-
getCharCode,
|
|
13
|
-
getCharFromCode,
|
|
14
|
-
getPairs,
|
|
15
|
-
range,
|
|
16
|
-
splitToken,
|
|
17
|
-
} from './utils'
|
|
18
|
-
|
|
19
|
-
const encoder: Record<string, number> = encoderData
|
|
20
|
-
const bpeRanks: Record<string, number> = bpeRanksData
|
|
21
|
-
|
|
22
|
-
const decoder: Record<number, string> = dictZip(
|
|
23
|
-
Object.values(encoder),
|
|
24
|
-
Object.keys(encoder),
|
|
25
|
-
)
|
|
26
|
-
|
|
27
|
-
const textEncoder = new TextEncoder()
|
|
28
|
-
const textDecoder = new TextDecoder()
|
|
29
|
-
|
|
30
|
-
// eslint-disable-next-line no-magic-numbers
|
|
31
|
-
const UPPER_BYTE_VALUE = 2 ** 8
|
|
32
|
-
|
|
33
|
-
function createByteToUnicodeMap(): Map<number, string> {
|
|
34
|
-
const asciiRange = range(getCharCode('!'), getCharCode('~') + 1)
|
|
35
|
-
const latin1Range1 = range(getCharCode('¡'), getCharCode('¬') + 1)
|
|
36
|
-
const latin1Range2 = range(getCharCode('®'), getCharCode('ÿ') + 1)
|
|
37
|
-
|
|
38
|
-
const initialCodePoints = [...asciiRange, ...latin1Range1, ...latin1Range2]
|
|
39
|
-
const mappedCodePoints = [...initialCodePoints]
|
|
40
|
-
|
|
41
|
-
let newCodePointOffset = 0
|
|
42
|
-
for (let byteValue = 0; byteValue < UPPER_BYTE_VALUE; byteValue++) {
|
|
43
|
-
if (!initialCodePoints.includes(byteValue)) {
|
|
44
|
-
initialCodePoints.push(byteValue)
|
|
45
|
-
mappedCodePoints.push(UPPER_BYTE_VALUE + newCodePointOffset)
|
|
46
|
-
newCodePointOffset += 1
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
const unicodeChars = mappedCodePoints.map(getCharFromCode)
|
|
51
|
-
return new Map(initialCodePoints.map((x, i) => [x, unicodeChars[i]!]))
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
const pat =
|
|
55
|
-
/'s|'t|'re|'ve|'m|'ll|'d| ?\p{L}+| ?\p{N}+| ?[^\s\p{L}\p{N}]+|\s+(?!\S)|\s+/gu
|
|
56
|
-
|
|
57
|
-
const byteEncoder = createByteToUnicodeMap()
|
|
58
|
-
const byteDecoder: Map<string, number> = new Map(
|
|
59
|
-
[...byteEncoder].map(([k, v]) => [v, k]),
|
|
60
|
-
)
|
|
61
|
-
|
|
62
|
-
function bpe(token: string, cache: Map<string, string> = new Map()): string {
|
|
63
|
-
if (cache.has(token)) {
|
|
64
|
-
return cache.get(token)!
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
let word = splitToken(token)
|
|
68
|
-
let pairs = getPairs(word)
|
|
69
|
-
|
|
70
|
-
if (pairs.length === 0) {
|
|
71
|
-
return token
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
// eslint-disable-next-line no-constant-condition
|
|
75
|
-
while (true) {
|
|
76
|
-
const minPairs: Map<number, [string, string]> = new Map()
|
|
77
|
-
pairs.forEach((pair) => {
|
|
78
|
-
const rank = bpeRanks[pair.join(',')]
|
|
79
|
-
minPairs.set(
|
|
80
|
-
// eslint-disable-next-line no-magic-numbers
|
|
81
|
-
typeof rank === 'undefined' || Number.isNaN(rank) ? 10e10 : rank,
|
|
82
|
-
pair,
|
|
83
|
-
)
|
|
84
|
-
})
|
|
85
|
-
const keys = [...minPairs.keys()]
|
|
86
|
-
|
|
87
|
-
const bigram = minPairs.get(Math.min(...keys))
|
|
88
|
-
|
|
89
|
-
if (!bigram || !(bigram.join(',') in bpeRanks)) {
|
|
90
|
-
break
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
const [first, second] = bigram
|
|
94
|
-
let newWord: string[] = []
|
|
95
|
-
let i = 0
|
|
96
|
-
|
|
97
|
-
while (i < word.length) {
|
|
98
|
-
const j = word.indexOf(first, i)
|
|
99
|
-
if (j === -1) {
|
|
100
|
-
newWord = newWord.concat(word.slice(i))
|
|
101
|
-
break
|
|
102
|
-
}
|
|
103
|
-
newWord = newWord.concat(word.slice(i, j))
|
|
104
|
-
i = j
|
|
105
|
-
|
|
106
|
-
if (word[i] === first && i < word.length - 1 && word[i + 1] === second) {
|
|
107
|
-
newWord.push(first + second)
|
|
108
|
-
i += 2
|
|
109
|
-
} else {
|
|
110
|
-
newWord.push(word[i]!)
|
|
111
|
-
i += 1
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
word = newWord
|
|
116
|
-
if (word.length === 1) {
|
|
117
|
-
break
|
|
118
|
-
} else {
|
|
119
|
-
pairs = getPairs(word)
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
const result = word.join(' ')
|
|
124
|
-
cache.set(token, result)
|
|
125
|
-
|
|
126
|
-
return result
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
function* encodeGenerator(
|
|
130
|
-
text: string,
|
|
131
|
-
cache: Map<string, string> = new Map(),
|
|
132
|
-
): Generator<number[], void, undefined> {
|
|
133
|
-
for (let [token] of text.matchAll(pat)) {
|
|
134
|
-
token = [...textEncoder.encode(token)]
|
|
135
|
-
.map((x) => byteEncoder.get(x) ?? '')
|
|
136
|
-
.join('')
|
|
137
|
-
|
|
138
|
-
const newTokens = bpe(token, cache)
|
|
139
|
-
.split(' ')
|
|
140
|
-
.map((x) => encoder[x]!)
|
|
141
|
-
|
|
142
|
-
yield newTokens
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
/**
|
|
147
|
-
* @returns {false | number} false if token limit is exceeded, otherwise the number of tokens
|
|
148
|
-
*/
|
|
149
|
-
export function isWithinTokenLimit(
|
|
150
|
-
text: string,
|
|
151
|
-
tokenLimit: number,
|
|
152
|
-
cache: Map<string, string> = new Map(),
|
|
153
|
-
): false | number {
|
|
154
|
-
const tokenGenerator = encodeGenerator(text, cache)
|
|
155
|
-
let count = 0
|
|
156
|
-
for (const tokens of tokenGenerator) {
|
|
157
|
-
count += tokens.length
|
|
158
|
-
if (count > tokenLimit) {
|
|
159
|
-
return false
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
return count
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
export function encode(
|
|
166
|
-
text: string,
|
|
167
|
-
cache: Map<string, string> = new Map(),
|
|
168
|
-
): number[] {
|
|
169
|
-
return [...encodeGenerator(text, cache)].flat(1)
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
export function decodeToken(token: number): string {
|
|
173
|
-
const decodedToken = decoder[token]
|
|
174
|
-
if (typeof decodedToken === 'undefined') {
|
|
175
|
-
return ''
|
|
176
|
-
}
|
|
177
|
-
const decodedBytes = splitToken(decodedToken).map((x) => byteDecoder.get(x)!)
|
|
178
|
-
return textDecoder.decode(new Uint8Array(decodedBytes), {
|
|
179
|
-
stream: true,
|
|
180
|
-
})
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
const HIGH_SURROGATE_START = 55_296
|
|
184
|
-
const HIGH_SURROGATE_END = 56_319
|
|
185
|
-
export function endsWithIncompleteUtfPairSurrogate(string: string): boolean {
|
|
186
|
-
if (string.length === 0) return false
|
|
187
|
-
// Check if the last character is a high surrogate
|
|
188
|
-
const lastCharCode = string.charCodeAt(string.length - 1)
|
|
189
|
-
return (
|
|
190
|
-
lastCharCode >= HIGH_SURROGATE_START && lastCharCode <= HIGH_SURROGATE_END
|
|
191
|
-
)
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
export function* decodeGenerator(
|
|
195
|
-
tokens: Iterable<number>,
|
|
196
|
-
): Generator<string, void, undefined> {
|
|
197
|
-
let buffer = ''
|
|
198
|
-
|
|
199
|
-
for (const token of tokens) {
|
|
200
|
-
buffer += decodeToken(token)
|
|
201
|
-
|
|
202
|
-
if (buffer.length === 0 || endsWithIncompleteUtfPairSurrogate(buffer)) {
|
|
203
|
-
// Keep the high surrogate in the buffer and continue with the next token
|
|
204
|
-
// eslint-disable-next-line no-continue
|
|
205
|
-
continue
|
|
206
|
-
} else {
|
|
207
|
-
yield buffer
|
|
208
|
-
// reset buffer
|
|
209
|
-
buffer = ''
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
// Yield any remaining characters in the buffer
|
|
214
|
-
if (buffer.length > 0) {
|
|
215
|
-
yield buffer
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
/**
|
|
220
|
-
* Decode tokens asynchronously and yield the decoded strings, one by one.
|
|
221
|
-
* Will not yield for tokens that include a high surrogate, but wait for the next token.
|
|
222
|
-
* @param {AsyncIterable<number>} tokens
|
|
223
|
-
* @returns {AsyncGenerator<string, void, undefined>}
|
|
224
|
-
*/
|
|
225
|
-
export async function* decodeAsyncGenerator(
|
|
226
|
-
tokens: AsyncIterable<number>,
|
|
227
|
-
): AsyncGenerator<string, void, undefined> {
|
|
228
|
-
let buffer = ''
|
|
229
|
-
|
|
230
|
-
for await (const token of tokens) {
|
|
231
|
-
buffer += decodeToken(token)
|
|
232
|
-
|
|
233
|
-
if (buffer.length === 0 || endsWithIncompleteUtfPairSurrogate(buffer)) {
|
|
234
|
-
// Keep the high surrogate in the buffer and continue with the next token
|
|
235
|
-
// eslint-disable-next-line no-continue
|
|
236
|
-
continue
|
|
237
|
-
} else {
|
|
238
|
-
yield buffer
|
|
239
|
-
// reset buffer
|
|
240
|
-
buffer = ''
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
// Yield any remaining characters in the buffer
|
|
245
|
-
if (buffer.length > 0) {
|
|
246
|
-
yield buffer
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
export function decode(tokens: number[]): string {
|
|
251
|
-
return [...decodeGenerator(tokens)].join('')
|
|
252
|
-
}
|
package/src/getBpe.ts
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import fs from 'fs'
|
|
2
|
-
import path from 'path'
|
|
3
|
-
import { dictZip, range } from './utils'
|
|
4
|
-
|
|
5
|
-
const bpeFile = fs.readFileSync(
|
|
6
|
-
path.join(__dirname, '../data/vocab.bpe'),
|
|
7
|
-
'utf8',
|
|
8
|
-
)
|
|
9
|
-
const lines = bpeFile.split('\n')
|
|
10
|
-
|
|
11
|
-
const bpeMerges = lines.slice(1, -1).map((x) =>
|
|
12
|
-
x
|
|
13
|
-
.split(/(\s+)/)
|
|
14
|
-
.filter((e) => e.trim().length > 0)
|
|
15
|
-
.join(','),
|
|
16
|
-
)
|
|
17
|
-
|
|
18
|
-
const bpeRanks = dictZip(bpeMerges, range(0, bpeMerges.length))
|
|
19
|
-
|
|
20
|
-
fs.writeFileSync(
|
|
21
|
-
path.join(__dirname, '../data/bpeRanks.json'),
|
|
22
|
-
JSON.stringify(bpeRanks),
|
|
23
|
-
)
|
package/src/utils.ts
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
/* eslint-disable unicorn/prefer-spread */
|
|
2
|
-
/* eslint-disable unicorn/prefer-code-point */
|
|
3
|
-
|
|
4
|
-
export function dictZip<T extends PropertyKey, U>(
|
|
5
|
-
x: T[],
|
|
6
|
-
y: U[],
|
|
7
|
-
): Record<T, U> {
|
|
8
|
-
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
9
|
-
const result = {} as Record<T, U>
|
|
10
|
-
x.forEach((k, i) => {
|
|
11
|
-
result[k] = y[i]!
|
|
12
|
-
})
|
|
13
|
-
return result
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export function range(x: number, y: number): number[] {
|
|
17
|
-
return Array.from({ length: y - x }, (_, i) => x + i)
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export const getCharCode = (x: string): number => x.charCodeAt(0)
|
|
21
|
-
|
|
22
|
-
export const getCharFromCode = (x: number): string => String.fromCharCode(x)
|
|
23
|
-
|
|
24
|
-
export function getPairs(word: string[]): [string, string][] {
|
|
25
|
-
/** @type {[string, string][]} */
|
|
26
|
-
const pairs: [string, string][] = []
|
|
27
|
-
let prevChar = word[0]
|
|
28
|
-
for (let i = 1; i < word.length; i++) {
|
|
29
|
-
const char = word[i]
|
|
30
|
-
pairs.push([prevChar!, char!])
|
|
31
|
-
prevChar = char
|
|
32
|
-
}
|
|
33
|
-
return pairs
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export const splitToken = (token: string): string[] => token.split('')
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|