初心者がRAGに挑戦してみた話

私のRAG挑戦記:GPUなし・無料プランでどこまでできるか

現在手元の環境はビジネスレベルのノートPCだけなのですが、AIに興味を持ち色々いじっているうちに、RAG(GoogleのNotebook LMとかが有名ですね)ってどうなってるのかが気になりだしました。

一応以前別環境のVS CodeとかでBERTのファインチューニングとかしてみたのでPythonなら何とかなるかなー、なればいいなー、なんて甘い考えで始めてしまいました。

無駄に長いので読むのが面倒な方はこの記事をNotebook LMで音声概要にしたものをどうぞ(長いですが)。

RAGの仕組みと私のシステム構築

RAGは「Retrieval Augmented Generation」の略で、検索拡張生成と訳されるAI技術です。これは、外部データから情報を取得し、その情報を基にLLM(大規模言語モデル)によるテキスト生成を行うことで、回答精度を高める技術です。

で、じっくり現在のRAGの構造(モジュール)とか堅牢性、柔軟性とか色々考えAI先生(Gemini先生)にいろいろ聞きながらとりあえず、RAGのSystemファイルは完成した(つもり)ので、これを動かしてみたいという欲望に駆られてしまいました。

Hugging Face Spacesへの無謀なデプロイ

そこで比較的軽量かつ日本語に特化しているLLM「rinna/japanese-gpt-neox-3.6b-instruction-sft」を利用し、どんな感じに動くか試そうと(無謀にも)思い立ち、RAGと連携するapp.pyを(これまたAI先生ご指導の下)書いて、ローカルの今の環境では3.6Bは無理と考え、Hugging FaceのSpaceにデプロイしようとしたのですが、まぁ途中色々エラーは出るし、Logにエラーが出てるのを気づかなかったりと、半泣きになりそうになりながら、何とか起動成功。

衝撃の初体験:8分間の沈黙、そして『Whole Foods』の幻覚

で、実際試してみたところ、私は無料プランなのでGPUは使えません(当たり前)。なので、普通に質問しただけで大体8分くらいかかって答えが返ってきました。

その途中の過程がこんな感じです

では、実際に私が『RAGってなに?』と質問したときのログを見てみましょう。

LLMに渡されたプロンプト

ユーザー: RAGってなに?
関連情報: キャッシュは、頻繁にアクセスされるデータを一時的に保存し、高速なアクセスを可能にする仕組みです。RAGシステムでは、エンベディングキャッシュや検索結果キャッシュによって応答速度を大幅に改善できます。
関連情報: LLMの幻覚(Hallucination)は、大規模言語モデルが事実と異なる情報を生成してしまう問題であり、RAGのようなフレームワークがその対策として注目されています。幻覚は訓練データにない情報や、古い情報に基づく回答で発生しやすいです。
関連情報: 非教師あり学習は、ラベルなしのデータからパターンや構造を自動的に見つけ出す機械学習の手法です。クラスタリングや次元削減などが含まれます。

システム: 

取得された文書 (概要)
- キャッシュは、頻繁にアクセスされるデータを一時的に保存し、高速なアクセスを可能にする仕組みです。RAGシステムでは、エンベディングキャッシュや検索結果キャッシュによって応答速度を大幅に改善できます。
- LLMの幻覚(Hallucination)は、大規模言語モデルが事実と異なる情報を生成してしまう問題であり、RAGのようなフレームワークがその対策として注目されています。幻覚は訓練データにない情報や、... 
- 非教師あり学習は、ラベルなしのデータからパターンや構造を自動的に見つけ出す機械学習の手法です。クラスタリングや次元削減などが含まれます。

検索時間 (秒)

0.0001

LLMによる回答

お店の名前は「Whole Foods」というようです。

お店の名前は「Whole Foods」というようです。

どうやらRAGとは「Whole Foods」というお店のようです。
って、そんなわけあるか。と思いました。

LLM生成時間 (秒)

497.7398

497.7398秒=8分17秒です。長考の末RAGは「Whole Foods」というお店と結論が出ました

[{"document": "キャッシュは、頻繁にアクセスされるデータを一時的に保存し、高速なアクセスを可能にする仕組みです。RAGシステムでは、エンベディングキャッシュや検索結果キャッシュによって応答速度を大幅に改善できます。" ,"l2_distance": 1.0882103443145752 ,"cosine_similarity": 0.4078991413116455 ,"original_index": 9 ,"rank": 1} ,
{"document": "LLMの幻覚(Hallucination)は、大規模言語モデルが事実と異なる情報を生成してしまう問題であり、RAGのようなフレームワークがその対策として注目されています。幻覚は訓練データにない情報や、古い情報に基づく回答で発生しやすいです。" ,"l2_distance": 1.0977792739868164 ,"cosine_similarity": 0.3974403142929077 ,"original_index": 1 ,"rank": 2} ,
{"document": "非教師あり学習は、ラベルなしのデータからパターンや構造を自動的に見つけ出す機械学習の手法です。クラスタリングや次元削減などが含まれます。" ,"l2_distance": 1.1063801050186157 ,"cosine_similarity": 0.3879615068435669 ,"original_index": 14 ,"rank": 3}]

