Skip to content

Busca semântica (neural search) para INLABS/OpenSearch #312

Open
Heitorh3 wants to merge 9 commits into
mainfrom
feat-search-neural
Open

Busca semântica (neural search) para INLABS/OpenSearch #312
Heitorh3 wants to merge 9 commits into
mainfrom
feat-search-neural

Conversation

@Heitorh3

Copy link
Copy Markdown
Contributor

Busca semântica (neural search) para INLABS/OpenSearch

Descrição

Adiciona suporte à busca semântica (neural search) para a fonte INLABS quando o backend OpenSearch está habilitado, permitindo encontrar publicações relevantes mesmo quando não há correspondência exata dos termos pesquisados.

Principais mudanças:

  • Busca semântica com embeddings: novo módulo src/utils/open_search/embeddings.py, que gera embeddings de passagem (documentos) e de consulta (queries) usando o modelo multilíngue intfloat/multilingual-e5-base (768 dimensões), com prefixos passage:/query: apropriados para cada caso e tratamento de truncamento de textos longos (mantendo a "cauda" do corpo do texto, que carrega mais conteúdo específico do que o preâmbulo padrão de atos normativos).

  • Novo parâmetro neural_search_config: permite habilitar a busca semântica por DAG, definindo

     `neural_search`, `score` mínimo de similaridade
     `max_semantic_results` (limite de resultados retornados apenas por similaridade semântica, sem correspondência de palavra-chave).
    
  • Indexação com KNN vector: campo embedding no mapeamento do OpenSearch passa a usar o método hnsw (engine lucene, cosinesimil), e o campo identifica ganha analisador portuguese e subcampos keyword/autocomplete.

  • Makefile / variáveis do Airflow: make create-opensearch-variable agora também cria OPENSEARCH_HOST, OPENSEARCH_USER e OPENSEARCH_PASS, além da variável existente RO_DOU_INLABS_USE_OPENSEARCH.

  • Documentação: novos exemplos de configuração (busca semântica), atualização do guia de instalação (seção sobre backend de busca do INLABS: SQL vs. OpenSearch), atualização do guia de parâmetros e reorganização da página de recursos e funcionalidades.

  • Dependências: adiciona sentence-transformers>=5.5.1 ao requirements.txt.

  • Testes: cobertura ampliada em tests/inlabs_hook_test.py, tests/inlabs_searcher_test.py e novo tests/opensearch_query_builder_test.py para os novos parâmetros e comportamento de busca híbrida (keyword + semântica).

Tipo de mudança

  • nova funcionalidade
  • correção de bug
  • melhoria de código ou refatoração
  • atualização de documentação
  • outra (descreva abaixo)

Checklist

  • o código segue os padrões definidos no projeto
  • os testes existentes não foram quebrados
  • a documentação foi atualizada (se aplicável)
  • o ambiente de desenvolvimento foi testado com as mudanças
  • o pull request está vinculado a uma issue (se aplicável)

Considerações finais

A busca semântica só está disponível para a fonte INLABS com o backend OpenSearch habilitado (RO_DOU_INLABS_USE_OPENSEARCH=True); em modo SQL, o parâmetro neural_search_config é ignorado. Quando neural_search_config está habilitado, os parâmetros ignore_attachments e ignore_inline_tables são ativados automaticamente. Com isso, conteúdos como anexos e tabelas incorporadas deixam de ser exibidos, garantindo consistência visual entre os resultados apresentados ao usuário.

Heitorh3 added 6 commits July 3, 2026 10:03
Adds an opt-in `neural_search_config` option to the search schema that
combines keyword matching with vector similarity search (k-NN) when
querying OpenSearch, backed by a multilingual sentence-transformers
embedding model. Includes document embedding during indexing, a
"Encontrado por similaridade" tag in the email template for
semantic-only matches, and score-threshold/result-cap controls.
Hits found only via k-NN similarity (no lexical matched_terms) were
grouped under an empty "matches" key, so the report's "Resultados
para: <termo>" heading was silently skipped for semantic-only
matches. Fall back to the configured searched_expression so those
results keep a visible term label.
Replaces the single "bem-estar" term with a broader set of synonyms
(qualidade de vida, vitalidade, equilíbrio, etc.) to better exercise
neural search matching across related concepts.
Evita falsos positivos vindos de conteúdo não relacionado ao habilitar
neural_search.
@Heitorh3 Heitorh3 added the enhancement New feature or request label Jul 14, 2026
@HenriqueLopes741

Copy link
Copy Markdown
Contributor

@Heitorh3 Heitor, ficou uma vírgula sobrando no requirements.txt em sentence-transformers>=5.5.1.

Também percebi que o build está demorando cerca de 3 a 4 minutos na minha máquina. Dei uma pesquisada e pode ser por causa do sentence-transformers, que baixa algumas dependências junto com ele (cerca de 1,5 GB extras). Acho que vale a pena dar uma verificada.

@Heitorh3

Copy link
Copy Markdown
Contributor Author

@HenriqueLopes741 Henrique, pode ser na sua maquina, na minha demorou 19s para gerar a imagen.

Each notification branch already links has_matches_task to its own
notify_task; the leftover reference here was undefined and would
raise a NameError when building the DAG.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants