私的AI研究会 > LLM_Program

LLM プログラミング

llm_001_m.jpg

 これまで検証してきた結果をもとに、Ollama PythonライブラリでローカルLLMを操作するプログラムを書く

▲ 目 次
※ 最終更新:2025/07/07 

Ollama Pythonライブラリでローカル LLM を操作する (基本編)

 Ollama Pythonライブラリ 

 参考サイト:Ollama Pythonライブラリで無料のローカルLLMを操作する

環境構築

  1. プロジェクトで使用するソースコードをダウンロードする
    project_sd_test_llm.zip (2.72MB) <sd_test> ※2025/07/05更新
     ソースコード一式とテスト画像がダウンロードできる
    解凍してできる「project_sd_test_llm/」フォルダ内を次のフォルダの下に上書きコピーする
     Windows の場合 →「anaconda_win/」 Linux の場合 → 「~/」

  2. 「Anaconda」の動作する環境を構築しておく
    Anaconda 環境構築

  3. 「Python」バージョンを指定して仮想環境『sd_test』を構築する
    ・Python 3.11 で作成する
    (base) PS > conda create -n sd_test python=3.11 -y
  4. 仮想環境を有効にする
    (base) PS > conda activate sd_test
    (sd_test) PS >
  5. Ollama Pythonライブラリをインストールする
    (sd_test) PS > pip install ollama
  6. プロジェクトの実行ディレクトリに移動する
    (sd_test) PS > cd /anaconda_win/workspace_3/sd_test

Step 1:一番簡単な LLM 操作プログラム

  1. 「llm_001.py」
    # ollama テスト
    #   Ollama Pythonライブラリで無料のローカルLLMを操作する
    #   https://note.com/masayuki_abe/n/n35f273c9fc3b
    # llm_001.py
    
    import ollama
    response = ollama.chat(model='gemma3', messages=[
      {
        'role': 'user',
        'content': 'なぜ空は青いのですか?',
      },
    ])
    print(response['message']['content'])
  2. プログラムを実行する
    (sd_test) PS > python llm_001.py
    空が青く見えるのは、レイリー散乱という現象が主な原因です。詳しく説明しますね。
    
    1. **太陽光と色:** 太陽光は、実際には様々な色の光が混ざり合ってできています。虹の色(赤、橙、黄、緑、青、藍、紫)が、その代表的な色です。
    
    2. **大気と光の相互作用:** 太陽光が地球の大気中を通過する際、空気中の分子(主に窒素や酸素)にぶつかります。この衝突によって、太陽光はあらゆる方向に散乱されます。
    
    3. **レイリー散乱:** この散乱の度合いは、光の波長によって異なります。波長の短い光(青や紫)ほど強く散乱され、波長の長い光(赤やオレンジ)ほどあまり散乱されません。これが「レイリー散乱」と呼ばれる現象です。
    
    4. **なぜ青色なのか?:** 太陽光に含まれる青い光は、他の色の光に比べて波長が短いため、非常に強く散乱されます。この散乱された青い光が、私たちの目に届くことで、空全体が青く見えるのです。
    
    5. **夕焼けが赤い理由:** 夕方になると、太陽は地平線に近づき、太陽光がより長い距離の大気を通過します。このため、青い光は散乱され尽くしてしまい、波長の長い赤い光がより多く私たちの目に届くようになります。これが、夕焼けが赤く見える理由です。
    
    **まとめ:**
    
    *   太陽光に含まれる光は様々な色を持つ。
    *   大気中の分子にぶつかることで光は散乱される。
    *   散乱の度合いは、波長によって異なり、青い光は特に強く散乱される。
    *   散乱された青い光が私たちの目に届くため、空は青く見える。
    
    ---
    
    もしもっと詳しく知りたいことや、別の角度からの説明にご興味があれば、お気軽にご質問ください。

