5 pontos por GN⁺ 2023-10-25 | 1 comentários | Compartilhar no WhatsApp
  • Embeddings convertem conteúdos como texto, imagem e código em um array de ponto flutuante de tamanho fixo, permitindo encontrar itens semanticamente próximos por cálculo de distância
  • No espaço vetorial criado pelo mesmo modelo, mesmo sem saber o significado de cada número individual, é possível comparar documentos relacionados, imagens semelhantes e trechos de código com similaridade de cosseno
  • Em um caso que armazenou 472 posts de TIL como vetores de 1.536 dimensões com o OpenAI text-embedding-ada-002, a consulta para buscar posts relacionados levou cerca de 400 ms, e o custo total de embedding de 402.500 tokens foi de cerca de US$ 0,04
  • Mesmo só com modelos locais e uma combinação de ferramentas pequenas, é possível implementar busca em README, busca de código, busca de imagens, clustering e RAG; os exemplos usam LLM, llm-sentence-transformers, Symbex, CLIP e E5-large-v2
  • A busca semântica baseada em embeddings não depende de correspondência exata de palavras, tornando-se um meio essencial em RAG, como em perguntas e respostas sobre documentos internos, ao inserir trechos relevantes no prompt do LLM

Conceitos básicos de embeddings

  • Embedding é uma forma de transformar um pedaço de conteúdo em um array de números de ponto flutuante
    • Independentemente do tamanho do conteúdo, o tamanho do array é sempre o mesmo
    • O tamanho do array é definido pelo modelo de embedding usado; por exemplo, podem sair 300, 1.000 ou 1.536 números
  • Esse array pode ser visto como uma coordenada em um espaço multidimensional
    • A posição nesse espaço representa o significado do conteúdo como entendido pelo modelo de embedding
    • Características do conteúdo, como cor, forma ou conceito, podem ser refletidas ali
  • Mesmo sem entender completamente o significado de cada número individual, é possível usar as relações de posição para tarefas úteis, como encontrar itens próximos

Recomendar conteúdo relacionado: caso do blog TIL

  • Em um site TIL com 472 posts, foi calculado um vetor de embedding de 1.536 dimensões para cada post com o modelo OpenAI text-embedding-ada-002
    • Os vetores foram armazenados no banco de dados SQLite do site
    • Os posts relacionados foram encontrados calculando a similaridade de cosseno entre o vetor do post-alvo e os vetores de todos os outros posts, retornando os 10 mais próximos
  • Para o post de exemplo “Geospatial SQL queries in SQLite using TG, sqlite-tg and datasette-sqlite-tg”, os principais resultados relacionados incluíam posts sobre SQLite, SpatiaLite, GDAL e consultas SQL espaciais
    • A similaridade com ele mesmo era 1.0
    • sqlite_geopoly.md tinha 0.8817322855676049
    • spatialite_viewing-geopackage-data-with-spatialite-and-datasette.md tinha 0.8813094978399854
  • A consulta para calcular posts relacionados levou cerca de 400 ms, então as 10 maiores similaridades para todos os posts foram pré-calculadas e armazenadas em uma tabela similarities
  • O custo da API de embeddings da OpenAI, no caso do site TIL, foi de cerca de US$ 0,04 para aproximadamente 402.500 tokens, à taxa de US$ 0,0001 por 1.000 tokens
  • Modelos proprietários exigem cuidados operacionais
    • A OpenAI já descontinuou alguns modelos antigos de embedding no passado
    • Se houver muitos embeddings armazenados com um modelo antigo, pode ser necessário recalculá-los com um modelo ainda suportado para embutir conteúdo novo
    • A OpenAI prometeu arcar com o custo de re-embedding para o novo modelo, mas o risco de dependência de modelo proprietário continua existindo
  • Modelos com licença aberta podem ser executados em hardware próprio, evitando o risco de descontinuação do modelo

