Исследовательский агент компаний Gemini и LlamaIndex.

LlamaIndex — это фреймворк для создания агентов знаний с использованием LLM, подключенных к вашим данным. В этом примере показано, как создать многоагентный рабочий процесс для исследовательского агента. В LlamaIndex Workflows являются строительными блоками для агентов и многоагентных систем.

Вам потребуется ключ API Gemini. Если у вас его еще нет, вы можете получить его в Google AI Studio . Сначала установите все необходимые библиотеки LlamaIndex. LlamaIndex использует пакет google-genai в качестве основы.

pip install llama-index llama-index-utils-workflow llama-index-llms-google-genai llama-index-tools-google

Настройте Gemini в LlamaIndex.

Движок любого агента LlamaIndex — это LLM, который обрабатывает логические рассуждения и текст. В этом примере используется Gemini 3 Flash. Убедитесь, что вы установили свой API-ключ в качестве переменной среды .

import os
from llama_index.llms.google_genai import GoogleGenAI

# Set your API key in the environment elsewhere, or with os.environ['GEMINI_API_KEY'] = '...'
assert 'GEMINI_API_KEY' in os.environ

llm = GoogleGenAI(model="gemini-3-flash-preview")

Инструменты для сборки

Агенты используют инструменты для взаимодействия с внешним миром, например, для поиска в интернете или хранения информации. Инструменты в LlamaIndex могут быть обычными функциями Python или импортироваться из уже существующих ToolSpecs . Gemini поставляется со встроенным инструментом для использования поиска Google, который используется здесь.

from google.genai import types

google_search_tool = types.Tool(
    google_search=types.GoogleSearch()
)

llm_with_search = GoogleGenAI(
    model="gemini-3-flash-preview",
    generation_config=types.GenerateContentConfig(tools=[google_search_tool])
)

Теперь протестируйте экземпляр LLM с запросом, требующим поиска. В этом руководстве предполагается работающий цикл обработки событий (например, с помощью python -m asyncio или Google Colab).

response = await llm_with_search.acomplete("What's the weather like today in Biarritz?")
print(response)

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

  1. search_web использует Gemini совместно с Google Search для поиска в интернете информации по заданной теме.
  2. record_notes сохраняет результаты поиска в интернете в состояние системы, чтобы другие инструменты могли их использовать.
  3. write_report создает отчет, используя информацию, полученную с помощью ResearchAgent
  4. review_report просматривает отчет и предоставляет обратную связь.

Класс Context передает состояние между агентами/инструментами, и каждый агент будет иметь доступ к текущему состоянию системы.

from llama_index.core.workflow import Context

async def search_web(ctx: Context, query: str) -> str:
    """Useful for searching the web about a specific query or topic"""
    response = await llm_with_search.acomplete(f"""Please research given this query or topic,
    and return the result\n<query_or_topic>{query}</query_or_topic>""")
    return response

async def record_notes(ctx: Context, notes: str, notes_title: str) -> str:
    """Useful for recording notes on a given topic."""
    current_state = await ctx.store.get("state")
    if "research_notes" not in current_state:
        current_state["research_notes"] = {}
    current_state["research_notes"][notes_title] = notes
    await ctx.store.set("state", current_state)
    return "Notes recorded."

async def write_report(ctx: Context, report_content: str) -> str:
    """Useful for writing a report on a given topic."""
    current_state = await ctx.store.get("state")
    current_state["report_content"] = report_content
    await ctx.store.set("state", current_state)
    return "Report written."

async def review_report(ctx: Context, review: str) -> str:
    """Useful for reviewing a report and providing feedback."""
    current_state = await ctx.store.get("state")
    current_state["review"] = review
    await ctx.store.set("state", current_state)
    return "Report reviewed."

Создайте многоагентного помощника.

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

  1. ResearchAgent осуществляет поиск в интернете информации по заданной теме.
  2. WriteAgent создает отчет, используя информацию, полученную ResearchAgent .
  3. Специалист ReviewAgent проверяет отчет и предоставляет обратную связь.

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

При желании вы можете помочь вашей многоагентной системе, указав, с какими другими агентами она может взаимодействовать, используя can_handoff_to (в противном случае она попытается определить это самостоятельно).

from llama_index.core.agent.workflow import (
    AgentInput,
    AgentOutput,
    ToolCall,
    ToolCallResult,
    AgentStream,
)
from llama_index.core.agent.workflow import FunctionAgent, ReActAgent

