☺️

【LiteLLM】PythonでLLMのAPIを簡単に切り替える方法

2025/02/11に公開

https://www.litellm.ai/

1. はじめに

アクセンチュア株式会社の桐山です。

近年、大規模言語モデル(LLM)の進化が加速し、ChatGPT、Claude、Gemini … などなど、多様なモデルが登場しています。
しかし、この急速な発展に伴い、LLMごとに APIのインターフェースが異なる という課題が生じています。
たとえば、ChatGPTとClaudeでは、以下のように実装方法が異なり、統一性がありません。

ChatGPTの場合(OpenAI公式より)

from openai import OpenAI
client = OpenAI()

completion = client.chat.completions.create(
    model="gpt-4o",
    messages=[
        {"role": "developer", "content": "You are a helpful assistant."},
        {
            "role": "user",
            "content": "Write a haiku about recursion in programming."
        }
    ]
)

print(completion.choices[0].message)

AWS Bedrock Claudeの場合(Anthropic公式より)

import boto3
import json

bedrock = boto3.client(service_name="bedrock-runtime")
body = json.dumps({
  "max_tokens": 256,
  "messages": [{"role": "user", "content": "Hello, world"}],
  "anthropic_version": "bedrock-2023-05-31"
})

response = bedrock.invoke_model(body=body, modelId="anthropic.claude-3-5-sonnet-20241022-v2:0")

response_body = json.loads(response.get("body").read())
print(response_body.get("content"))

 
そこで役立つのが LiteLLM です。LiteLLMを使うと、統一されたインターフェースで複数のLLMを簡単に切り替えることができます。
実装のイメージとしては、API Key等必要な情報を環境変数にセットし、あとは呼び出したい {モデル名} をセットするだけです。

LiteLLMの場合(LiteLLM公式より)

from litellm import completion
import os

## set ENV variables
os.environ[{APIキー名}] = "your-api-key"

response = completion(
  model={モデル名},
  messages=[{ "content": "Hello, how are you?","role": "user"}]
)

2. ゴール

まず冒頭に、今回のゴールを示します。
本記事では、LiteLLMの検証に焦点を当てるため、UIの実装は行わず、シンプルな実装にとどめます。
また、LLMの指定は、プロンプト内で「教えて {モデル名} 」の形式で行うものとします。

教えてChatGPT

プロンプト:教えてChatGPT DevOpsとSREの違いを詳しく説明して
回答:
DevOpsとSRE(Site Reliability Engineering)は、両方ともソフトウェア開発と運用の間のギャップを埋めるためのアプローチですが、それぞれ異なる視点からアプローチしています。

DevOpsは、開発(Dev)と運用(Ops)の間のコラボレーションを強調します。これは、ソフトウェアのリリースサイクルを短縮し、頻繁かつ信頼性の高いソフトウェアリリースを可能にするための文化的なシフトを意味します。DevOpsは、自動化 、継続的インテグレーション(CI)、継続的デリバリー(CD)、インフラストラクチャーとコードの管理などの技術的な側面に重点を置いています。

一方、SREはGoogleによって開発された概念で、ソフトウェアの信頼性と安定性を確保することに重点を置いています。SREは、システムの信頼性、スケーラビリティ、パフォーマンスを向上させるためのエンジニアリングの原則を適用します。SREは、システムのダウンタイムを最小限に抑えるためのエラーバジェットという概念を導入し、システムの問題を解決するための自動化に重点を置いています。

要するに、DevOpsは開発と運用の間のコラボレーションと効率性を強調し、SREはシステムの信頼性とスケーラビリティを強調します。しかし、両者は相互補完的であり、一部の組織では両方の原則を組み合わせて使用しています。

この回答は、ChatGPTが提供したものです。ChatGPTはOpenAIが開発したLLMです。

教えてClaude

プロンプト:教えてClaude DevOpsとSREの違いを詳しく説明して
回答:
はい、DevOpsとSREの違いについて詳しく説明します。

DevOpsは、ソフトウェア開発とIT運用の垣根を取り払い、両者が協力して迅速かつ効率的にアプリケーションやサービスを 提供することを目的とした文化的な取り組みです。DevOpsでは、開発者と運用者が密に連携し、自動化やツール活用によってリリースサイクルを短縮し、継続的な改善を行います。

一方、SRE(Site Reliability Engineering)は、Googleが提唱したソフトウェア工学の手法です。SREの目的は、大規模で複雑なシステムを信頼性の高い方法で運用することです。SREでは、開発者と運用者の垣根を取り払い、ソフトウェアエンジニアリングの手法を使ってシステムの可用性、パフォーマンス、スケーラビリティ、モニタリングなどを管理します。

主な違いは以下の通りです:

