AI(人工知能/ディープラーニング)

ローカルAI環境を自作した話 ― LM Studio × Flask × Pythonで業務用CSV分析を回せるまでにアップデート

この記事は約10分で読めます。

ローカルAI環境を構築クラウドAIに業務データを送りたくない。でも、ローカルで動くAIに本格的なデータ分析をさせるには物足りない。LMスタジオのモデルだけでは不足しています。とくに計算をさせるにはPythonとの連動が必要なので、ちょっとした工夫が必要でした。
本記事は、ローカルAI環境を一から構築し、4万行のCSV分析まで回せるようになるまでの試行錯誤を備忘録としてまとめたものです。これからローカルAIを始めたい方の参考になれば幸いです。

なぜ「ローカルAI」を自分で作ったのか

ローカルAI環境が必要な理由

業務でAIを使ううえで、どうしても気になるのが 機密データの取り扱い です。顧客リスト、財務データ、未公開の戦略文書――こうした情報をクラウドAIに送ることに抵抗がある方は多いはずです。

そこで、自分のPC内だけで完結する「ローカルAI環境」を組むことにしました。要件はシンプルです。

  • 外部ネットワークへ業務データを送らない
  • ブラウザでChatGPTのように使える
  • CSV・Excel・PDFを添付して質問できる
  • 必要に応じてAIが自動でPythonを呼び出して計算する

結論から言うと、これらは すべて実現できました。完成までに踏んだ工程と、ハマりどころを順に紹介します。

完成したシステム構成図

まずは全体像から。最終的なシステム構成は次の通りです。

ローカルAI環境のシステム構成図 ― ブラウザUIからFlask Server、Python Runtime、LM Studioまでの4階層構造

シンプルな三層構造です。ブラウザ → Flask → (LM Studio + Python)。会話履歴と添付ファイルは data/ フォルダに自動保存されます。

必要なものリスト

ハードウェア

項目 推奨スペック 備考
RAM 32GB 以上 16GBでも動くが、大規模CSVを扱うなら32GB欲しい
VRAM (GPU) 12〜16GB 以上 7B〜13B規模のローカルLLMを快適に動かすなら必須
ストレージ空き 30GB 以上 モデルファイル1つで5〜15GB程度
ローカルLLM環境構築:新調したRTX 5060 Ti PCで最適な日本語モデルを検証しました
今回はローカルAIについての報告です。ローカルで大規模言語モデル(LLM)を快適に動かすための基盤作りとして、新しくPCを導入しました。そして、これまでノートPCで細々と動かしていた「LM Studio」を本格運用すべく、複数の最新モデルを...

実際に私が利用しているPCについてマシンスペックなどの情報は上記の記事にて紹介しています。

ソフトウェア

  • LM Studio ― ローカルでLLMを動かすGUIアプリ。OpenAI互換APIを公開できる
  • Python 3.x ― Flaskサーバーとデータ処理に使用
  • pip パッケージflask, requests, pymupdf, pandas, openpyxl, numpy

ローカルAI:4つの主要コンポーネント

① LM Studio(推論エンジン)

ローカルLLMを動かすための土台。HuggingFaceから好みのモデルをダウンロードして、ボタンひとつで「OpenAI互換APIサーバー」として起動できます。port 1234 で待ち受けるのが一般的です。

今回使ったのは google/gemma-4-e4b 系のモデル。日本語が自然で、Tool Use(関数呼び出し)にも対応していたのが選定理由です。

ローカルAIの新星「Gemma-4-e4b-it」これはすごいです!LMスタジオで使うモデルの最適解がまた変わりました
私たちが自宅や企業で動かす「ローカルAI」の環境は、日々進化を続けています。最近の検証では、「小規模モデルの意外な強さ」を発見しましたが、今回、その常識をさらに塗り替える可能性を秘めた最先端モデル「Gemma-4-e4b-it」を迎え入れま...

② Flask Server(app.py)― 中央ハブ

本システムの心臓部はFlask(フラスク)です。ファイル名はapp.pyでPythonで書かれています。この内容はすべて生成AIとの対話で作成しました。

Flaskの役割は主に4つ。

  1. ブラウザからのチャットリクエストを受け取る
  2. 添付ファイル(PDF/CSV/Excel/画像)を解析・前処理する
  3. LM Studioへ問い合わせ、必要に応じてAIが要求するPython実行を代行する
  4. 会話履歴をMarkdown形式で自動保存する