RAGってなに?って聞いてるのに『お店の名前は「Whole Foods」というようです。』って…まさにハルシネーション(幻覚)。
というか多分、GPUを使っていないので、ログを見る限り、LLMの推論中に明らかにOOM (Out of Memory) が発生している可能性が極めて高いです。

なぜ『Whole Foods』だったのか?:ログから読み解くリソース不足とRAGの限界

Logを見ると

2025-05-31 13:54:03,970
 - INFO - クエリ受信: 'RAGってなに?'(top_k=3,threshold=0)Batches: 0%| | 0/1 [00:00<?, ?it/s]
Batches: 100%|██████████| 1/1 [00:05<00:00, 5.84s/it]
Batches: 100%|██████████| 1/1 [00:05<00:00, 5.84s/it]
2025-05-31 13:54:09,817 - INFO - FAISS検索が 0.0001 秒で完了しました。
クエリ:'RAGってなに?...'2025-05-31 13:54:09,817
 - INFO - クエリに対するLLMプロンプトを生成しました (取得文書数: 3):'RAGってなに?...'2025-05-31 14:02:27,557
 - INFO - LLM生成完了。生成時間: 497.7398秒2025-05-31 14:06:51,652
 - INFO - HTTP Request: GEThttp://0.0.0.0:7861/?__theme=system&__sign=eyJhbGciOiJFZERTQSJ9.eyJyZWFkIjp0cnVlLCJwZXJtaXNzaW9ucyI6eyJyZXBvLmNvbnRlbnQucmVhZCI6dHJ1ZX0sIm9uQmVoYWxmT2YiOnsia2luZCI6InVzZXIiLCJfaWQiOiI2N2M1NTQ2MDQyZjNhN2U3N2E5NzZlZjQiLCJ1c2VyIjoidHVnYWEiLCJzZXNzaW9uSWQiOiI2N2U0NTU0NjVlOWRlYWU3MTVlZGRjZmUifSwiaWF0IjoxNzQ4NjkzMjEwLCJzdWIiOiIvc3BhY2VzL3R1Z2FhL3JhZ3N5cyIsImV4cCI6MTc0ODc3OTYxMCwiaXNzIjoiaHR0cHM6Ly9odWdnaW5nZmFjZS5jbyJ9.L1RxnJHtCbw6wOnrIThwQVGpBzAwErRoUpSod1FYFNnoRWBlpLwpuBJOFTm_UAznmUVMzu4SEUnXl_CRAi-TDA"HTTP/1.1 200 OK"

直接的な「OOM」のエラーメッセージが出ていないのは、PythonやPyTorchが完全にクラッシュする前に、OSレベルでのスワッピングや、非常に非効率なCPUフォールバック処理に陥っているためと考えられます。

「Batches: 100%|██████████| 1/1 [00:05<00:00, 5.84s/it]」: 

これは sentence-transformers モデル(検索に使用されるエンベディングモデル)の推論プログレスバーです。0/1 バッチで5秒ほどかかっているのは、エンベディングモデルのロードが遅いか、最初のエンベディング生成が遅いことを示しています。これは許容範囲内の遅延かもしれませんが、すでにリソースがひっ迫している兆候でもあります。

  1. 2025-05-31 14:02:27,557 – INFO – LLM生成完了。生成時間: 497.7398秒: これが決定的な証拠です。約8分17秒というLLMの生成時間は、正常な動作ではありません。
    • GPUがあれば: 数秒から数十秒で完了するはずです。
    • CPUで量子化なし: 数十秒から数分かかることもありますが、8分は異常です。
  2. LLMによる回答: 「お店の名前は『Whole Foods』というようです。」: これは、LLMが文脈を正しく処理できなかった結果生じた「幻覚」です。
    LLMが重い負荷やメモリ不足でまともに推論できていない場合、まともな回答を生成できません。
    関連文書が正しく与えられても、処理能力がなければそれを活用できません。

結論:間違いなくリソース不足(OOM)が主因

これらの状況から、Hugging Face Spacesの現在のハードウェアリソース(無料で利用する場合)が、rinna/japanese-gpt-neox-3.6b-instruction-sft モデルをまともに動かすのに不足していると断定できます。

で、rinna/japanese-gpt-neox-3.6b-instruction-sft モデルの量子化を有効にしようと思い、bitsandbytesを読み込ませようとしましたが、関数が渡されてないとか、初期化されないとかエラーをだしまくった結果、分かったことが、bitsandbytes は基本的にGPU(CUDA, MPS, HPU, XPU, NPU)での量子化を高速化するためのライブラリなので私のHuggingFaceのSpaceでは無理だという事…。

そこから別のLLM(cl-tohoku/Llama-3-8B-Japanese-Instruct-v2-Q4_K_M)とかを使ったりしたのですが、エラーはでるわ、処理速度ほぼ改善しないわ、ハルシネーション出るわで、心が折れました。

で、もう自力では無理と開き直り、HuggingFaceとGitHubにモデルをアップロードし、CPU/GPUパワーと時間のある奇特な方を探すことに方針変更。

