• kevincox@lemmy.ml
    link
    fedilink
    English
    arrow-up
    37
    ·
    10 months ago

    This is pretty clever. As I understand it.

    1. Because LLMs are slow most of them stream the response to the user.
    2. The response is streamed as text, but generated in tokens.
    3. This means that each “chunk” leaks the length of the text corresponding to the token.
    4. You can then use heuristics to guess the text of the response based on the token lengths.

    This is a good reminder any time you are sending content in small chunks over an encrypted channel, many encrypted channels don’t provide protection against size leaks by default.

    It seems there are a few easy solutions to this:

    1. Send the token IDs (as fixed-size integers) over the network rather than the text.
    2. Pad the text representations of the tokens to a fixed length.
    3. Batch the tokens more (and maybe add padding) to produce bigger chunks and obscure individual token size.

    These still all leak the approximate length of the response, but that is probably acceptable.

    • PlexSheep@feddit.de
      link
      fedilink
      English
      arrow-up
      6
      ·
      10 months ago

      That actually is really really interesting. Thanks for giving the tldr. Do token lengths vary that much?

      • kevincox@lemmy.ml
        link
        fedilink
        English
        arrow-up
        5
        ·
        10 months ago

        Absolutely. They are sort of a compression scheme so the tokens contain different numbers of characters based on how frequent that string is. So common words like “the” will typically be one token, or maybe even common phrases like “I am”. On the other hand rare punctuation such as “~” may be its own token. There will also be tokens for many common prefixes and suffixes such as “non” and “n’t”. The tokens of each model are different but they definitely vary in length.