Oii, Nelson!
É uma excelente observação. Quando estamos começando a montar pipelines de IA, é muito comum nos perguntarmos por que adicionar mais uma camada ou ferramenta se uma delas parece fazer tudo.
A resposta reside na diferença entre armazenar/carregar um modelo e servir um modelo.
O papel de cada um:
- Hugging Face: Pense nele como uma biblioteca de alta precisão. Quando você usa o
AutoTokenizer ou carrega um modelo de embeddings diretamente por ele, o Python carrega os pesos do modelo diretamente na memória do seu script. É ideal para tarefas rápidas e específicas, como a tokenização e a criação de vetores (embeddings), onde o controle sobre cada etapa do texto é fundamental. - Ollama: Ele funciona mais como um "servidor de bastidores". O Ollama não apenas baixa o modelo, mas gerencia como ele utiliza sua memória RAM e sua placa de vídeo (GPU) de forma otimizada. Ele expõe o modelo como uma API local.
Por que usar os dois juntos?
- Gerenciamento de recursos: Modelos de chat (como o Llama 3 ou Gemma) são pesados. O Ollama consegue "segurar" esse modelo na memória de forma muito estável, permitindo que seu código Python fique livre para processar apenas a lógica do negócio, sem travar por falta de memória.
- Facilidade de execução: Rodar um modelo de linguagem via Hugging Face puro exige configurar muitas linhas de código para definir parâmetros de geração, parada e memória. Com o Ollama, você faz isso com um comando simples, e ele já entrega uma interface pronta para o LangChain consumir.
- Especialização: Usamos o Hugging Face para os embeddings porque precisamos de consistência total entre a forma como o texto é cortado (tokenizado) e como ele é transformado em vetor. Já para a geração da resposta final, usamos o Ollama pela sua agilidade em lidar com modelos de conversação maiores.
Então: o Hugging Face nos dá o ajuste fino e técnico para os dados, enquanto o Ollama nos dá a infraestrutura pronta e veloz para o chat.
Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!