Alternativa A: Manter o full-text do PostgreSQL atual
Fluxo
raw chunkText
-> plainto_tsquery
-> search_tsv @@ query
-> ts_rank_cd
-> top JSONL retornoVantagens
- Já está implementado.
- Pode ser feito apenas com PostgreSQL.
- A infraestrutura é simples.
search_tsvcombina diretamente com tabelas que já o possuem.
Desvantagens
- Não é BM25.
- É fraco com trechos de código longos.
- As condições geradas por
plainto_tsquerypodem 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_sizeSe 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_sizeNessa 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 completamenteFormas de falha visíveis:
0 resultados de pesquisa
ou retorna apenas um chunk muito pequenoNesse 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 restritaObservaçã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çãoO julgamento da nota original está próximo de “é melhor refazer tudo”.