Saltar para o conteúdo
V-Smart.

Motor de busca próprio para o modelo, sem contas em intermediários

Um modelo de linguagem conhece o mundo até ao dia em que acabaram de o treinar. Para responder a perguntas sobre as coisas de hoje, tem de saber procurar. Construímos para isso um motor de busca próprio, na mesma máquina — e, já agora, medimos quanto trabalho é preciso para que os resultados venham na língua certa.

Como é que o modelo procura, afinal

Ao contrário do que parece, o modelo não tem acesso à internet. Funciona de outra maneira, e vale a pena entendê-la, porque afeta a privacidade de toda a solução.

O modelo recebe à partida a informação de que existem duas ferramentas: uma devolve a lista de resultados de pesquisa, a outra descarrega o conteúdo de uma página indicada. Quando entende que a pergunta exige dados frescos, não executa nada sozinho — escreve um pedido: «chama a pesquisa com a frase X». O programa do lado do utilizador executa esse pedido, consulta o nosso motor de busca e cola os resultados de volta na conversa. O modelo lê-os como texto normal e formula a resposta.

Todo o tráfego passa, portanto, pela nossa máquina. Nenhum fornecedor de modelos vê a pergunta nem o que se fez com a resposta.

O que está por baixo

A camada de pesquisa é o SearXNG — um metamotor de busca aberto que corremos em casa. Consulta uma fonte externa (no nosso caso, a API oficial do motor de busca Brave, com chave) e devolve uma lista unificada de resultados. O fornecedor externo vê a pergunta, mas não vê quem pergunta, nem para quê, nem o que se passou antes na conversa. Não há aqui conta de utilizador, histórico nem definição de perfis.

Uma armadilha de configuração que vale a pena registar, porque nos custou algum tempo: escolhemos o motor que usa a API oficial, e não o que lê automaticamente a página de resultados. Este segundo método é, por vezes, o predefinido em instalações semelhantes e apanha um bloqueio ao fim de uma dúzia de pedidos.

Resultados na língua certa exigem duas definições, não uma

Por omissão, uma instalação destas responde com resultados em inglês, mesmo a uma pergunta em polaco. Medimo-lo numa frase técnica, contando os resultados em polaco — a nossa língua nativa — entre os vinte primeiros:

Definição de línguaResultados em polaco em 20
nenhuma / «todas»0
só o código de língua («pl»)10
locale completo («pl-PL»)17

A diferença entre «pl» e «pl-PL» não é cosmética: são sete resultados em vinte. O mesmo se aplica, um para um, à língua do leitor — no seu caso, «pt» contra «pt-PT». E é preciso definir duas camadas: o valor por omissão do servidor e os parâmetros passados ao próprio motor. Mudar só uma delas não chega, porque a outra é sobreposta pelo cliente.

O modelo pode sobrepor isto num pedido individual — e fá-lo com bom senso, passando para inglês quando procura documentação técnica.

O resultado por omissão era pobre de mais — corrigimos o motor

A versão padrão do motor guarda de cada resultado apenas uma descrição curta — duas frases, muitas vezes cortadas a meio da frase-chave. Entretanto, o fornecedor devolve, de caminho, fragmentos adicionais do conteúdo da página, que ninguém pediu e que eram simplesmente deitados fora.

Substituímos esse troço por uma versão nossa, que cola esses fragmentos e os junta ao resultado. O efeito são cerca de 4,7 vezes mais texto por resultado. O modelo recebe conteúdo real em vez de um aperitivo, por isso responde mais vezes de imediato, sem descarregar páginas inteiras.

A segunda alteração é pequena e resolve um problema frequente: antes de cada resultado colamos a data de publicação. Sem ela, o modelo não tem como distinguir um guia de há cinco anos de um deste ano — e confundia regularmente versões de software.

Quando o modelo desce mais fundo

Na instrução de sistema temos uma regra: se os fragmentos estiverem cortados, forem contraditórios ou não contiverem o dado concreto procurado — descarrega a página inteira. Isto resolve as situações em que a própria lista de resultados finge ser a resposta, mas não a contém.

Um pormenor que vale a pena imitar: descrevemos a regra pelo papel da ferramenta, não pelo seu nome («recebe um endereço, devolve o conteúdo»). Programas diferentes dão a esta ferramenta nomes diferentes, e uma instrução que se refira ao nome deixa de funcionar quando se muda de cliente.

Quanto contexto custa isto

Os dados frescos não são de graça — ocupam lugar na memória da conversa:

  • uma pesquisa com fragmentos completos: cerca de 4 mil tokens,
  • descarregar uma página inteira: até mais de dez mil.

Com um contexto de 262 mil tokens, é uma situação confortável: uma dúzia de pesquisas numa conversa não faz mossa. Numa máquina com pouco contexto, seria exatamente aqui que a brincadeira acabava — e este é um dos motivos por que valeu a pena lutar pela capacidade de contexto.

O que isto dá na prática

Três coisas, por ordem de importância para o utilizador doméstico:

Atualidade. O modelo deixa de inventar nas perguntas sobre coisas novas, porque tem como verificar.

Privacidade. As pesquisas não constroem um perfil publicitário nem um histórico associado a uma conta. De casa sai apenas o termo de pesquisa, sem o contexto da conversa.

Independência. O motor de busca é substituível — a fonte pode trocar-se sem mexer nos modelos e sem esperar que o fornecedor mude de ideias quanto ao preçário ou aos termos do serviço.


Configuração própria, na mesma máquina que os modelos. Medições da língua dos resultados feitas na nossa instância.