🤖
# Aisuiteでローカルllmをまとめてテストする
今回のゴール:
ローカルのollamaにpullしてあるすべてのモデルを一気にテストするツールをaisuiteを使って実装する。
AiSuiteとは?
AiSuiteは、開発者が単一の標準化されたインターフェースを通じて複数の LLM を操作できるようにするツールです。OpenAI のインターフェースと同様に動作し、ユーザーはコードを変更することなく、一般的な LLM と対話して出力を比較できます。
機能
- *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をテストするツールを作りました。以下から利用可能です。
主要な実装は以下の二つです。
コードはこちらの方の実装を参考にしています。
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