Ideia

Encontrar o fragmento certo e circular até seus vizinhos são duas capacidades distintas

Info

Escrito originalmente em francês. Traduzido por IA — o sentido foi preservado, não a prosa.

Ideia principal

Um motor de busca vetorial ligado a um repositório de código responde bem a "onde está escrita a regra que recusa a modificação de um item cancelado?". Ele traz os fragmentos mais próximos da pergunta, inclusive os que não usam nenhuma palavra dela, e faz isso tão bem numa grande massa documental quanto num repositório volumoso.

Ele encontra. Ele não viaja. Só que a pergunta seguinte é quase sempre uma pergunta de vizinhança: qual módulo chama este, qual outra regra trata do mesmo objeto, qual evento dispara o que acabamos de ler, qual tela expõe esse comportamento. O motor não responde a isso, e não é um defeito de ajuste: a métrica dele é a proximidade de sentido entre um fragmento e a pergunta feita, nunca a relação entre dois elementos do corpus.

Duas capacidades cobrem esse deslocamento, e elas não se parecem. Um grafo semântico liga explicitamente os conceitos, os módulos e os eventos, e permite passar de um nó aos vizinhos declarados dele. O percurso do sistema de arquivos — listar o diretório onde o fragmento foi encontrado, abrir os arquivos adjacentes, ler a estrutura local — é mais rústico e muitas vezes mais eficaz, porque a árvore de diretórios já carrega uma parte da relação sem que ninguém tenha precisado declará-la.

Um dispositivo construído só sobre a busca dá, portanto, respostas exatas sobre o que soubemos perguntar, e mudas sobre o que estava bem ao lado.

Por que isso importa

Isso explica um fracasso comum: ligar um modelo a um repositório Git com um índice vetorial e constatar que as respostas continuam superficiais. O problema não é a qualidade da busca, é que só uma das duas capacidades está presente.

Isso também dá um critério de avaliação que não trata do primeiro resultado. Um dispositivo de consulta não é julgado pela pertinência do fragmento que traz, mas pelo que sabe fazer depois: alcançar o que quem fez a pergunta não sabia que devia perguntar.

Nuances e limites

A distinção não é uma hierarquia. Num corpus pequeno ou muito homogêneo, encontrar basta: os vizinhos estão no mesmo arquivo, e o deslocamento acontece na leitura.

E circular nunca substitui encontrar. Um grafo sem ponto de entrada não serve para nada; é a busca que fornece o nó de partida, e uma entrada ruim faz explorar uma vizinhança sem relação com a pergunta.

As duas capacidades, enfim, não envelhecem do mesmo jeito. Uma árvore de arquivos está sempre atualizada, já que ela é o repositório; um grafo de relações declaradas é mais um artefato, que diverge assim que o código muda sem que o grafo seja reconstruído.

Questões em aberto

  • O que determina o ponto de parada de um percurso de vizinhança — quantos saltos antes de o contexto trazido deixar de esclarecer a pergunta e começar a afogá-la?
  • Num repositório que muda todo dia, em que momento reconstruir um grafo de relações custa mais do que o ganho que ele traz diante de um simples percurso de diretórios?