Pythonツール実行部分の概要はこんな感じです(要点のみ)。

def safe_calc(code_str):
    """AIが生成したPythonコードを安全に実行する"""
    # pandas/numpy/json/csv/datetime を事前注入
    exec_globals = {
        'pd': pandas, 'np': numpy, 'json': json,
        'OUTPUT_DIR': OUTPUT_DIR,
        ...
    }
    # exit() / sys.exit() を無害化(サーバー停止防止)
    safe_builtins['exit'] = _BlockedExit()

    # 標準出力をキャプチャしながら実行
    sys.stdout = io.StringIO()
    try:
        exec(code_str, exec_globals)
        return sys.stdout.getvalue()
    except SystemExit as e:
        return f"exit()がブロックされました(コード: {e.code})"
    except Exception as e:
        return f"エラー: {e}\n{traceback.format_exc()}"

Flask(フラスク)とは、Pythonで利用できる軽量なWebアプリケーションフレームワークです。2010年にArmin Ronacher氏によって開発され、シンプルで学習コストが低いため、初心者にも適したフレームワークとして知られています。

Flaskは「マイクロフレームワーク」と呼ばれ、必要最低限の機能のみを提供します。そのため、開発者は必要に応じて機能を自由に追加でき、柔軟性が高いのが特徴です。

私は今回、初めてFlaskという概念を知りましたが、実はそんな詳細は知らなくても生成AIが書いてくれたコードをapp.pyとして記録しただけで動きました。

③ index.html ― ブラウザUI

ChatGPTのような単一ページアプリ。Vanilla JavaScript + CSSのみで、ビルド不要。

  • 📎 ボタンとドラッグ&ドロップでファイル添付
  • テキストエリアは入力に応じて自動で高さが伸びる(最大画面の50%)
  • 会話履歴のサイドバーから過去のチャットを呼び出し可能
  • 「推論モード」で内部思考の表示/非表示を切替
  • PDF出力ボタンで会話まるごとPDF化

④ start.bat ― 起動メニュー(Windows用)

毎回コマンドプロンプトを叩くのは面倒なので、ダブルクリックで起動メニューが出るバッチファイルを用意。番号を選ぶだけでサーバーが立ち上がり、ブラウザも自動で開きます。
PCを立ち上げたらこの「start.bat」を実行しておきます。これで準備完了です。いつでもローカルAIが通常のブラウザで使えます。

実際のブラウザ画面

実際の運用は通常使うブラウザなので違和感なく楽々で使えます。
アドレスバーに「http://192.168.11.61:5000/」を叩けば動きます。このURLはブックマークしてありますので瞬時に起動できます。

実際のブラウザ画面

ちなみにこの環境構築は、ほぼ生成AIとの対話で実現できました。ややこしそうなコードが並んでいますが、私自身は一行も書いていません。(苦笑)

つまずきポイント4選 ― ハマって学んだこと

「動くものを作る」ところまではすぐ行けますが、業務で使えるレベルにするには、いくつかの落とし穴を踏み抜く必要がありました。

実際にハマった4つの問題を共有します。

問題1:4万行のCSVを読み込むと処理が止まる

テキストファイルの全文をプロンプトに突っ込む実装だと、長文CSVは途中で切られ、AIは「最初と最後の数十行」しか見えない状態に。結果、AIはコード内にデータをハードコードしようとして失敗します。

解決策:「メタ情報+ファイルパス」だけ渡す

ファイルサイズが閾値(50KB)を超えたら、中身ではなく 列名・データ型・先頭5行・末尾5行・行数・推奨エンコーディング だけをAIに渡します。本処理はAIが pd.read_csv() をPythonツールで実行する形にしました。

これでメモリも文脈も節約でき、4万行どころか100万行クラスでも動くようになります。

問題2:AIが exit() を呼んでサーバー本体が落ちる

AIがエラー処理用に exit() を生成 → Pythonの SystemExit 例外が発生 → 通常の except Exception ではキャッチできず、Flaskサーバーごとプロセスが終了してしまう、という事故。

解決策:builtinsの exit/quit を無害化

カスタム builtins を作って exit / quit / sys.exit を呼ばれた瞬間に普通の RuntimeError に変換します。SystemExit も明示的に except 節を追加。これでAIが何をやってもサーバーは生き続けます。

問題3:「分析→CSV出力」のような多段階処理が途中で終わる

