> ## Documentation Index
> Fetch the complete documentation index at: https://novita.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Réponses ancrées dans le Web

Un modèle seul ne peut pas répondre à des questions sur des événements postérieurs à la limite de son entraînement, ni citer une source. La solution est l’*ancrage* : récupérer du contenu Web pertinent au moment de la requête et le transmettre au modèle comme contexte. Ce guide présente le modèle à suivre avec Novita [AI Search](/docs/fr/guides/ai-search-quickstart) pour la récupération et l’[API LLM](/docs/fr/guides/llm-api) pour la synthèse — le tout derrière une seule clé API.

## Qu’est-ce que le RAG ?

La génération augmentée par récupération (RAG) est le schéma derrière chaque réponse ancrée ici : au lieu de s’appuyer sur ce que le modèle a mémorisé pendant l’entraînement, vous *récupérez* des documents pertinents au moment de la requête et vous *augmentez* le prompt avec ceux-ci, afin que le modèle *génère* sa réponse à partir de ce contexte récent et vérifiable.

Cette étape de récupération est exactement ce que fournit AI Search. Le web devient votre base de connaissances, et vous n’avez pas besoin de créer ni de maintenir une base de données vectorielle pour commencer — un appel de recherche renvoie les passages, et le LLM fait le reste. Lorsque vous voudrez plus tard effectuer une récupération sur vos *propres* documents privés, la même structure en trois étapes s’appliquera ; vous remplacez simplement la recherche web par un vector store.

Le RAG vous apporte trois choses qu’un modèle seul ne peut pas offrir :

* **Fraîcheur** — les réponses reflètent du contenu publié après la date limite d’entraînement du modèle.
* **Attribution** — chaque affirmation peut renvoyer à une URL source que l’utilisateur peut vérifier.
* **Hallucinations réduites** — ancrer le modèle dans du texte récupéré l’empêche d’inventer des faits.

## Comment fonctionne l’ancrage

Un tour RAG unique suit trois étapes :

1. **Rechercher** (récupérer) sur le web des pages pertinentes pour la question.
2. **Extraire** (augmenter) le contenu dont vous avez besoin — extraits ou texte complet de page — dans le prompt.
3. **Synthétiser** (générer) une réponse en transmettant ce contenu à un LLM, en lui demandant de citer ses sources.

Vous pouvez le faire avec deux appels (recherche + LLM), voire un seul, puisque Exa comme Tavily peuvent synthétiser une réponse pour vous. Choisissez en fonction du niveau de contrôle dont vous avez besoin sur la formulation finale et les citations.

## Laisser le fournisseur écrire la réponse

Le chemin le plus rapide. Search de Tavily renvoie une réponse générée par un LLM lorsque vous définissez `include_answer`, et Exa propose une [Answer](/docs/fr/api-reference/model-apis-exa-answer) point de terminaison. Un appel, aucune orchestration.

<CodeGroup>
  ```bash Tavily theme={"system"}
  curl -X POST 'https://api.novita.ai/v3/tavily/search' \
    -H "Authorization: Bearer ${NOVITA_API_KEY}" \
    -H 'Content-Type: application/json' \
    -d '{
      "query": "What changed in the latest Python release?",
      "include_answer": "advanced",
      "max_results": 5
    }'
  ```

  ```bash Exa theme={"system"}
  curl -X POST 'https://api.novita.ai/v3/exa/answer' \
    -H "Authorization: Bearer ${NOVITA_API_KEY}" \
    -H 'Content-Type: application/json' \
    -d '{
      "query": "What changed in the latest Python release?",
      "text": true
    }'
  ```
</CodeGroup>

Utilisez ceci lorsque vous voulez une bonne réponse avec un minimum de code. Optez pour l’approche récupérer-puis-synthétiser ci-dessous lorsque vous avez besoin de contrôler le modèle, le ton, le format de sortie ou la façon dont les citations sont présentées.

## Récupérer, puis synthétiser avec un LLM

Cela vous donne un contrôle total. Recherchez des sources, puis transmettez les résultats à l’[LLM API](/docs/fr/guides/llm-api) avec des instructions pour répondre en utilisant uniquement ce contexte et pour citer chaque affirmation.

