Aller au contenu principal

Structured outputs et web search

Combiner structure et recherche en temps réel

Les sorties structurées ne se limitent pas aux données statiques. Sur les modèles Grok 4 et versions ultérieures, vous pouvez combiner les structured outputs avec la recherche web. Le modèle cherche des informations en temps réel sur le web, puis structure les résultats selon votre schéma.

Pourquoi cette combinaison est puissante

Sans cette fonctionnalité, obtenir des données structurées à partir du web nécessite trois étapes séparées :

  1. Appeler une API de recherche (Google, Bing, etc.)
  2. Parser les résultats bruts
  3. Envoyer les résultats au LLM pour structuration

Avec les structured outputs + web search, tout se fait en un seul appel. Le modèle cherche, synthétise et structure.

Prérequis : Grok 4 minimum

Cette fonctionnalité est exclusivement disponible sur Grok 4 et les versions ultérieures. Les modèles Grok 3 et Grok 3 Mini ne supportent pas la combinaison d’outils avec les sorties structurées.

Exemple : veille concurrentielle

from pydantic import BaseModel

class Concurrent(BaseModel):
    nom: str
    site_web: str
    produit_phare: str
    avantage_principal: str

class VeilleConcurrentielle(BaseModel):
    secteur: str
    date_analyse: str
    concurrents: list[Concurrent]
    tendances: list[str]
    opportunites: list[str]

response, parsed = client.chat.parse(
    model="grok-4.20-reasoning",
    messages=[{
        "role": "user",
        "content": "Fais une veille concurrentielle sur le marché français des néobanques en 2026"
    }],
    response_format=VeilleConcurrentielle,
    tools=[{"type": "web_search"}]
)

for c in parsed.concurrents:
    print(f"{c.nom}{c.avantage_principal}")

Le modèle va :

  1. Rechercher les néobanques françaises actuelles sur le web
  2. Collecter les informations pertinentes
  3. Structurer le tout selon le schéma VeilleConcurrentielle

Exemple : suivi d’actualité

class Article(BaseModel):
    titre: str
    source: str
    date: str
    resume: str
    impact: str

class RevuePresse(BaseModel):
    sujet: str
    articles: list[Article]
    synthese: str

response, parsed = client.chat.parse(
    model="grok-4.20-reasoning",
    messages=[{
        "role": "user",
        "content": "Quelles sont les dernières actualités sur la régulation de l'IA en Europe ?"
    }],
    response_format=RevuePresse,
    tools=[{"type": "web_search"}]
)

print(parsed.synthese)
for article in parsed.articles:
    print(f"[{article.source}] {article.titre}")

Bonnes pratiques

Soyez spécifique dans le prompt

Le web search fonctionne mieux avec des requêtes précises :

# Trop vague
"Quoi de neuf dans la tech ?"

# Précis et exploitable
"Les 5 plus grosses levées de fonds dans l'IA en France au T1 2026"

Adaptez votre schéma aux données disponibles

Ne demandez pas des données que le web ne peut pas fournir de manière fiable :

# Difficile à trouver précisément
class Entreprise(BaseModel):
    chiffre_affaires_exact: float  # rarement public

# Réaliste
class Entreprise(BaseModel):
    chiffre_affaires_estime: str  # "environ 50M EUR"
    source_estimation: str

Gérez les données manquantes

Rendez optionnels les champs qui pourraient ne pas être trouvés :

class InfoEntreprise(BaseModel):
    nom: str
    fondateur: str
    annee_creation: int
    valorisation: str | None  # pas toujours disponible
    nombre_employes: str | None

Points clés à retenir

  • La combinaison structured outputs + web search nécessite Grok 4 minimum
  • Activez la recherche web avec tools=[{"type": "web_search"}]
  • Un seul appel API remplace une chaîne recherche → parsing → structuration
  • Soyez spécifique dans vos prompts pour de meilleurs résultats
  • Rendez optionnels les champs dont la disponibilité n’est pas garantie