LLMをPythonアプリから呼び出したいとき、APIごとに異なるSDKやリクエスト形式を覚えるのは少し面倒です。そこで今回は、OpenAI互換APIに対応したサービスを、共通のPythonコードから呼び出す最小構成を作ります。
結論から言うと、openaiパッケージのOpenAIクライアントにAPIキーとbase_url、モデル名を渡せば、短いコードでテキスト生成を実装できます。接続先を環境変数に切り出しておけば、サービスを変更するときもアプリ本体をほとんど変更せずに済みます。
前提と環境を準備する
今回の構成は次のとおりです。
- Python 3.10以上
- OpenAI互換APIを提供するサービス
- APIキー
- APIに対応したモデル名
まず、作業用ディレクトリを作成し、仮想環境を有効化します。
mkdir llm-minimal-app
cd llm-minimal-app
python -m venv .venv
macOSやLinuxの場合は次のコマンドです。
source .venv/bin/activate
Windows PowerShellの場合はこちらです。
.venv\Scripts\Activate.ps1
続いて、OpenAI公式SDKをインストールします。
pip install openai python-dotenv
今回のポイントは、特定サービス専用のSDKではなく、OpenAI互換のインターフェースを利用することです。サービス側が互換APIを提供していれば、同じ形式でリクエストを送れます。
APIキーと接続先を環境変数にする
プロジェクト直下に.envファイルを作成します。
LLM_API_KEY=ここにAPIキーを設定
LLM_BASE_URL=https://api.example.com/v1
LLM_MODEL=使用するモデル名
LLM_BASE_URLは利用するサービスのドキュメントに記載されているURLへ変更してください。サービスによっては、末尾に/v1を付ける必要があります。
.envはAPIキーを含むため、Git管理から除外します。
.venv/
.env
__pycache__/
APIキーをPythonコードに直接書く方法もありますが、ソースコードを共有したりGitHubへ公開したりする場合に漏えいしやすくなります。最初から環境変数に分離しておくのがおすすめです。
最小構成のPythonアプリを作る
PythonアプリからOpenAI互換APIへリクエストを送り、回答を表示するまでの流れは次のとおりです。
main.pyを作成し、次のコードを記述します。
import os
from dotenv import load_dotenv
from openai import OpenAI
load_dotenv()
api_key = os.getenv("LLM_API_KEY")
base_url = os.getenv("LLM_BASE_URL")
model = os.getenv("LLM_MODEL")
if not api_key:
raise RuntimeError("LLM_API_KEY が設定されていません")
if not base_url:
raise RuntimeError("LLM_BASE_URL が設定されていません")
if not model:
raise RuntimeError("LLM_MODEL が設定されていません")
client = OpenAI(
api_key=api_key,
base_url=base_url,
)
response = client.chat.completions.create(
model=model,
messages=[
{
"role": "system",
"content": "あなたは簡潔で正確なアシスタントです。",
},
{
"role": "user",
"content": "Pythonでリストをソートする方法を説明してください。",
},
],
temperature=0.2,
)
print(response.choices[0].message.content)
実際に試してみると、アプリ側で重要なのは次の3点だけでした。
-
OpenAIクライアントを作成する -
base_urlに接続先を指定する -
chat.completions.create()でメッセージを送る
messagesは会話の履歴です。systemで回答方針を指定し、userに質問を書きます。回答本文はresponse.choices[0].message.contentから取得できます。
temperatureは出力のランダム性を調整する値です。説明文やコード生成では、まず0から0.3程度の低い値で試すと、毎回の出力が比較的安定します。
コマンドラインから実行する
設定が終わったら、次のコマンドで実行します。
python main.py
正常に接続できれば、LLMから返ってきた回答がターミナルに表示されます。
入力内容を毎回変更するなら、固定文字列をinput()に置き換えるだけです。
question = input("質問を入力してください: ")
response = client.chat.completions.create(
model=model,
messages=[
{
"role": "user",
"content": question,
}
],
)
print(response.choices[0].message.content)
これで、最小限の対話型CLIアプリになります。
接続エラーが発生した場合は、次の順番で確認しました。
- APIキーが正しいか
-
.envがmain.pyと同じプロジェクト内にあるか -
base_urlの末尾に/v1が必要か - モデル名が利用可能な名前になっているか
- APIの利用上限や権限に問題がないか
特にbase_urlとモデル名は、互換APIを使うときに間違えやすい部分です。エラーメッセージだけで判断せず、提供元のAPIドキュメントに記載された値と比較すると切り分けやすくなります。
実用化するときの注意点
今回のコードは動作確認を目的にした最小構成です。実際のアプリへ組み込む場合は、少なくとも例外処理を追加します。
from openai import APIConnectionError, APIError, AuthenticationError
try:
response = client.chat.completions.create(
model=model,
messages=[
{"role": "user", "content": question}
],
timeout=30.0,
)
except AuthenticationError:
print("APIキーまたは認証設定を確認してください")
except APIConnectionError:
print("APIへ接続できませんでした")
except APIError as error:
print(f"APIエラーが発生しました: {error}")
else:
print(response.choices[0].message.content)
また、ユーザー入力をそのまま送る場合は、入力サイズの制限やログへの出力内容にも注意が必要です。個人情報や機密情報を外部APIへ送信しないこと、APIキーを画面やログに表示しないことも重要です。
OpenAI互換だからといって、すべてのサービスが同じ機能に対応しているとは限りません。ストリーミング、画像入力、ツール呼び出し、JSON出力などはサービスごとに差があるため、まずはテキスト生成だけで接続を確認し、その後に必要な機能を追加するのが安全です。
まとめ
OpenAI互換APIを使えば、PythonからLLMを呼び出すアプリを少ないコードで作れます。
ポイントは次のとおりです。
-
openaiパッケージのクライアントを利用する - APIキー、接続先、モデル名を環境変数で管理する
-
base_urlを変更することで接続先を切り替えられる - まずはテキスト生成だけで動作確認する
- 実運用では例外処理と機密情報の扱いに注意する
LLMを使った要約、チャット、社内ツールなどを試す場合も、最初はこの構成から始めると、API接続部分とアプリ本体を分けて考えられます。