「生成AIは便利そうだが、うちはデータを外に出せない」。
この一言で、企業や研究室のAI活用は止まります。この記事では、ローカルAI構築キットで作れるアプリが「外部送信なし」をどう設計し、どう検証しているかを、設定ファイル・コード・E2Eテストの証跡で実演します。
情シスやコンプライアンス担当に説明するときの材料として使える内容です。
1. 「クラウドAIは禁止」の職場で起きていること
研究開発、臨床、法務、公共部門。未発表のデータや個人情報を扱う現場では、クラウドAIの利用が規程で止められていることが珍しくありません。それ自体は正しい判断です。問題は、その結果として「AIを一切使わない」か「個人のスマホでこっそり使う」の二択になってしまうことです。後者のほうがよほど危険です。
2. 発想を変える:データを送らず、AIを手元に置く
ローカルAI構築キットで作れるアプリは、推論も埋め込みも文字起こしもPC内で行います。データを送らないのではなく、送る先がそもそも存在しない設計です。
ただし「ローカルです」と言葉で言うだけでは、情シスは納得しません。以下では、設計と検証を順に実演します。
3. 実演1:推論・埋め込み・文字起こしの3つをPC内で処理する
| 処理 | 使うもの | 通信先 |
|---|---|---|
| チャット回答・議事録生成 | Ollama(PC内のLLM) | 127.0.0.1:11434(自分のPC) |
| 資料のベクトル化(RAG) | Ollamaの埋め込みモデル(nomic-embed-text等)+ChromaDB(ローカル永続化) | 同上 |
| 音声の文字起こし | faster-whisper(PC内で実行) | なし |
| データ保存 | SQLite(app_data.db)+ chroma_db/ フォルダ | なし |
見落としやすいのが埋め込みです。ChromaDBには既定の埋め込み関数があり、そのまま使うとモデルを自動ダウンロードしに行きます。キットのRAGエンジンは、埋め込みをOllama経由で明示的に計算してChromaDBには数値だけを渡す設計にして、この経路を塞いでいます。

4. 実演2:ネットワークを閉じる設定ファイル
Streamlitの設定ファイルで、次を固定しています。
server.address = "127.0.0.1"。自分のPCからしか接続できない。LAN内の別PCからも不可- CORSは有効にしたうえで、許可する送信元を
http://localhost:8501とhttp://127.0.0.1:8501の2つに限定 - WebSocket接続を受け付けるホスト名も
localhostと127.0.0.1に限定 - XSRF保護を有効化
browser.gatherUsageStats = false。利用統計の外部送信を無効化
CORSを「無効」にする記事をよく見かけますが、無効にすると任意のオリジンからの接続を許す状態になります。機密データを扱うアプリでは、有効にして送信元を絞るのが正解です。起動スクリプトも同じ値をコマンドライン引数で渡しているので、設定ファイルを消しても緩くなりません。
5. 実演3:クラウド公開につながるUIを消す
Streamlitには、画面右上に「Deploy」ボタンと標準メニューがあります。これは便利な反面、「クリック1つで外部に公開できそうに見える」UIです。アプリ構築プロンプトでは、機密データ漏洩の懸念を排除するため、これらをCSSで完全に非表示にすることを要件にしています。
ヘッダー、ツールバー、ステータスウィジェット、Deployボタン、メインメニュー、フッター。いずれも display: none で消し、E2Eテストで「DOM上0件 / 表示0件」を確認しています。
6. 実演4:閉まっていることをテストで毎回確かめる
ここが一番大事です。設定を読んで安心するのではなく、E2Eテストのテスト1が毎回これを確認します。
localhost:8501で正常に表示される- Deployボタン・標準メニュー・ツールバー・ヘッダーが非表示
- 「Deploy」の文字が画面に出ない
- LAN側IPからは接続できない。テストランナーが自分のLANアドレスを取得し、そのアドレスの8501番へ実際に接続を試みて、失敗することを確認
- 画面に例外・エラー表示がない
直近のテストレポートでは、この10項目を含む79件の検証がすべてPASSでした。レポートには動画と赤枠付きスクリーンショットが付くので、そのまま情シスへの説明資料にできます。
7. 唯一、通信が起きるタイミング
正直に書いておきます。ネットワーク通信が発生するのは次の2つだけです。
- Whisperモデルの初回ダウンロード
- Ollamaでモデルを取得するとき(
ollama pull)
どちらもモデルファイルの取得で、ユーザーのデータは送られません。モデルを先に取得しておけば、その後はネットワークを切った状態でも全機能が動きます。
8. 注意:構築時のClaude Codeは外部サービスです
キットはClaude Codeでアプリを構築・カスタマイズする前提です。
Claude Codeでプロンプトを実行すると、指示内容と作業フォルダ内のファイルがAnthropicのサービスに送信されます。 機密データを置いたフォルダでは実行しないでください。
構築後のアプリの利用にClaude Codeは不要です。「作るときは空のフォルダで、使うときはローカルで」が原則です。使い方ガイドにも同じ注意を書いています。
9. 情シスに説明するときのチェックリスト
- [ ] 推論・埋め込み・文字起こしの実行場所(PC内)
- [ ] バインド先(127.0.0.1限定)とLANからの接続不可の検証結果
- [ ] CORS許可元・許可ホスト・XSRF保護の設定値
- [ ] 公開系UI(Deployボタン等)の非表示と、その検証結果
- [ ] 通信が発生する唯一のタイミング(モデル取得)
- [ ] 依存ライブラリのライセンス一覧(GPL系なし)
- [ ] 構築時のClaude Code利用と、機密フォルダで実行しない運用ルール
この7項目は、キットの使い方ガイド・設定ファイル・テストレポートで裏が取れます。


コメント