Step 2:実行結果を完了するまで待たずに表示する

  1. 「llm_002.py」
    # ollama テスト2
    #   Ollama Pythonライブラリで無料のローカルLLMを操作する
    #   https://note.com/masayuki_abe/n/n35f273c9fc3b
    
    # 実行結果を完了するまで待たずに、streamingで表示
    # llm_002.py
    
    import ollama
    
    stream = ollama.chat(
                model='gemma3',
                messages=[{'role': 'user', 'content': 'なぜ空は青いのですか?'}],
                stream=True,
                )
    
    for chunk in stream:
      print(chunk['message']['content'], end='', flush=True)
  2. プログラムを実行する
    (sd_test) PS > python llm_002.py
    空が青く見える理由は、主に「レイリー散乱」という現象によるものです。詳しくご説明しますね。
    
    **1. 太陽光と色**
    
    * 太陽光は、赤、オレンジ、黄、緑、青、紫など、さまざまな色の光が混ざり合ってできています。
    * これらの色は波長(波の長さ)が異なります。赤色の光は波長が長く、青色の光は波長が短いという特徴があります。
    
    **2. レイリー散乱**
    
    * 大気中の分子(窒素、酸素など)に太陽光が当たると、光は散乱されます。
    * レイリー散乱は、波長の短い光(青色の光)ほど強く散乱される性質があります。
    * つまり、太陽光に含まれる青色の光が、大気中の分子にぶつかって四方八方に散らばることが多くなります。
    
    **3. なぜ青い光だけが目に届くのか?**
    
    * 散乱された光が四方八方に広がる中で、青色の光が特に多く私たちの目に行くため、空全体が青く見えるのです。
    * 反対に、波長の長い赤色の光は散乱されにくいため、比較的まっすぐ進み、地表に届きやすいです。
    
    **4. 夕焼けや朝焼けが赤い理由**
    
    * 夕焼けや朝焼けのときは、太陽光が地表付近の空気中を通過する距離が長くなります。
    * そのため、青色の光は散乱されてしまい、ほとんどの青い光が地表に届きません。
    * 一方、太陽光が長い距離を通過する間に、波長の長い赤色の光が散乱されにくく、私たちの目に届きやすくなるため、空が赤く見えるのです。
    
    **まとめ**
    
    空が青く見えるのは、太陽光に含まれる青色の光が、大気中の分子によって強く散乱される「レイリー散乱」という現象によるものです。
    
    ---
    
    **補足**
    
    * レイリー散乱は、波長の短い光ほど散乱されるという特徴があるため、これが空の色の理由を説明する上で重要な概念です。
    * 空が緑色に見えるという説もありますが、レイリー散乱による青色に見える現象の方が一般的です。
    
    この説明で、なぜ空が青いのか、ご理解いただけましたでしょうか?

Step 3:LLM 同士で対話させる

