Ejen AI · Pelajaran

Reka Bentuk Gelung Penyelidikan Berbilang Langkah

Rancang → cari → baca → ekstrak → sintesis → ulang sehingga kedalaman mencukupi.

Pelajaran 1 daripada 413 langkah

Reka Bentuk Gelung Penyelidikan Berbilang Langkah ialah pelajaran Ejen AI percuma di CoddyKit. Ini ialah pelajaran 1 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Ejen AI, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Ejen AI merangkumi sejumlah 4 pelajaran.

Apakah Gelung Research

Gelung research ialah corak berasaskan ejen apabila LLM merancang, mencari, membaca, mengekstrak, mengenal pasti jurang dan mengulanginya sehingga matlamat research tercapai.

Berbeza daripada carian sekali jalan, gelung ini menyesuaikan diri berdasarkan perkara yang ditemuinya — mengikuti petunjuk yang tidak dijangka dan mengetepikan jalan buntu.

Fasa 1: Penguraian Soalan

Langkah pertama ialah memecahkan soalan research kepada soalan kecil. Ini menghasilkan pelan carian terarah dan menghalang ejen daripada melayari sesawang tanpa tujuan.

import openai, json

client = openai.OpenAI(api_key='YOUR_OPENAI_KEY')

def decompose_question(question: str) -> list[str]:
    prompt = (
        f'Break this research question into 3-5 focused sub-questions.\n'
        f'Each sub-question should be independently searchable.\n'
        f'Question: "{question}"\n'
        f'Return JSON: {{"sub_questions": ["..."]}}'
    )
    resp = client.chat.completions.create(
        model='gpt-4o',
        messages=[{'role': 'user', 'content': prompt}],
        response_format={'type': 'json_object'}
    )
    return json.loads(resp.choices[0].message.content)['sub_questions']

questions = decompose_question('What are the main causes of inflation in 2024?')
print(questions)

Fasa 2: Carian Sesawang

Jalankan carian sesawang untuk setiap soalan kecil. Gunakan API carian (Serper, Brave, Bing) untuk mendapatkan senarai URL dan coretan. Jangan baca semua halaman — utamakan sumber berkualiti tinggi terlebih dahulu.

import requests

SERPER_KEY = 'YOUR_SERPER_API_KEY'

def search_web(query: str, num_results: int = 5) -> list[dict]:
    resp = requests.post(
        'https://google.serper.dev/search',
        headers={'X-API-KEY': SERPER_KEY, 'Content-Type': 'application/json'},
        json={'q': query, 'num': num_results}
    )
    resp.raise_for_status()
    results = resp.json().get('organic', [])
    return [
        {'title': r['title'], 'url': r['link'], 'snippet': r.get('snippet', '')}
        for r in results
    ]

Fasa 3: Membaca dan Mengekstrak Fakta

Dapatkan setiap URL dan ekstrak fakta utama yang berkaitan dengan soalan kecil. Gunakan LLM untuk membaca artikel dan menghasilkan senarai fakta bersama URL sumber.

import httpx
from bs4 import BeautifulSoup

def fetch_text(url: str, max_chars: int = 4000) -> str:
    try:
        resp = httpx.get(url, timeout=10, follow_redirects=True,
                         headers={'User-Agent': 'ResearchAgent/1.0'})
        soup = BeautifulSoup(resp.text, 'html.parser')
        for tag in soup(['script', 'style', 'nav', 'footer']):
            tag.decompose()
        return soup.get_text(separator=' ', strip=True)[:max_chars]
    except Exception:
        return ''

def extract_facts(text: str, question: str, url: str) -> list[dict]:
    prompt = (
        f'Extract key facts from the text that answer: "{question}"\n'
        f'Return JSON: {{"facts": ["fact1", ...]}}\n\n'
        f'TEXT:\n{text[:3000]}'
    )
    resp = client.chat.completions.create(
        model='gpt-4o-mini',
        messages=[{'role': 'user', 'content': prompt}],
        response_format={'type': 'json_object'}
    )
    facts = json.loads(resp.choices[0].message.content).get('facts', [])
    return [{'fact': f, 'source': url} for f in facts]

Fasa 4: Mengenal Pasti Jurang Pengetahuan

