llama-vocab.h 6.07 KB
Newer Older
xuxzh1's avatar
init  
xuxzh1 committed
1
2
3
4
5
6
7
8
#pragma once

#include "llama-impl.h"

#include <string>
#include <vector>
#include <unordered_map>
#include <map>
xuxzh1's avatar
update  
xuxzh1 committed
9
10
11
#include <set>

struct llm_tokenizer;
xuxzh1's avatar
init  
xuxzh1 committed
12
13
14
15
16
17
18
19
20
21
22
23

struct llama_vocab {
    using id    = llama_token;
    using token = std::string;
    using tattr = llama_token_attr;

    struct token_data {
        token text;
        float score;
        tattr attr;
    };

xuxzh1's avatar
update  
xuxzh1 committed
24
25
    uint32_t n_vocab = 0; // TODO: not great because has to keep in sync with hparams.n_vocab

xuxzh1's avatar
init  
xuxzh1 committed
26
27
28
29
30
31
32
33
34
35
36
37
38
39
    enum llama_vocab_type     type     = LLAMA_VOCAB_TYPE_SPM;
    enum llama_vocab_pre_type type_pre = LLAMA_VOCAB_PRE_TYPE_DEFAULT;

    int max_token_len = 0; // used for optimizing longest token search

    std::unordered_map<token, id> token_to_id;
    std::vector<token_data>       id_to_token;

    std::vector<id>    cache_special_tokens;
    std::vector<token> cache_token_to_piece; // llama_token_to_piece(special = true);

    std::map<std::pair<std::string, std::string>, int> bpe_ranks;

    // default LLaMA special tokens
xuxzh1's avatar
update  
xuxzh1 committed
40
    // TODO: should we set all of these to LLAMA_TOKEN_NULL?
xuxzh1's avatar
init  
xuxzh1 committed
41
42
    id special_bos_id  = 1;
    id special_eos_id  = 2;
xuxzh1's avatar
update  
xuxzh1 committed
43
44
    id special_eot_id  = LLAMA_TOKEN_NULL;
    id special_eom_id  = LLAMA_TOKEN_NULL;
xuxzh1's avatar
init  
xuxzh1 committed
45
    id special_unk_id  = 0;
xuxzh1's avatar
update  
xuxzh1 committed
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
    id special_sep_id  = LLAMA_TOKEN_NULL;
    id special_pad_id  = LLAMA_TOKEN_NULL;
    id special_cls_id  = LLAMA_TOKEN_NULL;
    id special_mask_id = LLAMA_TOKEN_NULL;

    id linefeed_id = 13;

    // fim tokens
    id special_fim_pre_id = LLAMA_TOKEN_NULL;
    id special_fim_suf_id = LLAMA_TOKEN_NULL;
    id special_fim_mid_id = LLAMA_TOKEN_NULL;
    id special_fim_pad_id = LLAMA_TOKEN_NULL;
    id special_fim_rep_id = LLAMA_TOKEN_NULL; // repo
    id special_fim_sep_id = LLAMA_TOKEN_NULL; // file separator

    // set of all tokens that cause "end of generation"
    std::set<id> special_eog_ids;
xuxzh1's avatar
init  
xuxzh1 committed
63
64

    // tokenizer flags
xuxzh1's avatar
update  
xuxzh1 committed
65
66
67
68
69
    bool tokenizer_add_space_prefix           = false;
    bool tokenizer_add_bos                    = false;
    bool tokenizer_add_eos                    = false;
    bool tokenizer_ignore_merges              = false;
    bool tokenizer_clean_spaces               = false;  // clean_up_tokenization_spaces
xuxzh1's avatar
init  
xuxzh1 committed
70
71
72
73
74
75
    bool tokenizer_remove_extra_whitespaces   = false;
    bool tokenizer_escape_whitespaces         = true;
    bool tokenizer_treat_whitespace_as_suffix = false;

    std::vector<char> precompiled_charsmap;

xuxzh1's avatar
update  
xuxzh1 committed
76
77
78
79
80
    llm_tokenizer * tokenizer = nullptr;

    llama_vocab() = default;
    ~llama_vocab();

xuxzh1's avatar
init  
xuxzh1 committed
81
82
    int find_bpe_rank(const std::string & token_left, const std::string & token_right) const;

xuxzh1's avatar
update  
xuxzh1 committed
83
84
    void init_tokenizer();
};
xuxzh1's avatar
init  
xuxzh1 committed
85
86
87
88
89
90
91
92
93
94
95
96
97