初期実装ではAIのツール呼び出しは1往復だけ。「列を確認 → エラー修正 → 集計 → ファイル保存」のように複数ステップが必要な依頼で、最後まで走らずに止まっていました。

解決策:Tool Use のループ化(最大5回)

「ツール呼び出しがあれば実行 → 結果を返して再度AIに問い合わせ → またツール呼び出しがあれば実行…」を最大5周まで繰り返すループに改造。これで自己修正もファイル出力も連続で動くように。

問題4:AIが「集計」せず、明細データをそのまま並べる

同じ顧客番号が何度も登場する明細データに対して、「顧客ごとに集計してください」と頼んでも、AIは groupby を使わずに重複行をそのまま表示。

解決策:メタプレビューで「明細データ」を自動検知して警告

先頭列のユニーク値が全体行数の半分未満なら、メタ情報に「これは同じ識別子が複数登場する明細データです。集計指示があれば必ず df.groupby() を使ってください」と自動で注意書きを追加。さらにシステムプロンプトに「『集計』『累計』『ごと』のキーワードがあれば必ず集約せよ」というルールを明記しました。

💡 教訓:ローカルAIに業務処理を任せるなら、「AIがミスしても破綻しない仕組み」を先に作ることが重要。大きなファイルはメタ情報だけ渡す危険な関数はサンドボックス側でブロックツールは複数回ループ可能にするプロンプトでデータ構造のヒントを明示する。この4点を押さえれば、7B〜10B規模のローカルモデルでも実用的に動きます。

実際に動かしてみた感想

40,000行・93列(うち79列はExcelの保存ノイズで空列)のCSVから、顧客マスタ7,678人分への集約と、CSVファイル出力までを 1回の指示で完結 できるようになりました。

処理内容としては以下のような分析が問題なく回ります。

  • 年度別の売上集計と推移グラフ
  • 顧客ごとのリピート回数・累計購入金額の算出
  • RFM分析(Recency / Frequency / Monetary)の元データ準備
  • パレート分析(売上の8:2構造の可視化)

従来は中小企業診断士の現場で「Excel関数とピボットテーブル」で頑張っていたような分析が、自然言語で「これ集計して」「年度ごとの推移を出して」と頼むだけで終わるのは、想像以上に体験が変わります。クラウドAIにデータを送らないので、顧客情報を扱う案件でも気兼ねなく使えるのが何より大きい。

これからローカルAIを始める方へ

「いきなり本格的なシステムは難しそう」と感じた方へ、現実的なロードマップを提案します。

  1. ステップ1:LM Studioを単体で触る
    まずはLM Studio をインストールして、内蔵チャットでローカルLLMの感触を確かめる。これだけでも「ChatGPTもどき」をオフラインで使える。
  2. ステップ2:APIサーバー化
    LM Studioの「Local Server」機能をONにして、curlやPostmanでAPIを叩いてみる。中身がわかってくる。
  3. ステップ3:シンプルなFlask UIを作る
    最初はテキストやり取りだけのチャットUIで十分。ファイル添付やTool Useは後から段階的に追加していけばOK。
  4. ステップ4:ファイル添付とPython Tool Useを足す
    本記事で紹介した「メタプレビュー」と「safe_calc」のパターンを参考にすれば、業務で使えるレベルへ到達できる。

まとめ:ローカルAI環境を作るうえでの要点

ローカルAI環境を構築

  • ハードウェアは RAM 32GB / VRAM 12〜16GB あれば実用域
  • LM Studio + Flask + Python の組み合わせで、コア機能は 1ファイル数百行 で実現可能
  • 大容量データは「メタ情報だけ渡してパスを伝える」のが鉄則
  • AIが暴走してもサーバーが死なないよう サンドボックス側で防御 する
  • 多段階処理を回すなら Tool Useをループ化 する(最大5周程度)
  • プロンプトには「データ構造のヒント」と「集計の必要性」を 機械的に挿入 する

ローカルAIは「クラウドAIの劣化版」ではなく、業務データを安全に扱える別の選択肢です。一度組んでしまえばランニングコストは電気代だけ。中小企業診断や財務分析のように機密性の高い業務に取り組む方ほど、検討する価値があると思います。

同じような環境を作りたい方の参考になれば嬉しいです。質問や改善提案があればフォームからお問い合わせいただくか、SNS(XかFacebook)で交流しましょう。