このガイド付き訪問では、エージェントの構築方法、実行方法、そしてあなたのユースケースにより良く機能するようにカスタマイズする方法を学びます。
エージェントの構築 #
最小限のエージェントを初期化するには、少なくとも以下の2つの引数が必要です:
モデルエージェントは単純なLLMとは異なり、LLMをエンジンとして使用するシステムです。これらのオプションのいずれかを使用することができます:- トランスフォーマーモデル は、あらかじめ初期化された
変圧器パイプラインを使用して、ローカルマシンで推論を実行します。変圧器. - HfApiModel を活用している。
huggingface_hub.InferenceClientボンネットの下。 - LiteLLMMモデル を介して100以上の異なるモデルを呼び出すことができます。 LiteLLM!
- トランスフォーマーモデル は、あらかじめ初期化された
用具のリストツールエージェントがタスクを解決するために使用できるもの。空のリストでもかまいません。また、デフォルトのツールボックスを用具オプションの引数add_base_tools=True.
この2つの引数が揃えば 用具 そして モデルエージェントを作成し、それを実行することができます。好きなLLMを使うことができます。 ハギング・フェイスAPI, 変圧器, オラマあるいは LiteLLM.
ハギング・フェイスAPI
ローカル・トランス・モデル
OpenAIまたはAnthropic API
オーラマ
Hugging Face APIはトークンなしで無料で利用できるが、その場合はレート制限がある。
PROアカウントでゲーティングされたモデルにアクセスしたり、レートの上限を上げたりするには、環境変数 HF_TOKEN またはパス トークン 変数の初期化時に HfApiModel.
コピー
from smolagents import CodeAgent, HfApiModel
model_id = "meta-llama/Llama-3.3-70B-Instruct"
model = HfApiModel(model_id=model_id, token="")
agent = CodeAgent(tools=[], model=model, add_base_tools=True)
agent.run(
"フィボナッチ数列の118番目の数を教えてもらえますか?
)CodeAgentとToolCallingAgent #
について コードエージェント はデフォルトのエージェントです。これは各ステップでpythonコードスニペットを書いて実行します。
デフォルトでは、実行はローカル環境で行われます。呼び出せる関数は、あなたが提供したツール(特にHugging Faceによるツールだけなら)と、以下のような定義済みの安全な関数のセットだけなので、これは安全なはずだ。 プリント または 数学 モジュールで実行できることは限られている。
Pythonインタプリタもデフォルトではセーフリスト以外のインポートを許可しないので、最も明白な攻撃はすべて問題にならないはずです。引数に文字列のリストとして認可されたモジュールを渡すことで、追加のインポートを認可することができます。 追加認可輸入 初期化時に コードエージェント:
コピー
model = HfApiModel()
agent = CodeAgent(tools=[], model=model, additional_authorized_imports=['requests', 'bs4'])
agent.run("URL'https://huggingface.co/blog'にあるページのタイトルを取得してもらえますか?")LLMは任意のコードを生成し、それを実行することができる:安全でないインポートを追加しないこと!
不正な操作を実行しようとするコードや、エージェントによって生成されたコードに通常の Python エラーがある場合、実行は停止します。
を使うこともできる。 E2Bコードエグゼキュータ ローカルのPythonインタプリタの代わりに、最初に を設定する。 E2B_API_KEY 環境変数 そして use_e2b_executor=True エージェントの初期化時に
コード実行の詳細 このチュートリアルでは.
また、JSONのようなブロブとしてアクションを記述する、広く使われている方法もサポートしています。 ツールコーリングエージェントと同じように機能する。 コードエージェント勿論、そんなことはない。 追加認可輸入 コードを実行しないからだ:
コピー
from smolagents import ToolCallingAgent
agent = ToolCallingAgent(tools=[], model=model)
agent.run("URL 'https://huggingface.co/blog'にあるページのタイトルを取得してもらえますか?")エージェントランの検査 #
以下は、走行後に何が起こったかを調べるのに便利な属性である:
エージェントログは、エージェントの詳細なログを保存します。エージェントの実行の各ステップで、すべてが辞書に格納され、それがエージェントログ.- ランニング
agent.write_inner_memory_from_logs()は、LLM が表示するエージェントのログの内部メモリを、チャットメッセージのリストとして作成します。例えば、システムプロンプトとタスクを別々のメッセージに保存し、各ステップごとに LLM の出力をメッセージとして保存し、ツールコールの出力を別のメッセージとして保存します。何が起こったかをより高いレベルで見たい場合は、これを使う。
ツール #
ツールはエージェントによって使用される原子関数である。LLMによって使用されるためには、APIを構成するいくつかの属性も必要であり、LLMにこのツールをどのように呼び出すかを記述するために使用される:
- 名前
- 記述
- 入力タイプと説明
- 出力タイプ
例えば PythonInterpreterTool名前、説明、入力説明、出力タイプ、そして 前方 メソッドを使ってアクションを実行する。
エージェントが初期化されるとき、ツール属性は、エージェントのシステムプロンプトに組み込まれるツールの説明を生成するために使用されます。これによりエージェントは、どのツールを使用できるか、またその理由を知ることができます。
デフォルトのツールボックス #
Transformers には、エージェントに力を与えるためのデフォルトのツールボックスが付属しています。 add_base_tools = True:
- DuckDuckGoウェブ検索*。DuckDuckGoブラウザを使ってウェブ検索を行う。
- PythonコードインタプリタLLMが生成したPythonコードを安全な環境で実行します。このツールは ツールコーリングエージェント で初期化すると
add_base_tools=Trueコードベースのエージェントは、すでにネイティブにPythonコードを実行できる。 - トランスクライバーWhisper-Turbo上に構築された音声テキスト変換パイプライン。
ツールを手動で使用するには、引数を指定して呼び出します。
コピー
from smolagents import DuckDuckGoSearchTool
search_tool = DuckDuckGoSearchTool()
print(search_tool("Who's the current president of Russia?"))新しいツールを作成する #
Hugging Faceのデフォルトツールでカバーされていないユースケースのために、独自のツールを作成することができます。例えば、与えられたタスクに対して最もダウンロードされたモデルをハブから返すツールを作ってみましょう。
以下のコードから始める。
コピー
from huggingface_hub import list_models タスク = "テキスト分類" most_downloaded_model = next(iter(list_models(filter=task, sort="downloads", direction=-1))) print(most_downloaded_model.id)
このコードは、関数でラップして 工具 デコレーターを使用します:のサブクラスとして直接定義することもできます。 工具例えば、重いクラス属性を初期化することができる。
両方のオプションがどのように機能するか見てみよう:
ツールで関数を装飾する
サブクラスツール
コピー
from smolagents import tool
ツール
def model_download_tool(task: str) -> str:
"""
これは、Hugging Face Hub上で与えられたタスクの最もダウンロードされたモデルを返すツールです。
チェックポイントの名前を返します。
引数
タスク:ダウンロード数を取得するタスク。
"""
most_downloaded_model = next(iter(list_models(filter=task, sort="downloads", direction=-1)))
return most_downloaded_model.idこの機能は必要だ:
- 明確な名前。エージェントを動かすLLMの頭脳を助けるために、このツールが何をするのかを十分に説明できる名前でなければなりません。このツールはタスクに対して最もダウンロード数の多いモデルを返すので、次のように名付けましょう。
モデル・ダウンロード・ツール. - 入力と出力の両方にヒントを表示
- Args:'の部分を含む説明で、各引数が記述されています(今回はタイプ表示なしで、タイプヒントから引き出されます)。ツール名と同様に、この説明はエージェントを動かす LLM の取扱説明書です。これらの要素はすべて、初期化時にエージェントのシステムプロンプトに自動的に組み込まれます!
この定義フォーマットは、以下のツールスキーマと同じである。 apply_chat_template唯一の違いは 工具 decorator:ツール使用APIの詳細を読む これ.
その後、エージェントを直接初期化することができます:
コピー
from smolagents import CodeAgent, HfApiModel
agent = CodeAgent(tools=[model_download_tool], model=HfApiModel())
agent.run(
"Hugging Face Hubの'text-to-video'タスクで最もダウンロードされたモデルの名前を教えてもらえますか?"
)次のようなログが表示される:
コピー
ニューラン
ハグする顔」のタスクで最もダウンロードされたモデルの名前を教えてください。
Hugging Face Hubのタスクを教えてください。 │
╰─ HfApiModel - Qwen/Qwen2.5-Coder-32B-Instruct ───────────────────────────────────────────────────────────────────────────────────────────╯
このコードを実行します:───────────────────────────────────────────────────────────────────╮
│ 1 model_name = model_download_tool(task="text-to-video") │.
│ 2 print(モデル名)
╰──────────────────────────────────────────────────────────────────────────────────────────╯
実行ログ
バイトダンス/アニメイトディフ・ライトニング
アウトなし
[ステップ0:時間0.27秒|入力トークン:2,069|出力トークン:60].
ステップ 1
このコードを実行します:───────────────────────────────────────────────────────────────────╮
│ 1 final_answer("ByteDance/AnimateDiff-Lightning")│です。
╰──────────────────────────────────────────────────────────────────────────────────────────╯
アウト──最終回答ByteDance/AnimateDiff-Lightning
[ステップ1:所要時間0.10秒|入力トークン:4,288|出力トークン:148]。
アウト[20]: 'ByteDance/AnimateDiff-Lightning'ツールについての詳細は 専用チュートリアル.
マルチエージェント #
マルチエージェントシステムは、マイクロソフトのフレームワークで導入された。 オートoジェン.
このタイプのフレームワークでは、1つのエージェントだけでなく、複数のエージェントが協力してタスクを解決する。これは経験的にほとんどのベンチマークでより良いパフォーマンスをもたらす。このように性能が向上する理由は、概念的に単純である。多くのタスクでは、すべてをこなすシステムを使うよりも、サブタスクにユニットを特化させることを好むからである。ここで、別々のツールセットとメモリを持つエージェントを持つことで、効率的な特殊化を実現することができる。例えば、なぜコード生成エージェントのメモリを、ウェブ検索エージェントが訪問したウェブページのすべてのコンテンツでいっぱいにするのでしょうか?別々にしておいたほうがよいでしょう。
で簡単に階層型マルチエージェントシステムを構築できます。 smolagents.
そのためには、エージェントを マネージド・エージェント オブジェクトが必要です。このオブジェクトは引数を必要とする エージェント, 名称そして 記述このプロンプトは、マネージャーエージェントのシステムプロンプトに埋め込まれ、ツールの場合と同様に、このマネージドエージェントを呼び出す方法を知らせる。
特定のウェブ検索エージェントを管理するエージェントを作成する例を示します。 ダックデュックkゴーサーチツール:
コピー
from smolagents import CodeAgent, HfApiModel, DuckDuckGoSearchTool, ManagedAgent
model = HfApiModel()
web_agent = CodeAgent(tools=[DuckDuckGoSearchTool()], model=model)
managed_web_agent = ManagedAgent(
agent=web_agent、
name="web_search"、
description="ウェブ検索を実行します。引数としてクエリを渡してください。"
)
manager_agent = CodeAgent(
tools=[], model=model, managed_agents=[managed_web_agent].
)
manager_agent.run("Hugging FaceのCEOは誰ですか?")効率的なマルチエージェント実装の詳細な例については、以下を参照のこと。 マルチエージェントシステムをGAIAリーダーボードのトップに押し上げた方法.
エージェントと会話し、クールなGradioインターフェイスでエージェントの考えを視覚化する #
を使うことができる。 グラディオUI を使用して、エージェントにタスクをインタラクティブに送信し、その思考と実行プロセスを観察することができます:
コピー
from smolagents import (
load_tool、
CodeAgent、
HfApiModel、
GradioUI
)
# ハブからのインポートツール
image_generation_tool = load_tool("m-ric/text-to-image")
model = HfApiModel(model_id)
# 画像生成ツールでエージェントを初期化する
agent = CodeAgent(tools=[image_generation_tool], model=model)
GradioUI(agent).launch()ボンネットの下では、ユーザが新しい回答をタイプすると、エージェントは agent.run(user_request, reset=False).その reset=False フラグは、新しいタスクを開始する前にエージェントのメモリがフラッシュされないことを意味します。
このような使い方もできます。 reset=False 他のエージェントアプリケーションで会話を続けるための引数。
次のステップ #
より詳しい使い方は、チュートリアルをご覧ください:
