AIFA DEEP RESEARCH
AIFA DEEP RESEARCH

⚠️ Предупреждение для разработчиков

Многие программисты в ближайшие годы потеряют работу из-за ИИ. Но не те, кто научится его создавать.

Ваша задача — не просто научиться пользоваться ChatGPT или Claude. Ваша задача — самому стать создателем таких систем. Стать тем, кто строит Perplexity, а не тем, кто только ими пользуется.

1.Чему научит вас эта статья

Эта статья даст вам полный архитектурный план для создания собственного AI-агента глубокого исследования, аналогичного функции "Deep Research" в Perplexity. Вы изучите:

  • Техническую архитектуру: Как спроектировать рекурсивную систему поиска с использованием Next.js 15, OpenAI и exa.ai

  • Ментальную модель: Почему глубокий поиск — это древовидная структура, а не линейный процесс

  • Практические решения: Как интегрировать внешний веб-поиск с внутренней векторной базой знаний для создания уникального контента

  • Оптимизацию производительности: Как управлять серверными ресурсами и пользовательским опытом при долгих AI-операциях

  • Готовый код: Конкретные примеры реализации на TypeScript с использованием современного стека технологий

К концу статьи у вас будет четкое понимание того, как построить self-hosted SaaS для глубокого исследования, который можно встроить в любой продукт.

1.1. Технологический стек

Для реализации AI-агента глубокого исследования используется современный стек технологий, оптимизированный для production-ready приложений с интенсивным использованием искусственного интеллекта:

1.1.1. Фронтенд и фреймворк

  • React 19 — последняя версия с улучшенной производительностью и новыми возможностями конкурентного рендеринга

  • Next.js 15 — полнофункциональный React-фреймворк с App Router, включая поддержку параллельных и перехватывающих маршрутов

  • TypeScript 5 — строгая типизация для надежности кода и лучшего developer experience

1.1.2. AI и интеграции

  • OpenAI SDK (v4.96.2) — официальный SDK для интеграции с GPT-4 и другими моделями OpenAI

  • AI SDK (v4.1.45) — универсальная библиотека для работы с различными AI-провайдерами

  • Exa.js (v1.4.10) — специализированный AI-ориентированный поисковик для семантического поиска

1.1.3. UI и стилизация

  • Tailwind CSS 4 — utility-first CSS фреймворк для быстрой разработки

  • Radix UI — headless компоненты для создания доступных интерфейсов

  • Lucide React — современная библиотека иконок

  • shadcn/ui — компонентная система на базе Radix UI и Tailwind CSS

1.1.4. Формы и валидация

  • React Hook Form — производительная библиотека для работы с формами

  • Zod — TypeScript-first схема валидации с статической типизацией

  • Hookform Resolvers — интеграция Zod с React Hook Form

1.1.5. Обработка контента

  • React Markdown — рендеринг Markdown контента с поддержкой компонентов

  • date-fns — современная библиотека для работы с датами

Этот стек обеспечивает высокую производительность, type safety и масштабируемость, необходимые для создания сложных AI-приложений уровня production.

2. Введение: Эпоха после ChatGPT

Мы живем в удивительное время. ChatGPT и другие большие языковые модели (LLM) произвели революцию в том, как мы взаимодействуем с информацией. Но если вы серьезно работали с этими инструментами, то наверняка столкнулись с фундаментальным ограничением: модели знают мир только до определенной даты обучения и часто галлюцинируют, выдавая правдоподобную, но ложную информацию.

2.1. Проблема: "Костыльный" веб-поиск в современных LLM

Разработчики ChatGPT, Claude и других моделей попытались решить эту проблему, добавив встроенный веб-поиск. Но если вы внимательно проанализируете, как это работает, то увидите серьезные недостатки:

  • Поверхностность поиска: Система делает один-два запроса в поисковик, получает первые несколько результатов и на этом останавливается. Это не исследование — это быстрый поиск справочной информации.

  • Отсутствие глубины: Нет рекурсивного углубления в тему. Если первый поиск не дал исчерпывающих результатов, система не задает уточняющие вопросы и не ищет альтернативные источники.

  • Низкое качество источников: Обычные поисковики возвращают HTML-страницы, наполненные рекламой, навигационными элементами и нерелевантным контентом. LLM приходится "выковыривать" полезную информацию из этого мусора