O espaço vetorial visto com Word2Vec

  • Efficient Estimation of Word Representations in Vector Space, do Google Research, é o artigo do Word2Vec, publicado em 16 de janeiro de 2013
  • Word2Vec é um modelo inicial de embedding que transforma uma palavra em um array de 300 números
  • turbomaze.github.io/word2vecjson é uma demo que permite explorar 10.000 palavras e o array de 300 números de cada uma
    • Para “france”, aparecem palavras próximas como french, belgium, paris, germany, italy e spain
  • Relações também aparecem em operações vetoriais
    • Se você somar “paris” ao vetor de “germany” e subtrair “france”, o vetor resultante fica mais próximo de “berlin”
    • Isso mostra que o modelo capturou relações de nacionalidade e geografia dentro do espaço vetorial
  • O Word2Vec foi treinado com conteúdo de 1,6 bilhão de palavras, e os modelos de embedding atuais são treinados com conjuntos de dados muito maiores, capturando relações mais ricas

Calculando embeddings com a ferramenta LLM

  • LLM é uma ferramenta de linha de comando e também uma biblioteca Python para trabalhar com grandes modelos de linguagem
    • Pode ser instalada com pip install llm ou brew install llm
    • Por padrão, pode ser usada com a API da OpenAI
  • Ao instalar plugins, é possível adicionar novos modelos de linguagem ou de embedding
  • O plugin llm-sentence-transformers empacota a biblioteca SentenceTransformers
    • Ele permite baixar o modelo all-MiniLM-L6-v2 do Hugging Face e usá-lo localmente
    • O comando llm embed imprime um array JSON de números para uma única frase
  • Um embedding isolado, como array numérico sozinho, não tem muito valor; ele se torna útil quando é armazenado e comparado
  • llm embed-multi permite embutir vários conteúdos de uma vez e armazená-los em uma tabela SQLite chamada collection
    • O comando de exemplo encontra todos os arquivos README.md sob o diretório home e os armazena na collection readmes
    • A opção --store salva também o texto original junto na tabela SQLite
    • Na execução, foram armazenados 16.796 arquivos README.md, e isso levou cerca de 30 minutos em um computador local

Busca semântica e “vibes-based search”

  • O comando llm similar encontra itens semelhantes à frase de entrada em uma collection de embeddings armazenada
  • Ao pesquisar a collection readmes com a frase sqlite backup tools, aparecem no topo READMEs de projetos SQLite como sqlite-diffable, sqlite-dump, sqlite-generate, sqlite-history e sqlite-utils
  • Não há garantia de que a palavra “backups” esteja diretamente presente nos documentos de resultado
    • Se o conteúdo for semanticamente semelhante ao termo de busca, ele pode aparecer como resultado
  • Esse método é busca semântica; no texto original, ele é chamado de vibes-based search
  • Como a correspondência exata de texto nem sempre encontra o que o usuário procura, isso é útil em mecanismos de busca para vários tipos de conteúdo

Embeddings de código: Symbex e Datasette

  • Symbex é uma ferramenta para explorar símbolos de codebases Python
    • Ela foi criada para localizar rapidamente funções e classes Python e passá-las a um LLM
    • Depois, passou a permitir calcular embeddings de todas as funções do codebase para criar um mecanismo de busca de código
  • O Symbex pode exportar os símbolos encontrados em JSON ou CSV, formatos que podem ser usados como entrada do llm embed-multi
  • Um exemplo de embedding de todas as funções e métodos de classe do projeto Datasette usa o modelo gte-tiny
    • gte-tiny é um arquivo de 60 MB
    • symbex '*' '*:*' --nl produz JSON delimitado por nova linha com funções e métodos de classe do diretório atual
    • llm embed-multi ... --format nl pode receber diretamente essa saída e gerar os embeddings
  • Depois, é possível executar busca semântica de código com SQL usando o Datasette e o plugin datasette-llm-embed
  • O SQLite funciona como um ponto de integração para várias ferramentas
    • Extrai funções do código
    • Passa o resultado pelo modelo de embedding
    • Registra os resultados no SQLite
    • Faz a busca com SQL

