Skip to content

feat(catalog): tokenized semantic find + route free-text discovery to ACB - #509

Closed
Gabrymi93 wants to merge 3 commits into
mainfrom
feat/find-token-minimal
Closed

Gabrymi93 wants to merge 3 commits into
mainfrom
feat/find-token-minimal

Conversation

@Gabrymi93

Copy link
Copy Markdown
Member

Sintesi

toolkit_dataset find non trovava dataset su query naturali: la semantica matchava solo la frase intera come substring continua (appalti pubblici anac → 0). Ora tokenizza le query e fa AND cross-part tra meta e colonne, usando le primitive condivise lab_connectors.textmatch. La description del tool dichiara il ruolo: find live = slug/colonne; discovery org-wide → dataciviclab-context find (DEC #11: ACB = dove cerco, toolkit = cosa c'è dentro).

Contesto collegato

Depende da lab-connectors#92 — mergiare prima quella (porta lab_connectors.textmatch). Segue la fix ACB agent-context-builder#90.

Cosa cambia

  • Nuovo artifact o modifica schema
  • Modifica builder (src/)
  • Modifica configurazione
  • Bug fix
  • CI / deploy
  • Dipendenze
  • Documentazione

Dettaglio

toolkit/domain/catalog.py — _semantic_query_hits

  • Tokenizza la query via lab_connectors.textmatch (stopword italiane escluse)
  • Meta hit: tutti i token matchano sparsi tra slug + name/description/source/tags/category (AND cross-part — prima: frase intera continua)
  • Colonna hit: tutti i token dentro nome/descrizione colonna
  • Morfologia leggera + prefissi (sanitaria≈sanita, import→importo)
  • Split per parola: appalti non matcha più dentro n_subappalti (falso positivo rimosso)
  • Query solo-stopword → nessun hit semantico

toolkit/mcp/server.py — description toolkit_dataset

  • find dichiarata come strumento live workspace+GCS (slug, colonne, meta); per discovery naturale org-wide rimanda a dataciviclab-context find

Impatto su artifact upstream

  • Nessun impatto su artifact

Verifica

pytest tests/
ruff check toolkit/
mypy toolkit/domain/catalog.py
  • pytest tests/ passa (1322 passed, 1 skipped)
  • ruff check passa
  • mypy toolkit/domain/catalog.py passa
  • Test nuovi in TestSemanticFind (cross-part, stopword, morfologia, prefisso colonna, no-falso-positivo subappalti)

⚠️ Il CI di questa PR andrà verde dopo il merge di lab-connectors#92 (installa lab-connectors da @main). Se resta rosso su import di textmatch, rifare merge/re-run dopo quel merge.

Comportamento atteso vs prima (fixture semantica)

Query Prima Dopo
appalti gara 0 (frase non continua) anac_bandi_gara (tokens sparsi tra tags e name)
bandi di gara ok (fortuito, frase continua nel fixture) ok (stopword di droppata)
gare appalti 0 anac_bandi_gara (morfologia)
import n/a colonna importo
di dei delle dipendente da substring 0

Checklist PR

Note per chi revisiona

  • Lo scoring restituito da toolkit find non è ranking editoriale: è un filtro live (slug/colonne/meta). La discovery con ranking resta ACB.
  • lab_connectors.textmatch è puramente funzionale — nessuna dipendenza di rete o stato.

- test_clean_duckdb_read: i 3 test ODS usano importorskip("odf") —
  fallivano in env senza extra pandas (CI resta verde grazie a [dev,pandas])
- test_smoke_scout: i 4 test con URL reali (finanze.gov.it, consip.it)
  dietro RUN_NETWORK_SMOoke=1 come RUN_S3_SMOKE — lo step smoke CI
  (-m smoke) li includeva nonostante il docstring dicesse il contrario,
  creando dipendenza da endpoint esterni; il test puro infer_years
  resta smoke e gira sempre
L'audit markers richiede un marker per ogni test nei file toccati;
i 4 test di rete avevano solo skipif senza marker. Stesso pattern di
test_s3_parquet_smoke: @pytest.mark.smoke + skipif env var — restano
collezionabili da -m smoke ma saltano senza RUN_NETWORK_SMOKE=1.
… ACB

toolkit_dataset find restava indietro su query naturali: la semantica
matchava solo la frase intera come substring continua. Ora tokenizza
le query (primitive condivise lab_connectors.textmatch) e fa AND
cross-part tra meta e colonne.

- meta hit: tutti i token sparsi tra slug + name/description/source/
  tags/category
- colonna hit: tutti i token dentro nome/descrizione colonna
- stopword italiane escluse dai token richiesti
- morfologia leggera + prefissi (sanitaria~=sanita, import→importo)
- split per parola: 'appalti' non matcha più dentro 'n_subappalti'
- description tool MCP: find = slug/colonne live; discovery org-wide →
  dataciviclab-context find (DEC #11)

Depende da lab-connectors#92 (textmatch) — mergiare prima quella.
@Gabrymi93
Gabrymi93 force-pushed the feat/find-token-minimal branch from 7a740af to c31da84 Compare October 14, 2026 15:36
@Gabrymi93

Copy link
Copy Markdown
Member Author

Chiusa: scope ridotto. Il matcher tokenizzato non serve se la discovery naturale va ad ACB find (DEC #11). Rimane solo il cambio description/routing, aperto in una PR dedicata minima.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant