transformers-ruby - Transformers modernos para Ruby
(github.com/ankane)- Transformers.rb é uma biblioteca que permite usar os Transformers da Hugging Face em Ruby, com foco em executar modelos transformer modernos em código Ruby
- A instalação é feita primeiro instalando o Torch.rb e depois adicionando
gem "transformers-rb"ao Gemfile - Os exemplos de suporte incluem modelos de embedding, sparse embedding e reranking, mostrando como usar modelos das famílias
sentence-transformers,mixedbread-ai,BAAI,SnowflakeeOpenSearch - Os pipelines são divididos em texto e visão, e tarefas como NER, análise de sentimento, perguntas e respostas, classificação de imagens e extração de características de imagens são chamadas no formato
Transformers.pipeline - A API segue a Transformers Python API e atualmente oferece suporte às arquiteturas BERT, DeBERTa-v2, DistilBERT, MPNet, ViT e XLM-RoBERTa
Usando Transformers em Ruby
- Transformers.rb é uma biblioteca moderna de transformers para Ruby
- Para inferência rápida, a documentação recomenda conferir o Informers
Forma de instalação
- Primeiro é necessário instalar o Torch.rb
- Em seguida, adicione a linha abaixo ao Gemfile da aplicação
gem "transformers-rb"
Exemplos de modelos suportados
- O README fornece exemplos de uso de modelos divididos em Embedding, sparse embedding e reranking
-
Embedding
- sentence-transformers/all-MiniLM-L6-v2: recebe um array de frases e gera embeddings
- sentence-transformers/multi-qa-MiniLM-L6-cos-v1: inclui um exemplo que cria embeddings para consulta e documentos e depois ordena os documentos por pontuação de produto interno
- sentence-transformers/all-mpnet-base-v2: converte um array de frases em embeddings
- sentence-transformers/paraphrase-MiniLM-L6-v2: fornece um exemplo de embedding que recebe um array de frases como entrada
- mixedbread-ai/mxbai-embed-large-v1: há um exemplo que usa o prefixo
"Represent this sentence for searching relevant passages: "para representações de frases voltadas a busca - thenlper/gte-small: recebe duas frases como entrada e gera embeddings
- intfloat/e5-base-v2: há um exemplo que adiciona o prefixo
"passage: "a documentos e"query: "a consultas - BAAI/bge-base-en-v1.5: há um exemplo que usa um prefixo para representação de passages relacionados a busca
- Snowflake/snowflake-arctic-embed-m-v1.5: há um exemplo que gera embeddings com a opção
pooling: "cls"
-
Sparse embedding
- opensearch-project/opensearch-neural-sparse-encoding-v1: carrega diretamente
AutoModelForMaskedLMeAutoTokenizerpara calcular sparse embeddings - A saída do tokenizer usa
padding,truncation,return_tensors: "pt"ereturn_token_type_ids: false - Aplica attention mask aos valores de saída e passa por
Torch.max,Torch.logeTorch.relupara criar o array de embeddings - Os valores nas posições de special tokens são definidos como 0
- opensearch-project/opensearch-neural-sparse-encoding-v1: carrega diretamente
-
Reranking
- mixedbread-ai/mxbai-rerank-base-v1: recebe uma consulta e uma lista de documentos e gera resultados de reranking
- BAAI/bge-reranker-base: também há um exemplo de reranking que usa uma consulta e um array de documentos como entrada
Pipelines
- Os pipelines de Text oferecem suporte às seguintes tarefas
embedding: geração de embeddings de textoreranking: reordenação do ranking de uma consulta e um array de documentosner: named-entity recognitionsentiment-analysis: análise de sentimentoquestion-answering: geração de resposta a partir de uma pergunta e um contextofeature-extraction: extração de características de texto
- Os pipelines de Vision oferecem suporte às seguintes tarefas
image-classification: classificação de imagensimage-feature-extraction: extração de características de imagens
API e arquiteturas suportadas
- Esta biblioteca segue a Transformers Python API
- As arquiteturas de modelo atualmente suportadas são as seguintes
- BERT
- DeBERTa-v2
- DistilBERT
- MPNet
- ViT
- XLM-RoBERTa
Desenvolvimento e contribuição
- O histórico de mudanças pode ser consultado no changelog
- As formas de contribuição incluem relatar bugs, corrigir bugs e enviar pull requests, escrever, esclarecer ou corrigir documentação, e sugerir ou adicionar novos recursos
- Os comandos para iniciar o desenvolvimento são apresentados na ordem: clonar o repositório,
bundle install,bundle exec rake download:filesebundle exec rake test
1 comentários
Comentários no Hacker News
O runtime ONNX para Ruby do Ankane é tão fácil de usar que chega a fazer a gente se perguntar por que o repositório oficial em JavaScript é tão difícil de entender
Só dei uma olhada por cima no que essa pessoa fez até agora, mas já parece um herói
Sério mesmo, essa pessoa é humana? Se fosse um indivíduo tão talentoso assim, eu teria vontade de investir 1 bilhão de dólares
Talvez não seja por isso que ele faz isso, mas se alguém quiser demonstrar agradecimento, já indiquei o Ankane para o Rails 2024 Luminary award
https://rubyonrails.org/2024/8/2/nominations-open-for-2024-l...
Esse tipo de contribuição é algo de que a comunidade Ruby realmente precisa, e este projeto também parece interessante
Neste caso, Ruby de repente ganhou uma biblioteca excelente, e isso por si só já é algo muito digno de agradecimento. Mas a “comunidade” só acabou “produzindo” isso meses ou anos depois de bibliotecas equivalentes já existirem em Python, JavaScript, TypeScript, Rust, Go etc.
Isso não acontece só com machine learning/IA, mas também com gems Ruby para lidar com tecnologias novas. Antigamente, SaaS e startups ofereciam Rubygems oficiais desde o início, e muitas vezes até antes de outras plataformas ou linguagens. Hoje em dia, se você quer integrar com coisas como Notion, Slack ou Cloudflare, muitas vezes não existe opção para Ruby, ou pelo menos não existe uma opção oficial
Isso é triste. Ruby é uma linguagem muito maior do que Rails, e dá para entender a resistência ou antipatia em relação ao Rails. Ainda assim, Ruby é uma linguagem bem mais prazerosa de usar do que Python e, com certeza, muito mais do que JavaScript. Tenho convicção de que Ruby poderia ter ocupado o lugar que Python ocupa hoje, e se isso tivesse acontecido, dezenas de milhares de desenvolvedores estariam um pouco mais felizes agora
O Ankane, mesmo sozinho, devolve para a indústria uma contribuição enorme de muitas formas. Impressionante
Fico me perguntando como uma pessoa consegue ser tão produtiva. Deve ter uma vida bastante corrida, com trabalho, família e tudo mais
É difícil expressar o quanto sou grato pelas gems do Ankane. O que ele criou foi essencial em alguns dos meus apps, e eu vejo isso como preenchendo lacunas no ecossistema
As ferramentas que essa pessoa criou são realmente impressionantes. Seria ótimo ver ainda mais delas
Pelo que sei, Andrew Kane também é o autor de pgvector, pgvector-ruby e neighbor, e todos são muito bons
Além disso, ele fez muitas outras coisas
Vai ver ele já resolveu IA/machine learning sozinho há muito tempo, e usa isso para ser tão produtivo assim
[0] https://github.com/pgvector/pgvector
[1] https://github.com/pgvector/pgvector-ruby
[2] https://github.com/ankane/neighbor
[3] https://github.com/ankane/
https://github.com/ankane/pretender facilita muito se passar por outro usuário em apps Rails
https://github.com/ankane/ahoy é uma ferramenta de analytics própria para Rails
https://github.com/ankane/blazer é uma ferramenta de business intelligence que roda dentro do Rails
https://github.com/ankane/field_test é para testes A/B
Essas coisas aumentam a produtividade no Rails em apps web comuns. Pode até existir um produto de fornecedor melhor ou uma solução mais especializada para cada uma delas, mas poder adicionar uma gem, configurar um pouco e obter uma solução de 80% permite lançar muito rápido
Chartkick é uma biblioteca de gráficos para Ruby, Ahoy é uma biblioteca de analytics para Rails, e Searchkick é uma biblioteca de busca para Rails
O perfil dele no GitHub tem mais de 370 repositórios
Por exemplo,
/discoé uma implementação bem simples de filtragem colaborativa que serve quando você quer adicionar recomendações rapidamente em qualquer lugarSe você está procurando algo relacionado a machine learning em Ruby, normalmente o ankane já deu uma olhada antes
Na comunidade Ruby, eu pessoalmente considero Andrew Kane e Chris Oliver os melhores entre os melhores. Mesmo que eu não use todas as contribuições deles, esse tipo de contribuição é sempre muito bem-vindo