AI-agenter · leksjon

Mønsteret for dyp research

Spørr → les → trekk ut → syntetiser → spør på nytt: research på tvers av flere trinn.

Leksjon 3 av 413 trinn

Mønsteret for dyp research er en gratis leksjon i AI-agenter på CoddyKit. Dette er leksjon 3 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i AI-agenter, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i AI-agenter inneholder totalt 4 leksjoner.

Hva er den dype research-løkken?

En dyp research-løkke er et agentmønster der agenten søker gjentatte ganger, leser, identifiserer kunnskapshull og søker på nytt til den har samlet inn nok informasjon til å skrive et omfattende svar.

I motsetning til et enkelt søk etterligner dette mønsteret arbeidsmåten til en menneskelig forsker: utforsk → lær → oppdag det ukjente → gå i dybden.

Oversikt over løkkearkitekturen

Den dype research-løkken har fem faser som gjentas:

  1. Innledende spørring – søk med brukerens opprinnelige spørsmål
  2. Les de beste resultatene – trekk ut viktige fakta fra de tre beste kildene
  3. Identifiser kunnskapshull – hvilke viktige spørsmål er fortsatt ubesvart?
  4. Oppfølgingsspørringer – generer målrettede søk etter kunnskapshullene
  5. Sammenstill – kombiner alle innsamlede fakta til et endelig 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)

Fase 1: Innledende søk

Det første søket bruker brukerens opprinnelige spørsmål. Hent 3–5 resultater, og trekk ut råtekstinnholdet. Denne fasen handler om bredde – å få en oversikt over temaet.

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

Fase 2: Uttrekking av viktige fakta

Send de rå søkeresultatene til LLM-en, og be den trekke ut spesifikke, etterprøvbare fakta som er relevante for forskningsspørsmålet. Faktaene bør være atomære – én påstand 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)

Fase 3: Identifisering av kunnskapshull

Etter hver søkeiterasjon spør De LLM-en: Gitt det vi vet så langt, hvilke viktige aspekter ved det opprinnelige spørsmålet er fortsatt ikke dekket?

Disse kunnskapshullene blir neste runde med søkespørringer.

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)

Fase 4: Generering av oppfølgingsspørringer

Gjør kunnskapshull om til effektive søkespørringer. Et kunnskapshull som «Vi kjenner ikke prismodellen», blir til en målrettet spørring 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

Uten tydelige avslutningskriterier kjører løkken for alltid. Stopp når: (1) ingen kunnskapshull er identifisert, (2) maksimalt antall iterasjoner er nådd, (3) tokenbudsjettet er brukt opp, eller (4) nye fakta ligner for mye på eksisterende fakta (avtakende utbytte).

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))

Fase 5: Sammenstilling av det endelige svaret

Etter at løkken avsluttes, sender De alle innsamlede fakta til LLM-en for sammenstilling. LLM-ens oppgave er å organisere faktaene til et helhetlig, godt strukturert svar med kildehenvisninger.

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
    ))

Kildesporing gjennom iterasjoner

I en løkke med flere iterasjoner samler De fakta fra mange ulike kilder. Spor hvilken kilde hvert faktum kommer fra, slik at det endelige svaret kan henvise nøyaktig til dem.

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økeutførelse

Når De har flere oppfølgingsspørringer, kan De kjøre dem parallelt ved hjelp av asyncio for å redusere den totale research-tiden. Dette kan redusere en løkke med tre iterasjoner fra 30 sekunder til 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))

Fjerning av duplikater blant fakta

Ulike kilder uttrykker ofte det samme faktumet med forskjellige ord. Før sammenstillingen bør De fjerne duplikater blant faktaene ved hjelp av embedding-likhet for å unngå at den samme informasjonen gjentas flere ganger i det endelige 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

Kunnskapstest

Hva er den riktige avslutningsbetingelsen for en dyp research-løkke når det ikke finnes noen kunnskapshull?

Oppsummering: Mønsteret dyp research-løkke

Mønsteret for en dyp research-løkke er: søk → trekk ut fakta → finn kunnskapshull → generer oppfølgingsspørringer → gjenta → sammenstill. Dette gjenspeiler arbeidsmåten til en menneskelig forsker.

Viktige designvalg er avslutningskriterier (maksimalt antall iterasjoner, ingen kunnskapshull, avtakende utbytte), kildesporing for kildehenvisninger, parallelt søk for høyere hastighet og fjerning av duplikater blant fakta før sammenstilling. Begrens løkken til 3–4 iterasjoner for å balansere dybde mot kostnad og forsinkelse.

Gratis å komme i gang

Lær deg AI-agenter med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
60
Leksjoner
239

Ofte stilte spørsmål

Er leksjonen «Mønsteret for dyp research» gratis?

Ja – hele teksten i «Mønsteret for dyp research» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av AI-agenter-kurset, kan du oppgradere til CoddyKit PRO. Kurset i AI-agenter inneholder totalt 4 leksjoner.

Hva lærer jeg i «Mønsteret for dyp research»?

Spørr → les → trekk ut → syntetiser → spør på nytt: research på tvers av flere trinn. Du øver på AI-agenter med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med AI-agenter?

Ingen tidligere erfaring er nødvendig. AI-agenter på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.

Hvor lang tid tar leksjonen «Mønsteret for dyp research»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne AI-agenter-leksjonen?

Ja. Alle AI-agenter-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Tavily og SerpAPI for agentsøk
  2. Rangere og filtrere søkeresultater
  3. Mønsteret for dyp research
  4. Kombinere nettsøk med RAG
← Tilbake til AI-agenter