Selepas membaca, minta LLM menyemak fakta yang telah dikumpulkan dan mengenal pasti perkara yang masih belum diketahui. Jurang ini menjadi pertanyaan carian untuk pusingan seterusnya.

def identify_gaps(original_question: str, facts: list[dict]) -> list[str]:
    fact_text = '\n'.join(f'- {f["fact"]}' for f in facts[:20])
    prompt = (
        f'Original question: "{original_question}"\n'
        f'Facts gathered so far:\n{fact_text}\n\n'
        f'What key aspects are still unanswered? '
        f'Return 0-3 follow-up search queries (0 if research is complete).\n'
        f'JSON: {{"gaps": ["search query 1", ...]}}'
    )
    resp = client.chat.completions.create(
        model='gpt-4o',
        messages=[{'role': 'user', 'content': prompt}],
        response_format={'type': 'json_object'}
    )
    return json.loads(resp.choices[0].message.content).get('gaps', [])

Syarat Penamatan

Gelung ini memerlukan syarat berhenti yang jelas supaya tidak berjalan selama-lamanya. Berhenti apabila:

  • Tiada jurang baharu dikenal pasti
  • Tiada fakta baharu ditambahkan dalam lelaran terakhir
  • Bilangan lelaran maksimum telah dicapai (had keselamatan)
  • Jumlah fakta melebihi ambang (kedalaman mencukupi)
def should_continue(gaps: list[str], new_facts_this_round: int,
                    iteration: int, total_facts: int) -> bool:
    if iteration >= 5:
        return False          # Hard cap: 5 iterations
    if new_facts_this_round == 0:
        return False          # No new information found
    if not gaps:
        return False          # LLM says research is complete
    if total_facts >= 50:
        return False          # Sufficient depth reached
    return True

if __name__ == '__main__':
    print('Continue (has gaps, new facts)?', should_continue(['gap1'], 4, iteration=1, total_facts=10))
    print('Continue (no new facts)?', should_continue(['gap1'], 0, iteration=1, total_facts=10))

Menyahpendua Fakta

Berbilang sumber sering melaporkan fakta yang sama. Nyahpendua fakta dengan meminta LLM menggabungkan fakta yang setara dari segi makna sambil mengekalkan versi yang mempunyai sumber terbaik.

def deduplicate_facts(facts: list[dict]) -> list[dict]:
    if len(facts) <= 3:
        return facts
    fact_text = '\n'.join(
        f'{i}: {f["fact"]} (source: {f["source"]})' for i, f in enumerate(facts)
    )
    prompt = (
        f'Remove duplicate or near-duplicate facts. Keep the most informative version.\n'
        f'Return JSON: {{"keep_indices": [0, 1, ...]}}\n\n'
        f'FACTS:\n{fact_text}'
    )
    resp = client.chat.completions.create(
        model='gpt-4o-mini',
        messages=[{'role': 'user', 'content': prompt}],
        response_format={'type': 'json_object'}
    )
    indices = json.loads(resp.choices[0].message.content).get('keep_indices', [])
    return [facts[i] for i in indices if i < len(facts)]

Gelung Research Penuh

Gabungkan semua fasa ke dalam satu fungsi research() yang menggerakkan gelung sehingga penamatan.

def research(question: str) -> dict:
    all_facts = []
    iteration = 0

    # Phase 1: Decompose into sub-questions
    queries = decompose_question(question)

    while True:
        new_facts_this_round = 0

        for query in queries:
            results = search_web(query, num_results=3)
            for result in results:
                text = fetch_text(result['url'])
                if not text:
                    continue
                facts = extract_facts(text, query, result['url'])
                all_facts.extend(facts)
                new_facts_this_round += len(facts)

        all_facts = deduplicate_facts(all_facts)
        gaps = identify_gaps(question, all_facts)
        iteration += 1

        if not should_continue(gaps, new_facts_this_round, iteration, len(all_facts)):
            break

        queries = gaps  # next iteration searches for the gaps

    return {'facts': all_facts, 'iterations': iteration}

Menjejak Asal Usul Sumber

Setiap fakta mesti membawa URL sumbernya supaya laporan akhir boleh menyertakan rujukan. Jangan sekali-kali membuang metadata sumber semasa pemprosesan — metadata itu diperlukan oleh lapisan rujukan.

