Qui vedremo l'utilizzo di strumenti avanzati.
Se siete alle prime armi con la costruzione di agenti, assicuratevi di leggere prima la sezione introduzione agli agenti e il visita guidata agli smolagent.
Che cos'è uno strumento e come si costruisce? #
Uno strumento è per lo più una funzione che un LLM può utilizzare in un sistema agenziale.
Ma per utilizzarlo, è necessario fornire all'LLM un'API: nome, descrizione dello strumento, tipi e descrizioni di input, tipo di output.
Quindi non può essere solo una funzione. Dovrebbe essere una classe.
In sostanza, lo strumento è una classe che avvolge una funzione con metadati che aiutano il LLM a capire come usarla.
Ecco come si presenta:
Copiato
da smolagents importiamo Tool classe HFModelDownloadsTool(Tool): name = "model_download_counter" description = """ Questo strumento restituisce il modello più scaricato di una determinata attività sull'hub Hugging Face. Restituisce il nome del punto di controllo.""" input = { "task": "type": "string", "description": "la categoria dell'attività (come la classificazione del testo, la stima della profondità, ecc)", } } output_type = "string" def forward(self, task: str): da huggingface_hub import list_models model = next(iter(list_models(filter=task, sort="downloads", direction=-1)) return model.id model_downloads_tool = HFModelDownloadsTool()
Le sottoclassi degli strumenti personalizzati Strumento per ereditare metodi utili. La classe figlio definisce anche:
- Un attributo
nome
che corrisponde al nome dello strumento stesso. Il nome di solito descrive le funzioni dello strumento. Poiché il codice restituisce il modello con il maggior numero di download per un'attività, chiamiamolocontatore_di_download_del_modello
. - Un attributo
descrizione
è usato per riempire il prompt di sistema dell'agente. - Un
ingressi
che è un dizionario con chiavi"tipo"
e"descrizione"
. Contiene informazioni che aiutano l'interprete Python a fare scelte oculate sull'input. - Un
tipo_uscita
che specifica il tipo di output. I tipi per entrambiingressi
etipo_uscita
dovrebbe essere Formati pidocchiosi, possono essere uno di questi:~TIPOLOGIE_AUTORIZZATE()
. - A
in avanti
che contiene il codice di inferenza da eseguire.
E questo è tutto ciò che serve per essere utilizzato in un agente!
C'è un altro modo per costruire uno strumento. Nel visita guidataabbiamo implementato uno strumento che utilizza il metodo @strumento
decoratore. Il strumento() è il modo consigliato per definire strumenti semplici, ma a volte è necessario qualcosa di più: usare diversi metodi in una classe per una maggiore chiarezza o usare attributi aggiuntivi della classe.
In questo caso, si può costruire il proprio strumento sottoclassificando Strumento come descritto sopra.
Condividete il vostro strumento all'Hub #
È possibile condividere lo strumento personalizzato con l'Hub chiamando push_to_hub() sullo strumento. Assicurarsi di aver creato un repository sull'Hub e di utilizzare un token con accesso in lettura.
Copiato
model_downloads_tool.push_to_hub("{your_username}/hf-model-downloads", token="")
Affinché il push to Hub funzioni, lo strumento deve rispettare alcune regole:
- Tutti i metodi sono autosufficienti, ad esempio utilizzano variabili che provengono dai loro argomenti.
- Come da punto precedente, tutte le importazioni devono essere definite direttamente all'interno delle funzioni dello strumentoaltrimenti si otterrà un errore quando si cercherà di richiamare il file salvare() o push_to_hub() con lo strumento personalizzato.
- Se si sottoclasse la classe
__init__
si può dare al metodo un argomento diverso dasé
. Questo perché gli argomenti impostati durante l'inizializzazione di un'istanza di uno strumento specifico sono difficili da tracciare, il che impedisce di condividerli correttamente con l'hub. E comunque, l'idea di creare una classe specifica è che si possono già impostare gli attributi della classe per qualsiasi cosa sia necessario codificare (basta impostaretua_variabile=(...)
direttamente sotto ilclasse YourTool(Tool):
). E naturalmente si può sempre creare un attributo di classe in qualsiasi punto del codice, assegnando qualcosa aself.your_variable
.
Una volta che lo strumento è stato inviato a Hub, è possibile visualizzarlo. Qui è il strumento_modello_downloads
che ho spinto. Ha una bella interfaccia gradio.
Quando ci si immerge nei file dello strumento, si scopre che tutta la logica dello strumento si trova sotto la voce strumento.py. È qui che si può ispezionare uno strumento condiviso da qualcun altro.
Poi si può caricare lo strumento con load_tool() o crearlo con da_hub() e passarlo al metodo strumenti
nel proprio agente. Dal momento che l'esecuzione degli strumenti implica l'esecuzione di codice personalizzato, è necessario assicurarsi di fidarsi del repository, quindi è necessario passare il parametro trust_remote_code=True
per caricare uno strumento dall'Hub.
Copiato
da smolagents import load_tool, CodeAgent model_download_tool = load_tool( "{your_username}/hf-model-downloads", trust_remote_code=True )
Importare uno spazio come strumento #
È possibile importare direttamente uno spazio dall'Hub come strumento utilizzando il comando Strumento.from_space() metodo!
È sufficiente fornire l'id dello spazio sull'Hub, il suo nome e una descrizione che aiuti l'agente a capire cosa fa lo strumento. Sotto il cofano, questo utilizzerà gradio-client
per chiamare lo Spazio.
Per esempio, importiamo il file FLUX.1-dev spazio dall'Hub e utilizzarlo per generare un'immagine.
Copiato
strumento_di_generazione_immagine = Tool.from_space( "black-forest-labs/FLUX.1-schnell", name="image_generator", description="Genera un'immagine da un prompt" ) strumento_di_generazione_immagine("Una spiaggia assolata")
E voilà, ecco la vostra immagine! 🏖️

Quindi è possibile utilizzare questo strumento come qualsiasi altro strumento. Ad esempio, miglioriamo il prompt un coniglio che indossa una tuta spaziale
e generarne un'immagine.
Copiato
da smolagents import CodeAgent, HfApiModel model = HfApiModel("Qwen/Qwen2.5-Coder-32B-Instruct") agent = CodeAgent(tools=[image_generation_tool], model=model) agent.run( "Migliora questo prompt, poi genera un'immagine di esso", prompt='Un coniglio che indossa una tuta spaziale' )
Copiato
=== Pensieri dell'agente: improved_prompt potrebbe essere "Un coniglio in tuta spaziale blu brillante, sulla superficie della luna, sotto un tramonto arancione brillante, con la Terra visibile sullo sfondo". Ora che ho migliorato il prompt, posso usare lo strumento generatore di immagini per generare un'immagine basata su questo prompt. >>> L'agente sta eseguendo il codice sottostante: image = image_generator(prompt="Un coniglio in tuta spaziale blu brillante, sulla superficie della luna, sotto un tramonto arancione brillante, con la Terra visibile sullo sfondo") risposta_finale(immagine)

Quanto è bello questo? 🤩
Utilizzare gli strumenti di LangChain #
Amiamo Langchain e pensiamo che abbia una suite di strumenti molto interessante. Per importare uno strumento da LangChain, usare il comando da_langchain()
metodo.
Ecco come si può utilizzare per ricreare il risultato della ricerca dell'introduzione utilizzando uno strumento di ricerca web LangChain. Questo strumento avrà bisogno di pip installare langchain google-search-results -q
per funzionare correttamente.
Copiato
da langchain.agents import load_tools search_tool = Tool.from_langchain(load_tools(["serpapi"])[0]) agent = CodeAgent(tools=[search_tool], model=model) agent.run("Quanti blocchi in più (indicati anche come strati) ci sono nel codificatore BERT di base rispetto al codificatore dell'architettura proposta in Attention is All You Need?")
Gestire la cassetta degli attrezzi dell'agente #
È possibile gestire la cassetta degli attrezzi di un agente aggiungendo o sostituendo uno strumento nell'attributo agente.strumenti
, poiché si tratta di un dizionario standard.
Aggiungiamo il strumento_di_download_del_modello
a un agente esistente inizializzato solo con la casella degli strumenti predefinita.
Copiato
da smolagents importare 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
Ora possiamo sfruttare il nuovo strumento:
Copiato
agent.run( "Puoi darmi il nome del modello che ha il maggior numero di download nell'attività 'text-to-video' sull'Hub Hugging Face ma invertendo le lettere?". )
Attenzione a non aggiungere troppi strumenti a un agente: questo può sovraccaricare i motori LLM più deboli.
Utilizzare una collezione di strumenti #
È possibile sfruttare le raccolte di strumenti utilizzando l'oggetto ToolCollection, con lo slug della raccolta che si desidera utilizzare. Quindi passarle come elenco per inizializzare l'agente e iniziare a usarle!
Copiato
da smolagents import 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("Per favore, disegnami un'immagine di fiumi e laghi").
Per velocizzare l'avvio, gli strumenti vengono caricati solo se chiamati dall'agente.