Recherchergebnisse mit Gemini und LlamaIndex abrufen

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 und Multi-Agenten-Systemen.

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

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

Gemini in LlamaIndex einrichten

Die Engine eines jeden LlamaIndex-Agents ist ein LLM, das für die Verarbeitung von Logik und Text zuständig ist. In diesem Beispiel wird Gemini 3 Flash verwendet. Legen Sie Ihren API-Schlüssel als Umgebungsvariable fest.

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

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 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-3-flash-preview",
    generation_config=types.GenerateContentConfig(tools=[google_search_tool])
)

Testen Sie die LLM-Instanz nun mit einer Anfrage, für die eine Suche erforderlich ist. In dieser Anleitung wird davon ausgegangen, dass eine laufende Ereignisschleife vorhanden ist (z. B. python -m asyncio oder Google Colab).

response = await llm_with_search.acomplete("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 Web gefundene Informationen im Status, damit die anderen Tools sie verwenden 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 Agents und ihre Interaktionen. Ihr System hat drei Agents:

  1. Mit ResearchAgent wird das Web nach Informationen zum angegebenen Thema durchsucht.
  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, in dem die Agents nacheinander ausgeführt werden. Jeder Agent erhält einen system_prompt, der ihm sagt, 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 Agenten 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üfbeauftragten ausdrucken.

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

Benutzerdefinierte Workflows

Der AgentWorkflow ist ein guter Ausgangspunkt für Multi-Agenten-Systeme. 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 Kundenservicemitarbeiter einschlagen. Dazu gehört das Erstellen von Schleifen, das Treffen von Entscheidungen an bestimmten Punkten oder die parallele Bearbeitung verschiedener Aufgaben durch Agents.
  • Komplexe Daten verwenden: Gehen Sie über reinen 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 Agents mit der Arbeit beginnen. Das ist nützlich für komplexe Aufgaben, die mehrere Schritte erfordern.
  • Selbstkorrektur aktivieren: Erstellen Sie KI-Agenten, 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 erstellen, bis das Ergebnis perfekt ist.

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