Embutindo texto e imagem no mesmo espaço com CLIP

  • CLIP é um modelo lançado pela OpenAI em janeiro de 2021 que consegue gerar embeddings tanto para texto quanto para imagens
  • O ponto central é que texto e imagem são colocados no mesmo espaço vetorial
    • A posição do embedding da string “dog” e a posição do embedding de uma foto de cachorro ficam próximas dentro do mesmo espaço
    • Isso permite encontrar imagens relacionadas a partir de texto ou textos relacionados a partir de imagem
  • A demo de CLIP executada no navegador foi criada como um notebook Observable e roda o modelo CLIP dentro do navegador
    • A página carrega 158 MB de recursos
    • O modelo de texto do CLIP tem 64,6 MB e o modelo de imagem tem 87,6 MB
  • Há um exemplo que calcula pontuações de similaridade para vários textos em relação a uma foto de praia
    • beach: 26.946%
    • city: 19.839%
    • sunshine: 24.146%
    • california beach: 27.427%
  • Mais importante do que perguntar a similaridade entre uma foto qualquer e uma palavra isolada é construir uma interface de busca sobre isso

Faucet Finder: busca de imagens baseada em CLIP

  • Faucet Finder é uma ferramenta de busca personalizada para encontrar fotos de torneiras de banheiro
  • Drew Breunig coletou 20.000 fotos de torneiras de fornecedores e calculou os embeddings com CLIP
    • Na implementação, foram usados o LLM e o plugin llm-clip
    • O sistema foi publicado com Datasette
  • A ferramenta permite encontrar outras torneiras visualmente parecidas com uma torneira específica
    • Se você gostar de uma torneira cara, pode buscar uma opção mais barata visualmente semelhante
  • A demo de Drew usa embeddings pré-calculados para mostrar resultados semelhantes sem executar o modelo CLIP no servidor
  • Depois, um modelo CLIP no lado do servidor foi implantado no Fly.io, e foi criada uma demo em notebook Observable combinando uma API de embeddings de strings de texto com uma API da tabela de embeddings de torneiras
    • É possível buscar imagens de torneiras por significado com termos como “gold purple”

Clustering e visualização em 2D

  • Embeddings podem ser usados não só para recomendação de conteúdo relacionado e busca semântica, mas também para clustering
  • llm-cluster é um plugin que implementa clustering com sklearn.cluster, do scikit-learn
  • Usando a API de issues do GitHub e o paginate-json, é possível criar uma collection llm-issues com os títulos das issues do repositório simonw/llm e gerar 10 clusters
  • A opção llm cluster llm-issues 10 --summary envia o texto dos clusters a um LLM para gerar nomes descritivos
    • Exemplos de nomes incluem “Log Management and Interactive Prompt Tracking” e “Continuing Conversation Mechanism and Management”
  • Espaços de alta dimensão são difíceis de visualizar, então é possível reduzir a dimensionalidade com análise de componentes principais (PCA)
    • Matt Webb gerou embeddings com OpenAI para descrições de episódios do podcast BBC In Our Time e criou uma visualização 2D com PCA
    • Mesmo ao reduzir 1.536 dimensões para duas, episódios sobre guerras históricas ou descobertas científicas modernas ainda aparecem próximos entre si

Classificando frases pela posição média

  • Embeddings também podem ser usados para classificação
    • Primeiro, calcula-se a posição média de grupos de embeddings previamente classificados de uma certa maneira
    • Depois, atribui-se uma categoria ao novo embedding comparando de qual dessas posições ele está mais próximo
  • Getting creative with embeddings, de Amelia Wattenberger, mostra um caso de pontuação de frases como mais concretas ou mais abstratas
  • São criadas amostras de frases concretas e abstratas, e calcula-se a posição média de cada grupo
  • Uma nova frase recebe pontuação conforme sua proximidade relativa entre essas duas posições médias
  • Essa pontuação também pode ser convertida em uma cor que indica de forma solta o quão abstrata ou concreta é a frase

RAG: perguntas e respostas com documentos pessoais e internos

  • Quem já usou ChatGPT costuma se perguntar como fazer o modelo responder com base em notas pessoais ou documentos internos da empresa
  • A resposta pode não ser um treinamento caro de modelo customizado, mas uma combinação entre um LLM pronto e RAG (Retrieval-Augmented Generation)
  • O processo básico de RAG é simples
    • O usuário faz uma pergunta
    • Busca-se, nos documentos pessoais, conteúdo que pareça relevante para a pergunta
    • Respeitando o limite de tamanho do LLM, trechos relevantes e a pergunta original são inseridos no prompt
    • O LLM responde com base no conteúdo adicional fornecido
  • Um limite de tamanho comum fica na faixa de 3.000 a 6.000 palavras
  • A parte difícil no RAG é encontrar os melhores trechos para colocar no prompt
    • A busca semântica baseada em embeddings é adequada para reunir conteúdo com alta probabilidade de relevância

