4 pontos por GN⁺ 2025-11-29 | 1 comentários | Compartilhar no WhatsApp
  • O conjunto de dados do Hacker News inclui 28,74 milhões de postagens e comentários, e cada texto é composto por embeddings vetoriais de 384 dimensões gerados pelo modelo SentenceTransformers all-MiniLM-L6-v2
  • O dado é disponibilizado pela ClickHouse como um único arquivo Parquet (bucket S3), para uso em design e benchmark de aplicações de busca vetorial em grande escala
  • Com código SQL de exemplo, é explicado passo a passo como criar a tabela, carregar os dados, criar um índice de similaridade vetorial baseado em HNSW e executar consultas de busca
  • No exemplo em Python, embeddings de consulta são gerados com SentenceTransformers, e a busca semântica é realizada no ClickHouse usando a função cosineDistance()
  • A aplicação de demonstração de resumo seguinte usa LangChain e OpenAI GPT-3.5-turbo para resumir as postagens recuperadas, mostrando potencial de expansão para casos de uso de IA generativa empresarial

Visão geral do conjunto de dados de busca vetorial do Hacker News

  • O conjunto de dados inclui 28,74 milhões de postagens e comentários do Hacker News, e cada item inclui um embedding vetorial de 384 dimensões gerado com o SentenceTransformers all-MiniLM-L6-v2
    • Os embeddings usam um modelo de embedding local para capturar o significado de frases e parágrafos
  • Este conjunto de dados pode ser utilizado para projetar aplicações de busca vetorial, dimensionamento e análise de desempenho em larga escala com base em texto gerado por usuários

Detalhes do conjunto de dados

  • Todo o conjunto de dados é disponibilizado pela ClickHouse como um único arquivo Parquet e pode ser baixado a partir do bucket S3 https://clickhouse-datasets.s3.amazonaws.com/hackernews-miniLM/…
  • Os usuários são orientados a consultar o guia de índice ANN da documentação da ClickHouse para estimar requisitos de armazenamento e memória

Processo de carregamento de dados e construção do índice

  • A tabela hackernews é criada para incluir vários atributos, como ID da postagem, texto, vetor, autor, timestamp e pontuação
  • O carregamento dos dados é feito com o seguinte comando SQL
    INSERT INTO hackernews SELECT * FROM s3('https://clickhouse-datasets.s3.amazonaws.com/hackernews-miniLM/…');
    
    • A inserção de cerca de 28,74 milhões de linhas pode levar alguns minutos
  • O índice de similaridade vetorial é criado usando o algoritmo HNSW e cosineDistance
    ALTER TABLE hackernews ADD INDEX vector_index vector TYPE vector_similarity('hnsw', 'cosineDistance', 384, 'bf16', 64, 512);
    ALTER TABLE hackernews MATERIALIZE INDEX vector_index SETTINGS mutations_sync = 2;
    
    • Com M=64 e ef_construction=512, a construção do índice pode levar de alguns minutos a algumas horas, dependendo do número de núcleos de CPU e da largura de banda de armazenamento
  • Após a construção do índice, as consultas de busca vetorial passam a usar o índice automaticamente
    SELECT id, title, text
    FROM hackernews
    ORDER BY cosineDistance(vector, <search vector>)
    LIMIT 10
    
    • Carregar o índice para memória pode levar de alguns segundos a alguns minutos

Exemplo de busca semântica em Python

  • O script em Python gera o embedding da consulta de entrada com SentenceTransformers e executa a consulta via ClickHouse Connect
  • A função cosineDistance() é usada para calcular similaridade entre o vetor de entrada e os vetores do conjunto de dados
  • No exemplo de execução, são retornados os 20 principais itens relacionados à consulta “Are OLAP cubes useful”
    • Os resultados incluem o ID de cada postagem e parte do texto (100 caracteres)

