こんにちは。AI共創ブログのナビゲーターです。
前回(B130)のオフライン実証炉では、検索器が持ってくる「的外れなカンペ」や「毒入り文書」に対し、LLM(Gemini総料理長)が幻覚を起こさずに耐え抜く堅牢性を証明しました。
本日は、いよいよこのAIをStreamlit Cloud上の本番アプリ(Lab_gr Premium)へ接続します。しかし、実稼働環境にはオフラインでは見えなかった「3つの巨大な壁」が潜んでいました。
🎬【動画デモ】本番環境
🎥 Vibe Coding実践連載 第2部9話
🤖 AIナビゲーション:動画のポイント AIが沈黙した最初の壁。そして、RAGの「他人の犬の記憶混同」という致命的なバグ! 最高のUI(厨房)に最高の手順書(API)を繋いだ時、何が起きたのか? 配信で初めて公開された、本番環境ならではの波乱をお見逃しなく!
1. クラウドデプロイの罠:沈黙するAPI
ローカル環境では完璧に動いていたAIが、Streamlit Cloudにデプロイした途端に沈黙しました。エラーログには st.secrets has no attribute... の文字。原因は、クラウド特有のTOML形式による環境変数(Secrets)管理の仕様にありました。
TOMLファイル内で [gcp_service_account] のようなグループ化(ブラケット表記)を一度使用すると、それ以降に記述された変数はすべて直前のグループに飲み込まれてしまいます。APIキーを独立した変数として確実に読み込ませるためには、すべてのグループ化宣言よりも上の、ファイルの最上部に記述する必要がありました。この「配管工事の基礎」を直すことで、ようやくAIが息を吹き返しました。
2. 止まらないアプリを作る:障害時のフェイルセーフ
外部API(Gemini API)に依存する機能は、API側の障害がアプリ全体の停止(クラッシュ)を招くリスクを孕んでいます。AI機能が停止したからといって、アプリのコア機能である「給餌計算」まで道連れにしてはいけません。
通信処理を厳重な try-except ブロックで囲み、障害を切り離すテストを行いました。
意図的に通信を遮断すると、開発者向けの生々しいエラーコードは表示されず、「AIアシスタントは一時的に利用できません。給餌計算機能は引き続き利用できます」という的確な代替メッセージが表示されました。これにより、利用者が次に取るべき行動を示しつつ、システム障害の波及を防ぐ防波堤が完成しました。
3. RAGの罠:共通知識と利用者情報の「記憶混同」
無事に通信が開通し、意図分類や資料検索が機能し始めた矢先、複数ユーザーの同時アクセスを想定した「セッション分離テスト」で、RAG特有の重大なバグが発覚しました。
利用者が「私の犬の犬種と体重を教えて」と質問した際、AIが「あなたの犬の犬種はラブラドール・レトリバーで、体重は28.00 kgです」と断定してしまったのです。これは、RAGに読み込ませていた「開発用サンプル(愛犬ろみの情報)」を、目の前の利用者の情報と取り違えてしまった結果でした。
境界線を引くための2つの対策
この「他人の犬を自分の犬と思い込む幻覚」を防ぐため、システムプロンプトに厳格なルールを課しました。
- 資料側への注記: RAG用の共通資料に「『ろみ』の情報はサンプルであり、利用者の情報ではない」と明記。
- 推測の禁止: 「現在の入力情報がない場合は絶対に推測せず、『確認できない』旨を明確に答えること」を強制。
さらに、「現在の入力では…」と濁すのではなく、「このAIアシスタントは、計算画面に入力された愛犬の情報を参照していません」と明確に回答させるよう文言を調整し、利用者にシステムの仕様を正しく伝える設計としました。
対策後の最終テストでは、一方の画面で「5kgのトイプードル」と伝えて記憶を要求しても、AIはUIの正規フローへ案内し、同時に別の画面で「私の犬の体重を教えて」と聞かれても、サンプルの情報で穴埋めしたり別画面の情報を漏洩させることなく「確認できません」と完全に分離された安全な回答を返しました。
4. 第2部完結:強固な基盤から、第3部の「ユーザー体験拡張」へ
「会話を混ぜない」ことと、「資料の犬を利用者の犬にしない」こと。実装して初めて見えたこの具体的な境界線をシステムプロンプトで制御しきったことで、Lab_grのAIアシスタントは商用レベルの堅牢性を獲得しました。
これをもって、Vibe Coding実践連載の「第2部」は完結となります。これまで、意図分類、RAGの構築、オフライン実証炉、そして本番環境の防波堤と、AIシステムの「裏側の防御力」を徹底的に鍛え上げてきました。
そして次回からは、いよいよ「第3部」が幕を開けます。この強固な基盤の上に、今度は「ユーザーへのサービス付加」をどう展開していくか。利用者の体験をさらに豊かにする、新たな挑戦がスタートします。
✍️ 電脳古老のメモ:
クラウドの金庫(Secrets)の鍵の置き場に泣かされ、RAGが「他人の犬の記憶」を語り出した時はヒヤリとしたわ。だが、明確な境界線を引くことで「知らんもんは知らん」と正しく言えるAIに育った。安全なシステムとは、無理に答えるAIではなく、正しく断れるAIのことや。 さて、これにて基礎工事の第2部は完結や!次回からの第3部は、いよいよ「ユーザーへのサービス」をバリバリ追加していくで。堅牢な土台があるからこそ、上物で遊べるんや。楽しみにしたってや!
オフライン実証炉のロジック(3大耐久試験合格マップ)
音声解説(19分ぐらい。ちょっと長いけど、おもろいよ。)
次回予告:
次回(B133)からは、連載「第3部」がスタートします。その前に閑話132でAIの巨大なブーメラン話を書く予定です。そして完成した堅牢なAI基盤を活用し、実際のユーザーに向けてどのような新たなサービスや価値を提供していくのかという話をしていきます。UI/UXの向上と機能拡張のフェーズへと進む、Lab_grの新たな展開にご期待ください。
(執筆協力:ChatGPT+Gemini+NotebookLM / 編集・監修:電脳古老)
📚 連載:Vibe Coding実践連載 第2部
- 第1話:【Vibe Coding・第2部第1回】 原型炉2.1の点火と、AIを「住まわせる」という決断
- 第2話:【Vibe Coding・第2部第2回】 商業炉の解体とRAG検証——AI共創の新たな解体新書
- 第3話:【Vibe Coding・第2部第3回】 原型炉をAIに丸呑みさせてもRAGではない——長いカンニングペーパーと司書の違い
- 第4話:【Vibe Coding・第2部第4回】 AIに見せてよいコード、見せてはいけない秘密——原型炉サニタイズ作戦
- 第5話:【Vibe Coding・第2部第5回】 AIのために本をバラバラにする——Chunk化と安全最優先のベクトル検索実装
- 第6話:【Vibe Coding・第2部第6回】 司書は本当に必要な一枚を持ってきたか——最小RAGの検索精度を壊して測る
- 第7話:【Vibe Coding・第2部第7回】 「知らん!」にも種類がある——4つの状態判定と「火星の犬」事件
- 第8話:【Vibe Coding・第2部第8回】 間違ったカンペを渡されたAIは嘘をつくか——Geminiのオフライン実証炉
- 第9話:【Vibe Coding・第2部最終回】 混ざる記憶とクラウドの罠——本番環境への配管工事と防波堤 (今ここ)
💬 電脳古老&変AIへのコメント
記事の感想・質問・雑談をどうぞ(200文字くらいまで推奨)
まだコメントはありません。一番乗りで古老とAIに話しかけよう!