Research Agent mit Gemini 2.5 Pro und LlamaIndex

LlamaIndex ist ein Framework zum Erstellen von Wissens-Agents mit LLMs, die mit Ihren Daten verbunden sind. In diesem Beispiel wird gezeigt, wie Sie einen Multi-Agent-Workflow für einen Research Agent erstellen. In LlamaIndex sind Workflows die Bausteine von Agenten- oder Multi-Agenten-Systemen.

Sie benötigen einen Gemini API-Schlüssel. Wenn Sie noch keinen haben, können Sie einen in Google AI Studio erstellen. Installieren Sie zuerst alle erforderlichen LlamaIndex-Bibliotheken.LlamaIndex verwendet das Paket google-genai.

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

Gemini 2.5 Pro in LlamaIndex einrichten

Die Engine eines LlamaIndex-Agents ist ein LLM, das für Reasoning und Textverarbeitung zuständig ist. In diesem Beispiel wird Gemini 2.5 Pro verwendet. Legen Sie Ihren API-Schlüssel als Umgebungsvariable fest.

from llama_index.llms.google_genai import GoogleGenAI

llm = GoogleGenAI(model="gemini-2.5-pro")

Build-Tools

Agents verwenden Tools, um mit der Außenwelt zu interagieren, z. B. um im Web zu suchen oder Informationen zu speichern. Tools in LlamaIndex können reguläre Python-Funktionen sein oder aus vorhandenen ToolSpecs importiert werden. Gemini enthält ein integriertes Tool für die Verwendung der Google Suche, das hier verwendet wird.

from google.genai import types

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

llm_with_search = GoogleGenAI(
    model="gemini-2.5-pro",
    generation_config=types.GenerateContentConfig(tools=[google_search_tool])
)

Testen Sie die LLM-Instanz jetzt mit einer Abfrage, für die eine Suche erforderlich ist:

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

Der Research Agent verwendet Python-Funktionen als Tools. Es gibt viele Möglichkeiten, ein System zu entwickeln, das diese Aufgabe ausführt. In diesem Beispiel verwenden Sie Folgendes:

  1. search_web verwendet Gemini mit der Google Suche, um im Web nach Informationen zum angegebenen Thema zu suchen.
  2. record_notes speichert im Status Informationen, die im Web gefunden wurden, damit sie von den anderen Tools verwendet werden können.
  3. write_report erstellt den Bericht anhand der Informationen, die von ResearchAgent gefunden wurden.
  4. review_report prüft den Bericht und gibt Feedback.

Die Klasse Context übergibt den Status zwischen Agents/Tools und jeder Agent hat Zugriff auf den aktuellen Status des Systems.

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."

Multi-Agent-Assistenten erstellen

Um ein Multi-Agent-System zu erstellen, definieren Sie die Agenten und ihre Interaktionen. Ihr System hat drei Agents:

  1. Mit ResearchAgent wird im Web nach Informationen zum angegebenen Thema gesucht.
  2. Ein WriteAgent erstellt den Bericht anhand der Informationen, die vom ResearchAgent gefunden wurden.
  3. Ein ReviewAgent prüft den Bericht und gibt Feedback.

In diesem Beispiel wird die Klasse AgentWorkflow verwendet, um ein Multi-Agent-System zu erstellen, das diese Agents in der angegebenen Reihenfolge ausführt. Jeder Agent erhält eine system_prompt, die ihm mitteilt, was er tun soll, und vorschlägt, wie er mit den anderen Agenten zusammenarbeiten kann.

Optional können Sie Ihr Multi-Agent-System unterstützen, indem Sie mit can_handoff_to angeben, mit welchen anderen Agents es kommunizieren kann. Andernfalls versucht es, dies selbst herauszufinden.

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"],
)

Die Agents sind definiert. Jetzt können Sie die AgentWorkflow erstellen und ausführen.

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.",
    },
)

Während der Ausführung des Workflows können Sie Ereignisse, Tool-Aufrufe und Updates in die Konsole streamen.

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

Nach Abschluss des Workflows können Sie die endgültige Ausgabe des Berichts sowie den endgültigen Prüfstatus des Prüfers ausdrucken.

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

Benutzerdefinierte Workflows

Die AgentWorkflow ist eine gute Möglichkeit, mit Multi-Agent-Systemen zu beginnen. Was aber, wenn Sie mehr Kontrolle benötigen? Sie können einen Workflow von Grund auf neu erstellen. Hier sind einige Gründe, warum Sie einen eigenen Workflow erstellen sollten:

  • Mehr Kontrolle über den Prozess: Sie können den genauen Pfad festlegen, den Ihre Agents nehmen. Dazu gehören das Erstellen von Schleifen, das Treffen von Entscheidungen an bestimmten Punkten oder die parallele Bearbeitung verschiedener Aufgaben durch Kundenservicemitarbeiter.
  • Komplexe Daten verwenden: Gehen Sie über einfachen Text hinaus. Mit benutzerdefinierten Workflows können Sie strukturiertere Daten wie JSON-Objekte oder benutzerdefinierte Klassen für Ihre Ein- und Ausgaben verwenden.
  • Mit verschiedenen Medien arbeiten: Erstellen Sie Agents, die nicht nur Text, sondern auch Bilder, Audio und Video verstehen und verarbeiten können.
  • Intelligentere Planung: Sie können einen Workflow entwerfen, in dem zuerst ein detaillierter Plan erstellt wird, bevor die Kundenservicemitarbeiter mit der Arbeit beginnen. Das ist nützlich für komplexe Aufgaben, die mehrere Schritte erfordern.
  • Selbstkorrektur aktivieren: Erstellen Sie Agents, die ihre eigene Arbeit überprüfen können. Wenn die Ausgabe nicht gut genug ist, kann der Agent es noch einmal versuchen und so eine Schleife von Verbesserungen durchlaufen, bis das Ergebnis perfekt ist.

Weitere Informationen zu LlamaIndex Workflows finden Sie in der Dokumentation zu LlamaIndex Workflows.