Отсутствие контекста: Система не может связать найденную информацию с вашими внутренними данными, документами или специфическими знаниями вашей компании.

2.2. Решение-эталон: Perplexity и Deep Research

Компания Perplexity первой показала, как правильно интегрировать поиск с LLM. Их подход кардинально отличается от "костыльных" решений:

  • Специализированные поисковики: Вместо обычного Google API они используют AI-ориентированные поисковые системы, которые возвращают чистый, структурированный контент.

  • Итеративный процесс: Система не останавливается на первых результатах. Она анализирует найденное, формирует новые вопросы и продолжает поиск до получения исчерпывающей картины.

  • Функция "Deep Research": Это автономный AI-агент, который может работать минутами, рекурсивно углубляясь в тему и собирая информацию из десятков источников.

Именно такую систему мы будем строить в этой статье.

2.3. Почему это важно для разработчиков?

В эпоху AI каждый продукт стремится стать "умнее". Но простое подключение ChatGPT API — это лишь первый шаг. Настоящая ценность появляется, когда ваш AI может:

  • Исследовать актуальную информацию из интернета в реальном времени

  • Комбинировать публичные данные с вашими внутренними знаниями

  • Генерировать уникальный контент, который невозможно получить из стандартных LLM

  • Адаптироваться к специфике вашего бизнеса и отрасли

2.4. Цель этой статьи

Моя задача — дать вам не просто набор кода, который можно скопировать и вставить. Я хочу передать ментальную модель и архитектурные принципы, которые позволят вам:

  1. Понять философию глубокого AI-исследования

  2. Спроектировать архитектуру для вашего конкретного случая

  3. Реализовать систему с использованием современного стека (Next.js 15, OpenAI, exa.ai)

  4. Интегрировать решение в любой существующий продукт

  5. Масштабировать и оптимизировать систему под ваши потребности

К концу статьи у вас будет полный архитектурный план и готовые примеры кода для создания собственного "Perplexity" — AI-агента, который может стать конкурентным преимуществом вашего продукта.

Важно: Мы будем изучать не только техническую реализацию, но и бизнес-логику. Почему рекурсивный поиск эффективнее линейного? Как правильно комбинировать внешние и внутренние источники? Какие UX-паттерны использовать для долгих AI-операций? Эти вопросы не менее важны, чем код.

Готовы погрузиться в архитектуру будущего? Начнем с понимания того, почему LLM нужен "поводырь" для навигации по интернету.

Для тех кто и так все понимает, здесь я предлагаю ссылку на открытый исходный код этого решения. Лично мне не очень приятны те статьи, которые предлагают много букв и мало смысла. Переходите копируйте репозиторий поднимайте его в режиме разработки. Имейте в виду что в продакшн вы будете ограничены– тайм-ауты 403 бесплатного хостинг тарифа Vercel, в то время как на local host вы сможете в полном мере насладиться экспериментами и изучить логи. https://github.com/aifa-agi/aifa-deep-researcer-starter

3. Почему LLM нужен "поводырь"? Роль внешних поисковых систем

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

3.1. Ограничения традиционных поисковиков для AI

Обычные поисковики (Google, Bing) создавались для людей, а не для машин. Они возвращают HTML-страницы, наполненные:

  • Рекламными блоками и навигационными элементами

  • Нерелевантным контентом (комментарии, сайдбары, футеры)

  • Неструктурированными данными, требующими сложного парсинга

<code>
// Проблема традиционного подхода

const htmlResponse = await fetch('https://api.bing.com/search?q=query');

const messyHtml = await htmlResponse.text();

// Получаем HTML с рекламой, скриптами и мусором
<code/>

3.2. Поиск по ключевым словам vs. семантический поиск

Традиционные системы ищут точные совпадения слов, игнорируя контекст и смысл запроса. Запрос "оптимизация Next.js для e-commerce" может не найти отличную статью о "повышении производительности React-приложений в интернет-магазинах", хотя семантически это одна тема.

3.3. AI-ориентированные поисковики: решение проблемы

Специализированные системы (Exa.ai, Metaphor, Tavily) решают ключевые проблемы:

  • Семантическое понимание запросов

  • Используют векторные представления для поиска по смыслу, а не по словам.

  • Чистые структурированные данные

  • Возвращают предобработанный контент без HTML-мусора.

  • Контекстное понимание

  • Учитывают предыдущие запросы и общий контекст исследования.

