get_from_ai.py 技術ドキュメント
プログラムの動作
get_from_ai.py は、INI形式の設定ファイルからプロンプトを読み込み、指定されたAIサービス(Google Gemini または OpenAI)に対してリクエストを送信し、その応答をファイルに保存するPythonスクリプトです。
主な機能:
INIファイルからのプロンプト読み込み: 柔軟なINIパーサーを内蔵しており、
key=value形式に加えて、プロンプトのような複数行テキストを「3重引用符」で囲んで定義できます。また、ファイルがkey=を含まない複数行テキストで始まる場合、それを自動的にPROMPTキーの値として認識します。AIサービスへのリクエスト送信: コマンドライン引数で指定されたAPI(
gemini,openai,openai5)とモデルを使用し、AIにプロンプトを送信します。APIキーは環境変数から取得します。AI応答のファイル保存: AIからの応答テキストを、指定された出力ファイルパスにUTF-8エンコーディングで保存します。
解決する課題:
AIサービスとの対話において、プロンプトをコード内にハードコードするのではなく、設定ファイルとして外部化することで、プロンプトの管理と再利用を容易にします。また、AIからの応答を自動的にファイルに保存することで、その後の処理や記録を簡素化します。
原理
INIファイル解析 (read_ini 関数)
read_ini 関数は、INI形式のファイルから設定値を読み込む独自のパーサーです。以下のアルゴリズムに基づいて動作します。
行の読み込みと前処理: ファイルから各行を読み込み、末尾の空白を除去します。空行や
#または;で始まるコメント行はスキップします。複数行モードの検出と処理:
もし現在の行が「3重引用符」と一致する場合、複数行モードを終了し、バッファに格納されていた行を現在のキーの値として結合します。
複数行モードの場合、現在の行をバッファに追加し、次の「3重引用符」が現れるまで続行します。
key=value形式の解析:行に
=が含まれる場合、=を区切り文字としてキーと値に分割します。値が「3重引用符」と一致する場合、複数行モードを開始し、次の「3重引用符」が現れるまで行をバッファに格納します。
それ以外の場合、値をそのまま現在のキーに割り当てます。
最初の有効行の特殊処理:
もしファイルの最初の有効な行が
=を含まず、かつ「3重引用符」で始まる場合、その行から始まる複数行テキストをPROMPTキーの値として扱います。最初の有効な行が
=も「3重引用符」も含まない場合でも、これをPROMPTキーに対する複数行値の開始とみなし、仮の「3重引用符」で閉じると想定して処理を継続します。
ファイル末尾処理: ファイルが終了しても複数行モードが閉じられていなかった場合、バッファに残っていた行を現在のキーの値として格納します。
このパーサーは、特にプロンプトのような長文テキストをINIファイル内に記述する際に非常に柔軟な方法を提供します。
AI呼び出し (call_ai 関数)
call_ai 関数は、指定されたAPIタイプに応じて、Google GeminiまたはOpenAIのAPIを利用してAIに応答をリクエストします。
APIキーの取得: 各APIタイプに対応する環境変数からAPIキーを読み込みます。
Gemini:
GOOGLE_API_KEYOpenAI:
OPENAI_API_KEYもし環境変数が設定されていない場合、ValueErrorを発生させます。
モデル名の決定: コマンドライン引数でモデル名が明示的に指定されていない場合、以下の環境変数からデフォルトモデル名を読み込みます。
Gemini:
GOOGLE_MODEL(デフォルトはgemini-2.5-flash)OpenAI:
OPENAI_MODEL(デフォルトはgpt-4o)
Gemini APIの呼び出し:
apiがgeminiの場合、google.generativeaiライブラリを使用します。genai.configure(api_key=key)でAPIキーを設定します。genai.GenerativeModel(model)でモデルインスタンスを作成し、m.generate_content(prompt)で応答を生成します。応答は
resp.textとして返されます。
OpenAI APIの呼び出し:
apiがopenaiまたはopenai5の場合、openaiライブラリを使用します。OpenAI(api_key=key)でクライアントインスタンスを作成します。apiがopenai5の場合は、client.responses.create(model=model, input=prompt)を使用します。apiがopenaiの場合は、client.chat.completions.create(model=model, messages=[{"role": "user", "content": prompt}])を使用します。応答はそれぞれ
r.output_textまたはr.choices[0].message.contentとして返されます。
必要な非標準ライブラリとインストール方法
このプログラムの実行には、以下のPythonライブラリが必要です。
openaigoogle-generativeai
これらのライブラリは pip を使用してインストールできます。
pip install openai google-generativeai
必要な入力ファイル
INIファイル (get_from_ai.ini または指定されたファイル)
プロンプトやその他の設定を含むINI形式のファイルが必要です。デフォルトのファイル名は get_from_ai.ini ですが、コマンドライン引数 --inifile (-i) で変更できます。
ファイル形式の例:
; コメント行
# これもコメント行
PROMPT="""
次のPythonコードの機能を簡潔に説明してください。
```python
def add(a, b):
return a + b
"""
; または PROMPT_TEMPLATE_JA や PROMPT_TEMPLATE_EN も使用可能 ; PROMPT_TEMPLATE_JA=日本の首都はどこですか? ; PROMPT_TEMPLATE_EN=What is the capital of Japan?
MY_SETTING=some_value
**重要なキー:**
* `PROMPT`: AIに送信するメインのプロンプトテキスト。
* `PROMPT_TEMPLATE_JA`: 日本語のプロンプトテンプレート(`PROMPT` がない場合に使用)。
* `PROMPT_TEMPLATE_EN`: 英語のプロンプトテンプレート(`PROMPT` と `PROMPT_TEMPLATE_JA` がない場合に使用)。
プログラムは `PROMPT` を最優先し、次に `PROMPT_TEMPLATE_JA`、最後に `PROMPT_TEMPLATE_EN` の順でプロンプトを検索します。
### 環境変数
AIサービスを利用するためのAPIキーやデフォルトモデル名を設定する必要があります。
* **Google Gemini 用:**
* `GOOGLE_API_KEY`: Google CloudのAPIキー。
* `GOOGLE_MODEL`: 使用するGeminiモデル名(例: `gemini-pro`, `gemini-2.5-flash`)。未設定の場合、デフォルトの `gemini-2.5-flash` が使用されます。
* **OpenAI 用:**
* `OPENAI_API_KEY`: OpenAIのAPIキー。
* `OPENAI_MODEL`: 使用するOpenAIモデル名(例: `gpt-4o`, `gpt-3.5-turbo`)。未設定の場合、デフォルトの `gpt-4o` が使用されます。
環境変数の設定例(Linux/macOSの場合):
```bash
export GOOGLE_API_KEY="YOUR_GEMINI_API_KEY"
export OPENAI_API_KEY="YOUR_OPENAI_API_KEY"
export GOOGLE_MODEL="gemini-1.5-pro"
生成される出力ファイル
AIからの応答テキストが保存されます。
ファイル名: コマンドライン引数
--output_path(-o) で指定されたパス。この引数は必須です。内容: AIサービスから返されたテキストデータ。通常、テキストの末尾の空白は除去されて保存されます。
エンコーディング: UTF-8
コマンドラインでの使用例 (Usage)
python3 get_from_ai.py --inifile <inifile> --output_path <output_path> [--api <api>] [--model <model>]
または短縮形:
python3 get_from_ai.py -i <inifile> -o <output_path> [-a <api>] [-m <model>]
引数の説明:
--inifile(-i): プロンプトを含むINIファイルへのパス。デフォルトはget_from_ai.ini。--output_path(-o): AI応答を書き込む出力ファイルパス。必須。--api(-a): 使用するAIサービスAPI。選択肢はgemini,openai,openai5。デフォルトはgemini。--model(-m): 使用するモデル名を明示的に指定します(任意)。指定しない場合、環境変数またはプログラム内のデフォルト値が使用されます。
コマンドラインでの具体的な使用例
以下のINIファイル my_prompt.ini を用意します。
PROMPT="""
日本の首都はどこですか?その都市の簡単な説明も加えてください。
"""
1. Gemini API を使用する例
まず、環境変数 GOOGLE_API_KEY を設定してください。
export GOOGLE_API_KEY="YOUR_GEMINI_API_KEY_HERE"
そして、以下のコマンドを実行します。
python3 get_from_ai.py -i my_prompt.ini -o output_gemini.txt -a gemini -m gemini-1.5-flash
実行結果の説明:
output_gemini.txt というファイルが生成され、そのファイルにはGemini AIからの応答(例: 「日本の首都は東京です。東京は日本の本州の東部に位置し、国の政治、経済、文化の中心地です。世界で最も人口密度の高い都市圏の一つであり、高層ビル、ネオンサイン、歴史的な寺院や庭園が混在しています。」のようなテキスト)が書き込まれます。
2. OpenAI API を使用する例
まず、環境変数 OPENAI_API_KEY を設定してください。
export OPENAI_API_KEY="YOUR_OPENAI_API_KEY_HERE"
そして、以下のコマンドを実行します。
python3 get_from_ai.py -i my_prompt.ini -o output_openai.txt -a openai -m gpt-4o
実行結果の説明:
output_openai.txt というファイルが生成され、そのファイルにはOpenAI API(gpt-4o モデル)からの応答(例: 「日本の首都は東京です。東京は本州の関東地方に位置し、世界で最も人口の多い都市圏の一つです。政治、経済、文化の中心地であり、皇居、国会議事堂、多くの美術館や劇場があります。」のようなテキスト)が書き込まれます。