Aplicação de demonstração de resumo

  • Após o exemplo de busca semântica e busca documental com ClickHouse, é apresentada uma aplicação de resumo baseada em IA generativa
  • Etapas principais
    1. Entrada do tópico pelo usuário
    2. Geração do embedding do tópico com SentenceTransformers all-MiniLM-L6-v2
    3. Busca de postagens/comentários relacionados no ClickHouse via busca de similaridade vetorial
    4. Resumo dos resultados usando LangChain e OpenAI gpt-3.5-turbo
  • O exemplo de execução faz uma busca com o tema “ClickHouse performance experiences”, e o GPT-3.5 gera um resumo
    • O resumo destaca desempenho, simplicidade, eficiência e adequação para análise em grande escala do ClickHouse, além de mencionar também algumas dificuldades com DML e backups
  • Esta aplicação pode ser expandida para diversos casos de uso de IA generativa empresarial, como análise de sentimento de clientes, automação de suporte, resumo de atas e análise de documentos financeiros

Estrutura do código da aplicação de resumo

  • O código Python utiliza SentenceTransformer, clickhouse_connect, LangChain, ChatOpenAI, entre outros
  • Os resultados da busca são combinados e enviados ao modelo GPT-3.5 para gerar um resumo com no máximo 10 frases
  • Dependendo da quantidade de tokens do texto de entrada, a cadeia stuff ou map_reduce é escolhida para o processamento
  • O resultado é exibido no formato “Summary from chatgpt-3.5:”