//
// internal API
//

// TODO: rename to llama_tokenize_impl
// TODO: This should probably be in llama.h
std::vector<llama_vocab::id> llama_tokenize_internal(
        const llama_vocab & vocab,
        std::string raw_text,
        bool add_special,
        bool parse_special = false);

xuxzh1's avatar
update  
xuxzh1 committed
98
// TODO: move the API below as member functions of llama_vocab
xuxzh1's avatar
init  
xuxzh1 committed
99
100
101
102
103
104
105
106
107
108
109
110
111
112
llama_token llama_byte_to_token_impl(const llama_vocab & vocab, uint8_t ch);

const char * llama_token_get_text_impl(const struct llama_vocab & vocab, llama_token token);

float llama_token_get_score_impl(const struct llama_vocab & vocab, llama_token token);

llama_token_attr llama_token_get_attr_impl(const struct llama_vocab & vocab, llama_token token);

bool llama_token_is_eog_impl(const struct llama_vocab & vocab, llama_token token);

bool llama_token_is_control_impl(const struct llama_vocab & vocab, llama_token token);

llama_token llama_token_bos_impl(const struct llama_vocab & vocab);
llama_token llama_token_eos_impl(const struct llama_vocab & vocab);
xuxzh1's avatar
update  
xuxzh1 committed
113
114
llama_token llama_token_eot_impl(const struct llama_vocab & vocab);
llama_token llama_token_eom_impl(const struct llama_vocab & vocab);
xuxzh1's avatar
init  
xuxzh1 committed
115
116
117
118
119
120
121
122
llama_token llama_token_cls_impl(const struct llama_vocab & vocab);
llama_token llama_token_sep_impl(const struct llama_vocab & vocab);
llama_token llama_token_nl_impl (const struct llama_vocab & vocab);
llama_token llama_token_pad_impl(const struct llama_vocab & vocab);

llama_token llama_token_prefix_impl(const struct llama_vocab & vocab);
llama_token llama_token_middle_impl(const struct llama_vocab & vocab);
llama_token llama_token_suffix_impl(const struct llama_vocab & vocab);
xuxzh1's avatar
update  
xuxzh1 committed
123
124
125
126
127
128
129
130
131
132

llama_token llama_token_fim_pre_impl(const struct llama_vocab & vocab);
llama_token llama_token_fim_suf_impl(const struct llama_vocab & vocab);
llama_token llama_token_fim_mid_impl(const struct llama_vocab & vocab);
llama_token llama_token_fim_pad_impl(const struct llama_vocab & vocab);
llama_token llama_token_fim_rep_impl(const struct llama_vocab & vocab);
llama_token llama_token_fim_sep_impl(const struct llama_vocab & vocab);

bool llama_add_bos_token_impl(const struct llama_vocab & vocab);
bool llama_add_eos_token_impl(const struct llama_vocab & vocab);
xuxzh1's avatar
init  
xuxzh1 committed
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151

int32_t llama_tokenize_impl(
        const struct llama_vocab & vocab,
                      const char * text,
                         int32_t   text_len,
                     llama_token * tokens,
                         int32_t   n_tokens_max,
                            bool   add_special,
                            bool   parse_special);

// does not write null-terminator to buf
int32_t llama_token_to_piece_impl(
        const struct llama_vocab & vocab,
                     llama_token   token,
                            char * buf,
                         int32_t   length,
                         int32_t   lstrip,
                            bool   special);

xuxzh1's avatar
update  
xuxzh1 committed
152
153
154
155
156
157
// check if token0 is contained as a prefix in token1
bool llama_token_is_prefix_impl(
        const struct llama_vocab & vocab,
                     llama_token   token0,
                     llama_token   token1);

xuxzh1's avatar
init  
xuxzh1 committed
158
159
160
161
162
163
164
165
int32_t llama_detokenize_impl(
        const struct llama_vocab & vocab,
               const llama_token * tokens,
                         int32_t   n_tokens,
                            char * text,
                         int32_t   text_len_max,
                            bool   remove_special,
                            bool   unparse_special);
xuxzh1's avatar
update  
xuxzh1 committed
166
167
168
169
170

std::string llama_detokenize(
        const struct llama_vocab & vocab,
  const std::vector<llama_token> & tokens,
                            bool   special);