Executando verificação de segurança...
27

Fiz uma ferramenta pra ver LLMs gerando texto token por token

Fala, galera!

Você já parou pra pensar no que acontece entre o momento que você manda um prompt e o momento que a resposta aparece? Tipo, qual token o modelo quase escolheu mas não escolheu? Quão confiante ele estava naquela decisão?

Foi pra isso que eu desenvolvi a Miru Tracer.

Exemplo do modo interativo da Miru Tracer

O que é

É uma aplicação Gradio que carrega modelos do Hugging Face e mostra a geração de texto acontecendo passo a passo. Você vê a distribuição de probabilidade de cada token, a confiança (por entropia), e no modo interativo pode até escolher manualmente qual token vem a seguir em vez de deixar o modelo decidir.

Não é interpretabilidade mecanicista ainda, já que não mexe em circuitos neurais nem aplica técnicas como activation steering (isso é o próximo passo). Por enquanto a ideia é só dar mais visibilidade ao processo de geração, que normalmente fica escondido.

Pra que serve

Quando você está aprendendo sobre LLMs, ler sobre temperatura e top-k é uma coisa. Ver o sampling acontecendo na sua frente, token por token, é outra completamente diferente. Se você está debugando um prompt e quer saber onde o modelo ficou "inseguro", os gráficos de entropia mostram exatamente isso. E se você só quer explorar, tipo "e se eu forçar ele a escolher esse token em vez daquele outro?", o modo interativo deixa.

O modo logging grava tudo (todas as probabilidades, todos os tokens considerados) e exporta pra JSON. Aí você pode analisar depois, fazer seus próprios gráficos, o que você quiser.

Exemplo de visualização

Como rodar

Clone o repo, cria um ambiente virtual, instala o requirements.txt. Mas uns detalhes: se você não tá no Python 3.13, vai precisar comentar a linha audioop-lts do requirements (é um módulo de compatibilidade que só existe/é necessário no 3.13). E se você quer rodar em GPU com CUDA, tem que instalar o PyTorch separadamente com suporte CUDA antes: o site deles tem as instruções certinhas pra sua configuração.

Pra começar a testar, recomendo o modelo Qwen/Qwen3-1.7b. É pequeno, roda em CPU tranquilo, e já dá pra entender como a ferramenta funciona sem precisar de uma placa de vídeo do caralho.

Lembrando que isso é uma ferramenta experimental em desenvolvimento ativo. Tem várias melhorias e fixes a caminho, incluindo uma imagem Docker pré-buildada pra facilitar a vida.

Por que eu fiz isso

A gente usa IA pra tudo hoje em dia, mas tem uma diferença entre "não preciso saber todos os detalhes" e "nem sei por onde começar se quiser entender". Eu queria uma ferramenta simples, visual, que qualquer dev pudesse usar pra entender melhor como esses modelos funcionam.

E é o primeiro passo de um projeto maior. A ideia é eventualmente mexer com interpretabilidade mecanicista de verdade: entender quais circuitos são ativados, como a informação flui, fazer activation steering. Mas tem que começar de algum lugar, e começar vendo o que está acontecendo na geração já é um bom começo.


O projeto é Unlicense (domínio público). Se você quiser contribuir, achou um bug, ou só quer conversar sobre isso, me chama no Telegram @rlaneth ou abre uma issue no GitHub!

Carregando publicação patrocinada...
2

Seria possível, ou você já viu algo semelhante, interferir no token para imprimir um estilo de escrita ou uma personalidade específica?

Achei o seu projeto excelente. Parabéns!

5

Opa, muito obrigado!

Resposta curta: sim! Mas não é a melhor opção. Esse objetivo ainda é melhor atingido com um prompt engineering. Mas a interpretabilidade mecanística abre outras possibilidades promissoras nesse sentido, como activation steering.

Resposta longa: A return moe; é a "equipe" (sou só eu, lol) sob a qual lancei esse projeto. Ela é basicamente um laboratório de aplicações criativas de tecnologia e IA, inclusive em entretenimento e roleplay (similar a plataformas como a Character.AI).

Por isso, eu já explorei diversas formas de atribuir personalidades consistentes e únicas aos LLMs, e é justamente essa a minha motivação para começar a estudar interpretabilidade mecanística.

Minha experiência é:

  • Prompt engineering é a maneira mais direta e efetiva de definir a personalidade. Problemática no que diz respeito a modelos menores que não têm uma aderência tão boa ao prompt, além de que personagens complexos usam uma quantidade absurda de tokens na definição. No RisuAI, se você ativar o modo de desenvolvedor, você consegue ver o padrão de prompt que ele usa; é extremamente longo.

  • Finetuning é efetivo, mas leva tempo e dinheiro pra criar o dataset, efetuar o treinamento, fazer os testes de qualidade, e ainda retreinar a cada vez que um modelo novo é lançado. Além disso, o catastrophic forgetting é um problema real. Em várias ocasiões, meu resultado foi um modelo que conseguia aderir ao estilo de escrita desejado mas inútil ao perder a capacidade de responder de maneira coerente.

  • Activation steering é o que eu tenho avaliado recentemente. Mais complexo por exigir definição das features do modelo, o que pode ser feito por contrastive activation ou pelo treinamento de um SAE (Sparse Autoencoder).

