Hier geht es um die Verwendung fortgeschrittener Werkzeuge.
Wenn Sie neu im Bereich der Bauagenten sind, sollten Sie zuerst die Intro zu Agenten und die geführte Besichtigung von smolagents.
Was ist ein Werkzeug, und wie baut man es? #
Ein Werkzeug ist meist eine Funktion, die ein LLM in einem agentenbasierten System nutzen kann.
Aber um es zu benutzen, muss dem LLM eine API gegeben werden: Name, Werkzeugbeschreibung, Eingabetypen und Beschreibungen, Ausgabetyp.
Es kann also nicht nur eine Funktion sein. Es sollte eine Klasse sein.
Im Kern ist das Tool also eine Klasse, die eine Funktion mit Metadaten umhüllt, die dem LLM helfen zu verstehen, wie sie zu verwenden ist.
So sieht es aus:
Kopiert
von smolagents importieren Werkzeug class HFModelDownloadsTool(Tool): name = "model_download_counter" description = """ Dies ist ein Tool, das das am häufigsten heruntergeladene Modell einer bestimmten Aufgabe auf dem Hugging Face Hub zurückgibt. Es gibt den Namen des Checkpoints zurück.""" inputs = { "task": { "type": "string", "description": "die Aufgabenkategorie (z. B. Textklassifizierung, Tiefenabschätzung usw.)", } } output_type = "string" def forward(self, task: str): from huggingface_hub import list_models model = next(iter(list_models(filter=task, sort="downloads", direction=-1))) return model.id model_downloads_tool = HFModelDownloadsTool()
Die Unterklassen der benutzerdefinierten Werkzeuge Werkzeug um nützliche Methoden zu erben. Die Kindklasse definiert auch:
- Ein Attribut
Name
der dem Namen des Werkzeugs selbst entspricht. Der Name beschreibt normalerweise, was das Werkzeug tut. Da der Code das Modell mit den meisten Downloads für eine Aufgabe zurückgibt, nennen wir esmodel_download_counter
. - Ein Attribut
Beschreibung
wird verwendet, um die System-Eingabeaufforderung des Agenten zu füllen. - Eine
Eingaben
Attribut, das ein Wörterbuch mit Schlüsseln ist"Typ"
und"Beschreibung"
. Sie enthält Informationen, die dem Python-Interpreter helfen, eine fundierte Entscheidung über die Eingabe zu treffen. - Eine
ausgabe_art
Attribut, das den Ausgabetyp angibt. Die Typen für beideEingaben
undausgabe_art
sollte sein Pydantische Formatekönnen sie eines von beiden sein:~AUTHORIZED_TYPES()
. - A
weiter
Methode, die den auszuführenden Inferenzcode enthält.
Und das ist alles, was es braucht, um in einem Agenten verwendet zu werden!
Es gibt noch einen anderen Weg, ein Werkzeug zu bauen. In der geführte_tourhaben wir ein Tool implementiert, das die @tool
Dekorateur. Die tool() Dekorator ist der empfohlene Weg, um einfache Werkzeuge zu definieren, aber manchmal braucht man mehr als das: die Verwendung mehrerer Methoden in einer Klasse für mehr Klarheit oder die Verwendung zusätzlicher Klassenattribute.
In diesem Fall können Sie Ihr Werkzeug durch Unterklassifizierung erstellen Werkzeug wie oben beschrieben.
Teilen Sie Ihr Tool mit dem Hub #
Sie können Ihr benutzerdefiniertes Tool für den Hub freigeben, indem Sie push_to_hub() für das Werkzeug. Stellen Sie sicher, dass Sie dafür ein Repository auf dem Hub erstellt haben und ein Token mit Lesezugriff verwenden.
Kopiert
model_downloads_tool.push_to_hub("{Ihr_Benutzername}/hf-model-downloads", token="")
Damit der Push-to-Hub funktioniert, muss Ihr Werkzeug einige Regeln einhalten:
- Alle Methoden sind in sich geschlossen, d.h. sie verwenden Variablen, die entweder aus ihren Args stammen.
- Wie unter dem obigen Punkt beschrieben, alle Importe sollten direkt in den Funktionen des Werkzeugs definiert werdensonst erhalten Sie eine Fehlermeldung, wenn Sie versuchen, die speichern() oder push_to_hub() mit Ihrem benutzerdefinierten Werkzeug.
- Wenn Sie die Unterklasse
__init__
Methode können Sie ihr kein anderes Argument geben alsselbst
. Der Grund dafür ist, dass Argumente, die während der Initialisierung einer spezifischen Werkzeuginstanz gesetzt werden, schwer zu verfolgen sind, was verhindert, dass sie ordnungsgemäß an den Hub weitergegeben werden. Und wie auch immer, die Idee der Erstellung einer spezifischen Klasse ist, dass Sie bereits Klassenattribute für alles setzen können, was Sie hart kodieren müssen (setzen Sie einfachihre_variable=(...)
direkt unter demclass YourTool(Tool):
Zeile). Und natürlich können Sie immer noch ein Klassenattribut irgendwo in Ihrem Code erstellen, indem Sie etwas anself.Ihre_Variable
.
Sobald Ihr Werkzeug an Hub übergeben wurde, können Sie es visualisieren. Hier ist die model_downloads_tool
die ich angeschoben habe. Es hat eine schöne Gradio-Schnittstelle.
Wenn Sie in die Werkzeugdateien eintauchen, werden Sie feststellen, dass sich die gesamte Logik des Werkzeugs unter tool.py. Dort können Sie ein von einer anderen Person freigegebenes Werkzeug einsehen.
Dann können Sie das Werkzeug mit load_tool() oder erstellen Sie es mit from_hub() und übergibt sie an die Werkzeuge
Parameter in Ihrem Agenten. Da das Ausführen von Werkzeugen das Ausführen von benutzerdefiniertem Code bedeutet, müssen Sie sicherstellen, dass Sie dem Repository vertrauen, daher müssen wir den Parameter trust_remote_code=True
um ein Werkzeug aus dem Hub zu laden.
Kopiert
von smolagents importieren load_tool, CodeAgent model_download_tool = load_tool( "{Ihr_Benutzername}/hf-model-downloads", trust_remote_code=True )
Einen Raum als Werkzeug importieren #
Sie können einen Space direkt aus dem Hub als Werkzeug importieren, indem Sie die Tool.from_space() Methode!
Sie müssen nur die ID des Spaces im Hub, seinen Namen und eine Beschreibung angeben, die dem Agenten hilft zu verstehen, was das Tool tut. Unter der Haube wird dies verwenden gradio-Klient
Bibliothek, um den Space aufzurufen.
Importieren wir zum Beispiel die FLUX.1-dev Space aus dem Hub und verwenden Sie es, um ein Bild zu erzeugen.
Kopiert
image_generation_tool = Tool.from_space( "black-forest-labs/FLUX.1-schnell", name="bild_generator", description="Erzeuge ein Bild aus einer Eingabeaufforderung" ) image_generation_tool("Ein sonniger Strand")
Und voilà, hier ist Ihr Bild! 🏖️