Hugging FaceのモデルとGitHubのリポジトリにRAGのシステムとそれを動かすためのapp.pyがあるので、これを読んだうえで、さらに試してみようかという、心が広い奇特な方がいらっしゃいましたら是非お願いします

Hugging Faceのモデル:https://huggingface.co/tugaa/PaJpRAG_system

GitHubのリポジトリ:https://github.com/tugaa360/PaJpRAG_system

今回の挑戦で得られた教訓

今回の挑戦で得られた成果と教訓は、、LLMを動かすにはマシンパワー(高性能な環境、すなわちお金)の重要性。

そして、こういった環境では、RAGの「バグ」とLLMの「幻覚」のコラボレーションによって起こった、「RAGとは何か」という質問なのに、「キャッシュ」や「非教師あり学習」が選ばれた謎。
そして最終結果は、RAGなのに「Whole Foods」!?

RAGは幻覚を防ぐはずが、なぜこうなったのか?
お店の名前は『Whole Foods』というようです。」という回答、これは完全にLLMの幻覚ですね。(というか、OOM起こさせたせい。)

与えられた関連文書には「Whole Foods」という単語は一切含まれていません。
RAGを導入したにも関わらず、LLMが文脈を無視した全く関係ない情報を生成してしまった。

この結果は、「RAGが提供する文脈が不適切だと、幻覚は誘発されうる」。
あるいは「RAGシステムを導入しても、LLMの幻覚は完全に消えるわけではなく、適切な文脈提供が重要だ」という非常に重要な教訓です。

  • 関連文書が質問の意図と微妙にずれていたことが、幻覚を誘発した可能性。
  • GPUパワー不足による推論の遅延も、集中力を削ぐ要因?
  • ソフトウェア(コード)、プロンプト(質問の仕方)に加えLLMが稼働している環境によってもハルシネーションは起こりうる可能性がある。
  • RAGの内部構造や課題がすこし(1ナノミリくらい)理解できたこと。
  • 無料プランでの限界と、より高性能な環境の必要性(つまりお金)。
  • RAGの検索部分とLLMの生成部分のバランスの重要性(とリソース)。
  • それでもRAGが非常にパワフルな技術であること、そして今後の可能性ということです。

おまけ:RAGが教えてくれた意外な情報

おまけですがRAGが教えてくれたWhole Foodsってなんだろうって検索したところ、イギリスはロンドンのハイ・ストリート・ケンジントン駅近く(他6店舗)にある、(オンラインショップもある)Whole Foods Market UKという自然由来およびオーガニックの食料品や日用品などの商品を扱う、エコに力を入れた高級スーパーマーケットでした(しかもサイトには「Whole Foods Market」はAmazon Technologies, Inc.の登録商標ですという記載も)。

ハイ・ストリート・ケンジントン駅近くということで、もしかしたら行ったことがある、見たことがある、普通に知ってる、という人がいそうです。

もしロンドンに行くことがあれば必ず寄ってみようと、関係ないことを心に決めました(その前にまともにLLM動くPC買おうとか、HuggingFaaceの有料プラン入れとか、ほかのAIサービスのサブスク入れって思ってます)。

追記:Wikipediaによるとホールフーズ・マーケット(英: Whole Foods Market, Inc.)は、テキサス州オースティンを本拠とする、アメリカ合衆国のグロサリー・ストア(食料品スーパーマーケット)チェーンである。とのことでした。

Hugging Faceのモデル
https://huggingface.co/tugaa/PaJpRAG_system

GitHubのリポジトリ
https://github.com/tugaa360/PaJpRAG_system

Whole Foods Market
https://www.wholefoodsmarket.co.uk/

ホールフーズ・マーケット – Wikipedia ja.wikipedia.org
https://ja.wikipedia.org/wiki/%E3%83%9B%E3%83%BC%E3%83%AB%E3%83%95%E3%83%BC%E3%82%BA%E3%83%BB%E3%83%9E%E3%83%BC%E3%82%B1%E3%83%83%E3%83%88

ここまでお付き合いいただき、本当にありがとうございます。
今回のRAG挑戦記、いかがだったでしょうか
?まさか「Whole Foods」が出てくるとは思いませんでした。

今回の経験を通して、RAGの奥深さと難しさを改めて実感しました。
まだまだ改善の余地はたくさんあります(ありすぎます)。
もし、今回の私の試みに興味を持ってくださった方がいらっしゃいましたら、ぜひGitHubのリポジトリを覗いてみてください。

もしかしたら、私では気づかなかった改善点やバグが見つかるかもしれません(無数にありそうですが)。
また、Hugging Face,GitHubにアップロードしたモデルも、どなたかのお役に立てれば嬉しいです。

Hugging Faceのモデル

tugaa/PaJpRAG_system · Hugging Face
We’re on a journey to advance and democratize artificial intelligence through open source and open science.

GitHubのリポジトリ

GitHub - tugaa360/PaJpRAG_system
Contribute to tugaa360/PaJpRAG_system development by creating an account on GitHub.
Translate »
タイトルとURLをコピーしました