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.
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 ternlightDepois 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.
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.
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
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.
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.
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.
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.
Comentários
Deixar um comentárioVocê precisa ter uma conta no CuritibaBlog para comentar.