idea_world_labDEV JOURNAL
domingo, 28 de junho de 2026

Alternativa A: Manter o full-text do PostgreSQL atual

Fluxo

raw chunkText
  -> plainto_tsquery
  -> search_tsv @@ query
  -> ts_rank_cd
  -> top JSONL retorno

Vantagens

  • Já está implementado.
  • Pode ser feito apenas com PostgreSQL.
  • A infraestrutura é simples.
  • search_tsv combina diretamente com tabelas que já o possuem.

Desvantagens

  • Não é BM25.
  • É fraco com trechos de código longos.
  • As condições geradas por plainto_tsquery podem ficar excessivamente restritivas.
  • Há muito ruído de tokens de código.
  • Não realiza busca semântica.
  • Uma pequena mudança na divisão dos trechos pode resultar em zero resultados.

Problemas esperados no trecho padrão

No trecho padrão, os seguintes tokens estão presentes simultaneamente.

func
process
delta
velocity
vector2
zero
input
is_action_pressed
move_right
move_left
normalized
animatedsprite2d
play
stop
position
clamp
screen_size

Se todos esses tokens não estiverem presentes simultaneamente em uma única linha JSONL, os resultados da pesquisa podem ser perdidos.

Simulação de PoC

Assume que o chunk de referência é passado diretamente para /api/retrieve.

Entrada:

chunkText = Corpo completo da função _process(delta)

O método atual converte esta entrada para plainto_tsquery('simple', chunkText).

Tipo esperado da consulta:

func & process & delta & var & velocity & vector2 & zero
& input & is_action_pressed & move_right & move_left
& length & normalized & speed & animatedsprite2d
& play & stop & position & clamp & screen_size

Nessa situação, se o documento real relacionado estiver dividido em dois blocos como a seguir, surgirá um problema.

docs chunk A:
  Input.is_action_pressed("move_right")
  Input.is_action_pressed("move_left")
  velocity.normalized() * speed
  $AnimatedSprite2D.play()
  $AnimatedSprite2D.stop()

docs chunk B:
  position += velocity * delta
  position = position.clamp(Vector2.ZERO, screen_size)

Se uma pessoa olhar, A e B estão ambos relacionados.

Mas se a consulta full‑text exigir muitos tokens ao mesmo tempo, pode acontecer o seguinte.

docs chunk A:
  animatedsprite2d = presente
  is_action_pressed = presente
  move_left/move_right = presente
  clamp = ausente
  screen_size = ausente
  position.clamp = ausente
  => consulta não satisfaz completamente

docs chunk B:
  clamp = presente
  screen_size = presente
  position = presente
  animatedsprite2d = ausente ou fraco
  move_left/move_right = ausente
  is_action_pressed = ausente
  => consulta não satisfaz completamente

Formas de falha visíveis:

0 resultados de pesquisa  
ou retorna apenas um chunk muito pequeno

Nesse método, é difícil distinguir se a falha na pesquisa ocorre porque “não há base no documento” ou porque “as condições da consulta são excessivas”.

Logs a serem verificados no PoC

Ao testar esta alternativa, não se deve olhar apenas o resultado.

É necessário mostrar os seguintes valores.

1. texto bruto chunkText  
2. consulta criada com plainto_tsquery  
3. lista de tokens incluídos na consulta  
4. número de linhas retornadas  
5. se for 0, qual token tornou a consulta muito restrita

Observação esperada:

Quanto maior o raw chunk, maior a query,  
e se os documentos relacionados estiverem divididos em vários chunks, o resultado será perdido.

Julgamento

Pode ser usado como linha de base do PoC  
Como estratégia de busca final, candidato à remoção

O julgamento da nota original está próximo de “é melhor refazer tudo”.