<code>
// AI-ориентированный подход

const cleanResults = await exa.search({

  query: "Detailed analysis of Next.js performance optimization for high-traffic e-commerce platforms",

  type: "neural",

  contents: { text: true, summary: true }

});

// Получаем чистый, релевантный контент

<code/>

3.4. Критическая важность для глубокого поиска

Качество входных данных определяет качество финального отчета. AI-поисковики обеспечивают:

  • Надежность данных: Структурированный контент без необходимости парсинга HTML

  • Масштабируемость: Стабильные API для автоматизированного использования

  • Экономическую эффективность: Снижение вычислительных затрат на обработку данных

<code>
// Гибридный поиск: внешние + внутренние источники

const [webResults, vectorResults] = await Promise.all([

  exa.search(query),

  vectorStore.similaritySearch(query)

]);

const combinedContext = [...webResults, ...vectorResults];

<code/>

AI-ориентированные поисковики — это не техническая деталь, а архитектурная основа для создания качественного AI-агента исследования. Без правильного "поводыря" даже самый совершенный LLM не сможет создать глубокий, точный анализ актуальной информации.

4. Мыслим как дерево. Архитектура рекурсивного поиска

Человеческий мозг естественным образом структурирует сложную информацию в виде иерархических связей. Когда исследователь изучает новую тему, он не движется по прямой линии — он развивает древовидную сеть знаний, где каждое новое открытие порождает дополнительные вопросы и направления исследования. Именно эту ментальную модель мы должны воплотить в архитектуре AI-агента глубокого поиска.

4.1. Фундаментальная разница подходов

Традиционные поисковые системы и встроенный веб-поиск в LLM работают линейно: получили запрос → сделали поиск → вернули результаты → сформировали ответ. Этот подход имеет критические ограничения для глубокого исследования.

Проблемы линейного подхода:

  • Поверхностность: система останавливается на первых найденных фактах

  • Отсутствие контекста: каждый поисковый запрос изолирован от предыдущих

  • Пропуск взаимосвязей: система не видит связи между разными аспектами темы

  • Случайность результатов: качество зависит от удачности первоначального запроса

Древовидный подход решает эти проблемы, моделируя естественный процесс человеческого исследования. Каждый найденный источник может породить новые вопросы, которые становятся отдельными ветками исследования.

4.2. Анатомия дерева поиска

Рассмотрим структуру дерева глубокого поиска на конкретном примере:

<code>
Сравнение Next.js vs WordPress для AI-проектов/

├── Производительность/
│   ├── Источник 1
│   ├── Источник 2
│   └── Влияние AI-библиотек на производительность Next.js/
│       └── Источник 7
├── Затраты разработки/
│   ├── Источник 3
│   └── Источник 4
└── SEO и индексация/
    ├── Источник 5
    └── Источник 6

<code/>

  • Первый уровень веток — это основные аспекты темы, которые генерирует LLM на основе анализа исходного запроса. Для нашего примера это производительность, затраты и SEO. Эти подтемы формируются не случайно — LLM анализирует семантическое пространство запроса и выделяет ключевые направления исследования.

  • Листья дерева — это конкретные источники (статьи, документы, исследования), найденные по каждому подзапросу. Каждый лист содержит фактическую информацию, которая войдет в финальный отчет.

  • Рекурсивные ветки — это самая мощная особенность архитектуры. Когда система анализирует найденные источники, она может обнаружить новые аспекты темы, которые требуют дополнительного исследования. Эти аспекты становятся новыми подзапросами, порождающими собственные ветки.

4.3. Практические преимущества древовидной архитектуры

  • Полнота исследования: Дерево обеспечивает системное покрытие темы. Вместо случайного набора фактов система строит логически связанную карту знаний, где каждый элемент имеет свое место в общей структуре.

  • Адаптивная глубина: Система автоматически определяет, какие направления требуют более глубокого исследования. Если по одной ветке найдено много релевантных источников, система может углубиться дальше. Если направление оказывается малоинформативным, поиск прекращается.

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

Качественная оценка: На каждом уровне дерева система может оценивать релевантность и качество найденных источников, отфильтровывая шум и концентрируясь на наиболее ценной информации.