```python theme={"system"}
import os
import requests
from openai import OpenAI

NOVITA_KEY = os.environ["NOVITA_API_KEY"]
QUESTION = "What changed in the latest Python release?"

# 1. Retrieve relevant web content.
search = requests.post(
    "https://api.novita.ai/v3/tavily/search",
    headers={"Authorization": f"Bearer {NOVITA_KEY}"},
    json={
        "query": QUESTION,
        "max_results": 5,
        "include_raw_content": "text",
    },
).json()

# 2. Build a compact, numbered context block the model can cite.
sources = []
for i, r in enumerate(search["results"], start=1):
    body = (r.get("raw_content") or r.get("content") or "")[:1500]
    sources.append(f"[{i}] {r['title']} ({r['url']})\n{body}")
context = "\n\n".join(sources)

# 3. Synthesize a grounded, cited answer.
client = OpenAI(base_url="https://api.novita.ai/openai", api_key=NOVITA_KEY)
completion = client.chat.completions.create(
    model="deepseek/deepseek-v4-flash",
    messages=[
        {
            "role": "system",
            "content": (
                "Answer using ONLY the provided sources. "
                "Cite claims with [n] referring to the source number. "
                "If the sources don't contain the answer, say so."
            ),
        },
        {"role": "user", "content": f"Question: {QUESTION}\n\nSources:\n{context}"},
    ],
)
print(completion.choices[0].message.content)
```

Le même flux fonctionne avec Exa Search — remplacez la route par `/v3/exa/search` et lire `text` de chaque résultat au lieu de `raw_content`.

## Ajuster la qualité de la récupération

La qualité d’une réponse ancrée dépend bien davantage de *ce que vous récupérez* que du modèle. Quelques leviers à fort impact :

* **Fraîcheur.** Pour les questions sensibles au temps, contraignez par date. Tavily expose `time_range` et `start_date`/`end_date`; Exa expose `startPublishedDate`/`endPublishedDate`. Cela évite que des pages obsolètes se retrouvent dans le contexte.
* **Fiabilité des sources.** Utilisez `include_domains`/`excludeDomains` pour restreindre la récupération aux sources auxquelles vous faites confiance (documentation officielle, éditeurs réputés) et exclure les sites de faible qualité.
* **Indices de sujet.** Tavily `topic` (`news`, `finance`, `general`) et d'Exa `category` orientez le moteur vers le bon type de résultat.
* **Dimensionnement approprié du contexte.** Limitez le texte extrait (Tavily `chunks_per_source`, Exa `maxCharacters`) afin de transmettre suffisamment de signal sans faire exploser la fenêtre de contexte du modèle ni votre budget de tokens.

## Search vs. extract vs. crawl

Choisissez la primitive de récupération qui correspond à votre besoin :

* **Search** — vous avez une question et devez *découvrir* des pages pertinentes. Le point de départ par défaut.
* **Extract / Contents** — vous connaissez déjà les URLs et souhaitez en obtenir un texte propre. Idéal pour s’ancrer sur un ensemble fixe de documents. Voir [Tavily Extract](/docs/fr/api-reference/model-apis-tavily-extract) et [Exa Contents](/docs/fr/api-reference/model-apis-exa-contents).
* **Crawl / Map** — vous voulez ingérer un site ou une section entière, en suivant les liens. Idéal pour constituer une base de connaissances hors ligne. Voir [Tavily Crawl](/docs/fr/api-reference/model-apis-tavily-crawl) et [Tavily Map](/docs/fr/api-reference/model-apis-tavily-map).

<Tip>
  Pour un agent plus complet qui effectue des recherches de manière itérative et raisonne sur de nombreuses sources, consultez l’[intégration DeepSearcher](/docs/fr/guides/deepsearcher).
</Tip>

## Mise en production

* **Gérez les résultats vides.** Si la recherche ne renvoie rien de pertinent, faites dire au modèle qu’il ne peut pas répondre plutôt que d’en inventer une. Le prompt système ci-dessus le fait.
* **Mettez en cache lorsque vous le pouvez.** Des requêtes identiques renvoient des résultats similaires ; la mise en cache de la récupération réduit les coûts et la latence.
* **Tenez compte des limites de débit.** Les appels de récupération et les appels LLM sont limités séparément — une requête de recherche n’entame pas votre quota LLM. Appliquez un backoff en cas de `429` pour l’un ou l’autre. Consultez [les limites de débit des LLM](/docs/fr/guides/llm-rate-limits) pour le côté LLM.
* **Gardez les clés côté serveur.** Votre clé Novita authentifie chaque appel ici — ne l’intégrez jamais dans du code côté client.
