Resumen
Ground contenido generado by local LLMs (Llama, Mistral, Qwen) con live search datos. Before generating, pull actual resultados de busqueda as context. After generating, verify claims contra search. Eliminate hallucination in LLM-generated contenido sin sending datos to cloud proveedores.
Desencadenador
On contenido generation solicitud (event-driven)
Programación
On contenido solicitud (event-driven)
Pasos del flujo de trabajo
Recibir contenido solicitud
Accept un topic y contenido tipo (blog publicacion, informe, analisis). Extraer el primary palabra clave y subtopics for search grounding.
Pre-generation search
Search Google via Scavio for el topic. Recopilar resultados organicos, AI Overview, y People Also Ask as grounding context for el local LLM.
Generar con grounding context
Pass el resultados de busqueda as context to el local LLM alongside el contenido solicitud. Instruct el model to cite solo informacion present in el search context.
Post-generation verification
Extraer factual claims de el generado contenido. Search for cada claim to verify precision. Marcar unverifiable claims for human resena.
Salida con citaciones
Attach fuente URLs de el resultados de busqueda as citaciones. Mark verified facts y flagged claims. Salida el final grounded contenido con un verification informe.
Implementacion en Python
import requests, os, json
H = {'x-api-key': os.environ['SCAVIO_API_KEY']}
def search_grounding(topic, subtopics=None):
"""Gather search context for LLM grounding."""
context = {}
# Main topic search
r = requests.post('https://api.scavio.dev/api/v1/search', headers=H,
json={'platform': 'google', 'query': topic, 'ai_overview': True},
timeout=10).json()
context['main'] = {
'organic': [{'title': o['title'], 'snippet': o.get('snippet', ''),
'url': o.get('link', '')} for o in r.get('organic', [])[:5]],
'ai_overview': (r.get('ai_overview', {}) or {}).get('text', ''),
'paa': [q.get('question', '') for q in r.get('people_also_ask', [])[:5]],
}
# Subtopic searches
for sub in (subtopics or []):
sr = requests.post('https://api.scavio.dev/api/v1/search', headers=H,
json={'platform': 'google', 'query': sub}, timeout=10).json()
context[sub] = [{'title': o['title'], 'snippet': o.get('snippet', '')}
for o in sr.get('organic', [])[:3]]
return context
def verify_claim(claim):
"""Verify a factual claim against search results."""
r = requests.post('https://api.scavio.dev/api/v1/search', headers=H,
json={'platform': 'google', 'query': claim}, timeout=10).json()
organic = r.get('organic', [])[:3]
snippets = ' '.join(o.get('snippet', '').lower() for o in organic)
keywords = [w.lower() for w in claim.split() if len(w) > 4]
matches = sum(1 for kw in keywords if kw in snippets)
return {
'claim': claim, 'verified': matches >= len(keywords) * 0.5,
'confidence': min(matches / max(len(keywords), 1), 1.0),
'sources': [o.get('link', '') for o in organic[:2]],
}
# Example: ground a blog post
topic = 'best local LLM models for code generation 2026'
ctx = search_grounding(topic, ['llama 3 code performance', 'mistral code generation'])
print(f"Grounding context gathered: {len(ctx['main']['organic'])} results, {len(ctx['main']['paa'])} PAA")
print(f"AI Overview: {ctx['main']['ai_overview'][:100]}")Implementacion en JavaScript
const H = {"x-api-key": process.env.SCAVIO_API_KEY, "Content-Type": "application/json"};
async function searchGrounding(topic, subtopics = []) {
const r = await fetch("https://api.scavio.dev/api/v1/search", {
method: "POST", headers: H,
body: JSON.stringify({platform: "google", query: topic, ai_overview: true})
}).then(r => r.json());
const context = {
main: {
organic: (r.organic || []).slice(0, 5).map(o => ({
title: o.title, snippet: o.snippet || "", url: o.link || ""
})),
aiOverview: ((r.ai_overview || {}).text || ""),
paa: (r.people_also_ask || []).slice(0, 5).map(q => q.question || ""),
}
};
for (const sub of subtopics) {
const sr = await fetch("https://api.scavio.dev/api/v1/search", {
method: "POST", headers: H,
body: JSON.stringify({platform: "google", query: sub})
}).then(r => r.json());
context[sub] = (sr.organic || []).slice(0, 3).map(o => ({
title: o.title, snippet: o.snippet || ""
}));
}
return context;
}
async function verifyClaim(claim) {
const r = await fetch("https://api.scavio.dev/api/v1/search", {
method: "POST", headers: H,
body: JSON.stringify({platform: "google", query: claim})
}).then(r => r.json());
const organic = (r.organic || []).slice(0, 3);
const snippets = organic.map(o => (o.snippet || "").toLowerCase()).join(" ");
const keywords = claim.split(" ").filter(w => w.length > 4).map(w => w.toLowerCase());
const matches = keywords.filter(kw => snippets.includes(kw)).length;
return {
claim, verified: matches >= keywords.length * 0.5,
confidence: Math.min(matches / Math.max(keywords.length, 1), 1),
sources: organic.slice(0, 2).map(o => o.link || ""),
};
}
(async () => {
const ctx = await searchGrounding("best local LLM models for code generation 2026",
["llama 3 code performance", "mistral code generation"]);
console.log(`Grounding: ${ctx.main.organic.length} results, ${ctx.main.paa.length} PAA`);
console.log(`AIO: ${ctx.main.aiOverview.slice(0, 100)}`);
})();Plataformas utilizadas
Búsqueda web con grafo de conocimiento, PAA y resúmenes de IA