O que é o Ternlight

Ternlight e um modelo de embedding compacto, com apenas 7 MB, projetado para rodar diretamente no browser via WebAssembly (WASM). Embedding e uma técnica de IA que transforma texto em vetores numéricos, permitindo comparar semanticamente frases e documentos, mesmo sem palavras em comum.

A grande sacada aqui é eliminar a dependência de servidor. Normalmente, para gerar embeddings você precisa chamar uma API como a da OpenAI ou Cohere, pagar por token e esperar o roundtrip de rede. Com o Ternlight, tudo roda localmente no browser do usuário, sem nenhuma requisição externa.

O projeto surgiu da necessidade de privacidade e desempenho em aplicações web modernas. Com modelos cada vez menores e otimizados para WASM, ficou possível trazer capacidades de NLP para o frontend sem comprometer a experiência do usuário.

Como funciona

O Ternlight usa uma arquitetura de transformer comprimida e quantizada para caber em 7 MB. O modelo e carregado via JavaScript diretamente no browser, compilado para WASM e executado em um Web Worker para não travar a UI.

O fluxo e simples: você passa um texto, o modelo tokeniza, processa pelas camadas do transformer e devolve um vetor de números de dimensão fixa. Esse vetor representa o significado semântico do texto. Para comparar dois textos, você calcula a similaridade de cosseno entre os vetores, valor entre -1 e 1, onde 1 significa idênticos semanticamente.

A quantização e o que torna isso possível em 7 MB. Em vez de usar floats de 32 bits para os pesos, o modelo usa inteiros de 8 bits, reduzindo o tamanho em até 4x com perda mínima de qualidade para tarefas de embedding.

💡
Dica

Para não bloquear a thread principal, carregue o modelo em um Web Worker. O browser vai continuar respondendo enquanto o modelo processa o texto em segundo plano.

Principais recursos

O Ternlight oferece um conjunto de recursos práticos para quem precisa de NLP no frontend:

  • Embedding client-side: gera vetores semânticos sem nenhuma chamada de rede
  • Busca semântica: encontre documentos por significado, não apenas por palavras-chave exatas
  • Classificação de texto: categorize mensagens, tickets ou produtos sem API externa
  • Detecção de similaridade: compare perguntas, detecte duplicatas ou agrupe conteúdos relacionados
  • Privacidade total: o texto do usuário nunca sai do dispositivo dele
  • Zero custo variável: sem cobrança por token, sem limite de requisições

A demo oficial do projeto mostra busca semântica em tempo real numa lista de documentos, com resultados relevantes mesmo quando você usa sinónimos ou frases com estrutura diferente.

Como começar: instalação e acesso

Você pode testar o Ternlight direto na demo online antes de integrar no seu projeto. Para usar localmente, o caminho mais simples e via npm:

npm install ternlight

Depois de instalar, o uso básico e carregar o modelo e chamar a função de encode:

import { TernlightModel } from 'ternlight';\n\nconst model = new TernlightModel();\nawait model.load();\n\nconst vec1 = await model.encode('como aprender programação');\nconst vec2 = await model.encode('dicas para estudar código');\nconsole.log(model.cosineSimilarity(vec1, vec2));

O modelo e baixado uma única vez e fica em cache no browser. Nas requisições seguintes, o carregamento e instantâneo.

Atenção

Os 7 MB são baixados na primeira visita. Em conexões lentas isso pode demorar alguns segundos. Considere um loading state antes do usuário precisar usar a funcionalidade.

Exemplo prático

Imagine uma FAQ com 50 perguntas. Com busca por palavra-chave, o usuário precisa digitar exatamente o que esta escrito. Com busca semântica via Ternlight, funciona mesmo com paráfrase.

const faq = [\n  { id: 1, question: 'Como cancelar minha assinatura?' },\n  { id: 2, question: 'Quais métodos de pagamento são aceitos?' },\n  { id: 3, question: 'O plano gratuito tem limite de uso?' }\n];\n\nconst faqEmbeddings = await Promise.all(\n  faq.map(async (item) => ({ ...item, vec: await model.encode(item.question) }))\n);\n\nasync function searchFaq(query) {\n  const queryVec = await model.encode(query);\n  return faqEmbeddings\n    .map(item => ({ ...item, score: model.cosineSimilarity(queryVec, item.vec) }))\n    .sort((a, b) => b.score - a.score)\n    .filter(item => item.score > 0.6);\n}

