大規模言語モデルにおけるツール呼び出しのクイックガイド

Table of Contents

大規模言語モデルにおけるツール呼び出しのクイックガイド

実践編4,242 x 1,977 のような数学の問題を解く課題があるとしましょう。中には暗算でできる人もいるかもしれませんが、ほとんどの人はおそらく今すぐに電卓に手を伸ばしているでしょう。計算が速いだけでなく、ミスの可能性を最小限に抑えられるからです。

実は、この同じロジックは大規模言語モデル(LLM)にも当てはまります。チャットボットに同じ数学の問題を解かせてみると、ほとんどの場合、妥当ではあるものの間違った答えが返ってきます。しかし、そのモデルに専用の計算機を与えれば、適切なプログラミングを施せば、突如として複雑な方程式を正確に解くことができるようになります。

これは算術演算に限ったことではありません。適切なツールを使用すれば、LLMは任意のコードを実行したり、APIにアクセスしたり、複雑なリクエストをドメイン固有のモデルに渡したり、さらにはWeb検索したりする機能も提供できます。

これらのツールは、人々が「エージェントAI」と呼ぶものを実現するための基盤の一つです。適切なツールがあれば、AIモデルは監督をほとんど、あるいは全く必要とせずに、複雑な問題を分解、計画し、解決できるという考え方です。

これらのモデルにどの程度のコントロールを与えるか、どのようなガードレールが必要か、そしてどの程度信頼するかは、皆さんの判断にお任せします。今日はメカニズムに焦点を当てます。

そこで、このハンズオンでは、ツール呼び出しを使用して LLM の機能を拡張し、制限に対処する方法をいくつか検討します。

必要なもの:

  • 4ビット量子化で中程度のLLMを実行できるシステム。最新のNvidiaグラフィックカード、または少なくとも6GBのvRAMを搭載したAMD 7000シリーズGPUであれば問題なく動作します。Apple Silicon Macの場合は、少なくとも16GBのメモリを推奨します。
  • Python の基本的な理解。
  • このガイドは、Ollamaモデルランナーが既にインストールされていることを前提としています。まだインストールされていない場合は、こちらのガイドをご覧ください。
  • また、カスタム ツールを展開するための比較的使いやすいインターフェイスを提供する Open WebUI ダッシュボードを展開するための手順については、ここを参照してください。

モデルの選択

先に進む前に、モデルの互換性についてお話ししておくことが重要です。すべてのモデルがツールや関数の呼び出しをサポートしているわけではありません。

私たちの理解では、Mistral-7Bは5月にInstructバージョン0.3で正式にツールサポートを追加し、Metaは先月のLlama 3.1リリースでこの機能を導入しました。Ollamaのリポジトリからツールサポートが利用できる他の注目すべきモデルとしては、MistralのNeMo、Large、Mixtralモデル、そしてCohereのCommand R+などがあります。

このガイドでは、Mistral-NeMo について説明しますが、リソースが不足している場合は、Llama 3.1-8B が動作し、6 GB のメモリに収まることを確認できます。

LLMツールボックスの構築

先ほどの例に戻ると、選択した LLM に計算機を提供して、時々発生する数学の問題に対処できるようにするのは良い考えかもしれません。

新しいツールを作成するには、「ワークスペース」タブを開き、「ツール」に移動して、「+」ボタンをクリックして新しいツールを作成します。

新しいツールを作成するには、「ワークスペース」タブを開き、「ツール」に移動して「+」ボタンをクリックして新しいツールを作成します。クリックして拡大

開始するには、Open WebUI サイドバーの「ワークスペース」タブに移動し、「ツール」セクションを開いて、新しいツールを作成します。

デフォルトのスクリプトには、計算機、ユーザー情報の収集、時刻と日付、天気 API の機能が用意されています。

デフォルトのスクリプトには、電卓、ユーザー情報収集、日時、天気予報APIの機能が用意されています。クリックして拡大

デフォルトでは、Open WebUI は次のようなさまざまな便利なツールを追加するサンプル スクリプトをフィールドに入力します。

  • Open WebUIから名前とメールアドレスを取得する機能
  • 時計とカレンダー
  • 電卓
  • 天気アプリ

このスクリプトは変更せずにそのままにしておくこともできますが、動作しているかどうかを確認しやすくするために、次のようself.citation = Trueに追加することができますdef __init__(self):

