ドキュメンテーション

使用開始

LLMによる予測

エージェントフロー

テキスト埋め込み

トークン化

モデル管理

モデル情報

.act() 呼び出し

自動ツール呼び出し

ここでは、ツールの実行、その出力をLLMに提供し、LLMが次に何をすべきかを決定するのを待つという結合されたプロセスを説明するために、「実行ラウンド」という概念を導入します。

実行ラウンド

 • run a tool →
 ↑   • provide the result to the LLM →
 │       • wait for the LLM to generate a response

 └────────────────────────────────────────┘ └➔ (return)

モデルは、最終結果を返す前にツールを複数回実行することを選択する場合があります。たとえば、LLMがコードを記述している場合、プログラムをコンパイルまたは実行し、エラーを修正し、再度実行するというプロセスを、望ましい結果が得られるまで繰り返す場合があります。

これを踏まえ、.act() APIは自動的な「複数ラウンド」のツール呼び出しAPIであると言えます。

クイック例

import lmstudio as lms

def multiply(a: float, b: float) → float:
    """Given two numbers a and b. Returns the product of them."""
    return a * b

model = lms.llm("qwen2.5-7b-instruct")
model.act(
  "What is the result of 12345 multiplied by 54321?",
  [multiply],
  on_message=print,
)

LLMが「ツールを使用する」とはどういう意味ですか?

LLMは、ほとんどがテキスト入力・テキスト出力のプログラムです。そこで、「LLMがどのようにツールを使用できるのか?」と疑問に思うかもしれません。答えは、一部のLLMは、人間に対してツールの呼び出しを依頼し、ツールの出力を特定の形式で返すことを期待するように訓練されているということです。

電話で誰かにコンピュータサポートを提供している場面を想像してみてください。「このコマンドを実行してください...OK、何が出力されましたか?...OK、今度はそこをクリックして、何が表示されるか教えてください...」などと言うかもしれません。この場合、あなたがLLMです!そして、あなたは電話の向こうにいる人を通して「ツールを代理で呼び出している」のです。

重要: モデルの選択

ツール使用のために選択されるモデルは、パフォーマンスに大きく影響します。

モデル選択に関する一般的なガイドライン

  • すべてのモデルがインテリジェントなツール使用ができるわけではありません
  • 大きいほど良い(つまり、7Bパラメータモデルは一般的に3Bパラメータモデルよりも優れたパフォーマンスを発揮します)
  • Qwen2.5-7B-Instructは幅広いケースで良好なパフォーマンスを示すことが観察されています
  • このガイドラインは変更される可能性があります

例: 複数のツール

以下のコードは、単一の.act()呼び出しで複数のツールを提供する方法を示しています。

import math
import lmstudio as lms

def add(a: int, b: int) → int:
    """Given two numbers a and b, returns the sum of them."""
    return a + b

def is_prime(n: int) → bool:
    """Given a number n, returns True if n is a prime number."""
    if n < 2:
        return False
    sqrt = int(math.sqrt(n))
    for i in range(2, sqrt):
        if n % i == 0:
            return False
    return True

model = lms.llm("qwen2.5-7b-instruct")
model.act(
  "Is the result of 12345 + 45668 a prime? Think step by step.",
  [add, is_prime],
  on_message=print,
)

例: ファイル作成ツールを使用したチャットループ

以下のコードは、ファイルを作成できるLLMエージェントとの会話ループを作成します。

import readline # Enables input line editing
from pathlib import Path

import lmstudio as lms

def create_file(name: str, content: str):
    """Create a file with the given name and content."""
    dest_path = Path(name)
    if dest_path.exists():
        return "Error: File already exists."
    try:
        dest_path.write_text(content, encoding="utf-8")
    except Exception as exc:
        return "Error: {exc!r}"
    return "File created."

def print_fragment(fragment, round_index=0):
    # .act() supplies the round index as the second parameter
    # Setting a default value means the callback is also
    # compatible with .complete() and .respond().
    print(fragment.content, end="", flush=True)

model = lms.llm()
chat = lms.Chat("You are a task focused AI assistant")

while True:
    try:
        user_input = input("You (leave blank to exit): ")
    except EOFError:
        print()
        break
    if not user_input:
        break
    chat.add_user_message(user_input)
    print("Bot: ", end="", flush=True)
    model.act(
        chat,
        [create_file],
        on_message=chat.append,
        on_prediction_fragment=print_fragment,
    )
    print()

進捗コールバック

ツールを使用するエージェントとの複雑なインタラクションは、処理に時間がかかる場合があります。

あらゆる予測リクエストに対する通常の進捗コールバックは利用可能ですが、期待される機能は単一ラウンド予測のものとは異なります。

  • on_prompt_processing_progress: 各予測ラウンドのプロンプト処理中に呼び出されます。進捗率(float)とラウンドインデックスを位置引数として受け取ります。
  • on_first_token: 各予測ラウンドのプロンプト処理完了後に呼び出されます。ラウンドインデックスを唯一の引数として受け取ります。
  • on_prediction_fragment: クライアントが受け取った各予測フラグメントごとに呼び出されます。予測フラグメントとラウンドインデックスを位置引数として受け取ります。
  • on_message: 各予測ラウンドが完了するとアシスタント応答メッセージとともに、各ツール呼び出しリクエストが完了するとツール結果メッセージとともに呼び出されます。これは受信したメッセージをチャット履歴インスタンスに追加することを目的としており、そのためラウンドインデックスを引数として受け取りません

予測ラウンドを監視するために、以下の追加コールバックが利用可能です。

  • on_round_start: 各ラウンドの予測リクエストを送信する前に呼び出されます。ラウンドインデックスを唯一の引数として受け取ります。
  • on_prediction_completed: ラウンドの予測が完了した後、要求されたツール呼び出しが開始される前に呼び出されます。ラウンドの予測結果を唯一の引数として受け取ります。ラウンド予測結果は、追加のround_index属性を持つ通常の予測結果です。
  • on_round_end: ラウンドのツール呼び出し要求がすべて解決された後に呼び出されます。

最後に、アプリケーションはエージェントが無効なツール要求を発行した際に通知を要求することができます。

  • handle_invalid_tool_request: ツールリクエストが処理できなかった場合に呼び出されます。報告されようとしている例外と、問題を引き起こした元のツールリクエストを受け取ります。ツールリクエストが与えられない場合、これはエージェントのインタラクションが指定された例外を発生させる前の、回復不能なエラーの純粋な通知です(アプリケーションが代わりに独自の例外を発生させることを許可します)。ツールリクエストが与えられる場合、それはエラーの説明がローカルで発生するのではなく、失敗したツールリクエストの結果としてエージェントに返されることを示します。これらのケースでは、コールバックは、エラーの説明をエージェントに送信する必要があることを示すためにNoneを返すか、指定された例外(または異なる例外)をローカルで発生させるか、またはエラーの説明の代わりにエージェントに送信すべきテキスト文字列を返すことができます。

ツールの定義に関する追加の詳細、および無効なツール要求処理をオーバーライドして、エージェントに渡す代わりにすべての例外をローカルで発生させる例については、ツール定義を参照してください。