0Pricing
AI Agents · Урок

Шаблон цикла глубокого исследования

Запрос → чтение → извлечение → синтез → повторный запрос: многошаговое исследование.

«Шаблон цикла глубокого исследования» — бесплатный урок AI Agents на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения AI Agents, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс AI Agents содержит 4 уроков всего.

Что такое цикл глубокого исследования

Цикл глубокого исследования — это шаблон агента, в котором агент многократно выполняет поиск, читает материалы, выявляет пробелы в знаниях и снова ищет информацию, пока не соберёт достаточно данных для написания подробного ответа.

В отличие от однократного поиска, этот шаблон имитирует работу человека-исследователя: изучить → узнать новое → обнаружить неизвестное → исследовать глубже.

Обзор архитектуры цикла

Цикл глубокого исследования состоит из пяти повторяющихся этапов:

  1. Исходный запрос — выполните поиск по исходному вопросу пользователя
  2. Изучение лучших результатов — извлеките ключевые факты из 3 лучших источников
  3. Выявление пробелов — какие важные вопросы остаются без ответа?
  4. Уточняющие запросы — сформируйте целевые запросы для устранения пробелов
  5. Синтез — объедините все собранные факты в итоговый ответ
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)

Этап 1: исходный поиск

Первый поиск выполняется по исходному вопросу пользователя. Получите 3–5 результатов и извлеките необработанное текстовое содержимое. Этот этап посвящён широте охвата — получению общего представления о теме.

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

Этап 2: извлечение ключевых фактов

Передайте необработанные результаты поиска в LLM и попросите извлечь конкретные проверяемые факты, относящиеся к исследовательскому вопросу. Факты должны быть атомарными — одно утверждение на элемент.

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)

Этап 3: выявление пробелов в знаниях

После каждой итерации поиска спросите LLM: учитывая всё, что нам уже известно, какие важные аспекты исходного вопроса всё ещё не рассмотрены?

Эти пробелы станут запросами для следующего раунда поиска.

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)

Этап 4: формирование уточняющих запросов

Преобразуйте пробелы в знаниях в эффективные поисковые запросы. Пробел вроде «Мы не знаем модель ценообразования» превращается в целевой запрос, например «стоимость GPT-4 за токен в 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

Критерии завершения

Без чётких критериев завершения цикл будет выполняться бесконечно. Остановите его, если: (1) пробелы не выявлены, (2) достигнуто максимальное число итераций, (3) исчерпан бюджет токенов или (4) новые факты слишком похожи на уже имеющиеся (убывающая отдача).

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

Этап 5: синтез итогового ответа

После завершения цикла передайте все собранные факты в LLM для синтеза. Задача LLM — организовать факты в связный, хорошо структурированный ответ с указанием источников.

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

Отслеживание источников между итерациями

В цикле с несколькими итерациями вы собираете факты из множества разных источников. Отслеживайте, из какого источника получен каждый факт, чтобы в итоговом ответе можно было точно на них ссылаться.

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)

Параллельное выполнение поиска

Если у вас есть несколько уточняющих запросов, выполняйте их параллельно с помощью asyncio, чтобы сократить общее время исследования. Это может уменьшить продолжительность цикла из 3 итераций с 30 до 15 секунд.

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

Устранение дубликатов фактов

Разные источники часто сообщают один и тот же факт разными словами. Перед синтезом устраните дубликаты фактов с помощью сходства эмбеддингов, чтобы не повторять одну и ту же информацию несколько раз в итоговом ответе.

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

Проверка знаний

Каково правильное условие завершения цикла глубокого исследования, если пробелы в знаниях не обнаружены?

Повторение: шаблон цикла глубокого исследования

Шаблон цикла глубокого исследования: поиск → извлечение фактов → выявление пробелов → формирование уточняющих запросов → повторение → синтез. Он отражает работу человека-исследователя.

Ключевые решения при проектировании: критерии завершения (максимальное число итераций, отсутствие пробелов, убывающая отдача), отслеживание источников для указания авторства, параллельный поиск для ускорения и устранение дубликатов фактов перед синтезом. Ограничьте цикл 3–4 итерациями, чтобы сбалансировать глубину, стоимость и задержку.

Часто задаваемые вопросы

Урок «Шаблон цикла глубокого исследования» бесплатный?

Да — полный текст урока «Шаблон цикла глубокого исследования» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс AI Agents, подпишись на CoddyKit PRO. Курс AI Agents содержит 4 уроков всего.

Чему я научусь в уроке «Шаблон цикла глубокого исследования»?

Запрос → чтение → извлечение → синтез → повторный запрос: многошаговое исследование. Ты практикуешь AI Agents с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать AI Agents?

Предыдущий опыт не требуется. AI Agents на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Шаблон цикла глубокого исследования»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке AI Agents?

Да. Каждый урок AI Agents включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Tavily и SerpAPI для поиска агентов
  2. Ранжирование и фильтрация результатов поиска
  3. Шаблон цикла глубокого исследования
  4. Объединение веб-поиска с RAG
← Назад к AI Agents