Mönstret Deep Research Loop
Fråga → läs → extrahera → syntetisera → fråga igen: forskning i flera steg.
Mönstret Deep Research Loop är en gratis lektion i AI-agenter på CoddyKit. Detta är lektion 3 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för AI-agenter, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i AI-agenter innehåller totalt 4 lektioner.
Vad är loopen för djupgående research
En loop för djupgående research är ett agentmönster där agenten iterativt söker, läser, identifierar kunskapsluckor och söker igen tills den har samlat in tillräckligt med information för att skriva ett heltäckande svar.
Till skillnad från en enstaka sökning efterliknar detta mönster hur en mänsklig researcher arbetar: utforska → lär → upptäck det okända → fördjupa dig.
Översikt över looparkitekturen
Loopen för djupgående research består av fem faser som upprepas:
- Inledande sökfråga – sök med användarens ursprungliga fråga
- Läs de främsta resultaten – extrahera nyckelfakta från de 3 bästa källorna
- Identifiera luckor – vilka viktiga frågor är fortfarande obesvarade?
- Uppföljande sökfrågor – generera riktade sökningar för luckorna
- Sammanställ – kombinera alla insamlade fakta till ett slutligt svar
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)Fas 1: Inledande sökning
Den första sökningen använder användarens ursprungliga fråga. Hämta 3–5 resultat och extrahera råtextens innehåll. Den här fasen handlar om bredd – att få en överblick över ämnesområdet.
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 answerFas 2: Extrahering av nyckelfakta
Skicka de obearbetade sökresultaten till LLM:et och be det extrahera specifika, verifierbara fakta som är relevanta för forskningsfrågan. Fakta ska vara atomära – ett påstående per punkt.
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)Fas 3: Identifiering av kunskapsluckor
Efter varje sökomgång frågar ni LLM:et: med tanke på vad vi vet hittills, vilka viktiga aspekter av den ursprungliga frågan har fortfarande inte behandlats?
Dessa luckor blir nästa omgångs sökfrågor.
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)Fas 4: Generering av uppföljande sökfrågor
Omvandla kunskapsluckor till effektiva sökfrågor. En lucka som "Vi känner inte till prismodellen" blir en riktad sökfråga som "GPT-4 API-pris 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 iterationAvslutningskriterier
Utan tydliga avslutningskriterier körs loopen för evigt. Avsluta när: (1) inga luckor har identifierats, (2) det maximala antalet iterationer har nåtts, (3) tokenbudgeten är slut eller (4) nya fakta liknar befintliga fakta för mycket (avtagande nytta).
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))
Fas 5: Sammanställning av det slutliga svaret
När loopen avslutas skickar ni alla insamlade fakta till LLM:et för sammanställning. LLM:ets uppgift är att organisera fakta till ett sammanhängande, välstrukturerat svar med källhänvisningar.
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
))Källspårning mellan iterationer
I en loop med flera iterationer samlar ni in fakta från många olika källor. Spåra vilken källa varje faktauppgift kommer från så att det slutliga svaret kan hänvisa till dem korrekt.
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)Parallell sökning
När ni har flera uppföljande sökfrågor kan ni köra dem parallellt med asyncio för att minska den totala researchtiden. Det kan halvera en loop med 3 iterationer, från 30 sekunder till 15 sekunder.
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))Deduplikering av fakta
Olika källor uttrycker ofta samma fakta med olika ord. Före sammanställningen deduplicerar ni fakta med hjälp av likhet mellan embeddings för att undvika att samma information upprepas flera gånger i det slutliga svaret.
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_factsKunskapskontroll
Vilket är det korrekta avslutningsvillkoret för en loop för djupgående research när inga kunskapsluckor hittas?
Sammanfattning: Mönstret för djupgående research-loopar
Mönstret för en loop för djupgående research: sök → extrahera fakta → hitta luckor → generera uppföljande sökfrågor → upprepa → sammanställ. Det efterliknar hur en mänsklig researcher arbetar.
Viktiga designbeslut är avslutningskriterier (maximalt antal iterationer, inga luckor, avtagande nytta), källspårning för källhänvisningar, parallella sökningar för högre hastighet och deduplicering av fakta före sammanställningen. Begränsa loopen till 3–4 iterationer för att balansera djup mot kostnad och fördröjning.
Lär dig AI-agenter med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 60
- Lektioner
- 239
Vanliga frågor
Är lektionen ”Mönstret Deep Research Loop” gratis?
Ja – hela texten till ”Mönstret Deep Research Loop” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i AI-agenter, kan Ni uppgradera till CoddyKit PRO. Kursen i AI-agenter innehåller totalt 4 lektioner.
Vad lär jag mig i ”Mönstret Deep Research Loop”?
Fråga → läs → extrahera → syntetisera → fråga igen: forskning i flera steg. Ni övar på AI-agenter med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig AI-agenter?
Du behöver inga förkunskaper. Utbildningen i AI-agenter på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 3 av 4.
Hur lång tid tar lektionen ”Mönstret Deep Research Loop”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här AI-agenter-lektionen?
Ja. Varje AI-agenter-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Tavily och SerpAPI för agentsökning
- Rangordna och filtrera sökresultat
- Mönstret Deep Research Loop
- Kombinera webbsökning med RAG