O resultado e busca semântica funcional, 100% no browser, sem nenhuma API key. Para uma FAQ típica, o tempo de busca fica abaixo de 50ms depois do modelo carregado.

Comparação com alternativas

OpenAI text-embedding-3-small: qualidade muito superior para textos longos e técnicos, mas custa por token, exige chave de API no backend e envia o texto para servidores externos. Ideal para casos onde qualidade máxima e necessária.

Transformers.js (Xenova): biblioteca mais completa, suporta dezenas de modelos WASM, mas os modelos são maiores, de 20 MB a 80 MB. Melhor para quem precisa de mais do que embedding, como geração de texto ou tradução.

Ternlight: ponto ideal entre tamanho e qualidade para embedding. 7 MB carregam rápido em redes moveis, privacidade garantida, zero custo variável. Ideal para busca semântica, deduplicação e classificação simples.

🚀
Pro tip

Use Ternlight para a busca semântica do frontend e OpenAI embeddings no backend para indexar conteúdo crítico. Você entrega privacidade ao usuário sem abrir mao de qualidade no pipeline principal.

Pontos positivos e limitações

Pontos positivos: privacidade total pois o texto nunca sai do browser, zero custo de API, funciona offline após o primeiro carregamento, latência muito baixa depois que o modelo esta em cache.

Limitações reais: qualidade inferior a modelos maiores para textos técnicos longos. O modelo foi treinado principalmente em inglês, com suporte parcial ao português. Textos muito longos precisam ser fragmentados manualmente.

Os 7 MB de download inicial podem ser problemáticos para usuários em conexões muito lentas. O processamento também é mais lento em dispositivos de entrada comparado a uma GPU em servidor.

Casos de uso reais

FAQ e suporte: startups SaaS podem adicionar busca semântica na página de suporte sem configurar backend. O usuário digita a duvida com as próprias palavras e o sistema encontra a pergunta mais relevante.

E-commerce: busca por produtos com linguagem natural no catalogo. Uma busca por presente para criança encontra brinquedos educativos mesmo sem essas palavras exatas no nome do produto.

Apps offline-first: aplicativos PWA que precisam funcionar sem internet podem oferecer busca semântica local em notas, documentos ou histórico do usuário, tudo processado no dispositivo.

Privacidade por design: aplicações de saúde, jurídico ou RH onde o texto do usuário não pode trafegar para servidores externos. Com Ternlight, o processamento fica 100% no dispositivo.

Dicas e boas práticas

💡
Dica

Pre-compute os embeddings do seu conteúdo estático uma vez no build e salve no IndexedDB. Assim você só gera embedding da query do usuário em tempo real.

💡
Dica

Defina um threshold de similaridade adequado ao seu caso, geralmente entre 0.55 e 0.75. Muito baixo retorna resultados irrelevantes; muito alto perde resultados validos com paráfrase.

Atenção

O modelo tem performance reduzida em texto em português com muita gíria ou abreviações. Faca testes com amostras do seu público antes de ir para produção.

🔴
Cuidado

Não misture embeddings do Ternlight com embeddings de outros modelos (OpenAI, Cohere). Cada modelo tem seu próprio espaço vetorial e comparar entre modelos resulta em valores sem sentido.

Vale a pena?

Sim, para quem precisa de busca semântica ou NLP básico no frontend sem querer configurar backend ou pagar por API. O Ternlight resolve esse problema de forma elegante e prática.

Para casos onde qualidade máxima e necessária ou volume alto de processamento no servidor, modelos maiores com API dedicada continuam sendo a melhor escolha.

O próximo passo e acessar a demo em ternlight-demo.vercel.app, testar com seus próprios textos e ver na prática a qualidade do embedding antes de decidir integrar no seu projeto.