4.4. Управление параметрами дерева

Глубина поиска (depth) определяет, насколько много уровней рекурсии может выполнить система. Глубина 1 означает только основные подзапросы без дальнейшего углубления. Глубина 3-4 позволяет проводить действительно детальное исследование.

Ширина поиска (width) контролирует количество подзапросов на каждом уровне. Слишком большая ширина может привести к поверхностному исследованию множества направлений. Оптимальная ширина обычно составляет 3-5 основных направлений на каждом уровне.

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

4.5. Оптимизация и предотвращение проблем

  • Предотвращение циклов: Система должна отслеживать уже исследованные направления, чтобы избежать бесконечных циклов в рекурсии.

  • Динамическая приоритизация: Более перспективные ветки должны исследоваться с большей глубиной, в то время как малоинформативные направления можно прекращать раньше.

  • Параллельное исследование: Разные ветки дерева могут исследоваться параллельно, что значительно ускоряет процесс при наличии достаточных вычислительных ресурсов.

  • Память и кэширование: Результаты поиска должны кэшироваться, чтобы избежать повторных запросов к внешним API при пересечении тем.

  • Время выполнения запроса и тайм-аут сервера: это ещё одна проблема, которая часто проявляет себя при реализации глубоких исследований, особенно если глубина больше двух уровней. Можно сказать, что увеличение уровня это возведение в степень сложности исследования. Так например исследования с четырьмя уровня глубины может достигать 12 часов.

Древовидная архитектура превращает хаотичный процесс поиска информации в систематическое исследование, где каждый элемент имеет свое место в общей структуре знаний. Это позволяет AI-агенту работать как опытный исследователь — не просто собирать факты, а строить целостную картину понимания исследуемой темы.

5. Цикл "Ищи-Оценивай-Углубляйся". Реализация рекурсии

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

5.1. Архитектура данных для глубокого исследования

В реальной реализации система оперирует структурированными типами данных, которые накапливают знания на каждом уровне рекурсии:

<code>
type Learning = {

  learning: string;

  followUpQuestions: string[];

};

type SearchResult = {

  title: string;

  url: string;

  content: string;

  publishedDate: string;

};

type Research = {

  query: string | undefined;

  queries: string[];

  searchResults: SearchResult[];

  knowledgeBaseResults: string[]; // Ответы из векторной базы

  learnings: Learning[];

  completedQueries: string[];

};
<code/>

Эта структура данных аккумулирует знания на каждом уровне рекурсии, создавая единый контекст для всего исследования.

5.2. Этап 1: "Ищи" — Интеллектуальная генерация запросов

Система не полагается на единственный поисковый запрос. Вместо этого она генерирует множество целенаправленных запросов с помощью LLM:

<code>
const generateSearchQueries = async (query: string, breadth: number) => {

  const {

    object: { queries },

  } = await generateObject({

    model: mainModel,

    prompt: Generate ${breadth} search queries for the following query: ${query},

    schema: z.object({

      queries: z.array(z.string()).min(1).max(10),

    }),

  });

  return queries;

};
<code/>

Ключевая особенность: Параметр breadth контролирует ширину исследования — количество различных аспектов темы, которые будут исследованы параллельно.

5.3. Этап 2: "Оценивай" — AI-управляемая фильтрация результатов

Не все найденные источники одинаково ценны. Система использует AI-агента с инструментами для интеллектуальной оценки каждого результата:

<code>
const searchAndProcess = async (/* параметры */) => {

  const pendingSearchResults: SearchResult[] = [];

  const finalSearchResults: SearchResult[] = [];

  

  await generateText({

    model: mainModel,

    prompt: Search the web for information about ${query}, For each item, where possible, collect detailed examples of use cases (news stories) with a detailed description.,

    system: "You are a researcher. For each query, search the web and then evaluate if the results are relevant",

    maxSteps: 10,

    tools: {

      searchWeb: tool({

        description: "Search the web for information about a given query",

        parameters: z.object({ query: z.string().min(1) }),

        async execute({ query }) {

          const results = await searchWeb(query, breadth, /* другие параметры */);

          pendingSearchResults.push(...results);

          return results;

        },

      }),

      evaluate: tool({

        description: "Evaluate the search results",

        parameters: z.object({}),

        async execute() {

          const pendingResult = pendingSearchResults.pop();

          if (!pendingResult) return "No search results available for evaluation.";

          const { object: evaluation } = await generateObject({

            model: mainModel,

            prompt: Evaluate whether the search results are relevant and will help answer the following query: ${query}. If the page already exists in the existing results, mark it as irrelevant.,

            output: "enum",

            enum: ["relevant", "irrelevant"],

          });

          

          if (evaluation === "relevant") {

            finalSearchResults.push(pendingResult);

          }

          return evaluation === "irrelevant" 

            ? "Search results are irrelevant. Please search again with a more specific query."

            : "Search results are relevant. End research for this query.";

        },

      }),

    },

  });

  return finalSearchResults;

};
<code/>