def add_fact(fact_list: list, fact_text: str, source_url: str, iteration: int):
    fact_list.append({
        'fact':      fact_text,
        'source':    source_url,
        'iteration': iteration,
        'verified':  False   # set to True after cross-referencing
    })

# Example:
facts_store = []
add_fact(facts_store, 'Global inflation peaked at 9.1% in June 2022',
         'https://bls.gov/news.release/cpi.htm', iteration=1)

print(f'Logged {len(facts_store)} fact(s):')
for f in facts_store:
    print(f"  - {f['fact']} (source: {f['source']})")

Carian Selari untuk Kelajuan

Carian berjujukan adalah lambat — 5 pertanyaan × 3 URL × 1 pengambilan setiap satu = 15 panggilan HTTP berjujukan. Gunakan concurrent.futures untuk menjalankan pengambilan secara selari dalam setiap lelaran.

from concurrent.futures import ThreadPoolExecutor, as_completed

def parallel_research_round(queries: list[str]) -> list[dict]:
    collected = []

    def process_query(query):
        results = search_web(query, num_results=3)
        facts = []
        for r in results:
            text = fetch_text(r['url'])
            if text:
                facts.extend(extract_facts(text, query, r['url']))
        return facts

    with ThreadPoolExecutor(max_workers=4) as ex:
        futures = {ex.submit(process_query, q): q for q in queries}
        for future in as_completed(futures):
            collected.extend(future.result())

    return collected

Memantau Kemajuan Gelung

Catat setiap lelaran supaya anda boleh debug sebab gelung berhenti atau berjalan lebih lama daripada yang dijangka. Sertakan bilangan pertanyaan, fakta yang ditambahkan dan jurang yang dikenal pasti.

import logging

log = logging.getLogger('research_loop')
import sys
logging.basicConfig(level=logging.INFO, stream=sys.stdout)

def log_iteration(iteration: int, queries: list[str],
                  new_facts: int, total_facts: int, gaps: list[str]):
    log.info(
        'Iteration %d | Queries: %d | New facts: %d | Total: %d | Gaps: %d',
        iteration, len(queries), new_facts, total_facts, len(gaps)
    )
    if gaps:
        for g in gaps:
            log.debug('  Gap query: %s', g)

if __name__ == '__main__':
    log_iteration(iteration=2, queries=['who are our top competitors?'], new_facts=4, total_facts=12, gaps=['pricing data'])

Apakah yang menamatkan gelung research apabila tiada maklumat baharu ditemui?

Memahami syarat penamatan dapat mengelakkan gelung tanpa penghujung dan memastikan ejen memberikan hasil dalam jendela time yang munasabah.

Ringkasan Reka Bentuk Gelung Research

Gelung research berbilang langkah mengikut urutan: uraikan → cari → baca → ekstrak → kenal pasti jurang → ulang. Berhenti apabila tiada jurang, tiada fakta baharu ditemui atau had lelaran yang ditetapkan telah dicapai.

Sentiasa jejak URL sumber bersama setiap fakta, jalankan carian secara selari untuk meningkatkan kelajuan dan nyahpendua fakta sebelum sintesis.

Percuma untuk bermula

Pelajari Ejen AI dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
60
Pelajaran
239

Soalan Lazim

Adakah pelajaran “Reka Bentuk Gelung Penyelidikan Berbilang Langkah” percuma?

Ya — teks penuh “Reka Bentuk Gelung Penyelidikan Berbilang Langkah” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Ejen AI, tingkat taraf kepada CoddyKit PRO. Kursus Ejen AI merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Reka Bentuk Gelung Penyelidikan Berbilang Langkah”?

Rancang → cari → baca → ekstrak → sintesis → ulang sehingga kedalaman mencukupi. Anda berlatih Ejen AI menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Ejen AI?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Ejen AI di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 1 daripada 4.

Berapa lamakah pelajaran “Reka Bentuk Gelung Penyelidikan Berbilang Langkah” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Ejen AI ini?

Ya. Setiap pelajaran Ejen AI menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Reka Bentuk Gelung Penyelidikan Berbilang Langkah
  2. Pengesahan Sumber dan Petikan
  3. Penjanaan Laporan Berstruktur
  4. Semakan Fakta dan Pencegahan Halusinasi
← Kembali ke Ejen AI