Aller au contenu principal

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}")
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èreFile SearchRAG 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

  1. Exportez vos fichiers du vector store
  2. Implémentez le chunking adapté à votre contenu
  3. Générez les embeddings avec text-embedding-3-large
  4. Indexez dans une base vectorielle (Qdrant, Pinecone, etc.)
  5. Ajoutez le reranking et la recherche hybride
  6. Évaluez avec votre dataset de test
  7. 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