UNPKG

gpt-token-utils

Version:

Isomorphic utilities for GPT-3 tokenization and prompt building.

54 lines (53 loc) 1.79 kB
/** * @copyright Sister Software. All rights reserved. * @author Teffen Ellis, et al. * @license * See LICENSE file in the project root for full license information. */ const nodeInspectSymbol = Symbol.for('nodejs.util.inspect.custom'); /** * Two-way map between Unicode byte-pairs and tokens. * @internal */ export class BytePairTokenMap { _bpeTokenMap; _tokenBPEMap; constructor(tokenEncodings, nMergedSpaces = 0) { this._bpeTokenMap = new Map(); this._tokenBPEMap = new Map(); for (const [key, value] of Object.entries(tokenEncodings)) { this.addBytePair(key, value); } // add merged spaces for codex tokenizer const normalizeVocabLength = this._bpeTokenMap.size + nMergedSpaces; for (let i = 0; i < nMergedSpaces; i++) { const key = '\u0120'.repeat(i + 2); const value = normalizeVocabLength - nMergedSpaces + i; this.addBytePair(key, value); } } addBytePair(bytePair, token) { this._bpeTokenMap.set(bytePair, token); this._tokenBPEMap.set(token, bytePair); } tokenToBytePair(token) { const bytePair = this._tokenBPEMap.get(token); if (typeof bytePair === 'undefined') { throw new Error(`Token "${token}" was not found in the token encoder.`); } return bytePair; } bytePairToToken(bytePair) { const token = this._bpeTokenMap.get(bytePair); if (typeof token === 'undefined') { throw new Error(`Byte pair "${bytePair}" was not found in the token encoder.`); } return token; } get size() { return this._bpeTokenMap.size; } [nodeInspectSymbol]() { return `BytePairTokenMap(${this.size})`; } }