Le problème
Les pipelines RAG récupèrent à partir de bases vectorielles statiques indexées il y a des jours ou des semaines. Lorsque les utilisateurs posent des questions sur des événements récents, des changements de prix ou de nouvelles versions, le récupérateur renvoie des chunks obsolètes ou non pertinents. La recherche vectorielle pure manque les informations publiées après la dernière construction de l'index.
La solution Scavio
Ajoutez une étape de recherche web en direct qui s'exécute en parallèle de la récupération vectorielle. Lorsque la confiance de la base vectorielle est faible ou que la requête contient des signaux temporels (prix, dernier, 2026), basculez vers la recherche Scavio pour des données fraîches. Fusionnez les deux ensembles de résultats avant de les passer au LLM.
Avant
Le pipeline RAG renvoie des chunks d'un index vieux de 2 semaines concernant un produit dont le prix a changé hier. Le LLM génère une réponse avec un prix erroné.
Après
Le pipeline hybride détecte les requêtes sensibles au temps, récupère les prix en direct via l'API de recherche, fusionne avec les résultats vectoriels, et le LLM génère une réponse précise avec citation.
À qui cela s'adresse
Ingénieurs IA construisant des pipelines RAG qui doivent gérer des requêtes sensibles au temps sans reconstruire l'intégralité de l'index vectoriel.
Avantages clés
- Basculement vers la recherche en direct lorsque la confiance vectorielle est faible
- La détection de requête sensible au temps déclenche la recherche web
- Fusionner les résultats vectoriels et web pour un contexte complet
- Coût : 0,005 $ par basculement vers la recherche web
- Fonctionne avec n'importe quelle base vectorielle (Pinecone, Weaviate, Chroma)
Exemple Python
import requests, os
API_KEY = os.environ["SCAVIO_API_KEY"]
TIME_SIGNALS = ["latest", "2026", "pricing", "current", "new release", "update"]
def needs_web_search(query: str, vector_score: float) -> bool:
"""Detect if query needs live web data."""
if vector_score < 0.75:
return True
return any(signal in query.lower() for signal in TIME_SIGNALS)
def web_search_fallback(query: str) -> list:
resp = requests.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY, "Content-Type": "application/json"},
json={"query": query, "country_code": "us"},
timeout=10,
)
data = resp.json()
return [
{"text": r.get("snippet", ""), "url": r.get("link", ""), "source": "web"}
for r in data.get("organic_results", [])[:5]
]
def hybrid_retrieve(query: str, vector_results: list, vector_score: float) -> list:
"""Merge vector and web results for hybrid RAG."""
results = [{"text": r["text"], "source": "vector"} for r in vector_results]
if needs_web_search(query, vector_score):
results.extend(web_search_fallback(query))
return results
# Example usage
chunks = hybrid_retrieve("latest stripe pricing 2026", vector_results=[], vector_score=0.4)
print(f"Retrieved {len(chunks)} chunks ({sum(1 for c in chunks if c['source']=='web')} from web)")Exemple JavaScript
const H = {'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json'};
const TIME_SIGNALS = ['latest','2026','pricing','current','new release'];
async function webFallback(query) {
const r = await fetch('https://api.scavio.dev/api/v1/search', {method:'POST', headers:H, body:JSON.stringify({query, country_code:'us'})});
const d = await r.json();
return (d.organic_results||[]).slice(0,5).map(r=>({text:r.snippet, url:r.link, source:'web'}));
}
async function hybridRetrieve(query, vectorResults, vectorScore) {
const results = vectorResults.map(r=>({...r, source:'vector'}));
if (vectorScore < 0.75 || TIME_SIGNALS.some(s=>query.toLowerCase().includes(s))) results.push(...await webFallback(query));
return results;
}
const chunks = await hybridRetrieve('latest stripe pricing 2026', [], 0.4);
console.log(chunks.length + ' chunks retrieved');Plateformes utilisées
Recherche web avec graphe de connaissances, PAA et aperçus IA