Старый туториал про research agent как Claude + Tavily + длинный Plan-and-Execute loop уже выглядит устаревшим. В 2026 у вас есть более правильные primitives:
web_search как built-in tool;file_search для собственной базы документов;o4-mini-deep-research, если нужен более мощный managed research mode;Поэтому ниже мы строим не "автономного web-краулера", а управляемый research workflow: planner -> collection -> synthesis -> report.
Research-агент в 2026 лучше мыслить не как chat-bot, а как workflow с разными типами работы:
web_search и file_search;Это проще тестировать, чем один "умный" autonomous agent.
Внешний поиск:
web_search в OpenAI Responses API;Внутренние документы:
file_search, если у вас уже есть vector store у провайдера;Практическое правило простое: research agent почти всегда должен уметь работать и с интернетом, и с внутренними файлами. Только web search редко даёт достаточную полезность для командовой аналитики.
Ниже не "полноценный фреймворк", а рабочий skeleton. Он делает три вещи:
import json
from openai import OpenAI
client = OpenAI()
VECTOR_STORE_ID = "vs_internal_research"
def plan_sections(topic: str) -> list[str]:
response = client.responses.create(
model="gpt-5-mini",
input=(
"Составь research plan из 4-6 разделов. "
"Верни JSON вида {\"sections\": [\"...\"]}.\n\n"
f"Тема: {topic}"
),
text={"format": {"type": "json_object"}},
)
return json.loads(response.output_text)["sections"]
def collect_notes(topic: str, section: str) -> str:
response = client.responses.create(
model="gpt-5.4",
reasoning={"effort": "medium"},
tools=[
{"type": "web_search"},
{
"type": "file_search",
"vector_store_ids": [VECTOR_STORE_ID],
"max_num_results": 4,
},
],
include=[
"web_search_call.action.sources",
"file_search_call.results",
],
input=(
"Собери section notes для будущего отчёта.\n"
"Требования:\n"
"1. Используй и внешний web search, и внутренний file search, если они релевантны.\n"
"2. Укажи только проверяемые выводы.\n"
"3. Верни markdown с буллетами, конфликтами между источниками и списком what-is-uncertain.\n\n"
f"Тема: {topic}\n"
f"Раздел: {section}"
),
)
return response.output_text
def write_report(topic: str, section_notes: dict[str, str]) -> str:
joined_notes = "\n\n".join(
f"## {section}\n{notes}" for section, notes in section_notes.items()
)
response = client.responses.create(
model="gpt-5.4",
input=(
"Напиши итоговый markdown-отчёт.\n"
"Структура: executive summary, основные разделы, risks / open questions, conclusion.\n"
"Не придумывай факты вне заметок.\n\n"
f"Тема: {topic}\n\n"
f"Section notes:\n{joined_notes}"
),
)
return response.output_text
topic = "Как reasoning-модели меняют enterprise search и knowledge work"
sections = plan_sections(topic)
notes = {section: collect_notes(topic, section) for section in sections}
report = write_report(topic, notes)
print(report)
Такой пайплайн уже полезен, потому что:
Если вам нужен не modular workflow, а более мощный managed research mode, OpenAI уже даёт o4-mini-deep-research и o3-deep-research.
Они полезны, когда:
Но есть важное ограничение: deep research модели удобны для сложного исследования, а не для каждого обычного аналитического запроса. Для регулярных отчётов, конкурентных обзоров и policy memo часто выгоднее собственный workflow на gpt-5-mini / gpt-5.4 плюс built-in tools.
Надёжный research agent в production почти всегда имеет четыре ограничения:
| Слой | Что ограничивать |
|---|---|
| Search policy | какие домены разрешены и нужен ли live internet |
| Retrieval policy | какие внутренние коллекции и metadata filters доступны |
| Budget policy | сколько section runs, search calls и токенов можно потратить |
| Review policy | какие выводы требуют человеческой проверки перед публикацией |
Это особенно важно для тем вроде финансов, регулирования, медицины и enterprise vendor analysis.
Если вы уже используете Agents SDK или другой runtime с трассировкой, research workflow стоит разбирать минимум по таким сигналам:
Research agent без traces быстро превращается в "вроде что-то нашёл, но непонятно почему так решил".
Хороший research agent в 2026 - это не "одна суперумная модель", а аккуратная сборка из planner, search, retrieval, synthesis и report writing.
Если нужен быстрый и управляемый baseline, начинайте с Responses API + web_search + file_search.
Если нужен более длинный и тяжёлый managed режим, смотрите на o4-mini-deep-research.
Но в обоих случаях главный выигрыш даёт не автономность сама по себе, а качественная source policy и review discipline.
1. Почему research agent лучше строить как workflow, а не как бесконечный autonomous loop?
2. Зачем research agent'у и `web_search`, и `file_search`?
3. Когда deep research model уместнее обычного planner + tools workflow?