]> git.djapps.eu Git - pkg/ggml/sources/llama.cpp/commitdiff
vocab : ignore invalid UTF-8 input in the BPE tokenizer (#11729)
authorChristian Fillion <redacted>
Fri, 7 Feb 2025 13:55:47 +0000 (08:55 -0500)
committerGitHub <redacted>
Fri, 7 Feb 2025 13:55:47 +0000 (15:55 +0200)
Silently insert U+FFFD(s) (Unicode replacement character) instead until the
next valid codepoint can be found.

This fixes `llama_tokenize` throwing an exception across the C API boundary
or libllama's module boundary (the caller's runtime might be incompatible!)

Returing a proper error code might be desirable, however the signature
of `llama_tokenize` doesn't allow it as all return values already have
existing meaning.

src/unicode.cpp

index 89180da4152da5f73047c94ac23268937db99ff3..a32ae6d0824f2e3718a4d5483d585781dc386544 100644 (file)
@@ -618,7 +618,14 @@ std::vector<uint32_t> unicode_cpts_from_utf8(const std::string & utf8) {
     result.reserve(utf8.size());
     size_t offset = 0;
     while (offset < utf8.size()) {
-        result.push_back(unicode_cpt_from_utf8(utf8, offset));
+        try {
+            result.push_back(unicode_cpt_from_utf8(utf8, offset));
+        }
+        catch (const std::invalid_argument & /*ex*/) {
+            // Silently ignore invalid UTF-8 input to avoid leaking the exception beyond llama_tokenize
+            ++offset;
+            result.emplace_back(0xFFFD); // replacement character
+        }
     }
     return result;
 }