Dateisuche vs. benutzerdefiniertes RAG: Wann kommt welches zum Einsatz?
Auf dieser Seite
Lernziele
- Verständnis für das verwaltete RAG von OpenAI (Dateisuche) entwickeln
- Dateisuche mit einem benutzerdefinierten RAG-Pipeline vergleichen
- Die richtige Herangehensweise für den eigenen Anwendungsfall auswählen
Dateisuche: Das verwaltete RAG von OpenAI
Sie haben in den vorherigen Lektionen schichtweise jede Komponente einer RAG-Pipeline selbst entwickelt. Die Dateisuche übernimmt dies alles für Sie. Es handelt sich um ein in die OpenAI Responses API integriertes Werkzeug, das das Chunking, das Erstellen von Embeddings, die Vektorspeicherung und die Suche automatisch verwaltet: Sie laden Ihre Dateien hoch und stellen Abfragen. Diese Lektion ist kein Verzicht auf das zuvor Gelernte, sondern stellt eine ehrliche Frage dar, die Sie sich stellen müssen, bevor Sie den ersten Code schreiben: Welches Abstraktionsniveau ist für Ihr Projekt das richtige?
Alles beginnt mit einem Vektorspeicher, dem Container, der Ihre indizierten Dokumente beherbergt. Sie erstellen diesen Speicher, laden die Dateien einzeln hinein und warten darauf, dass die Indizierung abgeschlossen ist, bevor Sie abfragen. Dieser Warteschleife ist nicht nur kosmetischer Natur: Die Indizierung läuft asynchron ab, und eine zu früh gestartete Abfrage würde nur einen Teil des Korpus sehen.
from openai import OpenAI
client = OpenAI()
# 1. Vektorspeicher erstellen
vector_store = client.vector_stores.create(
name="product-documentation"
)
print(f"Vektorspeicher erstellt: {vector_store.id}")
# 2. Dateien hochladen
files = ["user_guide.pdf", "faq.md", "changelog.txt"]
for file in files:
with open(file, "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" Hochgeladen: {file}")
# Warten, bis die Indizierung abgeschlossen ist
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("Indizierung abgeschlossen")
Die Abfrage erfolgt dann mit einem einzigen Aufruf: Sie deklarieren das file_search-Werkzeug mit der Speicher-ID, und das Modell entscheidet selbstständig, wann Informationen abgerufen werden. Der interessante Aspekt liegt im Lesen der Annotationen, die die Verweise auf die Dateien enthalten. Dies ermöglicht es Ihnen, Quellen für den Benutzer anzuzeigen – ein Verhalten, das Sie in der benutzerdefinierten Pipeline manuell implementieren mussten.
# Abfrage mit Dateisuche
response = client.responses.create(
model="gpt-5.6-terra",
input="Was sind die neuen Funktionen in v3.2?",
tools=[{
"type": "file_search",
"vector_store_ids": [vector_store.id]
}]
)
print(response.output_text)
# Zugreifen auf zitierte Quellen
for annotation in response.output:
if hasattr(annotation, "annotations"):
for ann in annotation.annotations:
if ann.type == "file_citation":
print(f" Quelle: Datei {ann.file_citation.file_id}")
Zwei Einstellungen ermöglichen es Ihnen, das Verhalten ohne Verlassen des verwalteten Werkzeugs zu verfeinern. max_num_results legt die Anzahl der abgerufenen Chunks fest, und score_threshold filtert Ergebnisse mit niedriger Punktzahl heraus, genau wie der Relevanzschwellenwert, den Sie nach dem Reranking angewendet haben.
response = client.responses.create(
model="gpt-5.6-terra",
input="Wie konfiguriere ich SSO?",
tools=[{
"type": "file_search",
"vector_store_ids": [vector_store.id],
"max_num_results": 10, # Anzahl der abzurufenden Chunks
"ranking_options": {
"ranker": "auto", # Automatischer Rangierer
"score_threshold": 0.3 # Relevanzschwellenwert
}
}]
)
Was die Dateisuche bietet und was sie entzieht
Das entscheidende Argument für die Dateisuche ist das vollständige Fehlen von Infrastruktur: Es gibt keinen Vektordatenbank-Server zu bereitstellen, zu sichern oder zu überwachen. Das Chunking wird für Sie durchgeführt und von OpenAI optimiert; die Aktualisierung des Korpus ist so einfach wie das Hinzufügen oder Entfernen einer Datei; Zitationen werden automatisch generiert, und gängige Formate werden nativ unterstützt – PDF, DOCX, MD, TXT, HTML, JSON und weitere. Ein Team ohne Infrastrukturkenntnisse kann eine Wissensdatenbank innerhalb eines Nachmittags online haben.
Die Kehrseite dieser Bequemlichkeit ist der Verlust der Kontrolle über jeden Gliederungsschritt der Kette. Sie wählen die Chunk-Größe nicht selbst aus, sodass der Kompromiss zwischen Präzision und Kontext aus Lektion 12 Ihnen nicht mehr zur Verfügung steht. Die Suche ist rein semantisch: Es gibt keine hybride Suche, sodass Produktreferenzen und exakte Fehlercodes fragil bleiben. Zudem können Sie keinen Reranker von Cohere oder einen hausinternen Cross-Encoder einbinden. Hinzu kommen drei weitere strategische Überlegungen: Die Vektorspeicherung wird zusätzlich zu den API-Aufrufen berechnet, Ihre Daten verbleiben auf den Servern von OpenAI, und die Indizierung umfasst nur Text.
Eine benutzerdefinierte Pipeline kehrt diese Liste Punkt für Punkt um. Sie beherrschen das Chunking, das Erstellen von Embeddings, die Suche, das Reranking und das Prompting; Sie kombinieren semantische und lexikalische Suche; Sie mischen Modellanbieter oder halten alles On-Premise, falls Ihre Daten dies erfordern; und vor allem optimieren Sie jede Komponente unabhängig voneinander, indem Sie deren Wirkung messen. Diese Kontrolle kostet Code, der geschrieben und gewartet werden muss, einen Vektordatenbank-Server, den Sie verwalten müssen, und Fachwissen – Chunking, Evaluation und Reranking sind keine Improvisationen, wofür genau dieser Kurs steht.
Entscheidungsmatrix
| Kriterium | Dateisuche | Benutzerdefiniertes RAG |
|---|---|---|
| Schnelle Prototypen | ✅ Ideal | ⚠️ Langsamer |
| Kontrolle über Chunking | ❌ | ✅ |
| Hybride Suche | ❌ | ✅ |
| Sensible Daten | ⚠️ Bei OpenAI | ✅ On-Premise |
| Kosten im großen Maßstab | ⚠️ Können hoch sein | ✅ Vorhersehbar |
| Wartung | ✅ Keine | ⚠️ Zu verwalten |
| Maximale Leistung | ⚠️ Gut | ✅ Optimierbar |
Hybrid-Architektur: Das Beste aus beiden Welten
Die Entscheidung muss nicht endgültig sein, und sie sollte es auch nicht. Der kosteneffektivste Ansatz besteht darin, mit der Dateisuche zu beginnen, um zu validieren, dass Ihr Anwendungsfall tragfähig ist, und dann an dem Tag auf eine benutzerdefinierte Pipeline umzusteigen, an dem Sie eine identifizierte Grenze erreichen. Die Einkapselung beider Ansätze hinter einer einzigen respond-Methode macht diesen Wechsel für den Rest Ihrer Anwendung schmerzlos.
class HybridRAG:
"""Beginnen Sie mit Dateisuche und wechseln Sie bei Bedarf zur benutzerdefinierten Pipeline."""
def __init__(self, mode: str = "file_search"):
self.client = OpenAI()
self.mode = mode
def respond_file_search(self, question: str, vs_id: str) -> str:
response = self.client.responses.create(
model="gpt-5.6-terra",
input=question,
tools=[{
"type": "file_search",
"vector_store_ids": [vs_id]
}]
)
return response.output_text
def respond_custom(self, question: str, pipeline) -> str:
result = pipeline.respond(question)
return result["response"]
def respond(self, question: str, **kwargs) -> str:
if self.mode == "file_search":
return self.respond_file_search(
question, kwargs["vs_id"]
)
else:
return self.respond_custom(
question, kwargs["pipeline"]
)
Wenn ein Wechsel notwendig wird, folgt er einer präzisen Reihenfolge:
- Exportieren Sie Ihre Dateien aus dem Vektorspeicher
- Implementieren Sie ein Chunking, das an Ihren Inhalt angepasst ist
- Generieren Sie Embeddings mit
text-embedding-3-large - Indizieren Sie in einer Vektordatenbank (Qdrant, Pinecone usw.)
- Fügen Sie Reranking und hybride Suche hinzu
- Evaluieren Sie mit Ihrem Testdatensatz
- Vergleichen Sie die Metriken mit der Dateisuche, bevor Sie wechseln
Der letzte Schritt ist der, der am häufigsten übersprungen wird, und er ist der einzige, der alles andere rechtfertigt: Ohne einen quantitativen Vergleich könnten Sie ein solides verwaltetes System durch ein minderwertiges hausinternes ersetzen, zusätzlich zu den Wartungsaufwänden.
Zusammenfassung
- Die Dateisuche ist ideal für die schnelle Prototypisierung eines RAG-Systems ohne Infrastruktur
- Eine benutzerdefinierte RAG-Pipeline bietet vollständige Kontrolle und optimierbare Leistung
- Beginnen Sie mit der Dateisuche und wechseln Sie zur benutzerdefinierten Pipeline, wenn Sie Grenzen erreichen
- Entscheidungskriterien: Kontrolle, sensible Daten, Kosten, Leistung