在這裡,我們要看看進階工具的用法。
如果您是建立代理商的新手,請務必先閱讀 代理商簡介 和 smolagents 導覽.
什麼是工具,以及如何建立工具? #
工具大多是 LLM 可以在代理系統中使用的功能。
但要使用它,LLM 將需要被賦予一個 API:名稱、工具說明、輸入類型和說明、輸出類型。
所以它不能只是一個函數。它應該是一個類別。
因此,核心來說,工具是一個包覆函數的類別,而函數的元資料可以幫助 LLM 瞭解如何使用它。
看起來是這樣的
複製
從 smolagents 匯入工具 class HFModelDownloadsTool(Tool): name = "model_download_counter" description = """ 這是一個工具,用來回傳 Hugging Face Hub 上指定任務中下載最多的模型。 它會回傳檢查點的名稱。""" 輸入 = { "task":{ "type":"string"、 "description":「任務類別 (例如文字分類、深度估算等)」、 } } 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()
自訂工具子類 工具 來繼承有用的方法。子類也定義:
- 屬性
姓名
,與工具本身的名稱相對應。名稱通常會說明工具的作用。由於程式碼會回傳下載最多的任務模型,因此我們將它命名為模型下載計數器
. - 屬性
描述
用於填充代理的系統提示。 - 顏色
輸入
屬性,這是一個字典,其鍵為「類型」
和「說明」
.它包含了幫助 Python 解譯器對輸入做出明智選擇的資訊。 - 顏色
輸出類型
屬性,指定輸出類型。兩者的類型都是輸入
和輸出類型
應 Pydantic 格式, 他們可以是其中之一:~authorized_types()
. - A
前言
方法,其中包含要執行的推理程式碼。
而這就是它在代理中使用的全部需求!
還有另一種建立工具的方法。在 導覽,我們使用 @ 工具
裝飾師。撠 工具() 裝飾器是「定義簡單工具」的推薦方式,但有時您需要的不只如此:在一個類中使用數個方法使其更清晰,或使用額外的類別屬性。
在這種情況下,您可以透過將 工具 如上所述。
分享您的工具到 Hub #
您可以透過呼叫 push_too_hub() 上的工具。確保您已在 Hub 上為其建立儲存庫,並使用具有讀取存取權限的令牌。
複製
model_downloads_tool.push_to_hub("{your_username}/hf-model-downloads", token="")
要讓 push to Hub 正常運作,您的工具需要遵守一些規則:
- 所有方法都是自足的,例如,使用的變數可以來自其 args。
- 根據上述觀點、 所有的匯入都應該直接在工具的函式中定義否則在嘗試呼叫 儲存() 或 push_too_hub() 使用您的自訂工具。
- 如果您將
__啟動__
方法,你可以給它除了自我
.這是因為在特定工具實例的初始化過程中設定的參數很難追蹤,因此無法正確地分享到集線器。無論如何,製作特定類別的想法是,您已經可以為任何需要硬程式碼的東西設定類別屬性 (只要設定your_variable=(...)
直屬class YourTool(Tool):
行)。當然您也可以在程式碼的任何地方建立類別屬性,只要將東西指定給self.your_variable
.
一旦您的工具被推送到 Hub,您就可以將其視覺化。 這裡 是 模型下載工具
我推過的。它有很好的 gradio 介面。
當深入研究工具檔案時,您可以發現所有工具的邏輯都在 工具.py.這是您可以檢視他人分享的工具的地方。
然後,您就可以使用 load_tool() 或使用 from_hub() 並傳送到 工具
參數。由於執行工具意味著執行自訂程式碼,您需要確定您信任套件庫,因此我們需要傳送 trust_remote_code=True
從 Hub 載入工具。
複製
from smolagents import load_tool, CodeAgent model_download_tool = load_tool( "{your_username}/hf-model-downloads"、 trust_remote_code=True )
匯入空間作為工具 #
您可以直接從 Hub 匯入 Space 作為工具,使用 Tool.from_space() 方法!
您只需提供 Hub 上 Space 的 id、其名稱,以及有助於代理瞭解該工具功能的說明。在引擎蓋下,這將使用 gradio-client
函式庫來呼叫 Space。
例如,讓我們匯入 FLUX.1-dev Space from the Hub and use it to generate an image.
複製
image_generation_tool = Tool.from_space( "black-forest-labs/FLUX.1-schnell"、 name="image_generator"、 description=「從提示產生影像」 ) image_generation_tool("A sunny beach")
瞧,這就是您的圖片!🏖️

然後您就可以像使用其他工具一樣使用此工具。例如,讓我們改善提示 穿太空服的兔子
並產生其影像。
複製
from smolagents import CodeAgent, HfApiModel model = HfApiModel("Qwen/Qwen2.5-Coder-32B-Instruct") agent = CodeAgent(tools=[image_generation_tool], model=model) agent.run( 「改善此提示,然後產生其影像。」, prompt='一隻穿著太空衣的兔子 )
複製
=== 探員的想法: improved_prompt 可以是 「穿著鮮藍太空服的兔子,在月球表面,在明亮的橘色夕陽下,背景是可見的地球」 現在我已經改進了提示,我可以使用圖片產生器工具,根據這個提示產生圖片。 >>> Agent 正在執行下面的程式碼: image = image_generator(prompt="A bright blue space suit wearing rabbit, on the surface of the moon, under a bright orange sunset, with the Earth visible in the background") final_answer(image)

這有多酷?🤩
使用 LangChain 工具 #
我們很喜歡 Langchain,認為它有一套非常引人注目的工具。要從 LangChain 匯入工具,請使用 from_langchain()
方法。
以下是如何使用 LangChain 網路搜尋工具來重現介紹的搜尋結果。這個工具需要 pip install langchain google-search-results -q
以正常工作。
複製
從 langchain.agents 匯入 load_tools search_tool = Tool.from_langchain(load_tools(["serpapi"])[0]) agent = CodeAgent(tools=[search_tool], model=model) agent.run("How many more blocks (also denoted as layers) are in BERT base encoder compared to the encoder from the architecture proposed in Attention is All You Need?")
管理您的代理商工具箱 #
您可以透過在屬性中新增或更換工具來管理代理的工具箱。 代理工具
, 因為它是標準字典。
讓我們加入 模型下載工具
到僅使用預設工具箱初始化的現有代理程式。
複製
從 smolagents 匯入 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
現在我們可以利用新工具:
複製
agent.run( "您能告訴我在抱抱臉樞紐的「文字轉影片」任務中,下載次數最多但字母相反的模型名稱嗎?" )
小心不要為代理程式加入太多工具:這會讓較弱的 LLM 引擎不堪負荷。
使用工具集 #
您可以使用 ToolCollection 物件,加上您要使用的集合的標題,來利用工具集合。然後,以清單的方式傳送它們,初始化您的代理程式,並開始使用它們!
複製
從 smolagents 匯入 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("Please draw me a picture of rivers and lakes.")
為了加快啟動速度,只有在代理程式呼叫時才會載入工具。