File Search vs RAG custom : quand utiliser quoi
Objectifs
- Comprendre le RAG managé d’OpenAI (File Search)
- Comparer File Search avec un pipeline RAG custom
- Choisir la bonne approche selon votre cas d’usage
File Search : le RAG managé d’OpenAI
File Search est un outil intégré à la Responses API d’OpenAI. Il gère automatiquement le chunking, l’embedding, le stockage vectoriel et la recherche. Vous n’avez qu’à uploader vos fichiers.
Créer un vector store
from openai import OpenAI
client = OpenAI()
# 1. Créer un vector store
vector_store = client.vector_stores.create(
name="documentation-produit"
)
print(f"Vector store créé : {vector_store.id}")
# 2. Uploader des fichiers
fichiers = ["guide_utilisateur.pdf", "faq.md", "changelog.txt"]
for fichier in fichiers:
with open(fichier, "rb") as f:
file_obj = client.files.create(file=f, purpose="assistants")
client.vector_stores.files.create(
vector_store_id=vector_store.id,
file_id=file_obj.id
)
print(f" Uploadé : {fichier}")
# Attendre que l'indexation soit terminée
import time
while True:
vs = client.vector_stores.retrieve(vector_store.id)
if vs.file_counts.completed == vs.file_counts.total:
break
time.sleep(2)
print("Indexation terminée")
Utiliser File Search avec la Responses API
# Requête avec File Search
response = client.responses.create(
model="gpt-5.3",
input="Quelles sont les nouvelles fonctionnalités de la v3.2 ?",
tools=[{
"type": "file_search",
"vector_store_ids": [vector_store.id]
}]
)
print(response.output_text)
# Accéder aux sources citées
for annotation in response.output:
if hasattr(annotation, "annotations"):
for ann in annotation.annotations:
if ann.type == "file_citation":
print(f" Source : fichier {ann.file_citation.file_id}")
Paramètres avancés de File Search
response = client.responses.create(
model="gpt-5.3",
input="Comment configurer le SSO ?",
tools=[{
"type": "file_search",
"vector_store_ids": [vector_store.id],
"max_num_results": 10, # Nombre de chunks à récupérer
"ranking_options": {
"ranker": "auto", # Ranker automatique
"score_threshold": 0.3 # Seuil de pertinence
}
}]
)
Comparaison détaillée
File Search : avantages
- Zéro infrastructure : pas de base vectorielle à gérer
- Chunking automatique : optimisé par OpenAI
- Mise à jour simple : ajoutez ou supprimez des fichiers
- Citations intégrées : les sources sont référencées automatiquement
- Formats supportés : PDF, DOCX, MD, TXT, HTML, JSON, etc.
File Search : limites
- Pas de contrôle sur le chunking : vous ne choisissez pas la taille des chunks
- Pas de recherche hybride : sémantique uniquement
- Pas de reranking custom : impossible d’ajouter Cohere ou un cross-encoder
- Coût : stockage vectoriel facturé en plus des appels API
- Vendor lock-in : vos données sont sur les serveurs OpenAI
- Pas de multi-modal : embeddings texte uniquement
RAG custom : avantages
- Contrôle total : chunking, embedding, recherche, reranking, prompt
- Recherche hybride : combinez sémantique et lexicale
- Multi-provider : utilisez différents modèles d’embedding et de LLM
- Données on-premise : gardez vos données chez vous
- Optimisation fine : ajustez chaque composant indépendamment
RAG custom : inconvénients
- Complexité : plus de code à écrire et maintenir
- Infrastructure : base vectorielle à gérer
- Expertise requise : chunking, evaluation, reranking
Matrice de décision
| Critère | File Search | RAG custom |
|---|---|---|
| Prototype rapide | ✅ Idéal | ⚠️ Plus lent |
| Contrôle du chunking | ❌ | ✅ |
| Recherche hybride | ❌ | ✅ |
| Données sensibles | ⚠️ Chez OpenAI | ✅ On-premise |
| Coût à grande échelle | ⚠️ Peut être élevé | ✅ Prévisible |
| Maintenance | ✅ Zéro | ⚠️ À gérer |
| Performance maximale | ⚠️ Bonne | ✅ Optimisable |
Architecture hybride : le meilleur des deux
Utilisez File Search pour le prototypage, puis migrez vers un RAG custom quand vous atteignez les limites :
class RAGHybride:
"""Commence avec File Search, bascule vers custom si nécessaire."""
def __init__(self, mode: str = "file_search"):
self.client = OpenAI()
self.mode = mode
def repondre_file_search(self, question: str, vs_id: str) -> str:
response = self.client.responses.create(
model="gpt-5.3",
input=question,
tools=[{
"type": "file_search",
"vector_store_ids": [vs_id]
}]
)
return response.output_text
def repondre_custom(self, question: str, pipeline) -> str:
resultat = pipeline.repondre(question)
return resultat["reponse"]
def repondre(self, question: str, **kwargs) -> str:
if self.mode == "file_search":
return self.repondre_file_search(
question, kwargs["vs_id"]
)
else:
return self.repondre_custom(
question, kwargs["pipeline"]
)
Guide de migration File Search vers RAG custom
- Exportez vos fichiers du vector store
- Implémentez le chunking adapté à votre contenu
- Générez les embeddings avec
text-embedding-3-large - Indexez dans une base vectorielle (Qdrant, Pinecone, etc.)
- Ajoutez le reranking et la recherche hybride
- Évaluez avec votre dataset de test
- Comparez les métriques avec File Search avant de basculer
Résumé
- File Search est idéal pour prototyper rapidement un RAG sans infrastructure
- Un pipeline RAG custom offre un contrôle total et des performances optimisables
- Commencez par File Search, migrez vers custom quand vous atteignez les limites
- Les critères de décision : contrôle, données sensibles, coût, performance