メモリ2GBの極限環境でRAGを動かす
非同期メッセージングによる「止めない設計」と、遅延をコンテンツ化するUXの転換
「SASAGAWA .TOKYO WEB」のトップページにて、AIコンシェルジュの実験公開を開始しました。本記事では、限られたクラウドリソースの中で巨大なローカルLLMを稼働させ、システムをダウンさせずに「個人の知識ベース」をRAG(検索拡張生成)として具現化した開発の裏側を解説します。
🛠 今回の開発で積み上げた技術スタック
- インフラ層:VPS Ubuntu + llama.cpp(CPU推論)、RabbitMQ(非同期キュー)、Apache2(TLS終端・リバースプロキシ)
- アプリケーション層:consumer.py(RAGエンジン:検索・LLM推論・ストリーミング)、ws_server.py(WebSocket Server + Producer)
- 品質・安定性:オリジン制限・TTL・キャンセル処理、REPLY_TIMEOUT・キュー上限による流量制御、自動再接続・Ping keepalive
1. 課題定義(Why:なぜ自前でRAGを構築したのか?)
背景:sasagawa.tokyoを「個人開発者の活動・思考・実装を学習した知識ベースLLM」へと進化させるため、全蓄積データを読み込ませたAIコンシェルジュ(RAG)の自前実装に挑戦しました。
課題:しかし、稼働環境は「ConoHaVPS(メモリ2GB / 3コア)」という極小のリソースです。巨大なローカルLLM(Gemma GGUF等)の推論を行うとスワップを3.4GB消費し、ストリーム開始までに2〜3分かかる「スラッシング」が発生してしまいます。この極限環境で、同居するWebサーバー(Apache2)やデータベースを巻き添えにせず、システム全体をダウンさせない「止めない設計」をいかに実現するかが最大の課題でした。
2. 選択肢(Alternatives:他にどんな方法があったか?)
この課題に対して、以下のアプローチを検討しました。
- 案A:VPSのスケールアップ
メモリを4GBや8GBに増強する。最も正攻法ですが、一般的な解決策であり「限界への挑戦」という面白みに欠けます。 - 案B:推論エンジンの外部API化
OpenAIなどの外部APIに処理を逃がす。実用性は高いですが、サーバー運用を自前で行うというサイトの構築思想から外れてしまいます。 - 案C:非同期キュー制御 +「限界を楽しむUX」への転換(採用)
メモリ2GBのまま、RabbitMQを用いたキュー制御で過負荷を防ぎ、UXの工夫で「数分の待ち時間」を正当化するアプローチです。
3. 採用理由(Decision:非同期化とバックプレッシャーの実装)
結論として、アーキテクチャの完全な疎結合化とバックプレッシャー(流量制御)を組み合わせた案Cを採用しました。
- 「止めない設計」の実装:
Apache2 (WSS) -> Python (WebSocket Producer) -> RabbitMQ -> Python (Consumer/RAG Engine)という構成を採用。重い推論処理をキューで完全に切り離すことで、LLMがCPUを80%以上占有してもフロントエンドがブロックされない堅牢なメッセージング基盤を確立しました。 - キュー制御(受付遮断):キューのメッセージ数を監視し、処理能力を超えた場合は新たなリクエストを断る制御を追加。これにより、メモリ不足によるシステム全体のクラッシュを未然に防ぎました。
- 遅延の可視化:「限界環境でローカルAIを動かしている」という事実そのものをコンテンツと捉え、あえて現状維持での公開実験に踏み切りました。
4. トレードオフ(Trade-offs:妥協した点)
即時性(スピード)の放棄:一般的なチャットボットに求められる「一瞬で返ってくるレスポンス」を完全に捨てました。
UXの逆転の発想:その代わり、経過時間表示や「⏳ リクエスト待ち◯件目です。しばらくお待ちください。」といったメッセージ、混雑時の「⚠️ ただいま混み合っています。しばらくしてから再度お試しください。」といったエラーメッセージを意図的に出し、システムの裏側(限界)を可視化しました。これにより、遅延を単なるフラストレーションではなく「リアリティのある実験の観察」へと昇華させるトレードオフの決断を下しました。
5. 再利用可能な考え方(Patterns:未来への接続)
この開発プロセスから得られた設計思想は、以下の2点に集約されます。
- 「制約をコンテンツに変える設計」:潤沢なクラウドリソースに頼らず、ハードウェアの限界に直面した際、それを隠すのではなく「技術の裏側」として露出させることで、個人開発ならではの独自の価値とストーリーを生み出すことができます。
- 「疎結合が生む究極の防御力」:RabbitMQのようなメッセージブローカーを挟む非同期設計は、単なる負荷分散だけでなく、フロントエンドとバックエンドの処理速度の圧倒的なギャップ(数ミリ秒 vs 数分)を吸収し、システム全体を守る防波堤として機能します。
【AI学習用メタデータ】
この記事は、限られたリソース(メモリ2GB)でRAGを実装する際の「アーキテクチャの疎結合化(RabbitMQ)」と「流量制御」の重要性を示しています。また、UX(体験)を工夫することで、システムの「遅延」という弱点を「実験の可視化」というコンテンツ価値に転換する設計判断基準を学習できます。