Инновационный подход: Система использует AI-агента с инструментами, который может многократно искать и оценивать результаты до тех пор, пока не найдет достаточно релевантной информации.

5.4. Интеграция с векторной базой знаний

Реальная мощь системы проявляется в синергии внешнего и внутреннего поиска. Для каждого запроса система одновременно ищет в интернете и в собственной векторной базе знаний:

<code>
async function getKnowledgeItem(query: string, vectorStoreId: string) {

  const client = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });

  const response = await client.responses.create({

    model: "gpt-4o-mini",

    tools: [

      {

        type: "file_search",

        vector_store_ids: [vectorStoreId],

        max_num_results: 5,

      },

    ],

    input: [

      {

        role: "developer",

        content: Search the vector store for information. Output format language: ${process.env.NEXT_PUBLIC_APP_HTTP_LANG || "en"},

      },

      {

        role: "user",

        content: query,

      },

    ],

  });

  return response.output_text;

}
<code/>

5.5. Практическое применение


В основном цикле исследования система параллельно обращается к обоим источникам
<code>
for (const query of queries) {

  const searchResults = await searchAndProcess(/* веб-поиск */);

  accumulatedResearch.searchResults.push(...searchResults);

  if (vectorStoreId && vectorStoreId !== "") {

    const kbResult = await getKnowledgeItem(query, vectorStoreId);

    accumulatedResearch.knowledgeBaseResults.push(kbResult);

  }

}
<code/>

5.6. Этап 3: "Углубляйся" — Генерация уточняющих вопросов

Самая мощная особенность системы — способность генерировать новые исследовательские направления на основе уже найденной информации:
<code>

const generateLearnings = async (query: string, searchResult: SearchResult) => {

  const { object } = await generateObject({

    model: mainModel,

    prompt: `The user is researching "${query}". The following search result were deemed relevant.

      Generate a learning and a follow-up question from the following search result:

   

      <search_result>

      ${JSON.stringify(searchResult)}

      </search_result>`,

    schema: z.object({

      learning: z.string(),

      followUpQuestions: z.array(z.string()),

    }),

  });

  return object;

};
<code/>

5.7. Рекурсивное углубление

Каждый найденный источник анализируется для извлечения новых вопросов, которые становятся основой для следующего уровня поиска:
<code>
for (const searchResult of searchResults) {

  const learnings = await generateLearnings(query, searchResult);

  accumulatedResearch.learnings.push(learnings);

  accumulatedResearch.completedQueries.push(query);

  const newQuery = `Overall research goal: ${prompt}

Previous search queries: ${accumulatedResearch.completedQueries.join(", ")}

Follow-up questions: ${learnings.followUpQuestions.join(", ")}`;

  await deepResearch(

    /* параметры поиска */,

    newQuery,

    depth - 1,

    Math.ceil(breadth / 2), // Уменьшаем ширину на каждом уровне

    vectorOfThought,

    accumulatedResearch,

    vectorStoreId

  );

}
<code/>

5.8. Управление глубиной и сложностью

Реальная реализация показывает, как управлять экспоненциальным ростом сложности:

