0Pricing
AI Agents · Pelajaran

Pola Putaran Riset Mendalam

Kueri → baca → ekstrak → sintesis → kueri lagi: riset multilangkah.

Pola Putaran Riset Mendalam adalah pelajaran AI Agents gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar AI Agents, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus AI Agents mencakup 4 pelajaran total.

Apa Itu Perulangan Riset Mendalam?

Perulangan riset mendalam adalah pola agen yang membuat agen mencari, membaca, mengidentifikasi kesenjangan pengetahuan, lalu mencari lagi secara berulang hingga mengumpulkan cukup informasi untuk menulis jawaban yang menyeluruh.

Berbeda dari satu kali pencarian, pola ini meniru cara kerja peneliti manusia: menjelajah → belajar → menemukan hal yang belum diketahui → menggali lebih dalam.

Ikhtisar Arsitektur Perulangan

Perulangan riset mendalam memiliki lima fase yang diulang:

  1. Kueri awal — lakukan pencarian menggunakan pertanyaan asli pengguna
  2. Baca hasil teratas — ekstrak fakta penting dari 3 sumber terbaik
  3. Identifikasi kesenjangan — pertanyaan penting apa yang masih belum terjawab?
  4. Kueri tindak lanjut — buat pencarian terarah untuk mengisi kesenjangan
  5. Sintesis — gabungkan semua fakta yang terkumpul menjadi jawaban akhir
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: Pencarian Awal

Pencarian pertama menggunakan pertanyaan asli pengguna. Ambil 3–5 hasil dan ekstrak isi teks mentahnya. Fase ini berfokus pada keluasan — mendapatkan gambaran umum tentang lanskap topik.

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: Mengekstrak Fakta Penting

Teruskan hasil pencarian mentah kepada LLM dan minta LLM mengekstrak fakta spesifik yang dapat diverifikasi serta relevan dengan pertanyaan riset. Fakta harus bersifat atomik — satu klaim untuk setiap butir.

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: Mengidentifikasi Kesenjangan Pengetahuan

Setelah setiap iterasi pencarian, tanyakan kepada LLM: berdasarkan hal-hal yang sejauh ini kita ketahui, aspek penting apa dari pertanyaan asli yang masih belum dibahas?

Kesenjangan ini menjadi kueri pencarian untuk putaran berikutnya.

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: Membuat Kueri Tindak Lanjut

Ubah kesenjangan pengetahuan menjadi kueri pencarian yang efektif. Kesenjangan seperti "Kita tidak mengetahui model penetapan harganya" dapat menjadi kueri terarah seperti "harga API GPT-4 untuk setiap token pada 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

Kriteria Penghentian

Tanpa kriteria penghentian yang jelas, perulangan akan berjalan selamanya. Hentikan ketika: (1) tidak ada kesenjangan yang teridentifikasi, (2) jumlah iterasi maksimum telah tercapai, (3) anggaran token telah habis, atau (4) fakta baru terlalu mirip dengan fakta yang sudah ada sehingga hasil tambahannya semakin kecil.

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: Menyintesis Jawaban Akhir

Setelah perulangan berhenti, teruskan semua fakta yang terkumpul kepada LLM untuk disintesis. Tugas LLM adalah mengatur fakta menjadi jawaban yang koheren dan terstruktur dengan baik, serta mencantumkan sumbernya.

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

Melacak Sumber di Berbagai Iterasi

Dalam perulangan dengan banyak iterasi, Anda mengumpulkan fakta dari berbagai sumber. Catat sumber asal setiap fakta agar jawaban akhir dapat mengutipnya secara akurat.

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)

Eksekusi Pencarian Paralel

Jika Anda memiliki beberapa kueri tindak lanjut, jalankan kueri-kueri tersebut secara paralel menggunakan asyncio untuk mengurangi total waktu riset. Cara ini dapat memangkas perulangan 3 iterasi dari 30 detik menjadi 15 detik.

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

Menghapus Duplikasi Fakta

Sumber yang berbeda sering kali menyatakan fakta yang sama dengan kata-kata yang berbeda. Sebelum sintesis, hapus duplikasi fakta menggunakan kemiripan representasi vektor agar informasi yang sama tidak diulang berkali-kali dalam jawaban akhir.

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

Pemeriksaan Pengetahuan

Apa kondisi penghentian yang tepat untuk perulangan riset mendalam ketika tidak ditemukan kesenjangan pengetahuan?

Rangkuman: Pola Perulangan Riset Mendalam

Pola perulangan riset mendalam: cari → ekstrak fakta → temukan kesenjangan → buat kueri tindak lanjut → ulangi → sintesis. Pola ini mencerminkan cara kerja peneliti manusia.

Keputusan desain utama: kriteria penghentian (iterasi maksimum, tidak ada kesenjangan, hasil tambahan yang semakin kecil), pelacakan sumber untuk atribusi, pencarian paralel untuk kecepatan, dan deduplikasi fakta sebelum sintesis. Batasi hingga 3–4 iterasi untuk menyeimbangkan kedalaman dengan biaya dan waktu tunda.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Pola Putaran Riset Mendalam” gratis?

Ya — teks lengkap “Pola Putaran Riset Mendalam” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus AI Agents, upgrade ke CoddyKit PRO. Kursus AI Agents mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Pola Putaran Riset Mendalam”?

Kueri → baca → ekstrak → sintesis → kueri lagi: riset multilangkah. Kamu berlatih AI Agents dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai AI Agents?

Tidak diperlukan pengalaman sebelumnya. AI Agents di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.

Berapa lama pelajaran “Pola Putaran Riset Mendalam” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran AI Agents ini?

Ya. Setiap pelajaran AI Agents menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Tavily dan SerpAPI untuk Pencarian Agen
  2. Mengurutkan dan Menyaring Hasil Pencarian
  3. Pola Putaran Riset Mendalam
  4. Menggabungkan Pencarian Web dengan RAG
← Kembali ke AI Agents