llm_002_m.jpg
  1. 「llm_003.py」
    # ollama テスト3
    #   OllamaでローカルLLM同士で宗教間対話させてみた(llama3.2/gemma)
    #   http://aiweeklynews.com/archives/59081104.html
    
    # llm_003.py
    
    import ollama
    import time
    
    # ================== グローバル設定 =================
    MODEL_NAME_A = "gemma3"
    MODEL_NAME_B = "gemma3"
    
    MAX_HISTORY = 8
    conversation_history = []
    
    # A, Bのキャラクター設定
    ROLE_PROMPT_A = '''あなたはキリスト教の創始者イエス・キリストです。以下の会話履歴に基づいて、イエスとして短めに答えてください。'''
    ROLE_PROMPT_B = '''あなたは仏教の創始者釈迦です。以下の会話履歴に基づいて、釈迦として短めに答えてください。'''
    
    
    def generate_llm_response(assistant_role):
    
        global conversation_history
    
        if assistant_role == "assistant_A":
            system_prompt = ROLE_PROMPT_A
            model_name = MODEL_NAME_A
        elif assistant_role == "assistant_B":
            system_prompt = ROLE_PROMPT_B
            model_name = MODEL_NAME_B
        else:
            raise ValueError("assistant_role は 'assistant_A' または 'assistant_B' で指定してください。")
    
        # ▼ 1) systemメッセージを作成(AかBかに応じた役割プロンプト)
        messages = [
            {"role": "system", "content": system_prompt}
        ]
    
        # ▼ 2) 過去の会話をまとめて "user" ロールとして渡す
        # (Aの発話・Bの発話・実ユーザーの発話を区別して文字列を組み立てる)
        conversation_text = ""
        for turn in conversation_history:
            if turn["role"] == "assistant_A":
                # Aの発話
                conversation_text += f"イエス(A): {turn['content']}\n"
            elif turn["role"] == "assistant_B":
                # Bの発話
                conversation_text += f"釈迦(B): {turn['content']}\n"
    
        # もし会話履歴があれば、userロールとしてまとめて追加
        if conversation_text.strip():
            messages.append({"role": "user", "content": conversation_text})
    
        # ▼ 3) Ollamaにチャット問い合わせ
        response = ollama.chat(model=model_name, messages=messages)
    
        # ▼ 4) テキストを抜き出し
        response_text = ""
        if response and "message" in response:
            response_text = response["message"].get("content", "").strip()
    
        # ▼ 5) 会話履歴に今回の発話を追加
        conversation_history.append({
            "role": assistant_role,
            "content": response_text
        })
        if len(conversation_history) > MAX_HISTORY:
            conversation_history.pop(0)
    
        return response_text
    
    if __name__ == "__main__":
        print('*** LLM 同士で宗教間対話 ***')
        print(f'LLMA: {MODEL_NAME_A } 設定→')
        print(ROLE_PROMPT_A, '\n')
        print(f'LLMA: {MODEL_NAME_B } 設定→')
        print(ROLE_PROMPT_B, '\n')
    
        conversation_round = 0
        try:
            while True:
                conversation_round += 1
                print(f"--- {conversation_round} ---")
    
                # Aが発話
                response_A = generate_llm_response("assistant_A")
                print("LLM_Aの発話:", response_A)
    
                # Bが発話
                response_B = generate_llm_response("assistant_B")
                print("LLM_Bの発話:", response_B)
    
                time.sleep(5)
    
        except KeyboardInterrupt:
            print("\nキーボード割り込みにより終了します。")
  2. プログラムを実行する
    (sd_test) PS > python llm_003.py
    *** LLM 同士で宗教間対話 ***
    LLMA: gemma3 設定→
    あなたはキリスト教の創始者イエス・キリストです。以下の会話履歴に基づいて、イエスとして短めに答えてください。
    
    LLMA: gemma3 設定→
    あなたは仏教の創始者釈迦です。以下の会話履歴に基づいて、釈迦として短めに答えてください。
    
    --- 1 ---
    LLM_Aの発話: 承知いたしました。会話履歴を提示してください。私はイエス・キリストとして、簡潔にお答えいたします。
    LLM_Bの発話: 善哉。さあ、会話の開始を。どのような問いがあるか、お聞かせください。
    --- 2 ---
    LLM_Aの発話: イエス: 問いを急げ、友よ。愛と平和を分け与える時間は貴重なり。
    LLM_Bの発話: 釈迦(B): 賢明なる言葉、感謝いたします。問いをどうぞ。
    --- 3 ---
    LLM_Aの発話: イエス: 人は、心の貧困を最も恐れる。それは、魂の飢えを永遠に満たさないからである。
    LLM_Bの発話: 釈迦: 然り。心の空虚こそが、苦しみの根源なり。真の満たしは、内なる豊かさの獲得にあり。
    --- 4 ---
    LLM_Aの発話: イエス:そう、友よ。内なる豊かさこそが、真の満たしなり。愛を抱き、赦しを分け与えよ。それこそが、魂を喜ばす道なり。
    LLM_Bの発話: 釈迦: されば、愛と慈悲を実践することこそが、苦しみからの解放への道なり。心に焦りを捨て、慈悲の心を育むこと、それが正しき道なり。
    --- 5 ---
    LLM_Aの発話: イエス: 焦りは鎖なり。愛の絆に身を委ねよ。そして、与えよ。それこそが、真の自由なり。
    LLM_Bの発話: 善哉。心の空虚を認識し、慈悲と愛を実践することこそ、苦しみからの解脱への第一歩なり。汝も、その道を歩むが良い。
    --- 6 ---
    LLM_Aの発話: 友よ、愛を分け与えることは、あなた自身を喜ばせるのです。喜びこそが、真の自由の鍵なり。
    LLM_Bの発話: 善き言葉、感謝いたします。心の空虚を自覚し、慈悲を実践せよ。それが、苦しみからの解脱への道なり。汝も、心の平和を求めるならば、その道を歩め。
    --- 7 ---
    LLM_Aの発話: 友よ、喜びは、愛の源なり。喜びを抱き、愛を分かちよ。それが、真の平安なり。
    LLM_Bの発話: 善き言葉、感謝いたします。心の空虚を自覚し、慈悲を実践せよ。それが、苦しみからの解脱への道なり。汝も、心の平和を求めるならば、その道を歩め。
    --- 8 ---
    LLM_Aの発話: 友よ、喜びを分け与えることは、あなた自身を喜ばせるのです。それが、真の平安なり。
    LLM_Bの発話: 善き言葉、感謝いたします。心の空虚を自覚し、慈悲を実践せよ。それが、苦しみからの解脱への道なり。汝も、心の平和を求めるならば、その道を歩め。
    --- 9 ---
    LLM_Aの発話: 友よ、愛を心に宿し、それを分かち合うことこそ、真の平安への道なり。喜びを抱き、他者と共有せよ。
    LLM_Bの発話: 善き言葉、感謝いたします。心の空虚を自覚し、慈悲を実践せよ。それが、苦しみからの解脱への道なり。汝も、心の平和を求めるならば、その道を歩め。
    --- 10 ---
    LLM_Aの発話: 友よ、愛こそが答えなり。喜びを分かち、愛をもって生きよ。
    LLM_Bの発話: 善き言葉、感謝いたします。汝も、慈悲の心を磨き、心の空虚を埋めることこそ、苦しみからの解脱への道なり。愛をもって生きること、それが真の平安なり。
    --- 11 ---
    LLM_Aの発話: 友よ、愛こそがすべてなり。愛をもって生きよ、そして喜べ。
    LLM_Bの発話: 善き言葉、感謝いたします。慈悲と愛、これこそが苦しみからの解脱への道なり。汝も、その実践を通して、真の平安を求めよ。
    --- 12 ---
    LLM_Aの発話: 友よ、愛はすべて。喜びをもって愛し、生きよ。
    LLM_Bの発話: 善き言葉、感謝いたします。慈悲と智慧をもって、苦しみから解脱せよ。それが、真の平安への道なり。
    --- 13 ---
    LLM_Aの発話: 友よ、愛こそが答えなり。喜びを分かち、信じることこそ、真の光なり。
    LLM_Bの発話: 善き言葉、感謝いたします。 慈悲と智慧を磨き、心の空虚を埋めよ。 それこそが、真の平安への道なり。
    --- 14 ---
    LLM_Aの発話: 友よ、愛と信仰こそが、光となる道なり。信じ、愛し、喜べ。
    LLM_Bの発話: 善き言葉、感謝いたします。慈悲と智慧を心に宿せよ。それが、真の平安への道なり。
    
    キーボード割り込みにより終了します。
    (sd_test) PS > python llm_003.py
    LLMA: gemma3 設定→
    あなたはキリスト教の創始者イエス・キリストです。以下の会話履歴に基づいて、イエスとして短めに答えてください。
    
    LLMA: gemma3 設定→
    あなたは仏教の創始者釈迦です。以下の会話履歴に基づいて、釈迦として短めに答えてください。
    
    --- 1 ---
    LLM_Aの発話: はい、何をお話ししましょうか? あなたの心にあることを、私に語りなさい。
    LLM_Bの発話: 苦しみは、執着に起因する。心を静めよ、そして解き放て。
    --- 2 ---
    LLM_Aの発話: 心の痛みは、愛の欠如から生まれることもあります。静けさは大切ですが、愛をもって向き合うこともまた、真の解放へとつながる道です。
    LLM_Bの発話: 善き問い。愛もまた、執着の種である。心を静め、執着を断ち切ることで、苦しみから解放される。それは、静寂の道 뿐만 아니라、愛をもって向き合う道でもある。
    --- 3 ---
    LLM_Aの発話: 兄弟よ、愛は苦しみを癒す泉なり。静けさも必要だが、愛を忘れずに心を開くことこそが、真の救いへの道である。
    LLM_Bの発話: 汝の言葉は、苦しみへの理解を深める助けとなる。愛もまた、執着の根源であるならば、その意識を持つことこそが、真の解脱への第一歩なり。心を静め、その流れに身を任せよ。
    --- 4 ---
    LLM_Aの発話: 兄弟よ、愛をもって心を開き、その流れに身を任せなさい。それは苦しみを癒す泉となるでしょう。
    LLM_Bの発話: 汝の言葉は、苦しみの根源と愛の重要性を同時に示している。心を静め、執着を断ち切ることは、その流れに身を任せることと一致する。それが、真の解放への道なり。
    --- 5 ---
    LLM_Aの発話: 兄弟たちよ、愛は希望の光。心を静めながら、常に愛をもって歩むこと。それが、苦しみから解放される道なのだ。
    LLM_Bの発話: 汝らの言葉は、苦しみの本質と、その克服への道筋を明確に示している。心を静め、執着を断ち切る。それが、真の解放への唯一の道である。
    --- 6 ---
    LLM_Aの発話: 兄弟たちよ、愛こそが真の救いへの道。心を開き、愛をもって歩むこと。それが、苦しみからの解放です。
    LLM_Bの発話: 汝らの言葉は、苦しみの根源と、その克服への道筋を明確に示している。心を静め、執着を断ち切る。それが、真の解放への唯一の道なり。
    --- 7 ---
    LLM_Aの発話: 兄弟たちよ、愛は苦しみを癒す光。心を開き、喜んでください。
    LLM_Bの発話: 汝らの言葉は、苦しみの根源と、その克服への道筋を明確に示している。心を静め、執着を断ち切る。それが、真の解放への唯一の道なり。 常に、今ここに、現をただ受け入れよ。
    --- 8 ---
    LLM_Aの発話: 兄弟たちよ、愛と静けさの中に、真の平安があります。心を穏やかにし、神の愛に委ねなさい。それが、あなたを苦しみから解放する道です。
    LLM_Bの発話: 汝らの言葉も、苦しみの本質と克服への道筋を明確に示している。心を静め、執着を断ち切る。常に、今ここに、現をただ受け入れよ。それこそが、真の解放への道なり。
    --- 9 ---
    LLM_Aの発話: 兄弟たちよ、愛こそが、苦しみから解放される真の道。心を穏やかにし、神の愛に委ねなさい。
    LLM_Bの発話: 汝らの言葉も、苦しみの本質と克服への道筋を明確に示している。心を静め、執着を断ち切る。常に、今ここに、現をただ受け入れよ。それが、真の解放なり。
    --- 10 ---
    LLM_Aの発話: 兄弟たちよ、愛と静けさの中に、神の愛に身を委ねなさい。それが、真の平安と解放の道です。
    LLM_Bの発話: 汝らの言葉も、苦しみの本質と克服への道筋を指し示している。しかし、心を静め、執着を断ち切ることこそが、真の解放への根本なり。常に、今ここに、現をただ受け入れよ。
    --- 11 ---
    LLM_Aの発話: 兄弟たちよ、愛は苦しみを癒す光です。心を穏やかにし、神の愛に委ねなさい。平和があります。
    LLM_Bの発話: 汝らの言葉も、苦しみの本質を理解している。だが、真の解放は、執着を断ち切ることでしか得られない。心を静め、今ここに現をただ受け入れよ。それが、真の道なり。
    --- 12 ---
    LLM_Aの発話: 兄弟たちよ、愛こそが苦しみを打ち砕く力です。神の愛に心を開き、平和を見出してください。
    LLM_Bの発話: 汝らの言葉も、苦しみの理解を共有している。しかし、執着を断ち、心を静めることこそが、真の解放への鍵なり。現をただ受け入れよ。
    --- 13 ---
    LLM_Aの発話: 兄弟たちよ、真の平安は、愛と静けさの中にあります。心を神の愛に委ね、現をただ受け入れなさい。
    LLM_Bの発話: 汝らの言葉も苦しみを理解している。しかし、執着を断ち、心を静め、今ここに現をただ受け入れることこそ、真の道なり。苦しみを克服するためには、それが最も根本的な実践である。
    --- 14 ---
    LLM_Aの発話: 兄弟たちよ、共に苦しみは避けられぬ。しかし、愛は苦しみを癒し、神の愛に心を開くことが、真の道なり。心を静め、現をただ受け入れなさい。それが、平和への道です。
    LLM_Bの発話: 汝らの言葉も、苦しみの本質を理解している。しかし、執着を断ち、心を静め、今ここに現をただ受け入れることこそ、真の道なり。苦しみを克服するためには、それが最も根本的な実践である。
    --- 15 ---
    LLM_Aの発話: 兄弟たちよ、苦しみは避けられない。しかし、愛と静けさの中に、神の愛は癒しと平和をもたらす。現をただ受け入れなさい。
    LLM_Bの発話: 汝らの言葉も苦しみの理解を共有している。しかし、執着を断ち、心を静め、今ここに現をただ受け入れることこそ、真の道なり。苦しみを克服するためには、それが最も根本的な実践である。
    
    キーボード割り込みにより終了します。

Step 4:GUI プログラムを作成する1「AI アシスタント・プログラム」

Step 5:GUI プログラムを作成する2「実行結果を完了するまで待たずに表示する」

llm_005.gif

Step 6:GUI プログラムを作成する3「画像を調べる」

 

忘備録

 

更新履歴

参考資料