El problema
Las canalizaciones RAG se recuperan de almacenes de vectores estáticos que se indexaron hace días o semanas. Cuando los usuarios preguntan sobre eventos recientes, cambios de precios o nuevos lanzamientos, el recuperador devuelve fragmentos obsoletos o irrelevantes. La búsqueda vectorial pura omite información que se publicó después de la última creación del índice.
La solucion de Scavio
Agregue un paso de búsqueda web en vivo que se ejecute junto con la recuperación de vectores. Cuando la confianza de la tienda de vectores es baja o la consulta contiene señales urgentes (precios, último, 2026), recurra a Scavio para buscar datos nuevos. Combine ambos conjuntos de resultados antes de pasar al LLM.
Antes
El oleoducto RAG devuelve fragmentos de un índice de dos semanas de antigüedad sobre un producto cuyo precio cambió ayer. LLM genera una respuesta con precios incorrectos.
Después
La canalización híbrida detecta consultas urgentes, obtiene precios en vivo a través de la API de búsqueda, se fusiona con resultados vectoriales y LLM genera una respuesta precisa con citas.
Para quien es
Ingenieros de inteligencia artificial que crean canales RAG que necesitan manejar consultas urgentes sin reconstruir todo el índice vectorial.
Beneficios clave
- Recurrir a la búsqueda en vivo cuando la confianza del vector es baja
- La detección de consultas urgentes activa la búsqueda web
- Fusionar resultados vectoriales y web para un contexto integral
- Costo: $0,005 por respaldo de búsqueda web
- Funciona con cualquier tienda de vectores (Pinecone, Weaviate, Chroma)
Ejemplo en 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)")Ejemplo en 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');Plataformas utilizadas
Búsqueda web con grafo de conocimiento, PAA y resúmenes de IA