Dann können Sie dieses Werkzeug wie jedes andere Werkzeug verwenden. Verbessern wir zum Beispiel die Eingabeaufforderung ein Kaninchen in einem Raumanzug
und erstellen Sie ein Bild davon.
Kopiert
von smolagents importieren CodeAgent, HfApiModel model = HfApiModel("Qwen/Qwen2.5-Coder-32B-Instruct") agent = CodeAgent(tools=[image_generation_tool], model=model) agent.run( "Verbessern Sie diesen Prompt und erzeugen Sie dann ein Bild davon.", prompt='Ein Kaninchen im Raumanzug' )
Kopiert
=== Gedanken des Agenten: improved_prompt könnte lauten: "Ein hellblauer Raumanzug tragender Hase, auf der Oberfläche des Mondes, unter einem hellorangen Sonnenuntergang, mit der Erde im Hintergrund" Nun, da ich die Eingabeaufforderung verbessert habe, kann ich das Bildgenerator-Tool verwenden, um ein Bild auf der Grundlage dieser Eingabeaufforderung zu erzeugen. >>> Der Agent führt den folgenden Code aus: image = image_generator(prompt="Ein Kaninchen in einem hellblauen Raumanzug, auf der Oberfläche des Mondes, unter einem leuchtend orangen Sonnenuntergang, mit der Erde im Hintergrund") final_answer(image)

Wie cool ist das denn? 🤩
LangChain-Tools verwenden #
Wir lieben Langchain und sind der Meinung, dass es eine sehr überzeugende Reihe von Tools hat. Um ein Werkzeug aus LangChain zu importieren, verwenden Sie die from_langchain()
Methode.
Im Folgenden erfahren Sie, wie Sie das Suchergebnis des Intros mit Hilfe eines LangChain-Web-Suchwerkzeugs nachbilden können. Dieses Tool benötigt pip install langchain google-search-results -q
richtig zu funktionieren.
Kopiert
from langchain.agents import load_tools search_tool = Tool.from_langchain(load_tools(["serpapi"]))[0]) agent = CodeAgent(tools=[search_tool], model=model) agent.run("Wie viele Blöcke (auch als Schichten bezeichnet) enthält der BERT-Basiskodierer im Vergleich zu dem Kodierer aus der in Attention is All You Need vorgeschlagenen Architektur?")
Verwalten Sie den Werkzeugkasten Ihres Agenten #
Sie können den Werkzeugkasten eines Agenten verwalten, indem Sie ein Werkzeug im Attribut "Werkzeug" hinzufügen oder ersetzen. agent.tools
, da es sich um ein Standardwörterbuch handelt.
Fügen wir die model_download_tool
zu einem vorhandenen Agenten, der nur mit der Standard-Toolbox initialisiert wurde.
Kopiert
von smolagents importieren HfApiModel model = HfApiModel("Qwen/Qwen2.5-Coder-32B-Instruct") agent = CodeAgent(tools=[], model=model, add_base_tools=True) agent.tools[model_download_tool.name] = model_download_tool
Jetzt können wir das neue Werkzeug nutzen:
Kopiert
agent.run( "Können Sie mir den Namen des Modells nennen, das die meisten Downloads bei der Aufgabe 'Text-zu-Video' auf dem Hugging Face Hub hat, aber die Buchstaben umkehren?" )
Achten Sie darauf, nicht zu viele Tools zu einem Agenten hinzuzufügen: Dies kann schwächere LLM-Engines überfordern.
Verwenden Sie eine Sammlung von Werkzeugen #
Sie können Werkzeugsammlungen nutzen, indem Sie das ToolCollection-Objekt mit dem Slug der Sammlung verwenden, die Sie verwenden möchten. Übergeben Sie sie dann als Liste, um Ihren Agenten zu initialisieren, und beginnen Sie, sie zu verwenden!
Kopiert
von smolagents importieren ToolCollection, CodeAgent image_tool_collection = ToolCollection( collection_slug="huggingface-tools/diffusion-tools-6630bb19a942c2306a2cdb6f", token="" ) agent = CodeAgent(tools=[*image_tool_collection.tools], model=model, add_base_tools=True) agent.run("Bitte zeichnen Sie mir ein Bild von Flüssen und Seen.")
Um den Start zu beschleunigen, werden die Tools nur geladen, wenn sie vom Agenten aufgerufen werden.