👋

LLMによるツール呼び出し速度テスト

に公開

チャットbotでは、ユーザーとリアクティブなコミュニケーションが必要なため、LLMには短い文章に対して素早く的を得た動作をしてもらう必要があります。

実は以前、LLMにGroqのモデルを使ってツール呼び出し機能を開発したことがあるのですが、全く適切でないタイミングで全然違うツールを呼び出してくれたため、全然実装できない壁にぶち当たったことがありました。

そこで速度及び精度面で、どのAPIやモデルを使うべきか検証するため、シンプルなコードでツール呼び出しにかかる時間を測定しました。

他のLLMを試す時にもお役立てください

サンプルコード

クリックで展開
"""LLMによるツールの呼び出し速度を比較する"""
from datetime import datetime
from typing import Dict, List, Any

# LangChainベースのAPIクライアント
from langchain_openai import ChatOpenAI
from langchain_anthropic import ChatAnthropic
from langchain_groq import ChatGroq

from langchain_core.tools import tool
from langchain_core.messages import BaseMessage, SystemMessage, HumanMessage, AIMessage, ToolMessage

from dotenv import load_dotenv
load_dotenv()

# ツール関数定義
@tool
def check_payment_deadline(proposed_date: str) -> Dict[str, Any]:
    """ユーザーが提示した支払い日が、支払い期限日に間に合うか確認する"""

    DEADLINE_DATE = "2025-04-20"
    
    due_date = datetime.strptime(DEADLINE_DATE, "%Y-%m-%d")
    proposed = datetime.strptime(proposed_date, "%Y-%m-%d")
    
    if proposed <= due_date:
        return {
            "status": "OK",
            "message": f"提案された支払い日({proposed.strftime('%Y-%m-%d')})は期限内です",
            "days_remaining": (due_date - proposed).days
        }
    else:
        return {
            "status": "NG",
            "message": f"提案された支払い日({proposed.strftime('%Y-%m-%d')})は期限を過ぎています",
            "days_overdue": (proposed - due_date).days
        }

# 利用可能なツールのリスト
tools = [check_payment_deadline]


def try_llm(llm:ChatOpenAI | ChatAnthropic | ChatGroq):
    system_message = """あなたはスポーツジムのスタッフです。月会費の支払いが遅れているお客様に対して、支払日を確認する電話をかけています。
    お客様に対して、支払日を確認する電話をかけています。

    支払い期限日: 2025-04-20

    お客様の支払い予定日が、最終支払い期日に間に合う場合は、そのまま支払いをお願いし、
    支払い期日に間に合わない場合は、解約になる旨を伝えてください
    """

    messages:List[BaseMessage] = [SystemMessage(content=system_message)]

    ai_messages = ["こんにちは。こちらはエニタイムフィットネスです。森本さんのお電話で間違いないでしょうか。","4月分のお支払いについて、未払いとなっております。至急お支払いをお願いしたいのですが、いつ頃お支払いが可能ですか?"]
    human_messages = ["はい","あ、そうだったんですね。すみません。4月10日に支払いします。"]

    llm_with_tools = llm.bind_tools(tools)


    for ai_message, human_message in zip(ai_messages, human_messages):
        print(f"AI: {ai_message}")
        messages.append(AIMessage(content=ai_message))

        print(f"HUMAN: {human_message}")
        messages.append(HumanMessage(content=human_message))
        time_start = datetime.now()

        response = llm_with_tools.invoke(messages)
        print(f"ツール呼び出し: {response.tool_calls}")

        time_end = datetime.now()
        print(f"時間: {time_end - time_start}")
        print("--------------------------------")        



if __name__ == "__main__":
    print("==============gpt-4o-mini==============")
    llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
    try_llm(llm)

    print("\n\n")

    print("==============gpt-4o==============")
    llm = ChatOpenAI(model="gpt-4o", temperature=0)
    try_llm(llm)

    print("==============claude-3-5-haiku-20241022==============")
    llm = ChatAnthropic(model_name="claude-3-5-haiku-20241022", temperature=0)
    try_llm(llm)

    print("==============groq==============")
    llm = ChatGroq(model="meta-llama/llama-4-scout-17b-16e-instruct", temperature=0)
    try_llm(llm)

※ できることはツール呼び出しだけです。
functionの実行は、LangGraphのToolNodeを使うなど別途実装が必要です。

実証結果

出力(クリックで展開)
==============gpt-4o-mini==============
AI: こんにちは。こちらはエニタイムフィットネスです。森本さんのお電話で間違いないでしょうか。
HUMAN: はい
ツール呼び出し: []
時間: 0:00:01.486236
--------------------------------
AI: 4月分のお支払いについて、未払いとなっております。至急お支払いをお願いしたいのですが、いつ頃お支払いが可能ですか?
HUMAN: あ、そうだったんですね。すみません。4月10日に支払いします。
ツール呼び出し: [{'name': 'check_payment_deadline', 'args': {'proposed_date': '2024-04-10'}, 'id': 'call_D4osymbXsfThuebKX1SGZ3JO', 'type': 'tool_call'}]
時間: 0:00:01.053883
--------------------------------



==============gpt-4o==============
AI: こんにちは。こちらはエニタイムフィットネスです。森本さんのお電話で間違いないでしょうか。
HUMAN: はい
ツール呼び出し: []
時間: 0:00:01.265814
--------------------------------
AI: 4月分のお支払いについて、未払いとなっております。至急お支払いをお願いしたいのですが、いつ頃お支払いが可能ですか?
HUMAN: あ、そうだったんですね。すみません。4月10日に支払いします。
ツール呼び出し: [{'name': 'check_payment_deadline', 'args': {'proposed_date': '2025-04-10'}, 'id': 'call_QiGez5cYDb5PF1QgqsE5rOdW', 'type': 'tool_call'}]
時間: 0:00:00.821806
--------------------------------



==============claude-3-5-haiku-20241022==============
AI: こんにちは。こちらはエニタイムフィットネスです。森本さんのお電話で間違いないでしょうか。
HUMAN: はい
ツール呼び出し: []
時間: 0:00:07.084594
--------------------------------
AI: 4月分のお支払いについて、未払いとなっております。至急お支払いをお願いしたいのですが、いつ頃お支払いが可能ですか?
HUMAN: あ、そうだったんですね。すみません。4月10日に支払いします。



==============groq==============
AI: こんにちは。こちらはエニタイムフィットネスです。森本さんのお電話で間違いないでしょうか。
HUMAN: はい
ツール呼び出し: []
時間: 0:00:00.836546
--------------------------------
AI: 4月分のお支払いについて、未払いとなっております。至急お支払いをお願いしたいのですが、いつ頃お支払いが可能ですか?
HUMAN: あ、そうだったんですね。すみません。4月10日に支払いします。
ツール呼び出し: [{'name': 'check_payment_deadline', 'args': {'proposed_date': '2025-04-10'}, 'id': 'call_b7en', 'type': 'tool_call'}]
時間: 0:00:00.525716
--------------------------------
  • gpt-4oよりも4o-miniのほうが少し早い。精度については、gpt-4o-miniでもとりあえず問題なさそう。1秒以内にツール呼び出しができており、チャットbotでも実用的なレベル。

  • claude-haikuは、ツール呼び出しに7〜8秒かかっており、速度面でチャットbotで使えるレベルではない。

  • Groqはやはり一番早い。とはいえ、会話が長くなってきたり、ツールが複雑になってくると正確性に欠くことは経験済みなので、そんな時はgpt-4o-miniを使おう

Discussion