このガイド付き訪問では、エージェントの構築方法、実行方法、そしてあなたのユースケースにより良く機能するようにカスタマイズする方法を学びます。
エージェントの構築 #
最小限のエージェントを初期化するには、少なくとも以下の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
他のエージェントアプリケーションで会話を続けるための引数。
次のステップ #
より詳しい使い方は、チュートリアルをご覧ください: