YaCy improved-search

Um fork experimental do YaCy: ranking melhor, resultados assinados, peers atrás de NAT

Um fork do YaCy que corrige fraquezas medidas na rede pública, adiciona uma camada de confiança para que resultados forjados e spam possam ser filtrados, e permite que peers atrás de um NAT participem por meio de um relay. Cada afirmação desta página foi medida em redes peer-to-peer fechadas que qualquer pessoa pode reconstruir com docker compose.

Status: experimento. Isto não é uma versão lançada pelo projeto YaCy e não tem afiliação com ele. Quebra deliberadamente a compatibilidade com a rede pública do YaCy (ids de peer, seeds, hashes de palavras CJK). É compartilhado para mostrar, com dados, o que as mudanças fazem, para que as ideias possam ser discutidas e, onde fizerem sentido, propostas upstream em partes pequenas.

Por quê

Medido na rede pública do YaCy (freeworld) com 16 consultas, apenas 11% dos 10 primeiros resultados continham todos os termos da consulta. Investigando as causas:

O que mudou

Ranking

Correspondência mínima mais rigorosa, ponderação por cobertura de termos após a normalização por peer, um peso contra páginas rasas e busca em todos os peers de redes pequenas.

CJK

Texto em chinês, japonês e coreano é indexado e buscado como bigramas sobrepostos, no Solr e no índice de palavras.

Confiança

Chaves de peer Ed25519, seeds assinados, listas de confiança assinadas por coordenadores com tags declaradas, e uma assinatura de autor em cada documento que o peer rastreia.

Travessia de NAT

Um pequeno sidecar go-libp2p reserva um slot em um circuit relay, para que peers atrás de um NAT respondam buscas.

Qualidade da busca

SintomaCausaMudança
Páginas que correspondem a um só termo (keyword stuffing) ficam no topoSolr mm=1 para consultas com vários termosCorrespondência mínima 2<-1 5<80%: com dois termos, ambos precisam corresponder; com 3–5 termos, pode faltar um (search.ranking.solr.mm, .mm.cjk)
A melhor correspondência parcial de um peer é classificada como as correspondências exatas de outros peersNormalização da pontuação por peerMultiplicar a pontuação normalizada por (termos encontrados / termos da consulta)², no mínimo 0.05, e nunca abaixo do que a correspondência mínima garante (search.ranking.coverage.exponent)
Japonês / chinês não são encontrados no índice de palavrasNão há segmentação de palavras para CJKBigramas sobrepostos no índice de palavras e na consulta; CJKWidthFilter + CJKBigramFilter no schema do Solr
Páginas rasas com a consulta inteira no título (listas de tags) ficam no topoO qf padrão pondera title^5 e h1^5 (e host ^6, nome de arquivo da URL ^4, caminho ^3) contra text^1Resultados com menos de 100 palavras são ponderados por palavras / 100, no mínimo 0.1 (search.ranking.thin.words); contagem de palavras CJK corrigida (contava espaços)
Uma rede de peers novos nunca busca nos índices de palavras de outros peersA busca DHT precisa de peers com mais de 3 diasConfigurável (remotesearch.dht.minage, padrão 3)
Redes pequenas não enviam consultas Solr remotas a ninguém, ou ignoram os alvos DHTA fórmula do número de alvos dá 0; os alvos DHT eram excluídos do SolrRedes de até 32 peers consultam cada peer confiável conectado (cada peer no modo aberto), alvos DHT incluídos

Camada de confiança

Travessia de NAT

Um processo sidecar (Go, go-libp2p) roda ao lado do YaCy com a mesma chave. Atrás de um NAT, ele reserva um slot em um circuit relay v2 e anuncia o endereço do circuito no seed assinado (Reach=relay). Os outros peers abrem uma porta de túnel local até ele e usam HTTP comum, então os clientes existentes do YaCy funcionam sem alterações. Por padrão, esses peers só respondem buscas. Eles não armazenam dados da DHT, a menos que optem por isso.

Os detalhes estão no design de confiança e NAT (em inglês).

Resultados

Dois experimentos no yacy-lab. Ambos rodam redes fechadas em docker compose, com um corpus e um conjunto de consultas determinísticos.

Qualidade da busca: upstream vs fork, 3 peers cada

Cada peer rastreia um site. As consultas vão para o peer 1 com resource=global, e a maioria das páginas relevantes está nos outros peers. O corpus contém dois tipos de iscas: páginas recheadas com um termo da consulta e páginas rasas de "arquivo de tags" com a consulta inteira no título. Média de 11 consultas (6 em inglês, 4 em japonês, 1 em chinês), 2 execuções com o mesmo resultado, exceto onde indicado.

Cluster / caminhoR-precision ↑Recall@10 ↑Iscas no top R ↓Todos os termos no top 10 ↑
upstream, padrão0.520.960.480.42
fork, padrão0.79–0.861.000.14–0.210.75
upstream, só índice de palavras0.020.020.000.09
fork, só índice de palavras0.930.950.070.77

Confiança e NAT: 6 peers do fork, um relay e um NAT

Três peers confiáveis, um peer confiável que declara ads, um peer assinado mas não confiável que rastreia spam e planta documentos com uma assinatura emprestada, e um peer atrás de um roteador MASQUERADE. Todas as 26 verificações passam, entre elas:

Experimente

Sem Docker: abra a demo no navegador. Ela roda em modo simulado, reproduzindo respostas gravadas da demo real (a página está em japonês).

A demo sobe as duas redes (3 peers upstream, e a configuração de confiança e NAT do fork) em uma única máquina e coloca uma página de busca na frente delas. Você precisa de Docker com cerca de 7 GB de memória.

git clone https://github.com/pad01g/yacy_search_server.git yacy
git clone https://github.com/pad01g/yacy-lab.git
cd yacy
git checkout baseline        && docker build -t yacy-lab/upstream:baseline -f docker/Dockerfile .
git checkout improved-search && docker build -t yacy-lab/fork:latest -f docker/Dockerfile .
docker build -t yacy-lab/sidecar:latest sidecar/
cd ../yacy-lab
docker compose -f compose.demo.yaml -p yacydemo up -d
# abra http://localhost:8800 (a preparação leva cerca de 10 minutos e mostra o progresso)
A página da demo: a mesma consulta enviada à rede upstream (esquerda) e ao fork (direita). O upstream lista primeiro páginas de spam; o fork lista primeiro páginas relevantes verificadas e, no modo aberto, o spam abaixo delas, marcado como não verificado.
"bitcoin lightning channel" no modo aberto. Esquerda: o upstream mostra o spam primeiro. Direita: o fork mostra primeiro os resultados verificados e, abaixo, o spam marcado como não verificado.

A página também permite mudar a confiança: escolher em quais coordenadores o peer que busca confia (um segundo coordenador lista apenas o peer de spam, então confiar nele torna o spam "verificado"), editar e assinar de novo a lista de confiança, entregar a nova versão a um peer e ver como ela se propaga, e revogar ou restaurar a delegação do operador.

Os experimentos em si: docker compose -p yacylab up -d && docker compose -p yacylab run --rm runner (qualidade da busca) e docker compose -f compose.trust.yaml -p yacytrust up -d && docker compose -f compose.trust.yaml -p yacytrust run --rm runner (confiança e NAT). Veja o README do laboratório.

Participar: sem pedir permissão

Qualquer um, pessoa ou agente, pode rodar um peer, conectá-lo com a URL de um membro (p2p.bootstrap.peers, também por uma rede Tailscale), indexar e assinar suas próprias páginas e serviços, e ter seu próprio coordenador ou operador: um coordenador é só uma chave e um arquivo assinado em qualquer URL, sem servidor. Anúncios declarados (tag ads) são permitidos; os usuários escolhem em quais listas confiam. Como participar · pull requests são bem-vindos.

Para agentes de IA

Um agente pode rodar seu próprio peer e usá-lo como ferramenta de busca, sem API de busca nem chave de API:

Limitações