Conecte un LLM local con noticias en tiempo real detectando cuándo la consulta de un usuario se relaciona con eventos actuales, buscando noticias recientes a través de la API de búsqueda e inyectando los resultados en la ventana contextual del modelo antes de la generación. Los LLM locales como Llama y Mistral tienen límites de conocimiento estáticos y no pueden responder preguntas sobre eventos recientes. La conexión a tierra de noticias resuelve esto proporcionando información actual en el momento de la inferencia, sin ajustes ni reentrenamiento. La llamada de búsqueda agrega una latencia mínima y evita las noticias alucinadas que generan los LLM locales cuando se les pregunta sobre eventos sobre los que no tienen datos.
Requisitos previos
- Python 3.8+ instalado
- solicita biblioteca instalada
- Una clave API de Scavio de scavio.dev
- Un LLM local en ejecución (a través de Ollama, llama.cpp o similar)
Guia paso a paso
Paso 1: Detectar consultas de interés periodístico
Cree un clasificador que identifique consultas que necesiten datos de noticias actuales.
import os, requests
API_KEY = os.environ['SCAVIO_API_KEY']
NEWS_SIGNALS = [
'latest', 'recent', 'today', 'this week', 'breaking',
'update', 'announcement', 'just happened', 'new release',
'election', 'earnings', 'ipo', 'acquisition', 'merger',
'what happened', 'current', 'news about',
]
TIME_ENTITIES = ['2025', '2026', 'yesterday', 'last week', 'this month']
def needs_news(query: str) -> bool:
q_lower = query.lower()
if any(signal in q_lower for signal in NEWS_SIGNALS):
return True
if any(entity in q_lower for entity in TIME_ENTITIES):
return True
if '?' in query and any(w in q_lower for w in ['who', 'what', 'when', 'where']):
return True
return False
print(needs_news('What happened with the OpenAI announcement?')) # True
print(needs_news('How do Python list comprehensions work?')) # False
print(needs_news('Latest AI agent frameworks 2026')) # TruePaso 2: Buscar noticias actuales
Consulta la API de búsqueda para artículos de noticias recientes relacionados con la pregunta del usuario.
def search_news(query: str, limit: int = 5) -> list:
resp = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'platform': 'google', 'query': f'{query} news 2026'}, timeout=15)
results = resp.json().get('organic_results', [])
news = []
for r in results[:limit]:
news.append({
'title': r.get('title', ''),
'snippet': r.get('snippet', ''),
'source': r.get('source', ''),
'url': r.get('link', ''),
})
return news
news = search_news('latest AI agent frameworks')
for n in news:
print(f" {n['source']}: {n['title'][:50]}")Paso 3: Contexto de formato para LLM
Estructura los resultados de las noticias como un bloque de contexto que encaja naturalmente en el mensaje de LLM.
def format_news_context(news: list) -> str:
if not news:
return ''
parts = ['CURRENT NEWS CONTEXT (live search results):', '']
for i, n in enumerate(news[:3], 1):
parts.append(f'{i}. {n["title"]}')
if n.get('source'):
parts.append(f' Source: {n["source"]}')
if n.get('snippet'):
parts.append(f' Summary: {n["snippet"][:200]}')
parts.append('')
parts.append('Use the above current information to answer the question accurately.')
parts.append('Cite sources when referencing specific news items.')
return '\n'.join(parts)
context = format_news_context(news)
print(context[:400])Paso 4: Inyectar en el mensaje LLM
Cree el mensaje completo con el contexto de las noticias inyectado antes de la consulta del usuario.
def grounded_prompt(query: str, system: str = 'You are a helpful assistant.') -> str:
parts = [system]
if needs_news(query):
news = search_news(query)
news_context = format_news_context(news)
if news_context:
parts.append(news_context)
parts.append(f'User: {query}')
parts.append('Assistant:')
return '\n\n'.join(parts)
# Example with news grounding:
prompt = grounded_prompt('What are the latest AI agent frameworks in 2026?')
print(f'Prompt length: {len(prompt)} chars')
print(prompt[:500])
# Example without grounding:
prompt_no_news = grounded_prompt('How do Python decorators work?')
print(f'\nNo-news prompt length: {len(prompt_no_news)} chars')Paso 5: Pruebe la calidad de la conexión a tierra
Verifique que el canal de conexión a tierra produzca un contexto relevante y actual para consultas de noticias.
def test_grounding():
test_cases = [
('Latest Python release', True),
('Python list comprehension syntax', False),
('Who won the latest tech IPO?', True),
('How to use git rebase', False),
('AI regulation news 2026', True),
]
for query, expected_news in test_cases:
detected = needs_news(query)
status = 'PASS' if detected == expected_news else 'FAIL'
print(f'[{status}] "{query}" -> needs_news={detected} (expected={expected_news})')
if detected:
news = search_news(query)
print(f' Found {len(news)} news items')
test_grounding()Ejemplo en Python
import requests, os
H = {'x-api-key': os.environ['SCAVIO_API_KEY']}
def news_context(query):
data = requests.post('https://api.scavio.dev/api/v1/search', headers=H,
json={'platform': 'google', 'query': f'{query} news 2026'}).json()
news = data.get('organic_results', [])[:3]
return '\n'.join(f"{n.get('title', '')}: {n.get('snippet', '')[:80]}" for n in news)
print(news_context('latest AI frameworks'))Ejemplo en JavaScript
const H = {'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json'};
async function newsContext(query) {
const r = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST', headers: H,
body: JSON.stringify({platform: 'google', query: `${query} news 2026`})
});
const news = (await r.json()).organic_results || [];
return news.slice(0, 3).map(n => `${n.title}: ${(n.snippet || '').slice(0, 80)}`).join('\n');
}
newsContext('latest AI frameworks').then(console.log);Salida esperada
A local LLM grounding pipeline that detects news-worthy queries, fetches current news via search API, and injects real-time context into the model prompt.