生成AIプリ①

2025年技術ブログ集

その1 生成AIアプリの開発(チャットボット) 

これまでは、OpenwebUIやAutomatic1111などのUIツールを使って生成AIの勉強をしてきましたが、そろそろpythonでアプリを作りたいと思い始めています。色々と書籍を買って読み漁ってみたのですが「知識先行実践不得意」という状況でモヤモヤしていた時に、日経ソフトウェア2025年7月号に出会いました。丁寧な導入記事と解説に加え、TkEasyGUI(PysimpleGUI互換)開発者であるクジラ飛行机さんの記事が非常に参考になりました。まずはチャットボットのコードをコピーし、RAG対応やollamのchatモードへの変更などを行ってみました。\2,200の雑誌ですが10倍くらいの価値はあると思い、友人知人に紹介させていただきました。本当に感謝です。
Pythonでアプリを開発する際に、生成AIモデルをWEB API経由で操作するインターフェースアプリとして「Ollama」や「LM-Studio」が使用されています。それぞれのアプリは、「OllamaSetup.exe」や「LM-Studio-0.3.15-x64.exe」などでインストールしPCに常駐させることができます。Pythonの「requests」ライブラリを使い、Ollama などのurlとプロンプトやパラメータをjson形式でまとめたものを引数として渡すと、応答が返ってきます。またOllamaの場合は、pythonの「ollama」ライブラリがあり、同じPCにollamaが常駐している場合はよりシンプルなコード記述ができます。その内容は7月号冒頭にありましたが、今回はWEB API経由で操作する方式を使います。

次に、ローカル生成AIアプリの開発環境ですが、Python3.11を選択しました。開発ツールとしてメジャーな「VScode」とこれまで使ってきた「Anaconda」を継続して使用するか迷いました。Python3.8まではpysimpleGUIがAPIキー無で使用できるためAnacondaは捨てがたかったのですが、生成AIアプリはpython3.10以降で3.11が安定しているようなので、これを機会にVScodeに移行してみました。コード自動生成をOllama経由でローカルで使用できるようになったのには驚きましたが、コードにいちいち色がついたり、コメントが出たりにぎやかすぎて落ち着きません。やはりAnacondaに仮想環境を登録してJupyterNotebookで、という従来パターンに戻りました。Anacondaでも自動コード生成サポートはあるようですが、Edgeで開いたCopilotと会話しながら、Chromeで開いたNotebookで動作確認していく方法が自分にはしっくりいくように思いました。

また、Anacondaの場合、PC間で環境をコピーする場合、anaconda3/env内にpython38のように名前を付けた環境フォルダーをコピペするだけです。(コピー先のパス設定が厄介な場合もありますが) 各環境にライブラリが多く含まれている場合は、10GBを超えることもありますが、作業は非常に楽です。以下にOllamaパラメータと基本コードを示します。Ollamaでのコンテキスト長は、バージョンにもよりますがデフォルトで、4096に制限されたりします。昨今のローカルモデルはコンテキスト長が長いものが多く提供されるようで、パラメータを纏めた、json形式で、“options”: { “num_ctx”: 8192 } というようにデフォルト値の変更ができるようです。

