Muster für Deep-Research-Schleifen
Abfragen → lesen → extrahieren → zusammenführen → erneut abfragen: Multi-Hop-Recherche.
Muster für Deep-Research-Schleifen ist eine kostenlose AI Agents-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des AI Agents-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der AI Agents-Kurs umfasst insgesamt 4 Lektionen.
Was ist die Deep-Research-Schleife?
Eine Deep-Research-Schleife ist ein Agentenmuster, bei dem der Agent wiederholt sucht, Inhalte liest, Wissenslücken erkennt und erneut sucht, bis er genügend Informationen für eine umfassende Antwort gesammelt hat.
Im Gegensatz zu einer einzelnen Suche bildet dieses Muster die Arbeitsweise eines menschlichen Rechercheurs nach: erkunden → lernen → Unbekanntes entdecken → tiefer recherchieren.
Überblick über die Schleifenarchitektur
Die Deep-Research-Schleife umfasst fünf sich wiederholende Phasen:
- Erste Suchanfrage – Suche mit der ursprünglichen Frage des Benutzers
- Top-Ergebnisse lesen – zentrale Fakten aus den besten 3 Quellen extrahieren
- Lücken identifizieren – welche wichtigen Fragen sind noch unbeantwortet?
- Folgeanfragen – gezielte Suchen für die offenen Lücken generieren
- Zusammenführen – alle gesammelten Fakten zu einer abschließenden Antwort verbinden
def deep_research(question, max_iterations=3):
all_facts = []
queries_used = [question]
for iteration in range(max_iterations):
results = search_and_rank(queries_used[-1])
facts = extract_facts(results, question)
all_facts.extend(facts)
gaps = identify_knowledge_gaps(question, all_facts)
if not gaps:
print(f'Research complete after {iteration + 1} iterations')
break
follow_up = generate_follow_up_query(gaps)
queries_used.append(follow_up)
print(f'Iteration {iteration + 1}: {follow_up}')
return synthesize_answer(question, all_facts)Phase 1: Erste Suche
Die erste Suche verwendet die ursprüngliche Frage des Benutzers. Rufen Sie 3–5 Ergebnisse ab und extrahieren Sie den Rohtext. In dieser Phase geht es um Breite – Sie verschaffen sich einen Überblick über das Themengebiet.
from tavily import TavilyClient
import os
client = TavilyClient(api_key=os.getenv('TAVILY_API_KEY'))
def initial_search(question, n_results=5):
results = client.search(
query=question,
max_results=n_results,
search_depth='advanced' # deeper extraction for research tasks
)
return results.get('results', [])
# Also capture the direct answer if available
def get_direct_answer(question):
results = client.search(query=question, max_results=3)
return results.get('answer', '') # Tavily's synthesized answerPhase 2: Zentrale Fakten extrahieren
Übergeben Sie die rohen Suchergebnisse an das LLM und bitten Sie es, konkrete, überprüfbare Fakten zu extrahieren, die für die Forschungsfrage relevant sind. Fakten sollten atomar sein – ein Sachverhalt pro Eintrag.
EXTRACT_FACTS_PROMPT = '''You are a research assistant.
From the search results below, extract all factual claims relevant to the question.
Question: {question}
Search results:
{results_text}
Return a JSON list of facts:
["GPT-4 was released in March 2023",
"GPT-4 supports 128k context window",
...]
Only include verifiable facts. No opinions or summaries. JSON:'''
def extract_facts(results, question):
import json
results_text = '\n\n'.join(
f"[{i+1}] {r['title']}\n{r['content'][:600]}"
for i, r in enumerate(results)
)
response = llm_call(EXTRACT_FACTS_PROMPT.format(
question=question, results_text=results_text
))
return json.loads(response)Phase 3: Wissenslücken identifizieren
Fragen Sie das LLM nach jeder Suchiteration: Welche wichtigen Aspekte der ursprünglichen Frage sind angesichts unseres bisherigen Wissens noch nicht abgedeckt?
Diese Lücken werden zu den Suchanfragen der nächsten Runde.
GAPS_PROMPT = '''You are a research analyst.
Original research question: {question}
Facts gathered so far:
{facts}
What important aspects of the question are still NOT covered by these facts?
List 2-3 specific knowledge gaps as a JSON array of strings.
If the question is fully answered, return an empty array [].
JSON:'''
def identify_knowledge_gaps(question, facts):
import json
facts_text = '\n'.join(f'- {f}' for f in facts)
response = llm_call(GAPS_PROMPT.format(
question=question, facts=facts_text
))
return json.loads(response)Phase 4: Folgeanfragen generieren
Wandeln Sie Wissenslücken in effektive Suchanfragen um. Aus einer Lücke wie „Wir kennen das Preismodell nicht“ wird eine gezielte Suchanfrage wie „GPT-4 API pricing per token 2024“.
QUERY_GEN_PROMPT = '''Convert these knowledge gaps into specific web search queries.
Original topic: {topic}
Knowledge gaps:
{gaps}
Return a JSON array of search query strings.
Make each query specific and searchable.
JSON:'''
def generate_follow_up_queries(topic, gaps):
import json
gaps_text = '\n'.join(f'- {g}' for g in gaps)
response = llm_call(QUERY_GEN_PROMPT.format(
topic=topic, gaps=gaps_text
))
queries = json.loads(response)
return queries[:3] # max 3 follow-up queries per iterationAbbruchkriterien
Ohne klare Abbruchkriterien läuft die Schleife endlos. Beenden Sie sie, wenn: (1) keine Lücken identifiziert wurden, (2) die maximale Anzahl an Iterationen erreicht ist, (3) das Tokenbudget ausgeschöpft ist oder (4) neue Fakten den vorhandenen zu ähnlich sind (abnehmender Nutzen).
MAX_ITERATIONS = 4
MAX_FACTS = 50
MIN_NEW_FACTS_TO_CONTINUE = 3
def should_continue(gaps, all_facts, new_facts, iteration):
if iteration >= MAX_ITERATIONS:
print(f'Stopping: max iterations ({MAX_ITERATIONS}) reached')
return False
if not gaps:
print('Stopping: no knowledge gaps found')
return False
if len(all_facts) >= MAX_FACTS:
print(f'Stopping: fact budget ({MAX_FACTS}) reached')
return False
if len(new_facts) < MIN_NEW_FACTS_TO_CONTINUE:
print(f'Stopping: diminishing returns ({len(new_facts)} new facts)')
return False
return True
if __name__ == '__main__':
print('Continue?', should_continue(gaps=['gap1'], all_facts=['f'] * 10, new_facts=['f1', 'f2', 'f3'], iteration=1))
print('Continue?', should_continue(gaps=[], all_facts=['f'] * 10, new_facts=['f1'], iteration=1))
Phase 5: Abschließende Antwort zusammenführen
Übergeben Sie nach Beendigung der Schleife alle gesammelten Fakten zur Zusammenführung an das LLM. Die Aufgabe des LLM besteht darin, die Fakten zu einer schlüssigen, gut strukturierten Antwort mit Quellenangaben zu ordnen.
SYNTHESIS_PROMPT = '''You are a research writer.
Original question: {question}
Researched facts (gathered from {n_iterations} search iterations):
{facts}
Write a comprehensive, well-structured answer based on these facts.
Format with clear sections. Be specific and cite facts where relevant.
If any aspect of the question could not be fully answered, say so.
Answer:'''
def synthesize_answer(question, all_facts, n_iterations):
facts_text = '\n'.join(f'- {f}' for f in all_facts)
return llm_call(SYNTHESIS_PROMPT.format(
question=question,
facts=facts_text,
n_iterations=n_iterations
))Quellen über Iterationen hinweg verfolgen
In einer Schleife mit mehreren Iterationen sammeln Sie Fakten aus vielen verschiedenen Quellen. Verfolgen Sie, aus welcher Quelle jeder Fakt stammt, damit die abschließende Antwort die Quellen korrekt zitieren kann.
def extract_facts_with_sources(results, question):
import json
PROMPT = '''Extract facts from these search results. For each fact include the source URL.
Question: {question}
Results: {results_text}
Return JSON list:
[{{"fact": "GPT-4 supports 128k context", "source": "https://openai.com/..."}}, ...]
JSON:'''
results_text = '\n\n'.join(
f"[URL: {r['url']}]\n{r['content'][:500]}"
for r in results
)
response = llm_call(PROMPT.format(
question=question, results_text=results_text
))
return json.loads(response)Parallele Suchausführung
Wenn mehrere Folgeanfragen vorliegen, führen Sie sie mit asyncio parallel aus, um die gesamte Recherchezeit zu verkürzen. Dadurch kann sich eine Schleife mit 3 Iterationen von 30 auf 15 Sekunden verkürzen.
import asyncio
async def async_search(client, query):
# Tavily has async support
loop = asyncio.get_event_loop()
result = await loop.run_in_executor(
None,
lambda: client.search(query=query, max_results=3)
)
return result.get('results', [])
async def parallel_search(queries):
tasks = [async_search(client, q) for q in queries]
results_list = await asyncio.gather(*tasks)
# Flatten
return [r for results in results_list for r in results]
# Run in event loop
all_results = asyncio.run(parallel_search(follow_up_queries))Fakten deduplizieren
Verschiedene Quellen stellen denselben Fakt oft mit unterschiedlichen Worten dar. Deduplizieren Sie die Fakten vor dem Zusammenführen mithilfe der Embedding-Ähnlichkeit, damit dieselbe Information in der abschließenden Antwort nicht mehrfach wiederholt wird.
def deduplicate_facts(facts, similarity_threshold=0.92):
if not facts:
return facts
# Get embeddings for all facts
embeddings = [embed(f) for f in facts]
unique_indices = [0] # always keep first
for i in range(1, len(facts)):
is_duplicate = False
for j in unique_indices:
sim = cosine_similarity(embeddings[i], embeddings[j])
if sim > similarity_threshold:
is_duplicate = True
break
if not is_duplicate:
unique_indices.append(i)
unique_facts = [facts[i] for i in unique_indices]
print(f'Deduplicated: {len(facts)} -> {len(unique_facts)} facts')
return unique_factsWissenscheck
Was ist das richtige Abbruchkriterium für eine Deep-Research-Schleife, wenn keine Wissenslücken gefunden werden?
Zusammenfassung: Muster der Deep-Research-Schleife
Das Muster der Deep-Research-Schleife: suchen → Fakten extrahieren → Lücken finden → Folgeanfragen generieren → wiederholen → zusammenführen. Dies entspricht der Arbeitsweise eines menschlichen Rechercheurs.
Wichtige Designentscheidungen sind: Abbruchkriterien (maximale Iterationszahl, keine Lücken, abnehmender Nutzen), Quellenverfolgung für die Zuordnung, parallele Suche für höhere Geschwindigkeit und die Deduplizierung von Fakten vor dem Zusammenführen. Beschränken Sie die Schleife auf 3–4 Iterationen, um Detailtiefe, Kosten und Latenz auszubalancieren.
Häufig gestellte Fragen
Ist die Lektion „Muster für Deep-Research-Schleifen“ kostenlos?
Ja — der vollständige Text von „Muster für Deep-Research-Schleifen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des AI Agents-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der AI Agents-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Muster für Deep-Research-Schleifen“?
Abfragen → lesen → extrahieren → zusammenführen → erneut abfragen: Multi-Hop-Recherche. Du übst AI Agents mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um AI Agents zu starten?
Keine Vorkenntnisse erforderlich. AI Agents auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.
Wie lange dauert die Lektion „Muster für Deep-Research-Schleifen“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser AI Agents-Lektion Code schreiben und ausführen?
Ja. Jede AI Agents-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Tavily und SerpAPI für die Agentensuche
- Suchergebnisse bewerten und filtern
- Muster für Deep-Research-Schleifen
- Websuche mit RAG kombinieren