0Pricing
AI Agents · Aula

Padrão de ciclo de pesquisa aprofundada

Consultar → ler → extrair → sintetizar → consultar novamente: pesquisa em várias etapas.

Padrão de ciclo de pesquisa aprofundada é uma aula grátis de AI Agents no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de AI Agents, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de AI Agents inclui 4 aulas no total.

O que é o ciclo de pesquisa aprofundada

Um ciclo de pesquisa aprofundada é um padrão de agente no qual o agente pesquisa, lê, identifica lacunas de conhecimento e pesquisa novamente de forma iterativa até reunir informações suficientes para escrever uma resposta abrangente.

Ao contrário de uma única pesquisa, esse padrão imita o trabalho de um pesquisador humano: explorar → aprender → descobrir o que não se sabe → aprofundar a pesquisa.

Visão geral da arquitetura do ciclo

O ciclo de pesquisa aprofundada tem cinco fases que se repetem:

  1. Consulta inicial — pesquisar usando a pergunta original do usuário
  2. Ler os principais resultados — extrair os fatos essenciais das 3 melhores fontes
  3. Identificar lacunas — quais perguntas importantes ainda não foram respondidas?
  4. Consultas de acompanhamento — gerar pesquisas direcionadas para preencher as lacunas
  5. Sintetizar — combinar todos os fatos reunidos em uma resposta final
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: pesquisa inicial

A primeira pesquisa usa a pergunta original do usuário. Busque de 3 a 5 resultados e extraia o conteúdo textual bruto. Esta fase prioriza a abrangência — obter uma visão geral do panorama do tema.

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: extração dos fatos essenciais

Envie os resultados brutos da pesquisa ao LLM e peça que ele extraia fatos específicos e verificáveis relevantes para a pergunta de pesquisa. Os fatos devem ser atômicos — uma afirmação por item.

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: identificação das lacunas de conhecimento

Após cada iteração da pesquisa, pergunte ao LLM: considerando o que sabemos até agora, quais aspectos importantes da pergunta original ainda não foram abordados?

Essas lacunas se tornam as próximas consultas de pesquisa.

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: geração de consultas de acompanhamento

Transforme as lacunas de conhecimento em consultas de pesquisa eficazes. Uma lacuna como "Não sabemos qual é o modelo de preços" se torna uma consulta direcionada como "Preços da API GPT-4 por unidade de texto em 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

Critérios de encerramento

Sem critérios de encerramento claros, o ciclo é executado indefinidamente. Pare quando: (1) nenhuma lacuna for identificada, (2) o número máximo de iterações for atingido, (3) o orçamento de texto for esgotado ou (4) os novos fatos forem muito semelhantes aos fatos existentes, indicando retornos decrescentes.

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: síntese da resposta final

Depois que o ciclo terminar, envie todos os fatos coletados ao LLM para síntese. A tarefa do LLM é organizar os fatos em uma resposta coerente e bem estruturada, com atribuição das fontes.

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

Rastreamento de fontes entre iterações

Em um ciclo com várias iterações, você coleta fatos de muitas fontes diferentes. Registre de qual fonte veio cada fato para que a resposta final possa citá-las com precisão.

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)

Execução de pesquisas em paralelo

Quando houver várias consultas de acompanhamento, execute-as em paralelo usando asyncio para reduzir o tempo total da pesquisa. Isso pode reduzir um ciclo de 3 iterações de 30 para 15 segundos.

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

Deduplicação de fatos

Fontes diferentes geralmente apresentam o mesmo fato com palavras diferentes. Antes da síntese, deduplicate os fatos usando a similaridade entre incorporações para evitar repetir a mesma informação várias vezes na resposta final.

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

Verificação de conhecimento

Qual é a condição correta de encerramento de um ciclo de pesquisa aprofundada quando nenhuma lacuna de conhecimento é encontrada?

Recapitulação: padrão de ciclo de pesquisa aprofundada

O padrão de ciclo de pesquisa aprofundada é: pesquisar → extrair fatos → encontrar lacunas → gerar consultas de acompanhamento → repetir → sintetizar. Ele reproduz o modo de trabalho de um pesquisador humano.

Principais decisões de design: critérios de encerramento (número máximo de iterações, ausência de lacunas e retornos decrescentes), rastreamento de fontes para atribuição, pesquisa em paralelo para ganhar velocidade e deduplicação de fatos antes da síntese. Limite o ciclo a 3 ou 4 iterações para equilibrar profundidade, custo e latência.

Perguntas Frequentes

A aula “Padrão de ciclo de pesquisa aprofundada” é grátis?

Sim — o texto completo de “Padrão de ciclo de pesquisa aprofundada” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de AI Agents, atualize para CoddyKit PRO. O curso de AI Agents inclui 4 aulas no total.

O que vou aprender em “Padrão de ciclo de pesquisa aprofundada”?

Consultar → ler → extrair → sintetizar → consultar novamente: pesquisa em várias etapas. Você pratica AI Agents com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar AI Agents?

Nenhuma experiência prévia é necessária. AI Agents no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.

Quanto tempo leva a aula “Padrão de ciclo de pesquisa aprofundada”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de AI Agents?

Sim. Cada aula de AI Agents inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Tavily e SerpAPI para pesquisa com agentes
  2. Classificando e filtrando resultados de pesquisa
  3. Padrão de ciclo de pesquisa aprofundada
  4. Combinando pesquisa na web com RAG
← Voltar para AI Agents