Implementando Q&A offline baseado em blog com E5-large-v2

  • Um exemplo de RAG baseado em conteúdo de blog usa E5-large-v2
  • Frases de pergunta e de resposta têm gramáticas diferentes, então uma pergunta nem sempre fica semanticamente próxima de um documento que contém a resposta
  • O E5-large-v2 suporta dois tipos de conteúdo
    • Uma factual sentence é embutida como phrase
    • Uma question é embutida como query
    • Isso é parecido com a forma como o CLIP coloca imagem e texto no mesmo espaço
  • Os 19.000 parágrafos do blog são embutidos como phrase, e a pergunta é embutida como query para encontrar os parágrafos mais próximos da resposta
  • O exemplo implementa RAG com um script Bash de uma linha
    • llm similar encontra os parágrafos relevantes
    • jq extrai o conteúdo
    • A pergunta e os parágrafos são enviados a um modelo Llama 2 Chat 7B executando localmente em um notebook
  • Para a pergunta What is shot-scraper?, foi gerada a resposta de que shot-scraper é um utilitário Python que encapsula o Playwright e automatiza screenshots de páginas web e scraping baseado em JavaScript por meio de uma interface de linha de comando e um fluxo de configuração baseado em YAML
  • A resposta gerada não era uma correspondência exata de frases já existentes no conteúdo do blog

Opções que podem ser ajustadas na prática

  • LangChain é um framework para implementar funcionalidades sobre LLMs, e RAG é uma de suas capacidades centrais
    • É possível construir a mesma funcionalidade sobre LangChain, mas entender LangChain exige um investimento considerável
    • Aqui, a preferência é por um conjunto de ferramentas pequenas que podem ser combinadas, em vez de um framework único para resolver tudo
  • A função de distância usada por padrão é a similaridade de cosseno
    • Outras funções de distância ainda não foram testadas
    • RAG tem muitos elementos ajustáveis: função de distância, modelo de embedding, estratégia de prompt e LLM
  • Os exemplos tinham no máximo cerca de 20.000 embeddings, e nessa escala ainda é razoável obter resultados em tempo aceitável usando cálculo de similaridade de cosseno por força bruta sobre o conjunto inteiro
  • Em dados maiores, como 1 bilhão de objetos, bancos de dados vetoriais ou extensões de bancos existentes passam a ser uma opção
  • Uma direção promissora para o futuro são os modelos multimodais e modelos menores
    • O ImageBind, do Facebook, aprende embeddings conjuntos para seis modalidades de dados: imagem, texto, áudio, profundidade, térmico e dados de IMU
    • Modelos cada vez menores, como o gte-tiny de 60 MB, aumentam a viabilidade em dispositivos limitados ou em execução no navegador

Leitura adicional