まず、日経ソフトウェア2025年7月号(P030-P035)を参照しました。筆者は「クジラ飛行机」さんで、PysimpleGUIと互換のTkEasyGUIの開発者です。写真を入れ替えてGUIを「犬先生と患者犬がチャットを行う」AIを作ってみました。マルチスレッド対応やTOKEN分割出力などが加えられていて、非常に参考になりました。画像ファイルを2つ用意して入れ替えただけのものです。Ollamaはgenerateモードです。(一問一答(過去会話を記憶しない) AIの回答の出し方やGUIがフリーズしない工夫がされています。特に、TkEasyGUIの「start_thread」関数は素晴らしいです。

クジラ飛行机先生のコードそのままですが、以下に示します。

dogAI1を少し改良しました。モデルとして軽量な「llama3.2」をデフォルトにしていましたが、長い回答の後に無意味に同じ文書を繰り返したり、——攻撃を始めたりするため、モデルの選択ができるようにしました。>ollma pull コマンドで、「llma3.2-vision」とコンテキスト長が32Kの「gemma3」を追加しました。これらのモデルが選択できるようにdogAI1を小変更しました。GUI画面に、モデル選択BOXを追加しました。(gogAI2) 
Llama3.2とgemma3を比較しました。Gemma3の方が少し賢いようです。

小改良した(モデル選択)、dogAI2.exeのコードを示します。

その2 Ollma+RAG 専用チャットアプリ 

次のステップは、LLM軽量モデルとRAGデータを使って専用チャットボットアプリを作ります。機能的にはOpenwebUIで既に実装されていますが、フレンドリなGUI画面と低性能のノートPCでも「ollama」さえインストールしていれば動くものを目指したいと思います。以下に、dogAI3.exeのGUI画面を示しました。dogAI2のモデル選択機能にRAGデータ(pdf)読み込みとログ保存機能を加えました。少し本格的になりました。

RAGを扱うため、コードが長くなりました。コンパイル後の容量も70MB→3GB程度と大きくなりました。お決まりなのでコードを以下に示します。

dogAI3は、「犬の健康について獣医さんと会話する」というコンセプトなので専用チャットボット化のためのRAGデータをcopilotの力を借りて、健康管理や食べ物や老犬のケア等の項目をWEB情報から集め、14,000文字の論文にまとめてもらいました。「ragdata.pdf」として読み込みます。

犬の健康管理関係資料(14,000文字)を読み込ませ「llama3.2」でチャットを行いました。長生きのコツとBCS指標の重要性を質問しました。獣医師のような回答が得られました。

一度に読み込めるRAGデータは、OpenwebUIと違い1つだけです。「飼い犬フォッカチオのデータ」と「犬の健康管理論文」を合体させRAGとして読み込ませました。個別情報にも、獣医的な観点から答えてくれていることが判ります。

dogAI3までは、ollamaのgenerateモードです。dogAI4は、ollamaのchatモードを使用しています。generateモードは単発の会話向けで比較的軽処理です。chatモードは過去会話も参照します。やっとOpenwebUIなみになりました。

最後に、ノートPCに「dogAI4」を実装し動かしている様子を示します。モデルは「llma3.2」ですがストレスなく使えています。

その3 Ollma+VLM 汎用アプリ 

その2までは、Ollama+LLMのアプリでしたが、その3ではOllama+VLMアプリを作ります。PythonでOllamaを使ったアプリを開発する際に「OllamaSetup.exe」でインストールし、OllamaをPCに常駐させます。Pythonの「requests」ライブラリを使い、Ollama などのurlとプロンプトやパラメータをjson形式のまとめたものを引数として渡すと応答が返ってきます。これはOllama+LLMアプリと共通です。Ollama+VLMの基本コードを以下に示します。

VLMでは画像を入力しますがカメラの操作が簡単に使えるGUIライブラリのgradioを使いました。gradioはAIアプリでよく使われているpythonのGUIライブラリです。画像入力BOXは画像ファイルのみならずカメラから直接画像を取り込むことができます。(動画はダメです) gradioを使って、VLMの基本的な操作をGUIアプリにしました。GradioはWEBサービスが可能で「http://localhost:7860」でGUI画面を提供します。
以下に、gradioで作ったGUIプリ画面と操作方法を示しました。入力画像とプロンプトを与えるとAIが回答するという簡単なアプリです。

Gradioを使ったVLMのコードを示します。入力・処理・出力の手順でコードを組み立てるだけです。

コードも短く簡潔で素晴らしいのですが、pyinstallerでコンパイルがまともにできません。環境設定不要なノートPCへのアプリ移植ができません。いろいろとトライしましたが解決できませんでした。Gradio を PyInstaller で .exe にパッケージングするのは、構造上かなり相性が悪いです。 Gradio は内部的にテンプレートHTMLや .py ファイル・コンポーネント定義ファイルなどを “実ファイルとして” 読み込んでいるため、PyInstaller のようにファイルをバイナリに固める方式だと次から次へと読み込めないファイルが出てきます。pyinstallerの—data-add で隠しファイルを追加しますがきりがないです。今後のため失敗の履歴を残しておきます。

次に、ノートPCへの移植性を考慮して、軽量なVLM基本アプリをpython標準のtkinterライブラリで作成しました。標準ライブラリなので、コンパイルエラーはなく容量も72MBでGradioの1/50に収まりました。画像入力は、gradioと異なりファイル入力とカメラ入力を分離して組み込む必要があります。特にカメラプレビュー状態からシャッターボタンで画像を取得する手間を考えると、Gradioの方が圧倒的に優れています。
画像ファイル入力とカメラ入力の両方に対応しましたが、カメラ入力には別途、子画面を開いてOpenCVでプレビュー動画をcaptureするとかしなければなりません。下記にGUI本画面(左)と子画面(右)を示します。画像入力が整ったら、プロンプトを入力し、解析ボタンを押すとAIが回答します。ログも残るようにしています。VLMアプリもollamaのgenerateモードを使用します。画像学習+画像分類アプリではollamaのchatモードを使います。あとで説明します。

非常に煩雑ですが、tkinterを使ったコードを以下に示します。コードの半分がカメラ画像を取り込むためのものです。

Ollama+VLM汎用アプリ「VLM_tkinter.exe」を使った、ノートPCでの活用例を示します。製造現場に転がっている円筒状金属部品端面に刻印された文字を認識するという事例を示します。従来の文字認識AI(tesseractとeasyocr)でチャレンジしましたが、文字が正立してない場合や特殊文字がある場合に読めなかったり誤認識を起こしました。
Easyocrはpytorchベースで文字の回転にはマージンがあるものの誤認識が激しく、また、ノートPCでの処理に60秒程度かかりました。従来AIでの文字認識状況と課題を具体的に示します。

今回開発したollama+VLMアプリ「VLM_tkinter.exe」をノートPC(DELL Inspirion 5415 Ryzen7 5700U)に実装し動かしてみました。左側がノートPC本体です。中央は90°傾けた画像ファイルを使って文字の読み取りを行った結果です。10秒程度でAIからの回答が返ってきました。従来AIでは読めなかった「304」を読み取っています。
右の画像は、別のノートPCに特殊文字を含んだ画像を表示させ、DELL Inspirion
に接続したWEBカメラのショット画像をAIに読ませました。3つの文字「304」「Ⅲ」「〇にHの商標」のうち、「304」と「Ⅲ」は読み取ることができました。WEBカメラ画像はFullHighVisionなので中央の画像ファイルの4倍以上の画素があるため解析時間が掛かったものと思われます。カメラ画像を適切なサイズにリサイズしてAIの渡すことで時短が図れると思います。

その4 Ollma+VLM 画像分類・顔認識アプリ 

次に、VLMとollamaのchatモードを活用した画像分類アプリの開発を行いました。その3では単なる一問一答方式で、ひとつ前の質問や応答をAIが記憶しない、ollamのgenerateモードを使用していましたが、画像分類や顔認識では任意画像を見せてAIに判断させる前に、AIに事前学習をさせておく必要があります。Ollamaのchatモードを使用します。VLMで読み込める画像は一度に1枚です。(llama4の上位バージョンでは5枚までというのもあるそうですが)
最初に読み込む画像と、プロンプトを使ってAIに学習をさせます。従来の画像AIと異なり、たった1枚の画像に複数の分類用画像を詰め込んだり、それぞれの画像についての特徴をプロンプトで補完したりする必要があります。以下にアボカド熟度を画像で分類するための学習工程と推論工程のイメージを示します。

この方法が、実際に上手く行くのかを簡単なコードを使って確かめました。以下にコードを示します。学習画像を「train.png」、学習プロンプトやパラメータををjosnに含めてollamaに投げます。一回目のollamaからの回答でAIの分類学習度合いを確かめることができます。次にテスト用の画像ファイル名を入力しAIの分類結果を確認します。

分類結果は、間違っていましたが、この方法が使えそうなことが判りました。

画像分類アプリを汎用化するためGUIコードをtkinterライブラリで作成してみました。今回はカメラのキャプチャ機能は取り入れず、画像ファイルのみの扱いにしました。
アプリ名は「VLM2_gemma_7b.exe」です。VLMの選択機能採用せず固定しました。
左上は、学習画像「train.png」です。表示中央上には学習プロンプト「train.txt」を表示しました。学習画像とプロンプトのファイル名は固定しています。中身を入れ替えれば他の応用が容易にできます。学習ボタンを押すとAIから学習度合いが、右上のBOXに表示されます。まだ、AIの認識が甘いと思えば、中央上のプロンプトを変更して再度、学習ボタンを押してください。学習が完了したら、テスト画像をブラウズ機能を使って選択できます。選択したテスト画像が左下画面に現れます。中央下には分類するようにプロンプトを入れます。(デフォルトでは、分類するように記載) 解析ボタンを押すとAIの分類結果が右下BOXに表示されます。ログは「log.txt」にタイムスタンプとともに保存されます。

以下に、「VLM2_gemma_7b.exe」のソースコードを示します。

VLMを上手く使えば、従来の画像AIの役割を肩代わりさせることが可能だと思います。学習コストも非常に小さく抑えられます。犬用の電子聴診器のスペクトラム画像で心臓病や内耳の異常などが検出できそうです。過去データを活用して有効な応用をこれからも検討しようと思います。同時聴診型聴診装置の開発 | TWINKLE TEC

タイトルとURLをコピーしました