クラス Tools: def __init__(self): self.citation = True を渡す

最後に、「BasicTools」のような名前と簡単な説明を付けて、「保存」をクリックします。

ツールをモデルで使用できるようにするには、必ずツールを有効にしてください。

ツールをモデルで使用できるようにするには、必ずツールを有効にしてください - クリックして拡大

ツールをご利用いただくには、モデルを選択して新しいチャットを開始し、メッセージボックスの左側にある「+」アイコンを押してBasicToolsを有効にしてください。これにより、モデルは会話中、適切なタイミングでこれらのツールを使用するようになります。

結局のところ、LLM に計算機を与えただけでは、答えを幻覚的に表示し始めることはないようです。

法学修士課程の学生に電卓を与えただけでは、答えを幻覚的に表示し始めることはないようです。クリックして拡大

ここで、先ほどの数学の問題をモデルに入力すると、正しい答えが返されるだけでなく、その数字に到達するために使用されたツールも表示されます。

会話の状況に応じて、リクエストに対応するために複数のツールが呼び出される場合があります。

詳しく見てみる

では、ここで何が起こっているのでしょうか?少なくともOpen WebUIでは、ツールはPythonスクリプトとして定義されています。正しくフォーマットされていれば、モデルから呼び出され、特定の問題を解決できます。

理解しやすくするために、前のステップで紹介したOpen WebUIのデモからこの例を引用しました。この例では、Pythonのdatetimeライブラリを使ってモデルに時間感覚を与えています。

インポートOS
from datetime import datetime class Tools: def __init__(self): self.citation = True # ツールの使用時に OpenWebUI にレポートさせたい場合はこれを追加します。 pass def get_current_time(self) -> str: """ より人間が読みやすい形式で現在の時刻を取得します。 :return: 現在の時刻。 """ now = datetime.now() current_time = now.strftime("%I:%M:%S %p") # AM/PM 付きの 12 時間形式を使用します current_date = now.strftime( "%A, %B %d, %Y" ) # 曜日、月名、日、年をすべて返します return f"Current Date and Time = {current_date}, {current_time}"

get_current_time日付と時刻を実際に取得する関数の他に、注意すべき要素が 2 つあります。

1 つ目はToolsクラスで、モデルに呼び出すことができる関数を通知します。

class Tools: def __init__(self): self.citation = True # ツールの使用時にOpenWebUIにレポートさせたい場合はこれを追加します。

ここでの2番目の要素は、実際には主関数の直下にあるdocstringです。これは関数が何をするかを示すだけでなく、コードをどのように処理するかに関するLLMの指示も提供します。

「」
現在の時刻を、より人間が読みやすい形式で取得します。
:return: 現在の時刻。
「」

モデルがツールの使用にあまりにも保守的になりすぎて困っている場合は、モデルがツールをどのように、いつ、どのような形式で使用すべきかについての指示をドキュメント文字列に追加して拡張すると役立つことがわかりました。

LLMをあらゆるものに接続

これらのツールは、時計、カレンダー、電卓などの基本的な機能に加えて、公開された API を持つほぼすべてのものと連携できます。

リモート ソースからデータを取得するだけでなく、API 呼び出しを使用して、Proxmox などのハイパーバイザーを含むあらゆるものを自動化できます。

この例では、Proxmoxer Python モジュールを使用して LLM が Proxmox クラスターの API に接続し、リソース使用率に関する情報を収集できるようにするツールをまとめました。

