Les grands modèles de langage produisent des réponses de meilleure qualité lorsqu'ils sont ancrés dans des données web actuelles plutôt que de se fier uniquement aux données d'entraînement. Ce tutoriel construit un pipeline qui récupère les résultats Google en direct pour une question d'utilisateur, formate les meilleurs résultats en contexte, et les envoie à GPT avec des instructions pour répondre en utilisant uniquement les sources fournies. Le résultat est une réponse citée et à jour, similaire à Perplexity ou Bing Chat, construite avec moins de 50 lignes de Python.
Prérequis
- Python 3.10 ou supérieur
- pip install requests openai
- Une clé API Scavio
- Une clé API OpenAI
Parcours
Étape 1: Récupérer les résultats de recherche pour la question
Utilisez l'API Scavio pour obtenir les meilleurs résultats organiques pour la question de l'utilisateur. Ceux-ci serviront de contexte d'ancrage.
import os
import requests
API_KEY = os.environ.get("SCAVIO_API_KEY", "your_scavio_api_key")
def fetch_context(question: str, n: int = 5) -> list[dict]:
r = requests.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"query": question, "country_code": "us"}
)
r.raise_for_status()
return r.json().get("organic_results", [])[:n]Étape 2: Formater les résultats en contexte
Convertissez les résultats de recherche en un bloc de contexte numéroté que le LLM peut référencer par numéro de source.
def format_context(results: list[dict]) -> str:
lines = []
for i, r in enumerate(results, 1):
lines.append(f"[{i}] {r.get('title', '')}")
lines.append(f" URL: {r.get('link', '')}")
lines.append(f" {r.get('snippet', '')}")
return "\n".join(lines)Étape 3: Envoyer à GPT avec des instructions d'ancrage
Transmettez le contexte et la question à GPT avec une invite système qui exige de citer les sources par numéro.
from openai import OpenAI
client = OpenAI()
def ask_with_context(question: str, context: str) -> str:
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "Answer the question using ONLY the provided search results. Cite sources using [n] notation. If the results do not contain the answer, say so."},
{"role": "user", "content": f"Search results:\n{context}\n\nQuestion: {question}"}
],
temperature=0
)
return response.choices[0].message.contentÉtape 4: Exécuter le pipeline complet
Enchaînez les étapes de récupération, de formatage et de réponse pour toute question utilisateur.
def answer(question: str) -> str:
results = fetch_context(question)
context = format_context(results)
return ask_with_context(question, context)
print(answer("What are the best Python testing frameworks in 2026?"))Exemple Python
import os
import requests
from openai import OpenAI
SCAVIO_KEY = os.environ.get("SCAVIO_API_KEY", "your_scavio_api_key")
client = OpenAI()
def fetch_context(question: str) -> list[dict]:
r = requests.post("https://api.scavio.dev/api/v1/search",
headers={"x-api-key": SCAVIO_KEY},
json={"query": question, "country_code": "us"})
r.raise_for_status()
return r.json().get("organic_results", [])[:5]
def format_context(results: list[dict]) -> str:
return "\n".join(f"[{i}] {r['title']}\n {r.get('snippet', '')}\n {r['link']}" for i, r in enumerate(results, 1))
def answer(question: str) -> str:
ctx = format_context(fetch_context(question))
resp = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "Answer using ONLY the search results. Cite with [n]."},
{"role": "user", "content": f"Results:\n{ctx}\n\nQuestion: {question}"}
], temperature=0)
return resp.choices[0].message.content
if __name__ == "__main__":
print(answer("What are the best Python testing frameworks in 2026?"))Exemple JavaScript
const SCAVIO_KEY = process.env.SCAVIO_API_KEY || "your_scavio_api_key";
const { OpenAI } = require("openai");
const client = new OpenAI();
async function fetchContext(question) {
const res = await fetch("https://api.scavio.dev/api/v1/search", {
method: "POST",
headers: { "x-api-key": SCAVIO_KEY, "Content-Type": "application/json" },
body: JSON.stringify({ query: question, country_code: "us" })
});
const data = await res.json();
return (data.organic_results || []).slice(0, 5);
}
async function answer(question) {
const results = await fetchContext(question);
const ctx = results.map((r, i) => `[${i + 1}] ${r.title}\n ${r.snippet || ""}\n ${r.link}`).join("\n");
const resp = await client.chat.completions.create({
model: "gpt-4o",
messages: [
{ role: "system", content: "Answer using ONLY the search results. Cite with [n]." },
{ role: "user", content: `Results:\n${ctx}\n\nQuestion: ${question}` }
], temperature: 0
});
console.log(resp.choices[0].message.content);
}
answer("Best Python testing frameworks 2026").catch(console.error);Sortie attendue
Based on search results, the top Python testing frameworks in 2026 are:
1. **pytest** - The most popular framework with extensive plugin support [1]
2. **Hypothesis** - Property-based testing gaining rapid adoption [2]
3. **Playwright for Python** - Leading choice for end-to-end browser testing [3]
Sources:
[1] https://example.com/python-testing-2026
[2] https://example.com/hypothesis-testing
[3] https://example.com/playwright-python