Du möchtest mit Qwen3 von Alibaba Aufgaben automatisieren, bei denen das KI-Modell externe Werkzeuge nutzen kann? Dann bist du hier genau richtig. In diesem Tutorial zeige ich dir Schritt für Schritt, wie du die leistungsstarke Tool-Use-Funktion von Qwen3 nutzt – und zwar im selben Format wie bei OpenAI. Das bedeutet: Du kannst dein bestehendes Wissen zu OpenAI direkt anwenden.
Als ich vor zwei Jahren das erste Mal mit Funktionsaufrufen arbeitete, dachte ich, das wäre extrem kompliziert. Spoiler: Ist es nicht. Nach diesem Tutorial wirst du deine ersten Funktionsaufrufe implementieren können – versprochen.
Was sind Tool Use (Funktionsaufrufe) eigentlich?
Bevor wir in den Code eintauchen, lass mich kurz erklären, was wir hier eigentlich bauen:
Normale KI-Chatbots können nur Text antworten. Mit Tool Use kann die KI jedoch richtig handeln:
- Sie kann das aktuelle Wetter abfragen
- Sie kann Berechnungen durchführen
- Sie kann in Datenbanken suchen
- Sie kann Dateien erstellen oder lesen
Stell dir vor: Du fragst die KI „Wie ist das Wetter in Berlin morgen?" – anstatt eine falsche Antwort zu erfinden, ruft sie automatisch eine Wetter-API auf und gibt dir die echten Daten zurück. Das ist der Kern von Tool Use.
Das OpenAI-kompatible Format verstehen
Qwen3 unterstützt das OpenAI-Format. Das ist fantastisch, weil:
- Du OpenAI-Dokumentation direkt anwenden kannst
- Viele existierende Bibliotheken und Tools funktionieren
- Der Umstieg von OpenAI zu Qwen3 extrem einfach wird
Ein Funktionsaufruf besteht aus drei Teilen:
- tools – Die Liste aller verfügbaren Funktionen
- function_call – Welche Funktion die KI aufrufen möchte
- function_response – Das Ergebnis der Funktion
Vorbereitung: HolySheep AI einrichten
Bevor wir starten, brauchst du einen API-Zugang. Ich empfehle HolySheep AI aus folgenden Gründen:
- 85%+ günstiger als OpenAI (DeepSeek V3.2 nur $0.42/MTok vs. GPT-4.1 $8)
- Unterstützung für Alipay und WeChat – perfekt für chinesische Nutzer
- Unter 50ms Latenz – extrem schnell
- Kostenlose Credits zum Testen
Schritt 1: Die Basis-Verbindung aufbauen
Zuerst installieren wir das benötigte Paket und richten die Verbindung ein:
# Installation der benötigten Bibliothek
pip install openai
Python-Code für die Verbindung zu HolySheep AI
from openai import OpenAI
API-Client erstellen
client = OpenAI(
api_key="YOUR_HOLYSHEEP_API_KEY", # Ersetze mit deinem echten Key
base_url="https://api.holysheep.ai/v1" # WICHTIG: HolySheep-Endpunkt
)
Einfacher Test: Ist die Verbindung erfolgreich?
response = client.chat.completions.create(
model="qwen3-32b",
messages=[{"role": "user", "content": "Sag hallo!"}]
)
print(response.choices[0].message.content)
Wichtig: Ersetze YOUR_HOLYSHEEP_API_KEY mit deinem echten API-Schlüssel von HolySheep. Falls du noch keinen hast, registriere dich jetzt kostenlos.
Schritt 2: Werkzeuge (Tools) definieren
Jetzt definieren wir die Funktionen, die Qwen3 nutzen darf. Wir erstellen drei praktische Beispiele:
# Definition der verfügbaren Werkzeuge im OpenAI-Format
tools = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "Erfährt das aktuelle Wetter für einen bestimmten Ort",
"parameters": {
"type": "object",
"properties": {
"ort": {
"type": "string",
"description": "Der Stadtname, z.B. 'Berlin' oder 'München'"
},
"einheit": {
"type": "string",
"enum": ["celsius", "fahrenheit"],
"description": "Temperaturausgabe in Celsius oder Fahrenheit"
}
},
"required": ["ort"]
}
}
},
{
"type": "function",
"function": {
"name": "rechne",
"description": "Führt mathematische Berechnungen durch",
"parameters": {
"type": "object",
"properties": {
"ausdruck": {
"type": "string",
"description": "Der mathematische Ausdruck, z.B. '15 * 8 + 42'"
}
},
"required": ["ausdruck"]
}
}
},
{
"type": "function",
"function": {
"name": "get_current_time",
"description": "Gibt das aktuelle Datum und die Uhrzeit zurück",
"parameters": {
"type": "object",
"properties": {}
}
}
}
]
Sieh dir die Struktur genau an:
- name: Der eindeutige Name der Funktion
- description: Was macht diese Funktion? Qwen3 nutzt das, um zu entscheiden, wann welche Funktion geeignet ist
- parameters: Welche Eingabewerte erwartet die Funktion?
- required: Pflichtfelder markieren
Schritt 3: Die Funktionen tatsächlich implementieren
Jetzt brauchen wir den Code, der ausgeführt wird, wenn Qwen3 eine Funktion aufruft:
import random
from datetime import datetime
Die tatsächliche Implementierung unserer Werkzeuge
def get_weather(ort: str, einheit: str = "celsius") -> str:
"""Simuliert eine Wetter-API Abfrage"""
# In echtem Code: Hier eine echte Wetter-API aufrufen
temperatur = random.randint(15, 30)
wetterlagen = ["sonnig", "wolkig", "regnerisch", "bewölkt"]
if einheit == "fahrenheit":
temperatur = temperatur * 9/5 + 32
wetter = random.choice(wetterlagen)
return f"In {ort} ist es {temperatur}°C und {wetter}."
def rechne(ausdruck: str) -> str:
"""Führt sichere mathematische Berechnungen durch"""
try:
# WICHTIG: In Produktion niemals eval() verwenden!
# Hier nur für Demo-Zwecke
erlaubte_zeichen = set("0123456789+-*/(). "))
if all(c in erlaubte_zeichen for c in ausdruck):
ergebnis = eval(ausdruck)
return f"Das Ergebnis von '{ausdruck}' ist {ergebnis}"
else:
return "Fehler: Nur grundlegende Mathematik erlaubt"
except Exception as e:
return f"Rechenfehler: {str(e)}"
def get_current_time() -> str:
"""Gibt die aktuelle Zeit zurück"""
jetzt = datetime.now()
return f"Es ist {jetzt.strftime('%H:%M:%S')} Uhr am {jetzt.strftime('%d.%m.%Y')}."
Mapping von Funktionsnamen zu tatsächlichen Funktionen
funktion_map = {
"get_weather": get_weather,
"rechne": rechne,
"get_current_time": get_current_time
}
Schritt 4: Das vollständige Konversationssystem
Hier ist das Herzstück – der komplette Code, der alles zusammensetzt:
from openai import OpenAI
client = OpenAI(
api_key="YOUR_HOLYSHEEP_API_KEY",
base_url="https://api.holysheep.ai/v1"
)
def kommuniziere_mit_ki(nachricht: str):
"""Führt eine Konversation mit Tool-Nutzung durch"""
nachrichten = [{"role": "user", "content": nachricht}]
while True:
# Anfrage an Qwen3 senden
antwort = client.chat.completions.create(
model="qwen3-32b",
messages=nachrichten,
tools=tools, # Unsere definierten Werkzeuge
tool_choice="auto" # KI entscheidet selbst, ob Werkzeug nötig
)
ergebnis = antwort.choices[0].message
# Hat die KI eine Funktion aufgerufen?
if ergebnis.tool_calls:
# Alle Funktionsaufrufe verarbeiten
for call in ergebnis.tool_calls:
funktions_name = call.function.name
argumente = call.function.arguments
print(f"\n🔧 KI möchte '{funktions_name}' aufrufen...")
print(f" Argumente: {argumente}")
# Argumente parsen
import json
args = json.loads(argumente)
# Funktion ausführen
funktion = funktion_map[funktions_name]
resultat = funktion(**args)
print(f" Ergebnis: {resultat}")
# Ergebnis zur Konversation hinzufügen
nachrichten.append({
"role": "assistant",
"content": None,
"tool_calls": [call]
})
nachrichten.append({
"role": "tool",
"tool_call_id": call.id,
"content": resultat
})
else:
# Keine Funktion – normale Antwort
print(f"\n💬 KI antwortet: {ergebnis.content}")
nachrichten.append({"role": "assistant", "content": ergebnis.content})
break
return ergebnis.content
Beispiel-Gespräche zum Testen
if __name__ == "__main__":
print("=== Qwen3 Tool Use Demo ===\n")
# Test 1: Wetterabfrage
print("\n--- Test 1: Wetter ---")
kommuniziere_mit_ki("Wie ist das Wetter in Tokio?")
# Test 2: Berechnung
print("\n--- Test 2: Mathematik ---")
kommuniziere_mit_ki("Was ist 125 geteilt durch 5 plus 17?")
# Test 3: Zeitabfrage
print("\n--- Test 3: Uhrzeit ---")
kommuniziere_mit_ki("Welche Zeit ist es gerade?")
Schritt 5: Die JSON-Format-Konvertierung verstehen
Manchmal brauchst du die Daten im JSON-Format für eigene Verarbeitung:
import json
def konvertiere_funktionsaufruf_zu_json(werkzeug_aufruf):
"""Konvertiert das HolySheep/OpenAI-Format zu sauberem JSON"""
return {
"funktions_name": werkzeug_aufruf.function.name,
"argumente": json.loads(werkzeug_aufruf.function.arguments),
"aufruf_id": werkzeug_aufruf.id
}
def parse_rohes_json_format():
"""Zeigt, wie das Rohformat aussieht"""
rohes_format = {
"type": "function",
"function": {
"name": "get_weather",
"arguments": '{"ort": "Berlin", "einheit": "celsius"}'
}
}
# Konvertierung zu Python-Objekt
name = rohes_format["function"]["name"]
argumente = json.loads(rohes_format["function"]["arguments"])
print(f"Funktion: {name}")
print(f"Parameter: {argumente}")
return {"name": name, "args": argumente}
Praxisbeispiel: Eigene Tool-Funktion erstellen
Lass uns eine nützliche Funktion für die不问不问不问不问不问不问不问不问不问不问不问不问不问不问不问不问不问不问不问不问不问不问不问不问不问不问不问不问问问问问不问不不不不不不不问问问问问-Industrie erstellen:
# Erweiterte Werkzeug-Definition für Finanzdaten
finanz_tools = [
{
"type": "function",
"function": {
"name": "währungs_umrechner",
"description": "Rechnet Geldbeträge zwischen verschiedenen Währungen um",
"parameters": {
"type": "object",
"properties": {
"betrag": {"type": "number", "description": "Der zu umrechnende Betrag"},
"von_währung": {"type": "string", "description": "Ausgangswährung, z.B. 'USD'"},
"zu_währung": {"type": "string", "description": "Zielwährung, z.B. 'CNY'"}
},
"required": ["betrag", "von_währung", "zu_währung"]
}
}
},
{
"type": "function",
"function": {
"name": "kurs_check",
"description": "Zeigt aktuelle Wechselkurse an",
"parameters": {
"type": "object",
"properties": {
"basis_währung": {"type": "string", "description": "Basiswährung, z.B. 'USD'"}
},
"required": ["basis_währung"]
}
}
}
]
def währungs_umrechner(betrag: float, von_währung: str, zu_währung: str) -> str:
"""Konvertiert Währungen (vereinfachtes Demo-Modell)"""
wechselkurse_usd = {
"USD": 1.0,
"CNY": 7.25, # Demo-Kurse, nicht real!
"EUR": 0.92,
"JPY": 149.50
}
if von_währung not in wechselkurse_usd or zu_währung not in wechselkurse_usd:
return f"Währung nicht unterstützt: {von_währung} oder {zu_währung}"
# Umrechnung über USD als Zwischenwährung
in_usd = betrag / wechselkurse_usd[von_währung]
ergebnis = in_usd * wechselkurse_usd[zu_währung]
return f"{betrag} {von_währung} = {ergebnis:.2f} {zu_währung}"
def kurs_check(basis_währung: str) -> str:
"""Gibt alle Kurse relativ zur Basiswährung aus"""
wechselkurse_usd = {"USD": 1.0, "CNY": 7.25, "EUR": 0.92, "JPY": 149.50}
if basis_währung not in wechselkurse_usd:
return f"Währung nicht gefunden: {basis_währung}"
basis_kurs = wechselkurse_usd[basis_währung]
ergebnisse = []
for währung, kurs in wechselkurse_usd.items():
if währung != basis_währung:
relativer_kurs = kurs / basis_kurs
ergebnisse.append(f"1 {basis_währung} = {relativer_kurs:.4f} {währung}")
return "\n".join(ergebnisse)
Test
print(währungs_umrechner(100, "EUR", "CNY"))
print(kurs_check("USD"))
Häufige Fehler und Lösungen
Fehler 1: "tool_calls is None" – Die KI ruft keine Funktion auf
Symptom: Du sendest eine Anfrage mit Tools, aber die KI antwortet nur mit Text, anstatt die Funktion aufzurufen.
Mögliche Ursachen:
- Das Modell unterstützt keine Tool Calls (ältere Modelle)
- Die Prompt-Beschreibung ist nicht klar genug
- Du verwendest ein anderes Modell
Lösung:
# Fehlerhafter Code
response = client.chat.completions.create(
model="qwen3-32b", # Richtig, aber manchmal braucht man Parameter
messages=[{"role": "user", "content": "Wetter?"}], # Zu vage!
tools=tools
)
Lösung: Klarere Anfrage + tool_choice erzwingen
response = client.chat.completions.create(
model="qwen3-32b",
messages=[{
"role": "user",
"content": "Ich möchte wissen, wie das Wetter morgen in Hamburg wird.
Könntest du dafür die Wettern-API nutzen?"
}],
tools=tools,
tool_choice="auto" # Oder "required" wenn Funktion zwingend sein soll
)
Prüfen ob tatsächlich Tool Call kam
if response.choices[0].message.tool_calls:
print("✓ Funktion wurde aufgerufen!")
else:
print("✗ Kein Funktionsaufruf - Anfrage präziser formulieren")
Fehler 2: JSONParseError bei function.arguments
Symptom: json.loads(antwort.tool_calls[0].function.arguments) wirft einen Fehler.
Lösung:
import json
def sicher_parsen(argumente):
"""Parse-Fehler abfangen und beheben"""
try:
return json.loads(argumente)
except json.JSONDecodeError as e:
# Manchmal sind die Argumente schon ein Dict
if isinstance(argumente, dict):
return argumente
# Oder es gibt Encoding-Probleme
if isinstance(argumente, str):
# Versuche verschiedene Encodings
for enc in ['utf-8', 'latin-1', 'cp1252']:
try:
return json.loads(argumente.encode(enc))
except:
continue
raise ValueError(f"Konnte Argumente nicht parsen: {argumente}")
Fehler 3: Authentication Error – Falscher API-Key
Symptom: AuthenticationError oder 401 Unauthorized
Lösung:
import os
def erstelle_client():
"""Sicherer Client-Setup mit Fehlerbehandlung"""
api_key = os.environ.get("HOLYSHEEP_API_KEY")
if not api_key:
raise ValueError(
"API-Key nicht gefunden! "
"Setze die Umgebungsvariable: "
"export HOLYSHEEP_API_KEY='dein-key-hier'"
)
if api_key == "YOUR_HOLYSHEEP_API_KEY":
raise ValueError(
"Bitte ersetze 'YOUR_HOLYSHEEP_API_KEY' mit deinem echten Key! "
"Hole ihn dir kostenlos bei https://www.holysheep.ai/register"
)
return OpenAI(
api_key=api_key,
base_url="https://api.holysheep.ai/v1"
)
Verwendung
try:
client = erstelle_client()
except ValueError as e:
print(f"Fehler: {e}")
Fehler 4: Rate Limit erreicht
Symptom: RateLimitError bei vielen An