「」
タイトル: Proxmoxステータスレポート
バージョン: 1.0
説明: proxmox からステータス レポートを取得するための API 呼び出し。
要件: proxmoxer
""" from proxmoxer import ProxmoxAPI class ツール: def __init__(self): pass def proxmox_resource_report(self, node: str = None) -> str: """ 指定されたノード名に基づいて、クラスター内の Proxmox ノードのリソース使用率レベルを確認します。 この情報の要求例: - 「ノードの状況はどうですか」 - 「ホームラボのステータス レポートをください」 - 「Jupiter のリソース使用率を確認してください」 :param node: Proxmox ノードの名前。 ノード名は下線が引かれます。 ノード名が不明な場合は、クラスター内のすべてのノードの使用率データが提供されます。 :return: リソース使用率を含む文字列。 """ try: # APIトークンを使用してProxmox APIに接続します proxmox = ProxmoxAPI( "proxmox_host", user="username@realm", token_name="token_name", token_value="your_token_here", verify_ssl=False, #SSLを使用する場合はコメントアウトします ) # クラスターリソースを取得します cluster_resources = proxmox.cluster.resources.get() result = [] for resource in cluster_resources: if resource["type"] == "node" and ( node is None or resource["node"] == node ): node_name = resource["node"] # 関連するシステム情報を抽出します cpu_cores = resource["maxcpu"] memory_gb = round(resource["maxmem"] / 1024**3, 2) disk_gb = round(resource["disk"] / 1024**3, 2) disk_size = round(resource["maxdisk"] / 1024**3, 2) # ノードのリソース使用率を取得します。 node_status = proxmox.nodes(node_name).status.get() cpu_usage = round(node_status["cpu"] * 100, 2) memory_usage = round( node_status["memory"]["used"] / node_status["memory"]["total"] * 100, 2, ) disk_usage = round(resource["disk"] / resource["maxdisk"] * 100, 2) # フォーマットされた文字列で情報を収集します。 result.append( f"Node: {node_name} | CPU Cores: {cpu_cores} | CPU Usage: {cpu_usage}% | " f"Memory: {memory_gb} GB | Memory Usage: {memory_usage}% | " f"ディスク: {disk_gb} GB / {disk_size} GB | ディスク使用量: {disk_usage}%" ) 結果でない場合: f"ノード '{node}' のデータが見つかりません。" ノードの場合、それ以外の場合は "データが見つかりません。" "\n" を返します。join(result) except Exception as e: f"予期しないエラーが発生しました: {str(e)}" を返します。# 使用例
__name__ == "__main__" の場合: tools = Tools() result = tools.proxmox_resource_report("saturn") print(result)

Open-WebUIに保存したら、チャットで有効化してProxmoxクラスタのヘルスレポートを要求できます。この場合、すべて正常に動作しているように見えます。

ツール内のAPI呼び出しを使用すると、Proxmoxクラスタのヘルスレポートの生成など、さまざまなタスクを自動化できます。

ツール内のAPI呼び出しを使用すると、Proxmoxクラスタのヘルスレポートの生成など、さまざまなタスクを自動化できます - クリックして拡大

この例で注目すべきは、スクリプトの先頭にあるドキュメント文字列です。これは、Open WebUI が実行前に関連する Python パッケージを取得するなど、様々な目的で使用されます。

一方、もう少し下を見ると、proxmox_resource_report関数のドキュメント文字列が、プロンプトを処理するときにどのパラメータに注意すべきかをモデルに伝えていることがわかります。

これよりもさらに進んで、適切な安全策を講じた上で、VM と LXC コンテナの起動、クローン作成、管理を行う関数を定義することもできますが、これでこれらの関数がどれだけ拡張可能であるかがおわかりいただけたかと思います。

インスピレーションをお探しなら、Open WebUIのコミュニティページをご覧ください。ただし、ダッシュボードにコードを盲目的に貼り付けるのはやめてください。

追加リソース

Open WebUI のツール呼び出し実装は、実装が最も簡単なものの 1 つですが、他にもいくつかある実装の 1 つにすぎません。

  • Ollamaは最近、独自のツール呼び出し機能を追加しました
  • Mistral.rs は、OpenAI 互換の API 呼び出しを通じてサポートを提供します。
  • ハギングフェイスにはトランスフォーマーエージェントがいます。
  • LangChain は、多数のビルド済みツールを提供し、カスタムツールもサポートしています。

ユースケースによっては、これらのいずれかがお客様のニーズにより適している可能性があります。また、今後数か月で、これらのツールを活用するようにトレーニングされたモデルの数が増加すると予想しています。

The Register は、近い将来、このようなローカル AI コンテンツをさらに提供することを目指しています。ぜひ、コメント セクションで熱い質問を共有し、次にどのようなコンテンツをご覧になりたいかをお知らせください。®

編集者注: The Registerは、このような記事をサポートするために、NVIDIAからRTX 6000 Ada世代グラフィックスカード、およびIntelからArc A770 GPUを提供されました。両社は、この記事の内容に関して一切関与していません。

Discover More