Ancrer un LLM local avec des actualités en temps réel en détectant quand une requête utilisateur concerne des événements récents, en recherchant les actualités récentes via l'API de recherche, et en injectant les résultats dans la fenêtre de contexte du modèle avant la génération. Les LLM locaux comme Llama et Mistral ont des coupures de connaissance statiques et ne peuvent pas répondre aux questions sur des événements récents. L'ancrage aux actualités résout ce problème en fournissant des informations actuelles au moment de l'inférence, sans fine-tuning ni réentraînement. L'appel de recherche ajoute une latence minimale et empêche les histoires d'actualités hallucinées que les LLM locaux génèrent lorsqu'on leur demande des événements dont ils n'ont pas de données.
Prérequis
- Python 3.8+ installé
- bibliothèque requests installée
- Une clé API Scavio depuis scavio.dev
- Un LLM local en fonctionnement (via Ollama, llama.cpp, ou similaire)
Parcours
Étape 1: Détecter les requêtes dignes d'actualité
Construire un classifieur qui identifie les requêtes nécessitant des données d'actualité récentes.
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')) # TrueÉtape 2: Rechercher les actualités récentes
Interroger l'API de recherche pour obtenir des articles d'actualité récents liés à la question de l'utilisateur.
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]}")Étape 3: Formater le contexte pour le LLM
Structurer les résultats d'actualité en un bloc de contexte qui s'intègre naturellement dans le prompt du 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])Étape 4: Injecter dans le prompt du LLM
Construire le prompt complet avec le contexte d'actualité injecté avant la requête utilisateur.
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')Étape 5: Tester la qualité de l'ancrage
Vérifier que le pipeline d'ancrage produit un contexte pertinent et actuel pour les requêtes d'actualité.
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()Exemple 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'))Exemple 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);Sortie attendue
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.