research_agent = FunctionAgent(
    name="ResearchAgent",
    description="Useful for searching the web for information on a given topic and recording notes on the topic.",
    system_prompt=(
        "You are the ResearchAgent that can search the web for information on a given topic and record notes on the topic. "
        "Once notes are recorded and you are satisfied, you should hand off control to the WriteAgent to write a report on the topic."
    ),
    llm=llm,
    tools=[search_web, record_notes],
    can_handoff_to=["WriteAgent"],
)

write_agent = FunctionAgent(
    name="WriteAgent",
    description="Useful for writing a report on a given topic.",
    system_prompt=(
        "You are the WriteAgent that can write a report on a given topic. "
        "Your report should be in a markdown format. The content should be grounded in the research notes. "
        "Once the report is written, you should get feedback at least once from the ReviewAgent."
    ),
    llm=llm,
    tools=[write_report],
    can_handoff_to=["ReviewAgent", "ResearchAgent"],
)

review_agent = FunctionAgent(
    name="ReviewAgent",
    description="Useful for reviewing a report and providing feedback.",
    system_prompt=(
        "You are the ReviewAgent that can review a report and provide feedback. "
        "Your feedback should either approve the current report or request changes for the WriteAgent to implement."
    ),
    llm=llm,
    tools=[review_report],
    can_handoff_to=["ResearchAgent","WriteAgent"],
)

Агенты определены, теперь вы можете создать AgentWorkflow и запустить его.

from llama_index.core.agent.workflow import AgentWorkflow

agent_workflow = AgentWorkflow(
    agents=[research_agent, write_agent, review_agent],
    root_agent=research_agent.name,
    initial_state={
        "research_notes": {},
        "report_content": "Not written yet.",
        "review": "Review required.",
    },
)

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

from llama_index.core.agent.workflow import (
    AgentInput,
    AgentOutput,
    ToolCall,
    ToolCallResult,
    AgentStream,
)

research_topic = """Write me a report on the history of the web.
Briefly describe the history of the world wide web, including
the development of the internet and the development of the web,
including 21st century developments"""

handler = agent_workflow.run(
    user_msg=research_topic
)

current_agent = None
current_tool_calls = ""
async for event in handler.stream_events():
    if (
        hasattr(event, "current_agent_name")
        and event.current_agent_name != current_agent
    ):
        current_agent = event.current_agent_name
        print(f"\n{'='*50}")
        print(f"🤖 Agent: {current_agent}")
        print(f"{'='*50}\n")
    elif isinstance(event, AgentOutput):
        if event.response.content:
            print("📤 Output:", event.response.content)
        if event.tool_calls:
            print(
                "🛠️  Planning to use tools:",
                [call.tool_name for call in event.tool_calls],
            )
    elif isinstance(event, ToolCallResult):
        print(f"🔧 Tool Result ({event.tool_name}):")
        print(f"  Arguments: {event.tool_kwargs}")
        print(f"  Output: {event.tool_output}")
    elif isinstance(event, ToolCall):
        print(f"🔨 Calling Tool: {event.tool_name}")
        print(f"  With arguments: {event.tool_kwargs}")

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

state = await handler.ctx.store.get("state")
print("Report Content:\n", state["report_content"])
print("\n------------\nFinal Review:\n", state["review"])

Расширьте возможности, используя настраиваемые рабочие процессы.

AgentWorkflow — отличный способ начать работу с многоагентными системами. Но что, если вам нужен больший контроль? Вы можете создать рабочий процесс с нуля. Вот несколько причин, по которым вам может понадобиться создать собственный рабочий процесс:

  • Больше контроля над процессом : вы можете точно определить путь, по которому будут двигаться ваши агенты. Это включает в себя создание циклов, принятие решений в определенных точках или параллельную работу агентов над различными задачами.
  • Используйте сложные данные : выходите за рамки простого текста. Пользовательские рабочие процессы позволяют использовать более структурированные данные, такие как объекты JSON или пользовательские классы, для входных и выходных данных.
  • Работа с различными медиа : создавайте агентов, способных понимать и обрабатывать не только текст, но и изображения, аудио и видео.
  • Более продуманное планирование : вы можете разработать рабочий процесс, который сначала создаст подробный план, прежде чем агенты начнут работу. Это полезно для сложных задач, требующих выполнения нескольких шагов.
  • Включите самокоррекцию : создайте агентов, которые могут проверять свою собственную работу. Если результат недостаточно хорош, агент может попробовать еще раз, создавая цикл улучшений до тех пор, пока результат не станет идеальным.

Чтобы узнать больше о рабочих процессах LlamaIndex, см. документацию по рабочим процессам LlamaIndex .