🤖

# Aisuiteでローカルllmをまとめてテストする

2025/01/03に公開

今回のゴール:

ローカルのollamaにpullしてあるすべてのモデルを一気にテストするツールをaisuiteを使って実装する。

AiSuiteとは?

AiSuiteは、開発者が単一の標準化されたインターフェースを通じて複数の LLM を操作できるようにするツールです。OpenAI のインターフェースと同様に動作し、ユーザーはコードを変更することなく、一般的な LLM と対話して出力を比較できます。

https://github.com/andrewyng/aisuite

機能

  • *AiSuite は、*LLM 用の既存の Python クライアント ライブラリをラップした軽量ラッパーです。
  • プロバイダーとの安定した接続を確保するために、HTTP エンドポイントまたは SDK のいずれかを使用します。
  • 開発者は LLM を簡単に切り替えてパフォーマンスをテストできます。

サポートされているプロバイダー:

AiSuite は、OpenAI、Anthropic、Azure、Google、AWS、Groq、Mistral、HuggingFace、Ollama など、いくつかの主要な LLM プロバイダーと連携しています。

今回はローカルモデルのテストなのでOllamaを使って例を示します。

(お財布の都合です。)

使ってみる。

仮想環境

python -m venv venv
source venv/bin/activate

インストール

pip install aisuite[ollama]

ollamaでダウンロード済みllm一覧確認

$ ollama ls
NAME                                              ID              SIZE      MODIFIED     
exaone3.5:32b                                     f2f69abac3da    19 GB     39 hours ago    
qwq:latest                                        46407beda5c0    19 GB     39 hours ago    
llama3.1:latest                                   46e0c10c039e    4.9 GB    40 hours ago    
llama3.2:3b                                       a80c4f17acd5    2.0 GB    2 weeks ago     
charaf/bge-m3-f32:latest                          f8019d326f54    2.3 GB    2 weeks ago     
7shi/tanuki-dpo-v1.0:8b-q6_K                      96d0a363b069    6.2 GB    2 weeks ago     
llama3:latest                                     365c0bd3c000    4.7 GB    6 weeks ago     
llava:latest                                      8dd30f6b0cb1    4.7 GB    6 weeks ago     
command-r:latest                                  7d96360d357f    18 GB     6 weeks ago     
mxbai-embed-large:latest                          468836162de7    669 MB    6 weeks ago     
brxce/stable-diffusion-prompt-generator:latest    474a09318a2e    4.1 GB    6 weeks ago     
qwen2.5:latest                                    845dbda0ea48    4.7 GB    6 weeks ago     
llama3.2:latest                                   a80c4f17acd5    2.0 GB    6 weeks ago  

超基本的なaisuiteの実装方法

# main.py
import aisuite as ai

client = ai.Client()
llm = 'ollama:exaone3.5:32b'
message = [{"role": "user", "content": "日本語で枝豆の魅力について語ってください"}]

response = client.chat.completions.create(model=llm, messages=messages)
print(response.choices[0].message.content.strip())

llmを選択するときはollama:をつけるのを忘れないでください。

出力:

枝豆はその独自の魅力で多くの人に愛されています。

* **豊かな風味:** 軟らかな食感と、苦味と甘みのバランスが絶妙な独特の味わいが特徴です。
* **健康メーカー:** 低カロリーで、ビタミン・B群、カルシウム、鉄分など多くの栄養素を豊富に含み、栄養価が高いです。
* **多様な利用:** 料理にあらかじめ絞ってお醤油やしょう油と混ぜて使用するほか、天ぷらに、サラダ、煮物、汁物など様々な場面で活躍します。
* **季節感:** 夏に収穫されることから、その時期の旬の食材として、季節感を楽しむことができる点も魅力的です。
* **郷愁と伝統:** 日本の食文化に根付いた存在で、懐かしい味で多くの人に定番の野菜として親しまれています。

これらの要素が組み合わさって、枝豆は単に味のある野菜を超え、日本の食文化にとって重要な位置を占めています。

使用例 ローカルLLMテスター

これを利用して、ローカルにダウンロードされている全てのllmをテストするツールを作りました。以下から利用可能です。

https://github.com/ikrfun/aisuit_test

主要な実装は以下の二つです。

コードはこちらの方の実装を参考にしています。

https://medium.com/@ahmadtalha963/comparing-ollama-llms-using-aisuite-fa9c7a65a1fe

def get_ollama_llms():
    try:
        result = subprocess.run(['ollama', 'ls'], capture_output=True, text=True)
        if result.returncode == 0:
            # ヘッダー行をスキップし、各行からNAME部分(最初のカラム)を抽出
            lines = result.stdout.strip().split('\n')[1:]  
            models = []
            for line in lines:
                # 空白で分割し、最初のカラム(NAME)を取得
                name = line.split()[0]
                models.append(f"ollama:{name}")
            print(f"これらのモデルが検出されました:{models}")
            return models
        else:
            print("ollamaコマンドの実行に失敗しました")
            return []
    except FileNotFoundError:
        print("ollamaコマンドが見つかりません")
        return []

pullされているモデルの一覧を取得して、ollama:{model_name}の形に整形し、リストにします。

def compare_llm(llms, messages):
    execution_times = []
    responses = []
    for llm in llms:
        try:
            print(f"\n{llm}のテストを開始します...")
            start_time = time.time()
            response = client.chat.completions.create(model=llm, messages=messages)
            end_time = time.time()
            execution_time = end_time - start_time
            responses.append(response.choices[0].message.content.strip())
            execution_times.append(execution_time)
            print(f"{llm} - {execution_time:.2f} seconds: {response.choices[0].message.content.strip()}")
        except Exception as e:
            print(f"\n{llm}でエラーが発生しました:")
            print(f"エラー内容: {str(e)}")
            responses.append(f"エラー: {str(e)}")
            execution_times.append(-1)
            continue
    return responses, execution_times

def get_messages(mcontent):
    return [
        {"role": "user", "content": mcontent},
    ]

リストに含まれたllmを順番に実行し、実行タイムを計測します。

Discussion