1 comentários

 
GN⁺ 2023-10-25
Comentários do Hacker News
  • Depois de publicar este texto, encontrei mais alguns materiais úteis para entender embeddings em um nível mais baixo
    Meu texto foi propositalmente escrito em um nível bem alto, com foco principalmente em aplicações
    Text Embeddings Visually Explained, da Cohere: https://txt.cohere.com/text-embeddings/
    Ferramenta Tensorflow Embedding Projector: https://projector.tensorflow.org/
    What are embeddings?, de Vicki Boykis, também vale a pena ver: https://vickiboykis.com/what_are_embeddings/
    Pretendo adicioná-los à seção “further reading” no fim da página

    • Tentei quase a mesma ideia algum tempo atrás: https://blog.scottlogic.com/2022/02/23/word-embedding-recomm...
      Usei embeddings para aumentar o engajamento com posts relacionados e, pessoalmente, vejo embeddings como uma ferramenta poderosa e subestimada
      Eles podem ser usados para navegar por similaridade entre documentos ou trechos, ou, ao contrário, para encontrar conteúdo único; e são bastante “seguros”, já que não é preciso se preocupar com alucinações
    • Gosto da forma como o texto é acessível mesmo para pessoas com pouca experiência em IA, machine learning e LLMs
      Também pode ser interessante entender como embeddings são criados. Por exemplo, há abordagens como cortar a camada de classificação depois do treinamento, ou métodos como o EfficientNet
    • Tenho curiosidade se existe algum material sobre a história dos embeddings e seu uso em ciência da computação e em LLMs
      Eles estão se tornando uma base central de machine learning
  • Em visão computacional e algoritmos de SLAM visual, embeddings se tornaram praticamente o método padrão para reconhecimento de lugares, e isso é muito parecido com o que o texto descreve
    É chamado de “bag-of-word place recognition” e hoje é usado em quase todas as bibliotecas open source
    A ideia central é passar cada imagem por um pipeline de extração de features e descritores, “embutindo-a” em um vetor com as N principais features
    Enquanto a câmera se move, cria-se um banco de dados de imagens chamado keyframes, e as imagens são armazenadas como vetores de dimensão muito menor
    Depois, o banco de dados é consultado com todas as imagens, e a melhor correspondência é encontrada no banco vetorial por métodos como similaridade de cosseno
    Quando há uma correspondência, é possível calcular as restrições estéreo entre a imagem de consulta e a imagem correspondente para atualizar o mapa
    O artigo original é [1], e a implementação mais famosa é https://github.com/dorian3d/DBoW2
    [1]: https://www.google.com/search?client=firefox-b-d&q=Bags+of+B...

  • É uma excelente referência introdutória
    Anos atrás, criei meu próprio app de notas para iOS, e adicionar embeddings à busca full-text existente foi 1) surpreendentemente fácil e 2) muito mais poderoso do que eu tinha imaginado inicialmente
    Eu sabia que, ao buscar por “dog”, também apareceriam notas contendo “canine”, mas só percebi mesmo quando testei uma busca como “animais de estimação de que eu gostaria” e ela encontrou várias notas relacionadas a animais com sentimento positivo
    Esse foi meu primeiro grande momento de “eureka”
    Na época, o PR do DocsGPT da Supabase foi útil como código de exemplo: https://github.com/supabase/supabase/pull/12056

    • A expressão “adicionar à busca full-text existente” é discretamente importante. Embeddings oferecem busca semântica que complementa algoritmos tradicionais de busca
      Muitas aplicações dependem muito de nomes ou nomes próprios, e frequentemente têm pouco contexto
      Se um cachorro for mencionado apenas pelo nome, sem descrição, certos modelos de embedding podem não capturar isso
      Nomes próprios como pessoas, lugares e nomes de ruas podem ser muito importantes para ancorar buscas personalizadas ou específicas de domínio, mas modelos de linguagem de uso geral não os conhecem
      Tenho curiosidade se existem métodos específicos para lidar com esse problema
    • Estou trabalhando em algo parecido para notas no Logseq
      A maior dúvida agora é quanto texto transformar em um único embedding
      Fico na dúvida entre fazer isso por frase ou agrupar em um só embedding todos os blocos de frases pertencentes a uma página de um app de notas
    • Tenho curiosidade se a geração dos embeddings usa uma API fora do dispositivo e se a busca é feita no próprio dispositivo
  • Um exemplo clássico de embedding de palavras é o famoso King - Man + Woman = Queen
    No espaço vetorial funciona bem, mas, quando projetado em 2D, visualmente não fica tão intuitivo
    Pela minha experiência, foi a mesma coisa com PCA, MDS e t-SNE: https://bhugueney.gitlab.io/test-notebooks-org-publish/jupyt...
    É um JupyterLite Notebook que executa embeddings de palavras no navegador; é melhor não rodar em smartphones
    Fico curioso se alguém conhece uma boa forma de visualizar de maneira clara esse exemplo clássico de embedding de palavras

    • Se entendi corretamente, em um espaço 2D dá para colocar “king” na origem e visualizar usando o eixo X como “king”-“man” e o eixo Y como “king”-“woman”
      Se você realmente quiser ortogonalidade, pode usar Gram-Schmidt
      Em 3D, dá para adicionar mais um eixo Z como “king”-“queen”, e a versão ortogonalizada fica mais próxima da noção de distância que o modelo enxerga
      Em 2D, ao calcular “king”-“man”+“woman”, não dá para mostrar quanto ele se desvia de “queen”, mas o restante da distância pode ser obtido com precisão
      Em 3D, deve ser possível fornecer a distância exata
      “queen” normalmente é escolhida por ser a palavra com o embedding mais próximo de X="king"-"man"+"woman"
      Em um gráfico 2D, também dá para mostrar algumas das palavras mais próximas seguintes e anexar a cada palavra a distância ortogonal em relação ao plano 2D
      Assim, “queen” deveria ser a palavra com a menor soma entre a distância quadrada a partir de X e a distância ortogonal quadrada a partir do plano, então dá para verificar isso visualmente até certo ponto
    • Seria bom experimentar UMAP
    • Enquanto procurava uma piada de matemáticos sobre visualizar altas dimensões, perguntei ao ChatGPT, e ele inventou uma piada no estilo Richard Feynman que eu não consegui encontrar no Google
      Era algo como “Não dá para visualizar 4 dimensões... pelo menos eu não consigo. Só tenho três branes”, um trocadilho com branes e brains
      Depois, o ChatGPT admitiu que tinha inventado e pediu desculpas
      Em seguida, trouxe citações de John von Neumann, H. G. Wells e Ian Stewart, e por fim respondeu algo como “para visualizar 4 dimensões, visualize 3 dimensões e então diga ‘n+1’”, que foi o mais parecido com a piada de que eu me lembrava, mas menos engraçado
      Então pedi para ele criar citações alucinatórias, no estilo Deepak Chopra, sobre visualizar espaços de alta dimensão, e ele despejou citações falsas plausíveis misturando expressões como embeddings septilhões-dimensionais, espaço de Hilbert, conjectura de Poincaré, princípio da incerteza de Heisenberg e entropia de Shannon
  • Um erro comum em trigonometria prática é fazer cálculos de raiz quadrada desnecessários
    No código de exemplo, magnitude_a = sum(x * x for x in a) * 0.5 e magnitude_b = sum(x * x for x in b) * 0.5 não precisam de *0.5
    Se você vai comparar cossenos, pode comparar os valores ao quadrado, evitando o cálculo caro da raiz
    De forma parecida, em criptografia de curvas elípticas, operações caras como cálculo de inverso são adiadas o máximo possível, ou, quando se está apenas comparando dois pontos, às vezes evita-se até calcular o valor canônico

    • Esse código foi escrito para ser fácil de entender
      Caso contrário, teria sido substituído por código SIMD de baixo nível
  • dot_product = sum(x * y for x, y in zip(a, b)); fico me perguntando por que fazer assim e não usar operações vetorizadas do numpy
    Aí entendi ao ver o trecho “pedi ao ChatGPT para escrever várias versões de código de similaridade de cosseno”

    • Há dois motivos
      Primeiro, ao explicar para as pessoas, sinto que a sintaxe do numpy mais atrapalha do que ajuda
      Segundo, numpy não é a dependência mais leve
      Eu o uso quando preciso de desempenho, mas não quero adotá-lo como opção padrão
  • Se você quiser ver publicações do Show HN, startups do ProductHunt, empresas da YC e repositórios do Github relacionados a embeddings de LLM, dá para encontrá-los rapidamente no MVP de mecanismo de busca baseado em embeddings de LLM que acabei de lançar
    https://payperrun.com/%3E/search?displayParams={%22q%22:%22L...

    • Está legal
      Eu esperava que, ao clicar nos vários botões de filtro, os resultados da busca fossem atualizados imediatamente, e não sabia que teria que pesquisar de novo
      Entendo por que foi feito assim
    • Meu post no Show HN está aqui: https://news.ycombinator.com/item?id=38011802
  • É a coisa mais interessante relacionada a “AI” que li nos últimos meses
    Sempre que via modelos de embedding em listas, ficava me perguntando o que eram, e também por que todo mundo fala de bancos de dados vetoriais
    Já consigo imaginar uma forma de aplicar isso imediatamente a um side project antigo
    Se todos os documentos tiverem embeddings, talvez um agrupamento útil dos dados dos usuários se torne realisticamente possível

  • Fico curioso se alguém já usou embeddings na prática para algo além de vizinhos mais próximos aproximados e clusterização
    Possibilidades que me vêm à mente são projeção, indexação e ordenação em eixos arbitrários. Por exemplo, eixos como “quente-frio”, “felicidade-tristeza”, “ficção científica-realismo”, “literariedade-comercialidade”
    Também deve haver formas de treinar embeddings diretamente, além de fazer classificação ao estilo SVM no espaço de embeddings, inferência ao estilo word2vec como woman-man+king=queen, ou extrair uma camada de um LLM
    Sei que aprendizagem contrastiva é usada, mas parece valer explorar outros métodos também, como aprender embeddings junto com uma rede neural de funções e gerar uma equação funcional para calcular a perda de erro quadrático médio
    É surpreendente ver tanto foco em busca semântica, e com certeza deve haver outras aplicações interessantes

    • Fico um pouco confuso porque todos os exemplos parecem tarefas relativamente comuns
      O primeiro e o terceiro são, na prática, a mesma coisa
      Em visão computacional, você pode querer alterar semanticamente uma imagem, como adicionar óculos a uma foto, e os trabalhos que vemos em anúncios do Google são exemplos disso
      Esse tipo de trabalho acontece no espaço latente
      Em fluxos normalizadores, isso fica especialmente claro porque o espaço é transformado em uma gaussiana
      Modelos de difusão fazem algo parecido por aproximação, mas não são reversíveis, embora seja possível voltar
      Você projeta a imagem, frase ou dado que quer manipular, manipula no espaço gaussiano e depois volta para o espaço de destino
      Mas talvez estejamos nos confundindo porque a palavra embedding é um termo sobrecarregado, com significados demais
      Talvez você esteja pensando apenas no primeiro bloco, que transforma tokens inteiros discretos em números de ponto flutuante contínuos
      Mas esse embedding também é aprendido, então, mesmo que acabe parecendo uma tabela de consulta, ainda é um processo de rede neural
      Também há usos de SVM nesse espaço
      Vejo como algo parecido com espaço latente, mas um pouco mais abstrato
      No mínimo, um embedding deveria ser injetivo. Matematicamente é assim, mas…
    • Classificação ao estilo SVM em espaço de embeddings é uma técnica bem básica em NLP e machine learning na indústria
      Treinar embeddings diretamente é literalmente o modelo de embeddings original, o Word2Vec
    • Já criei um espaço de embeddings word2vec com base em resumos do PubMed
      Encontrei muitas variantes e abreviações de nomes químicos e bioquímicos, como formas com hífen, sem hífen e com espaços
      Provavelmente daria até para construir um dicionário de termos técnicos
      Não sei até onde seria possível chegar em definições, mas, embora só vetores tenham limites, eles servem como ponto de partida
      É bem provável que outras pessoas também tenham construído dicionários dessa forma
    • Embeddings multilíngues, nos quais se cria um espaço de embeddings para cada uma das duas línguas e se alinham os espaços com um dicionário-semente, têm aplicações reais ou potenciais em busca multilíngue e tradução automática
    • Também dá para usar em deduplicação de dados
  • Já mexi com embeddings e criei alguns casos de uso em produção, e eles são uma ótima ferramenta que viabiliza muitas aplicações legais
    Mas, ao construir algo para um domínio específico, você esbarra nas limitações dos modelos de embeddings prontos
    Modelos prontos têm muitas dimensões, mas algumas delas podem ser importantes para classificação, similaridade de conteúdo, clusterização etc. na minha aplicação, enquanto outras podem não ser
    Em outras palavras, dois vetores podem parecer próximos porque estão próximos em dimensões que não me interessam
    Espero ver ferramentas e literatura melhores para ajuste fino de modelos de embeddings

    • Ajustar o modelo de linguagem inteiro para resolver esse problema é como usar uma marreta para pregar um prego
      Essas ferramentas existem há muito tempo; por exemplo, basta rotular um pouco de dados e depois treinar um SVM de classificação sobre o espaço de embeddings
    • O sentence-transformers tem um conjunto bem completo de ferramentas para isso