様々なLLMの差を吸収してくれる形で利用が可能となるライブラリといえばLangChainが有名ですが、LangChainは機能モリモリかつアップデートも頻繁で、単にLLMを共通の形式として利用したいだけのユースケースの場合には重いな、と感じる場合があります。
そこで、各LLMの差を吸収してくれる薄いライブラリとして利用できるのが今回ご紹介するLiteLLM。
LiteLLMを介して各LLMへリクエストを送ると、レスポンス形式がOpenAIの形式で統一される形で返ってきます。
たとえば、OpenAI以外のLLMからのレスポンスも、おなじみの下記OpenAI形式で中身を参照できます。
response.choices[0].message.content
ひととおり軽く触ってみたので、雰囲気をご共有いたします。
目次:
基本的なLiteLLMの使い方: リクエスト方法
LiteLLM - Getting Started | liteLLM
OpenAI (GPT)
from litellm import completion
response = completion(
model="gpt-4o-mini",
messages=[{ "content": "Hello, how are you?","role": "user"}]
)
completionを関数としてインポートして、各パラメータ指定は関数の引数として渡してあげるというシンプルな利用が可能。
Anthoropic (Claude)
Anthoropicモデルの指定はリリース日を含む形式で指定する必要があります。
LiteLLM公式Docs: Supported Modelsにおける「Function Call」と呼ばれるほうの呼び名で指定しましょう。(Model Nameではない)
response = completion(
model="claude-3-haiku-20240307",
messages=[{ "content": "Hello, how are you?","role": "user"}]
)
シンプルな形式で使用トークン数を確認可能
OpenAI形式よりシンプルな形式で確認可能です。他モデルで利用した場合も同様。
# 出力トークン数
response.usage.completion_tokens
# 入力トークン数
response.usage.prompt_tokens
# 合計トークン数
response.usage.total_tokens
キャッシュされたトークン数も参照可
モデルがキャッシュ利用に対応している場合、キャッシュされたトークン数も参照が可能です。
# プロンプトトークンの詳細を表示
print(response.usage.prompt_tokens_details)
# 出力結果:
PromptTokensDetailsWrapper(audio_tokens=0, cached_tokens=0, text_tokens=None, image_tokens=None)
OpenAIは自動でプロンプトキャッシュが適用されるようですが、Anthoropicはcache_controleによる明示的にキャッシュ利用の設定が必要なようです。
from litellm import completion
import litellm
import os
litellm.set_verbose = True # 👈 SEE RAW REQUEST
os.environ["ANTHROPIC_API_KEY"] = ""
response = completion(
model="anthropic/claude-3-5-sonnet-20240620",
messages=[
{
"role": "system",
"content": [
{
"type": "text",
"text": "You are an AI assistant tasked with analyzing legal documents.",
},
{
"type": "text",
"text": "Here is the full text of a complex legal agreement" * 400,
"cache_control": {"type": "ephemeral"},
},
],
},
{
"role": "user",
"content": "what are the key terms and conditions in this agreement?",
},
]
)
print(response.usage)
LangSmithによる監視が可能
Langsmith - Logging LLM Input/Output | liteLLM
litellmパッケージ全体をインポートし、処理が成功した場合のコールバック先としてLangSmithを指定するよう設定すればOKです。
import litellm
litellm.success_callback = ["langsmith"]
環境変数から利用する場合、LiteLLMでは”LANGSMITH_API_KEY”のように”LANGSMITH”として指定する必要があります。
この点、LangSmithで推奨される設定では”LANGCHAIN_API_KEY”のように”LANGCHAIN”として環境変数を設定することが推奨されているので、差異にご注意ください。
# LangChainでのデフォルト環境変数設定
LANGCHAIN_TRACING_V2=true
LANGCHAIN_ENDPOINT="https://api.smith.langchain.com"
LANGCHAIN_API_KEY="<your-api-key>"
LANGCHAIN_PROJECT="anything"
# LLMLiteで使用される環境変数 (exportしています)
export LANGSMITH_API_KEY="<your-api-key>"
export LANGSMITH_PROJECT="anything"
export LANGSMITH_DEFAULT_RUN_NAME="anything"
プロジェクトを新規に作成する場合、LANGSMITH_PROJECTとLANGSMITH_DEFAULT_RUN_NAMEは自由に決めてOKです。設定した名称でLangSmith上でプロジェクトが作成され監視されるようになります。
または一旦、下記のようにAPIキーをハードコーディングしてみても良いでしょう。
import os
os.environ["LANGSMITH_API_KEY"] = ""
os.environ["LANGSMITH_PROJECT"] = "" # defaults to litellm-completion
os.environ["LANGSMITH_DEFAULT_RUN_NAME"] = "" # defaults to LLMRun
# LLM API Keys
os.environ['OPENAI_API_KEY']=""
環境設定が完了したら、下記のように利用できます。
import litellm
# set langsmith as a callback, litellm will send the data to langsmith
litellm.success_callback = ["langsmith"]
# openai call
response = litellm.completion(
model="gpt-4o-mini",
messages=[
{"role": "user", "content": "Hi 👋 - i'm openai"}
]
)
構造化出力(Structured Output)やJSON Modeにも対応
まだ試せていませんが、OpenAIにおける構造化出力(Structured Output)や他モデルでもJSON Modeに対応しているようです。
Structured Outputs (JSON Mode) | liteLLM
型指定呼び出しの基本的な使い方(JSON Mode)
呼び出すときに引数としてresponse_formatでjson_objectとして指定すれば良いだけのようですね。純正OpenAI APIで呼び出す際にJSONモード指定する方法と同じ形式です。
from litellm import completion
import os
os.environ["OPENAI_API_KEY"] = ""
response = completion(
model="gpt-4o-mini",
response_format={ "type": "json_object" },
messages=[
{"role": "system", "content": "You are a helpful assistant designed to output JSON."},
{"role": "user", "content": "Who won the world series in 2020?"}
]
)
print(response.choices[0].message.content)
OpenAIの場合はPydanticを利用した構造化出力(Structured Output)にも対応
OpenAIのAPIではPydanticを利用してアウトプットのスキーマ定義が可能なStructured Outputが利用可能ですが、LiteLLMを介してもStructured Outputが利用可能なようです。
JSONモードでは単に「JSON形式であること」のみを保証するだけですが、Structured Outputでは「スキーマとしての形式」までが保証されます。
下記のように、response_formatにPydanticにより定義した型を指定すればOKとのこと。こちらも純正OpenAI APIから出力形式を指定する方法と同じですね。
import os
from pydantic import BaseModel
from litellm import completion
# add to env var
os.environ["OPENAI_API_KEY"] = ""
messages = [{"role": "user", "content": "List 5 cookie recipes"}]
class CalendarEvent(BaseModel):
name: str
date: str
participants: list[str]
resp = completion(
model="gpt-4o-2024-08-06",
messages=messages,
response_format=CalendarEvent
)
print("Received={}".format(resp))
コード転載元: [Feature]: Add openai structured responses · Issue #5074 · BerriAI/litellm
モデルが型指定に対応しているかチェックが可能
便利な機能として、対象のモデルがJSON Modeに対応しているかどうかのチェックが可能。
from litellm import get_supported_openai_params
params = get_supported_openai_params(model="anthropic.claude-3", custom_llm_provider="bedrock")
assert "response_format" in params
JSON型のバリデーション機能も搭載
jsonvalidatorを利用して、LiteLLM側がレスポンスとして返ってきたJSONのバリデーションチェックも実施可能とのこと。
# !gcloud auth application-default login - run this to add vertex credentials to your env
import litellm, os
from litellm import completion
from pydantic import BaseModel
messages=[
{"role": "system", "content": "Extract the event information."},
{"role": "user", "content": "Alice and Bob are going to a science fair on Friday."},
]
litellm.enable_json_schema_validation = True
litellm.set_verbose = True # see the raw request made by litellm
class CalendarEvent(BaseModel):
name: str
date: str
participants: list[str]
resp = completion(
model="gemini/gemini-1.5-pro",
messages=messages,
response_format=CalendarEvent,
)
print("Received={}".format(resp))
以上です。シンプルで使いやすいので、皆さんもぜひ触ってみてください!
この記事の気になる箇所を読み返す:
Category: 開発・プログラミング | エンジニアリング
Tags: