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形式のファイルから設定値を読み込む独自のパーサーです。以下のアルゴリズムに基づいて動作します。

  1. 行の読み込みと前処理: ファイルから各行を読み込み、末尾の空白を除去します。空行や # または ; で始まるコメント行はスキップします。

  2. 複数行モードの検出と処理:

    • もし現在の行が「3重引用符」と一致する場合、複数行モードを終了し、バッファに格納されていた行を現在のキーの値として結合します。

    • 複数行モードの場合、現在の行をバッファに追加し、次の「3重引用符」が現れるまで続行します。

  3. key=value 形式の解析:

    • 行に = が含まれる場合、= を区切り文字としてキーと値に分割します。

    • 値が「3重引用符」と一致する場合、複数行モードを開始し、次の「3重引用符」が現れるまで行をバッファに格納します。

    • それ以外の場合、値をそのまま現在のキーに割り当てます。

  4. 最初の有効行の特殊処理:

    • もしファイルの最初の有効な行が = を含まず、かつ「3重引用符」で始まる場合、その行から始まる複数行テキストを PROMPT キーの値として扱います。

    • 最初の有効な行が = も「3重引用符」も含まない場合でも、これを PROMPT キーに対する複数行値の開始とみなし、仮の「3重引用符」で閉じると想定して処理を継続します。

  5. ファイル末尾処理: ファイルが終了しても複数行モードが閉じられていなかった場合、バッファに残っていた行を現在のキーの値として格納します。

このパーサーは、特にプロンプトのような長文テキストをINIファイル内に記述する際に非常に柔軟な方法を提供します。

AI呼び出し (call_ai 関数)

call_ai 関数は、指定されたAPIタイプに応じて、Google GeminiまたはOpenAIのAPIを利用してAIに応答をリクエストします。

  1. APIキーの取得: 各APIタイプに対応する環境変数からAPIキーを読み込みます。

    • Gemini: GOOGLE_API_KEY

    • OpenAI: OPENAI_API_KEY もし環境変数が設定されていない場合、ValueError を発生させます。

  2. モデル名の決定: コマンドライン引数でモデル名が明示的に指定されていない場合、以下の環境変数からデフォルトモデル名を読み込みます。

    • Gemini: GOOGLE_MODEL (デフォルトは gemini-2.5-flash)

    • OpenAI: OPENAI_MODEL (デフォルトは gpt-4o)

  3. Gemini APIの呼び出し:

    • apigemini の場合、google.generativeai ライブラリを使用します。

    • genai.configure(api_key=key) でAPIキーを設定します。

    • genai.GenerativeModel(model) でモデルインスタンスを作成し、m.generate_content(prompt) で応答を生成します。

    • 応答は resp.text として返されます。

  4. OpenAI APIの呼び出し:

    • apiopenai または openai5 の場合、openai ライブラリを使用します。

    • OpenAI(api_key=key) でクライアントインスタンスを作成します。

    • apiopenai5 の場合は、client.responses.create(model=model, input=prompt) を使用します。

    • apiopenai の場合は、client.chat.completions.create(model=model, messages=[{"role": "user", "content": prompt}]) を使用します。

    • 応答はそれぞれ r.output_text または r.choices[0].message.content として返されます。

必要な非標準ライブラリとインストール方法

このプログラムの実行には、以下のPythonライブラリが必要です。

  • openai

  • google-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 モデル)からの応答(例: 「日本の首都は東京です。東京は本州の関東地方に位置し、世界で最も人口の多い都市圏の一つです。政治、経済、文化の中心地であり、皇居、国会議事堂、多くの美術館や劇場があります。」のようなテキスト)が書き込まれます。