- 目的: DevOpsは迅速なリリースと継続的な改善、SREは信頼性の高いシステム運用
- 手法: DevOpsは自動化とツール活用、SREはソフトウェアエンジニアリングの手法
- 組織: DevOpsは開発と運用の垣根を取り払う、SREは開発と運用の垣根を取り払う
- 指標: DevOpsはリリース頻度やデプロイ時間、SREはエラー率やダウンタイムなど

このように、DevOpsとSREは共通の目的を持ちつつ、アプローチや手法が異なります。両者を組み合わせることで、より高度なシステム運用が可能になります。

この回答は、Claudeが提供したものです。Claudeは、Anthropicが開発したLLMです。

教えてGemini

プロンプト:教えてGemini DevOpsとSREの違いを詳しく説明して
回答:
DevOpsとSREはどちらもソフトウェアの信頼性と運用効率の向上を目指す役割ですが、アプローチが異なります。

**DevOps**は、開発チーム(Dev)と運用チーム(Ops)の連携を強化し、ソフトウェア開発ライフサイクル全体を自動化・効率化することを目指します。開発と運用を統合することで、迅速なリリースサイクル、高い品質、そして柔軟な対応を実現します。具体的には、CI/CDパイプラインの構築、インフラの自動化、モニタリングツールの導入などが含まれます。

**SRE(Site Reliability Engineering)**は、ソフトウェアシステムの信頼性と安定性を定量的に管理・向上させるためのエンジニアリングアプローチです。DevOpsの原則を基盤としつつ、サービスレベル目標(SLO)を設定し、その達成度を監視・改善することに重点を置きます。障害発生時の迅速な復旧、システムのスケーラビリティ確保、そして予防的なメンテナ ンスなどが主な業務です。

簡単に言うと、DevOpsは「どのように効率的にソフトウェアを開発・運用するか」という方法論であり、SREは「どのようにソフトウェアの信頼性を保証するか」という専門分野です。DevOpsの原則をSREが実践する、という関係にあります。DevOpsが幅広い活動を含むのに対し、SREはより専門的で、信頼性と安定性に特化しています。

この回答は、Geminiが提供したものです。GeminiはGoogleが開発したLLMです。

3. インストール

以下のpipコマンドで、LiteLLMをインストールします。

pip install litellm

4. 実装

  • Pythonコード
import os
import re
import warnings
from litellm import completion
from dotenv import load_dotenv

load_dotenv()
AWS_MODEL = os.environ.get("AWS_MODEL") 
AZURE_MODEL = os.environ.get("AZURE_MODEL") 
GEMINI_MODEL = os.environ.get("GEMINI_MODEL") 

# システムプロンプト
system_prompt = (
    "あなたは親切で丁寧なAIアシスタントです。ユーザーからの質問に対して簡潔かつ分かりやすく回答してください。"
    "また、回答の最後にあなたのモデルとその開発元も教えてください。"
    "例えば、「この回答は、Xが提供したものです。XはYが開発したLLMです。」の情報を付加してください。Xはモデル名、Yは会社名です。"
)

# ユーザープロンプト
user_question = input("プロンプト:")

# モデルを選択
match = re.search(r"(教えて|おしえて)\s*(\w+)", user_question, re.IGNORECASE)
if match:
    model_name = match.group(2).lower()
    if "chatgpt" in model_name:
        select_model = AZURE_MODEL
    elif "claude" in model_name:
        select_model = AWS_MODEL
    elif "gemini" in model_name:
        select_model = GEMINI_MODEL
    else:
        select_model = AZURE_MODEL
else:
    select_model = AZURE_MODEL

response = completion(
    model = select_model,   # ここにモデル名を指定するだけ! 
    messages=[
        {
            "role": "system",
            "content": system_prompt
        },
        {
            "role": "user",
            "content": user_question
        }
    ],
    temperature=0,
    top_p=1
)

assistant_message = response.choices[0].message.content
print("回答:")
print(assistant_message)
  • .envの例
# Azure OpenAI Service ChatGPT API情報
AZURE_API_BASE={your-azure-api-base}
AZURE_API_KEY={your-azure-api-key}
AZURE_API_VERSION=2024-05-01-preview
AZURE_MODEL=azure/gpt-4

# AWS Bedrock Claude API情報
AWS_ACCESS_KEY_ID={your-aws-access-key-id}
AWS_SECRET_ACCESS_KEY={your-aws-secret-access-key}
AWS_REGION_NAME=ap-northeast-1
AWS_MODEL=bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0

# GEMINI API情報
GEMINI_API_KEY={your-gemini-api-key}
GEMINI_MODEL=gemini/gemini-1.5-flash

5. さいごに

本記事では、LiteLLMを活用することで、異なるLLMのAPIを統一的に扱い、簡単に切り替えられることを紹介しました。
現在、多様なLLMが存在し、それぞれ異なるAPI仕様を持っていますが、LiteLLMを利用すれば開発の手間を削減することが可能なため、非常に有用なツールと感じました。

LiteLLMは、もちろんDeepSeekにも対応していますw

Accenture Japan (有志)

Discussion