Sobre a sua proposição, é possível influenciar as respostas forçando a escolha de tokens específicos porque o processo de inferência é autoregressivo. Ele considera, em cada etapa, não apenas o system prompt e a entrada do usuário, mas também todos os tokens que já foram selecionados como resposta do assistente até ali.

Quando você interfere, é como se os tokens que você forçou tivessem sido selecionados pelo próprio modelo, e com isso, há modificação da resposta, uma vez que o modelo tenta continuar a escrever algo coerente com base no que já foi escrito.

É importante lembrar que o modelo, em cada uma das etapas, somente atribui um peso (probabilidade) a todos os tokens que ele conhece. A seleção em si é feita pelo sampler, um mecanismo separado. Há diversas estratégias de sampling: pode-se simplesmente escolher o token com a maior probabilidade (greedy), ou pode-se fazer uma seleção semi-aleatorizada com base nos pesos atribuídos.

Nas APIs comerciais como ChatGPT, Claude e Gemini, quando você ajusta parâmetros como Temperature, Top-K e Top-P. Não há modificação da rede neural em si, mas sim a seleção de tokens pelo sampler — ou seja, é literalmente uma interferência, ainda que indireta, na escolha real da rede neural.

Essa publicação no Instagram da return moe; fala um pouco sobre como essas opções afetam a escolha dos tokens.

Já o Interactive Mode da Miru Tracer permite que você sobreescreva diretamente a decisão do sampler. Por exemplo, você pode gerar um texto, ver qual seria a resposta normal, e depois voltar a uma etapa específica da geração, forçar a seleção de outro(s) token(s), e ver como o resto da resposta é influenciada.

Pra ilustrar, fiz o experimento a seguir com o Qwen3 4B Instruct 2507.


Rodada 1 (Controle)

Estratégia greedy (token com maior probabilidade atribuída pelo modelo é sempre selecionado). Nenhuma intervenção manual.

System: You are a helpful assistant. Provide short answers only.
User: Quem é gilveloso?
Assistant: Não há informação conhecida sobre uma pessoa chamada "Gilveloso" em fontes públicas ou históricas. É possível que seja um nome fictício, errado ou mal escrito. Se você se refere a alguém específico, por favor, forneça mais contexto.

Rodada 2 (Modificação)

Na rodada anterior, o token Ġum (ID 4443), da frase "... É possível que seja um nome fictício ...", foi gerado na etapa 30. Retornando a ela, uso o recurso de Token ID override da Miru Tracer para sobreescrever a escolha do próximo token: ao invés de permitir a escolha de Ġnome (ID 17129), injeto a sequência a seguir.

  1. Ġusuário (ID 59018)
  2. Ġdo (ID 653)
  3. ĠTab (ID 15139)
  4. News (ID 14373)
  5. , (ID 11)
  6. Ġque (ID 1709)
  7. Ġé (ID 3958)

Depois, permito que o modelo conclua a resposta. A mensagem final acaba modificada conforme a seguir.

System: You are a helpful assistant. Provide short answers only.
User: Quem é gilveloso?
Assistant: Não há informação conhecida sobre uma pessoa chamada "Gilveloso" em fontes públicas ou históricas. É possível que seja um usuário do TabNews, que é um site de notícias, e o nome seja fictício ou mal escrito. Se você se refere a algo específico, por favor, esclareça.


Nesse caso, diferença sutil, mas serve para demonstrar o efeito. Os resultados variam de acordo com o modelo, com os tokens substituídos e o posicionamento dos mesmos. É possível tentar outras estratégias; por exemplo, em modelos com bloco thinking, pode-se direcionar a substituição aos tokens dentro desse bloco.

Mas o Interactive Mode existe como curiosidade e ferramenta de estudo. Dá pra ver que, na prática, poderia ser bem caótico conseguir algum controle previsível dessa maneira; as outras alternativas são mais "limpas".

Abraços!

2

Muito obrigado pela resposta. Foi realmente esclarecedora e ampliou bastante minha visão sobre o tema. Agradeço também pelas referências, estou explorando cada uma e já me ajudaram a entender melhor as possibilidades.

Valeu mesmo! Sucesso com seu projeto.

2

Meus 2 cents,

Obrigado por compartilhar !

Projeto bem legal - ver a "predicao" de token acontecer em tempo real eh um ponto muito valioso no estudo do ML.

Por coincidencia, publiquei um post falando sobre o funcionamento do LLM um pouco antes:

https://www.tabnews.com.br/Oletros/carreira-inteligencia-artificial-ia-entendendo-como-funciona-esta-jabiraca

Enfim, parabens pela iniciativa - continue postando sobre os avancos que anda realizando, este eh um assunto especialmente interessante.

Saude e Sucesso !

2

Muito obrigado pelo feedback!

De fato é uma área muito bacana, e até me surpreende um pouco que a gente já saiba tanta coisa na teoria (principalmente pelos vários papers que o pessoal envolvido em pesquisa de ponta publica) mas raramente veja qualquer ferramenta pública pra reproduzir.

No início, isso aí era um notebook Jupyter básico que eu fiz pra ter a visualização por conta de um problema específico. Decidi transformar em algo mais polido depois que mostrei pra alguns amigos, pessoas que já estão cansadas de saber que "o LLM só prevê o próximo token", e vi o pessoal ficar maravilhado simplesmente porque conhecia o conceito mas nunca tinha visto na prática, e muito menos tido essa possibilidade de interagir (forçar a escolha do próximo token).

1