1 comentários

 
GN⁺ 2025-11-29
Comentários do Hacker News
  • O novo dataset de embeddings vetoriais recomenda não usar all-MiniLM-L6-v2
    Esse modelo era uma opção prática baseada em sentence-transformers, muito usada nos primeiros tutoriais, mas agora está desatualizado e não reflete as arquiteturas e pipelines de treinamento mais recentes
    O comprimento de contexto também é curto, de 512. Em vez disso, recomendam EmbeddingGemma. Ele suporta uma janela de contexto de 2k e tem desempenho excelente em benchmarks
    É mais lento, mas vale a pena. Como meio-termo, bge-base-en-v1.5 e nomic-embed-text-v1.5 também são boas opções

    • Hoje em dia prefiro Qwen3-Embedding-0.6B
      Oferece pesos abertos, suporte multilíngue e contexto de 32k
    • Ainda assim, a vantagem do all-Mini é que ele pode rodar no lado do cliente
      Com cerca de 70 MB, é fácil de baixar. O EmbeddingGemma tem mais de 300 MB, o que pesa mais
      Fico curioso se existe algum modelo utilizável com menos de 100 MB
    • O problema de licença do EmbeddingGemma é uma pena
      A “licença Gemma” é ambígua, então talvez exija análise jurídica
      Se o Google mudar a lista de “uso restrito”, sempre existe o risco de o uso ser proibido de repente
    • Tenho curiosidade sobre comparações entre modelos comerciais de embedding
      Por exemplo, faltam materiais comparando Cohere vs OpenAI small vs OpenAI large
      Não sei com base em quais critérios fazer benchmark
    • Algumas semanas atrás fiz um teste A/B entre EmbeddingGemma e nomic-embed-text-v1, e o nomic teve resultados muito melhores
      Também funciona bem em CPU
  • Desde 2023, todos os comentários do HN estão sendo transformados em embeddings no BigQuery e hospedados em hn.fiodorov.es
    O código-fonte está disponível no GitHub

    • Testei eu mesmo e ele deu respostas bem boas
      Quando procurei por “Who’s Gary Marcus”, o resultado saiu mais negativo do que no Google
      Fico curioso sobre quanto custa operar isso
    • A explicação da arquitetura no repositório do GitHub foi impressionante. Belo projeto
    • Gostaria de saber com que hardware os embeddings foram gerados e quanto tempo isso levou
    • Queria saber se existe algum recurso para abrir issue para que usuários peçam a remoção dos seus próprios dados
  • Segundo a Privacy and Data Policy do HN, o uso comercial dos comentários é proibido
    Tecnicamente, representações vetoriais também contam como obras derivadas

    • Segundo os Termos de Uso da Y Combinator,
      é proibido reproduzir, distribuir, modificar o conteúdo do site para fins comerciais ou criar obras derivadas
      Além disso, atividades como data mining e scraping também são proibidas
    • Claro, vetores são derivados, mas pela mesma lógica a minha memória também é derivada
      Acho que tenho o direito de criar um banco de dados vetorial como dispositivo externo de apoio para a minha memória
    • É brincadeira, mas eu estava quase pedindo a remoção de todos os meus comentários. Agora acho que não preciso mais
    • Então alguém também deveria avisar a OpenAI
  • Seria legal se o HN tivesse um menu de clique direito com algo como “ver frases semelhantes”
    Também daria para saber se a mesma sugestão já apareceu antes

    • Se conectássemos comentários e threads por semântica, isso seria realmente interessante
      Daria para ver quantas vezes a mesma discussão se repete em posts diferentes e
      até conferir de antemão reações antigas ao que estou pensando em escrever
      Poderia virar uma espécie de conceito de semantic thread
    • Se usassem esse recurso, provavelmente apareceriam um monte de palavras como “tangential, orthogonal, anecdata, enshittification, razor…”
    • No passado, alguém fez uma ferramenta para identificar contas secundárias no HN, e ela encontrava quase perfeitamente só pelo estilo de escrita, o que foi assustador
  • Queria saber se existe algum artigo comparando busca vetorial vs busca textual comum
    Fico pensando se busca vetorial realmente vale tudo isso

    • Busca comum geralmente é chamada de bm25. Na maioria dos artigos sobre busca, bm25 é usado como baseline
    • Não conheço um artigo específico, mas a conta reachsumit.com no Bluesky costuma compartilhar muito material sobre RAG e recuperação de informação
    • O importante é em que aspecto você quer comparar — carga no servidor ou experiência do usuário, por exemplo
  • Dizem que posts do HN e metadados dos embeddings somam 55 GB, e fico me perguntando se isso faz sentido se forem arquivos Parquet

    • Acho que a maior parte deve ser dados de embedding. Meu banco inclui todos os posts e comentários do HN, e fica em cerca de 17,68 GB sem compressão e 5,67 GB com compressão
    • A eficiência de compressão é surpreendentemente boa. Usando Brotli, até milhões de páginas caem para 1–2 GB
    • Pela tabela, esse número parece correto. Também queria fazer embeddings dos meus dados de upvote para analisar meu gosto
    • Se estiver comprimido, é um tamanho totalmente plausível
  • Se o único objetivo for usar os comentários para treinar modelos comerciais, isso deixa um gosto amargo
    Acho que isso pode afetar minha vontade de participar daqui para frente

    • Desde o surgimento dos LLMs, tenho menos vontade de escrever coisas úteis na internet
      Antes parecia que eu estava ajudando desconhecidos; agora parece que estou ajudando pessoas de quem não gosto
    • Eu, por outro lado, acho divertido pensar que meus comentários estranhos vão deixar rastros no espaço latente dos LLMs
      Talvez, em algum lugar dentro de um grande modelo do futuro, minhas palavras reverberem de leve
    • O clima está sério demais. Dá vontade de dizer: vamos só nos divertir
  • Queria que existisse uma função para excluir conta/comentários

    • O que dissemos já foi copiado para incontáveis dispositivos ao redor do mundo
      Na prática, virou dado permanente, e um dia meus comentários talvez sobrevivam como sabedoria antiga
    • O dataset do HN já foi replicado em vários lugares, então o ideal é considerar qualquer coisa escrita aqui como conteúdo público
  • Tirei um item da lista de tarefas (graças a este projeto)

  • Supondo que um amigo pergunte... se eu comentar aqui, isso será convertido em vetor?