Zum Hauptinhalt springen
Lektion 13 von 14 · Function Calling mit Grok

Multi-Tool Pipeline

Lektion 13 von 14 Aktualisiert am 29. Juli 2026 Entwickler
Auf dieser Seite
  1. Sequentielle Orchestrierung von Werkzeugen
  2. Pipeline-Architektur
  3. Beispiel: Wettbewerbs-Intelligence-Pipeline
  4. Pipeline-Ausführung
  5. Kombination von Server- und Client-Werkzeugen in einer Pipeline
  6. Muster: Fan-out / Fan-in
  7. Fehlerbehandlung in einer Pipeline
  8. Kernaussagen

Sequentielle Orchestrierung von Werkzeugen

Der Wetter-Agent aus der vorherigen Lektion verwendete unabhängige Werkzeuge. In einer Multi-Tool-Pipeline ernähren die Ergebnisse eines Werkzeugs den nächsten Aufruf. Das Modell orchestriert die Abfolge automatisch – Ihre Aufgabe besteht darin, die Werkzeuge bereitzustellen und die Aufrufe auszuführen.

Pipeline-Architektur

Eine typische Pipeline folgt diesem Schema:

Search → Analysis → Action → Notification

Jeder Schritt erzeugt Daten, die vom nächsten Schritt verbraucht werden. Das Modell übernimmt diese Orchestrierung natürlich dank des Gesprächskontexts.

Beispiel: Wettbewerbs-Intelligence-Pipeline

Stellen Sie sich eine Pipeline vor, die Wettbewerbspreise überwacht und einen Bericht erstellt:

tools = [
    {
        "type": "function",
        "function": {
            "name": "scrape_competitor_prices",
            "description": "Retrieve current prices from a competitor "
                          "for a list of products. Returns an array "
                          "of {product, price, availability}.",
            "parameters": {
                "type": "object",
                "properties": {
                    "competitor": {
                        "type": "string",
                        "description": "Competitor name"
                    },
                    "products": {
                        "type": "array",
                        "items": {"type": "string"},
                        "description": "List of products to check"
                    }
                },
                "required": ["competitor", "products"]
            }
        }
    },
    {
        "type": "function",
        "function": {
            "name": "compare_with_our_prices",
            "description": "Compare competitor prices with our prices. "
                          "Returns percentage gaps and adjustment "
                          "recommendations.",
            "parameters": {
                "type": "object",
                "properties": {
                    "competitor_prices": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "product": {"type": "string"},
                                "price": {"type": "number"}
                            }
                        }
                    }
                },
                "required": ["competitor_prices"]
            }
        }
    },
    {
        "type": "function",
        "function": {
            "name": "generate_report",
            "description": "Generate a PDF report with the benchmark "
                          "analysis results. Returns the report URL.",
            "parameters": {
                "type": "object",
                "properties": {
                    "title": {"type": "string"},
                    "data": {"type": "object"},
                    "format": {
                        "type": "string",
                        "enum": ["pdf", "csv", "json"]
                    }
                },
                "required": ["title", "data"]
            }
        }
    },
    {
        "type": "function",
        "function": {
            "name": "send_notification",
            "description": "Send an email or Slack notification "
                          "with a summary and a link to the report.",
            "parameters": {
                "type": "object",
                "properties": {
                    "channel": {
                        "type": "string",
                        "enum": ["email", "slack"]
                    },
                    "recipient": {"type": "string"},
                    "message": {"type": "string"},
                    "attachment_url": {"type": "string"}
                },
                "required": ["channel", "recipient", "message"]
            }
        }
    }
]

Pipeline-Ausführung

Wenn der Benutzer fragt: „Analysieren Sie die Preise von CompetitorX für unsere Top-5-Produkte und senden Sie den Bericht an das Vertriebsteam”, orchestriert das Modell:

Turn 1 : scrape_competitor_prices(competitor="CompetitorX", products=[...])
Turn 2 : compare_with_our_prices(competitor_prices=[results from turn 1])
Turn 3 : generate_report(title="CompetitorX Price Monitoring", data={...})
Turn 4 : send_notification(channel="slack", recipient="#sales", ...)

Jeder Turn nutzt die Ergebnisse des vorherigen. Das Modell überträgt Daten natürlich von einem Werkzeug zum nächsten.

Kombination von Server- und Client-Werkzeugen in einer Pipeline

Die leistungsfähigsten Pipelines kombinieren Server- und Client-Werkzeuge:

tools = [
    {"type": "web_search"},  # Server: web search
    {
        "type": "function",
        "function": {
            "name": "extract_data",
            "description": "Extract structured data from raw text",
            "parameters": { ... }
        }
    },
    {
        "type": "function",
        "function": {
            "name": "save_to_crm",
            "description": "Save extracted data to the CRM",
            "parameters": { ... }
        }
    }
]

Ablauf: Das Modell führt eine Websuche durch (automatisch auf Serverseite), ruft dann Ihre Extraktionsfunktion auf (Clientseite) und speichert schließlich die Daten im CRM (Clientseite).

Muster: Fan-out / Fan-in

Manche Pipelines erfordern ein Fan-out-Muster (mehrere parallele Aufrufe), gefolgt von einem Fan-in (Aggregation der Ergebnisse):

         ┌→ scrape_site_A ─┐
Request ─┤→ scrape_site_B ─┤→ aggregate_results → generate_report
         └→ scrape_site_C ─┘

Das Modell bewältigt dies natürlich mit parallelen Aufrufen:

Turn 1 : [scrape_site_A, scrape_site_B, scrape_site_C]  (parallel)
Turn 2 : aggregate_results(data=[result_A, result_B, result_C])
Turn 3 : generate_report(aggregated_data={...})

Fehlerbehandlung in einer Pipeline

Eine robuste Pipeline behandelt Fehler in jedem Schritt:

def execute_with_retry(name, args, max_retries=2):
    for attempt in range(max_retries + 1):
        try:
            result = execute_function(name, args)
            if "error" not in result:
                return result
        except Exception:
            pass

        if attempt < max_retries:
            time.sleep(1)  # Wait before retry

    return {
        "error": f"Failed after {max_retries + 1} attempts",
        "function": name,
        "partial_data": None
    }

Wenn ein Schritt fehlschlägt, kann das Modell:

  • Mit angepassten Parametern erneut versuchen
  • Den Schritt überspringen und mit unvollständigen Daten fortfahren
  • Den Benutzer informieren und Anweisungen anfordern

Kernaussagen

  • Eine Multi-Tool-Pipeline verknüpft die Ergebnisse eines Werkzeugs mit dem nächsten.
  • Das Modell orchestriert die Abfolge automatisch dank des Kontexts.
  • Das Fan-out/Fan-in-Muster kombiniert parallele Aufrufe und Aggregation.
  • Kombinieren Sie Server-Werkzeuge (web_search) und Client-Werkzeuge (Ihre Funktionen) für hybride Pipelines.
  • Behandeln Sie Fehler in jedem Schritt mit Retry und Fallback-Mechanismen.
  • Jedes Werkzeug in der Pipeline muss eine klare, einzelne Verantwortung haben.