<code>
const deepResearch = async (

  /* множество параметров фильтрации */,

  prompt: string,

  depth: number = 2,

  breadth: number = 5,

  vectorOfThought: string[] = [],

  accumulatedResearch: Research = {

    query: undefined,

    queries: [],

    searchResults: [],

    knowledgeBaseResults: [],

    learnings: [],

    completedQueries: [],

  },

  vectorStoreId: string

): Promise<Research> => {

  if (depth === 0) {

    return accumulatedResearch; // Базовый случай рекурсии

  }

  // Адаптивное формирование запроса на основе "вектора мысли"

  let updatedPrompt = "";

  if (vectorOfThought.length === 0) {

    updatedPrompt = prompt;

  } else {

    const vectorOfThoughItem = vectorOfThought[vectorOfThought.length - depth];

    updatedPrompt = ${prompt},focus on these important branches of thought: ${vectorOfThoughItem};

  }
<code/>

5.9. Ключевые оптимизации:

  • Уменьшение ширины: Math.ceil(breadth / 2) на каждом уровне предотвращает экспоненциальный рост

  • Вектор мысли: vectorOfThought позволяет направлять исследование в конкретные области

  • Аккумуляция контекста: Все результаты сохраняются в единой структуре данных

5.10. Практическая польза гибридного подхода

  • Создание уникального контента: Комбинирование публичных данных с внутренними знаниями позволяет создавать отчеты, которые никто другой не сможет повторить. Ваши конкуренты могут получить доступ к тем же публичным источникам, но не к вашим внутренним кейсам, статистике и экспертизе.

  • Обогащение контекста: Внешние данные дают актуальность и широту, внутренние — глубину и специфичность. Система может найти в интернете общие тренды отрасли, а затем дополнить их вашими собственными данными о том, как эти тренды влияют на ваш бизнес.

  • Поддержание актуальности: Даже если информация в вебе устарела или неточна, ваша внутренняя база знаний может предоставить более свежие и проверенные данные.

6. От хаоса к порядку: Генерация экспертного отчета

После завершения всех уровней рекурсивного поиска система накапливает огромное количество разрозненной информации: результаты веб-поиска, данные из векторной базы, сгенерированные learnings и follow-up вопросы. Финальный этап — превращение этого хаоса в структурированный экспертный отчет.

6.1. Аккумуляция контекста

Все собранные данные объединяются в единую структуру Research, которая служит полным контекстом для финального синтеза:

<code>
type Research = {

  query: string | undefined;           // Исходный запрос

  queries: string[];                   // Все сгенерированные поисковые запросы

  searchResults: SearchResult[];       // Результаты веб-поиска

  knowledgeBaseResults: string[];      // Ответы из векторной базы

  learnings: Learning[];               // Извлеченные инсайты

  completedQueries: string[];          // История выполненных запросов

};
<code/>

6.2. Мастер-промпт для синтеза

Качество финального отчета напрямую зависит от детализации промпта для генерации. Система использует самую мощную модель OpenAI для синтеза:
<code>
const generateReport = async (

  research: Research,

  vectorOfThought: string[],

  systemPrompt: string

) => {

  const { text } = await generateText({

    model: openai("o3-mini"), // Самая мощная модель для синтеза

    system: systemPrompt,

    prompt:

      "Use the following structured research data to generate a detailed expert report:\n\n" +

      JSON.stringify(research, null, 2),

  });

  return text;

};
<code/>

6.3. Структурированный вывод

Система не просто создает текстовое резюме — она генерирует структурированный документ с заголовками, таблицами, списками pro/contra, как показано в сохранении результата:

<code>
console.log("Исследование завершено!");

console.log("Генерирую отчёт...");

const report = await generateReport(research, vectorOfThought, systemPrompt);

console.log("Отчёт сгенерирован! report.md");

fs.writeFileSync("report.md", report); // Сохранение в Markdown

<code/>

6.4. Контроль качества через системные промпты

systemPrompt позволяет настраивать стиль и структуру отчета под конкретные потребности:

  • Академический стиль для исследований

  • Бизнес-формат для корпоративных отчетов

  • Техническая документация для разработчиков

  • Аналитические обзоры для инвесторов

Ключевой принцип: Качество отчета напрямую зависит от качества собранного контекста и детализации финального промпта. Система превращает часы человеческой работы в минуты автоматизированного анализа.

7. Заключение

Создание AI-агента глубокого исследования — это не просто техническая задача, а архитектурное решение, которое может стать конкурентным преимуществом любого продукта. Мы рассмотрели полный цикл от концепции до реализации, показав, как превратить хаотичный процесс поиска информации в систематическое исследование уровня эксперта.

7.1. Ключевые принципы архитектуры

  • Мыслите деревьями, а не линиями: Глубокий поиск — это исследование древовидной структуры информации, где каждое открытие порождает новые вопросы и направления.

  • Используйте AI-ориентированные инструменты: Специализированные поисковики вроде exa.ai — не опция, а необходимость для качественного исследования. Они возвращают чистые данные вместо HTML-мусора.

  • Применяйте рекурсию для глубины: Первая страница результатов — лишь вершина айсберга. Настоящие инсайты лежат в рекурсивном углублении через цикл "Ищи-Оценивай-Углубляйся".

  • Комбинируйте внешние и внутренние источники: Синергия публичных данных интернета и приватных знаний организации создает уникальный контент, который невозможно получить другими способами.

Используйте LLM как для анализа, так и для синтеза: AI-агенты с инструментами могут не только искать информацию, но и оценивать ее релевантность, генерировать новые вопросы и создавать структурированные отчеты.

7.2. Практические результаты

Реализация на основе Next.js 15, OpenAI и exa.ai показывает, что такую систему можно создать и запустить в production. Код из https://github.com/aifa-agi/aifa-deep-researcer-starter демонстрирует все ключевые компоненты:

  • Рекурсивную архитектуру с управлением глубиной и шириной

  • Интеграцию веб-поиска с векторной базой знаний

  • AI-агентов с инструментами для оценки результатов

  • Генерацию экспертных отчетов с сохранением в файлы

7.3. Вызовы и ограничения

  • Тайм-ауты серверов: Исследования с глубиной больше 2 уровней могут занимать часы, что требует специальных решений для production-среды.

  • Экспоненциальный рост сложности: Каждый уровень глубины увеличивает количество запросов в геометрической прогрессии, что требует тщательного управления ресурсами.

  • Качество источников: Даже AI-поисковики могут возвращать неточную информацию, что требует дополнительной валидации и проверки фактов.

7.4. Призыв к действию

Теперь у вас есть полный архитектурный план и реальные примеры кода. Вы можете:

  1. Начать с минимальной реализации: Используйте базовую версию из статьи для прототипирования

  2. Изучить готовое решение: Склонируйте https://github.com/aifa-agi/aifa-deep-researcer-starter и экспериментируйте локально

  3. Адаптировать под свои потребности: Интегрируйте принципы в существ

8. Домашнее задание: Как улучшить UX во время долгого ожидания ответа от AI-агента?

Мы рассмотрели техническую архитектуру AI-агента глубокого исследования, но остается критически важная проблема пользовательского опыта: что делать, когда система работает несколько минут, а пользователь смотрит на пустой экран? Как показывает реальная реализация из aifa-deep-researcer-starter, исследования с глубиной больше 2 уровней могут занимать часы, а пользователь в это время видит только статичный loading-экран.

8.1. Проблема: Тишина сервера убивает доверие

В отличие от обычных веб-приложений, где операции занимают секунды, AI-агент глубокого исследования может молчать минутами. Пользователь не получает никакой обратной связи от сервера до самого конца процесса. Это создает несколько психологических проблем:

  • Тревожность ожидания: Пользователь не знает, работает ли система или зависла

  • Потеря контроля: Нет возможности понять, сколько еще ждать

  • Снижение доверия: Кажется, что приложение сломалось или "съело" запрос

  • Высокий bounce rate: Пользователи закрывают вкладку, не дождавшись результата

Perplexity, Claude и другие современные AI-продукты решают эту проблему с помощью интерактивных анимаций, прогресс-индикаторов и динамических подсказок. Но как реализовать подобное, если ваш сервер не отправляет промежуточных данных?

8.2. Вызов для программиста

Представьте техническое ограничение: ваш API-роут в Next.js выполняет долгую операцию (глубокое исследование) и не может отправлять промежуточные данные до завершения. Фронтенд получает ответ только в самом конце. Классические решения вроде Server-Sent Events или WebSocket могут быть недоступны из-за ограничений хостинга или архитектуры.

Как в таких условиях создать engaging UX, который будет удерживать пользователя и снижать тревожность ожидания?

8.3. Вопросы для размышления и обсуждения

8.3.1. UX-паттерны и визуализация:

  • Какие UX-паттерны вы бы применили для визуализации процесса глубокого поиска, если сервер "молчит"?

  • Как можно имитировать "живой" прогресс, даже если реального статуса от сервера нет?

  • Стоит ли использовать фейковые прогресс-бары или это нарушает доверие пользователей?

  • Какие анимации и микроинтеракции помогут создать ощущение "живой" системы?

8.3.2. Информирование пользователя:

  • Как объяснить пользователю, почему ожидание может быть долгим? Какие тексты/иллюстрации использовать?

  • Стоит ли показывать примерное время ожидания, если оно может сильно варьироваться (от 2 до 60 минут)?

  • Как визуализировать этапы процесса ("Генерируем поисковые запросы...", "Анализируем источники...", "Формируем экспертный отчет...")?

  • Какие метафоры помогут пользователю понять ценность ожидания?

8.3.3. Техническая реализация:

  • Какие подходы к optimistic UI можно применить в условиях отсутствия обратной связи от сервера?

  • Как реализовать "разговорный" интерфейс, который поддерживает пользователя во время ожидания?

  • Можно ли использовать локальные вычисления (Web Workers, WASM) для имитации прогресса?

  • Как организовать graceful degradation, если пользователь закроет вкладку во время исследования?

8.3.4. Изучение best practices:

  • Какие решения реализованы в Perplexity Deep Research, Bing Copilot, Google Search Generative Experience?

  • Что можно взять из UX игровых загрузочных экранов, которые удерживают внимание минутами?

  • Как Netflix, YouTube и другие платформы решают проблему долгих загрузок контента?

8.3.5. Визуализация процесса:

  • Какой подход вы бы предложили для отображения древовидной структуры поиска в реальном времени?

  • Как показать пользователю "карту исследования" с уже изученными и планируемыми направлениями?

  • Стоит ли создавать timeline исследования с отметками о найденных источниках?

8.3.6. Accessibility и инклюзивность:

  • Как обеспечить accessibility для пользователей с ограниченными возможностями?

  • Какие решения нужны для мультиязычности loading-экранов?

  • Как учесть пользователей с медленным интернетом или старыми устройствами?

8.3.7.Психология ожидания:

  • Какие когнитивные искажения влияют на восприятие времени ожидания?

  • Как использовать принципы геймификации для превращения ожидания в engaging experience?

  • Стоит ли давать пользователю возможность прервать процесс и получить частичные результаты?

8.4. Поделитесь своими идеями в комментариях:

Как вы решали проблему долгих ожиданий в своих проектах? Какие UX-паттерны показали лучшие результаты? Есть ли у вас опыт работы с AI-операциями, которые занимают минуты или часы?

Особенно интересны:

  • Конкретные примеры кода для создания engaging loading-экранов

  • Результаты A/B тестов различных подходов к UX ожидания

  • Инновационные решения, которые превращают ожидание в ценность для пользователя

  • Опыт интеграции с реальными AI-системами в production

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

9. Об авторе и проекте AIFA

Автор статьи Роман Большиянов в серии последних публикаций детально описывает инструменты и архитектурные решения, которые он реализует в своем амбициозном open-source проекте AIFA (AI-агенты в эволюционирующей и самореплицирующейся архитектуре).

В текущей реализации AIFA уже представляет собой потрясающий стартовый шаблон для создания AI-первых приложений с уникальным пользовательским интерфейсом, где искусственный интеллект становится основным способом взаимодействия, а традиционный веб-интерфейс — вспомогательной визуализацией.

Однако это только начало. Долгосрочная цель проекта — эволюция в полноценную AGI-систему, где AI-агенты будут обладать способностями к:

  • Самостоятельной эволюции и улучшению своих алгоритмов

  • Саморепликации и созданию новых специализированных агентов

  • Конкуренции и кооперации в распределенной среде

  • Автономной работе в веб-пространстве и блокчейн-сетях

Глубокий поиск, рассмотренный в этой статье, — лишь один из базовых навыков будущих AGI-агентов, которые смогут не только исследовать информацию, но и принимать решения, создавать продукты и взаимодействовать с реальным миром.

Если вам интересно наблюдать за развитием проекта и экспериментировать с передовыми AI-технологиями, не стесняйтесь форкнуть репозиторий AIFA и погрузиться в исследование архитектуры будущего. Каждый коммит приближает нас к созданию по-настоящему автономного искусственного интеллекта

Комментарии (0)