Algoritmo di Raffinamento della Ricerca¶
Panoramica¶
L'algoritmo di raffinamento è il cuore di SearchMuse. Migliora progressivamente la qualità dei risultati attraverso cicli iterativi di ricerca, valutazione e refinement. Ogni ciclo aumenta sia la rilevanza (quanto i risultati corrispondono alla query originale) che la copertura (quanti aspetti diversi dell'argomento sono rappresentati).
Passi Algoritmo Dettagliato¶
Passo 1: Parsing della Query Iniziale¶
La query in linguaggio naturale è processata per estrarre:
Concetti Principali: Parole chiave significative della query
Modificatori di Contesto: Temporal, spatial, qualitative
Intenzione della Query: Cosa l'utente realmente cerca
Intentions: [
"comparison among frameworks",
"performance rankings",
"adoption trends",
"suitability for different use cases"
]
Passo 2: Strategia Iniziale LLM¶
Un modello LLM genera una strategia di ricerca basata sulla query:
Prompt Template:
Given the query: "[QUERY]"
With concepts: [CONCEPTS]
And intentions: [INTENTIONS]
Generate a search strategy with:
1. Primary search terms (3-5)
2. Secondary search angles (2-3)
3. Aspects to explore (4-6)
4. Quality filters to apply
5. Expected result types
Format as JSON.
Output Strategico Tipico:
{
"primary_terms": [
"Python web frameworks 2026",
"Django FastAPI comparison",
"best Python backend framework"
],
"secondary_angles": [
"framework adoption statistics 2026",
"web framework performance benchmark"
],
"aspects": [
"performance metrics",
"community size and activity",
"learning curve",
"scalability",
"deployment options",
"recent innovations"
],
"quality_filters": ["recent", "authoritative", "detailed"],
"expected_types": ["blog posts", "benchmarks", "official docs"]
}
Passo 3: Esecuzione Ricerca DuckDuckGo¶
Esecuzione della ricerca utilizzando il termine primario:
Parametri Ricerca:
query: "[SEARCH TERM]"
results: 10
time_range: "recent (if temporal modifier present)"
safe_search: true
Deduplicazione Risultati: - Rimozione URL duplicate - Filtering di short URLs e redirects - Prioritizzazione di domini autorevoli
Risultato: Lista di 10 risultati con URL, titolo, snippet
Passo 4: Scraping Multi-Strategia¶
Per ogni risultato nei top 10:
For each URL in results:
1. Try HTML parsing
2. If fails, try JavaScript rendering
3. If fails, try Wayback Machine
4. Extract content and metadata
5. Store raw content for analysis
Success Rate Target: ≥ 80% dei risultati processati
Passo 5: Estrazione e Cleaning Contenuto¶
Per ogni pagina scaricata con successo:
1. Remove scripts, styles, ads
2. Extract main content using trafilatura
3. Clean whitespace and normalize text
4. Extract metadata (author, date, title)
5. Identify and preserve key sections
6. Store extraction confidence score
Output: Contenuto pulito + metadati
Passo 6: Valutazione della Rilevanza¶
LLM valuta ogni risultato rispetto alla query originale:
Prompt:
Query: [ORIGINAL_QUERY]
Content: [EXTRACTED_CONTENT - first 1000 tokens]
Aspects sought: [ASPECT_LIST]
Score this content on relevance 0-100:
- Does it address the main query? (0-30 points)
- Does it cover important aspects? (0-40 points)
- Is information recent and authoritative? (0-30 points)
Provide score and brief reasoning.
Output:
{
"relevance_score": 82,
"relevance_reasoning": "Addresses 4/6 aspects, recent, good authority",
"aspects_covered": ["performance", "community", "scalability"],
"missing_aspects": ["deployment", "learning curve"]
}
Score Interpretation: - 0-40: Irrelevant or tangential - 40-60: Somewhat relevant, missing key aspects - 60-80: Good relevance, most aspects covered - 80-100: Highly relevant, comprehensive
Passo 7: Valutazione della Copertura¶
Aggregando i relevance scores, calcola Coverage Score:
Formula:
coverage_score = (
(aspects_covered_count / total_aspects_count) * 50 +
(avg_relevance_score / 100) * 50
)
Esempio:
Total aspects: 6
Aspects covered: 4 (67%)
Average relevance: 78
coverage_score = (4/6 * 50) + (78/100 * 50)
= 33.3 + 39
= 72.3
Passo 8: Decisione Raffinamento o Convergenza¶
Se coverage_score >= 80: - Ricerca ha raggiunto qualità target - Procedi a aggregazione finale - Convergenza raggiunta
Se coverage_score < 80 AND iterations < max_iterations: - Identifica aspetti mancanti - Genera query raffinata - Continua prossima iterazione
Se iterations >= max_iterations: - Termina anche se coverage < 80 - Ritorna risultati attuali
Passo 9: Generazione Query Raffinata¶
Prompt LLM:
Original Query: [QUERY]
Original Aspects: [ORIGINAL_ASPECTS]
Aspects Covered So Far: [COVERED_ASPECTS]
Aspects Still Missing: [MISSING_ASPECTS]
Previous Queries Used: [PREVIOUS_QUERIES]
Generate a NEW search query that will find content
addressing the missing aspects, without duplicating
previous queries. Make it natural language, not keyword spam.
Return ONLY the query string.
Esempio di Raffinamento:
Iteration 1 Query: "best Python web frameworks 2026"
Covered: performance, community, popularity
Missing: deployment, enterprise adoption, learning curve
Iteration 2 Query (Generated):
"Python web framework deployment enterprise adoption 2026"
Iteration 3 Query (Generated):
"learning FastAPI Django curve beginners comparison"
Criteri di Convergenza¶
La ricerca converge quando tutte queste condizioni sono vere:
- Coverage >= 80%: Almeno 80% degli aspetti principali coperti
- Relevance >= 75%: Media relevance score >= 75
- Stabilità: Due iterazioni consecutive producono coverage simile (<5% differenza)
- Tempo ragionevole: < 3 minuti totali di ricerca
- Diversità Fonti: >= 5 domini differenti rappresentati
Se non raggiunta con max_iterations, termina e ritorna best result ottenuto.
Formula del Quality Score¶
Metrica composita che combina multiple dimensioni:
quality_score = (
coverage_score * 0.35 +
avg_relevance_score * 0.25 +
source_diversity_score * 0.15 +
recency_score * 0.15 +
authority_score * 0.10
)
Componenti¶
Coverage Score (0-100): - Percentuale di aspetti identificati e coperti - Più aspetti = risultati più completi
Relevance Score (0-100): - Media dei relevance score dei top risultati - Determinato da LLM
Source Diversity Score (0-100): - Numero di domini distinti / benchmark - Penalizza ripetizioni da stesso dominio
Recency Score (0-100): - Basato su data di pubblicazione risultati - 2026 = 100, 2025 = 85, 2024 = 70, pre-2024 = 50
Authority Score (0-100): - Valutazione di affidabilità del dominio - .edu/.gov = 90+, noto media = 75-85, unknown = 50
Interpretazione Quality Score Finale¶
- 0-50: Qualità bassa, risultati incompleti o non rilevanti
- 50-70: Qualità media, risultati accettabili ma gaps presenti
- 70-85: Buona qualità, risultati soddisfacenti per uso generale
- 85-95: Alta qualità, risultati completi e affidabili
- 95-100: Qualità eccellente, copertura esaustiva
Diagramma di Flusso Algoritmo¶
flowchart TD
A[Start: Input Query] --> B[Parse Query & Extract Concepts]
B --> C[Generate Search Strategy with LLM]
C --> D[Initialize iteration = 1]
D --> E[Execute DuckDuckGo Search]
E --> F[Scrape Top 10 Results<br/>Multi-Strategy]
F --> G[Extract Content & Clean]
G --> H[LLM: Score Relevance<br/>for each result]
H --> I[Calculate Coverage Score]
I --> J{Coverage >= 80%<br/>AND Stable?}
J -->|Yes| K[Proceed to Aggregation]
J -->|No| L{Iterations<br/>< Max?}
L -->|No| K
L -->|Yes| M[LLM: Identify Missing Aspects]
M --> N[Generate Refined Query]
N --> O[iteration += 1]
O --> E
K --> P[Aggregate & De-duplicate Results]
P --> Q[Consolidate by Aspect]
Q --> R[Calculate Final Quality Score]
R --> S[Format Citations & Prepare Output]
S --> T[End: Return Results]
style A fill:#e3f2fd
style T fill:#c8e6c9
style K fill:#fff9c4
style J fill:#ffe0b2
Ejemplo de Ejecución Completa¶
Query Inicial¶
Iteración 1¶
Search Term: "best Python web frameworks 2026"
Results Found: 12
Coverage Score: 72% (missing: deployment, learning curve)
Relevant Results: 8/10
Decision: Refine and continue
Iteración 2¶
Search Term: "Python Django FastAPI Flask deployment 2026"
Results Found: 10
New Coverage: 85% (now includes deployment)
Relevant Results: 9/10
Decision: Converged - stop
Final Quality Score¶
Coverage: 85 * 0.35 = 29.75
Relevance: 82 * 0.25 = 20.5
Diversity: 88 * 0.15 = 13.2
Recency: 90 * 0.15 = 13.5
Authority: 80 * 0.10 = 8.0
Total: 85.0 / 100 (Alta Qualità)
Ottimizzazioni e Euristiche¶
Early Termination: Se dopo 1 iterazione coverage > 90%, termina Caching: Cache risultati per query identiche per 24 ore Rate Limiting: Max 2 richieste/secondo per rispettare robots.txt Timeout: Max 30 secondi per singolo URL Circuit Breaker: Se dominio fallisce 3 volte, blacklist per 5 minuti
Versione: 1.0 Ultimo aggiornamento: 2026-02-28