AI-agenter · Lektion

Mönstret Deep Research Loop

Fråga → läs → extrahera → syntetisera → fråga igen: forskning i flera steg.

Lektion 3 av 413 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:

  1. Inledande sökfråga – sök med användarens ursprungliga fråga
  2. Läs de främsta resultaten – extrahera nyckelfakta från de 3 bästa källorna
  3. Identifiera luckor – vilka viktiga frågor är fortfarande obesvarade?
  4. Uppföljande sökfrågor – generera riktade sökningar för luckorna
  5. 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 answer

Fas 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 iteration

Avslutningskriterier

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_facts

Kunskapskontroll

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.

Gratis att börja

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

  1. Tavily och SerpAPI för agentsökning
  2. Rangordna och filtrera sökresultat
  3. Mönstret Deep Research Loop
  4. Kombinera webbsökning med RAG
← Tillbaka till AI-agenter