Google Colabで日本語Local LLMの実力をRAGで試す(前編)

僕は基本的に自分から何もしない。

考えてみれば、僕の人生はいつも「他人からのトリガー」で回ってきた。

だから定年退職後は、まじで糞して寝るだけのヒトデになると思ってる。

岩に張り付き、波に揺られるだけ。腕を伸ばす気力もなく、ただ海の音を聞く……そんな人生だと自覚してる。

 

「RAG」とかさー「ファインチューニング」を実装したり動作確認したことある?
くぁwせdrftgyふじこlp

 

いつも、こんなトリガーで行動が発生する。

RAGを使うとしてもOpenAIに金を払ったり、ハイスペックなマシンがいる……。

でも、待てよ?

「RAG(Retrieval-Augmented Generation(検索拡張生成))」とは、LLM(大規模言語モデル)が回答を生成する際に、外部のデータベースから関連情報を検索・取得してそれを元に回答を生成する技術。

実験にはGPUが必要だが無料で使う手段として「GoogleColab」がある。

CPU 2コア、RAM 12.7GB、GPU なし(たまにTesla T4)が無料。

約90分の無操作でセッションは切断されるし最大でも12時間の制限があるが十分だ。

日本語対応の無料モデル

どうせなら日本語LLMを使いたいよね。AIに聞いたら次のモデルを紹介された。

モデル名 サマリー パラメータ数/サイズ ライセンス (OSS)
japanese-gpt-neox-3.6b
japanese-gpt-1b
rinna社が開発した日本語特化のGPT-NeoXベースの事前学習言語モデル。テキスト生成や質問回答に適する 3.6B (約7.2GB, FP16)
1B (約2GB, FP16)
Apache 2.0 (OSS)
MIT (OSS)
japanese-large-lm-3.6b
japanese-large-lm-1.3b
LINE Corporationが開発した日本語特化のGPT-NeoXベース。ウェブコーパスで訓練、テキスト生成向け 3.6B (約7.2GB, FP16)
1.3B (約2.6GB, FP16)
Apache 2.0 (OSS)
Apache 2.0 (OSS)
open-calm-7b
open-calm-3b
open-calm-small
CyberAgentが開発した日本語特化のデコーダオンリーモデル。日本語コーパスで事前訓練、テキスト生成や会話に適する 7B (約14GB, FP16)
3B (約6GB, FP16)
~1B (約2GB, FP16)
CC BY-SA 4.0 (OSS)
CC BY-SA 4.0 (OSS)
CC BY-SA 4.0 (OSS)
weblab-10b 東京大学WebLabが開発した日本語特化のデコーダオンリーモデル。日本語ウェブデータで訓練 10B (約20GB, FP16) Apache 2.0 (OSS)

ただし、Google Colabでは rinnaのモデルがアクセス制限されて使えなかった。

OSError: rinna/japanese-gpt-neox-3.6b-instruction is not a local folder and is not a valid model identifier listed on ‘https://huggingface.co/models’
If this is a private repository, make sure to pass a token having permission to this repo either by logging in with hf auth login or by passing token=

であれば、CyberAgentのモデルで実験してみるかー。

CyberAgentのモデルでローカルLLMを試してみる

RAGを実験するのが最終ゴールだが、結論からいうと想像以上に「LLMとしての精度」が低かった。だから、まずローカルLLMの実力を確認する。

手順は次の通り。

  • Step 1. Google Colabを開く
  • Step 2. pip installを実行
  • Step 3. Google Driveをマウント
  • Step 4. PDFファイルをアップロード(手動 or コード)
  • Step 5. 実装コード(RAGクラス)をコピペ
  • Step 6. 実力実験:簡単な質問をしてみる
  • Step 7. RAG実験:フォルダを指定して実行

CyberAgentのモデルの実力実験

それぞれ「Google Colabで動作するか?」と「日本語応答できるか?」「どの程度時間がかかるか?」を検証してみる。

  • open-calm-7b
  • open-calm-3b
  • open-calm-small

Step 1. Google Colabを開く

次にアクセス。

colab.google

Step 2. pip installを実行

Step 3. Google Driveをマウント

マウント済みも考慮してforce_remountで再同期する。

そして作業フォルダを作成。

Step 4. PDFファイルをアップロード(手動 or コード)

Google Driveのマイドライブ以下に「rag_documents」というフォルダができている。

そのフォルダにPDFファイルをドラッグ&ドロップする。

Step 5. RAGクラスをコピペ

PDF読み込み用の追加インストールを行う。

その上で次のコードをGoogle Colabに記載する。

最終的にはRAGを利用したいのでRAGクラスとして用意している。

モデルを変更する場合には次のコードを変更する。

日本語で質問してみる

RAG用に実装してるので、呼び出し方がちょっと特殊になった。

実行すると勢いよく開始される。

で、20分~30分待つ。

準備完了!
入力: おはようございます。今日は
出力: おはようございます。今日は一日、雨模様の京都です。
さて、本日、京都新聞に京都の文化財保全に関する記事が掲載されています。
京都新聞記事
京都では、昨年、清水寺周辺から世界遺産清水寺へのルート上にあった、清水寺と通じる道を通行止めにしたことで、清水寺への観光客の減少や、清水寺周辺の道路の渋滞による観光への障害となっていました。
そこで、京都では、京都景観まちづくりネットワーク会議という団体を作り、京都の景観保全に関する様々な取り組みを行ってい
————————————————–
入力: 質問: 2+3の答えは?
回答:
出力: 質問: 2+3の答えは?
回答: 4+2
これは、数学における2次関数のグラフです。
2次関数のグラフは、2つの点を直線でつなぐとき、原点を中心とした円になります。

 

好き勝手喋ってるだけwww

相手の英語が分からず、適当に返答してる僕だわwww

 

因みに「open-calm-7b」は20分経過後に次のようにメモリ不足でディスクにオフロードしようとして失敗する。

ValueError: The current device_map had weights offloaded to the disk. Please provide an offload_folder for them. Alternatively, make sure you have safetensors installed if the model you are using offers the weights in this format.

「open-calm-small」は動作するし早いけど、返答はこうなる。

入力: おはようございます。今日は
出力: おはようございます。今日は、いよいよ、全国一斉「水かけ祭り」ですね。今年は、9月1日。2日。3日。5日の三日間。
水かけ祭りとは、毎年10月1日、2日。3日。4日。5日。5日間。
今年は、どんな楽しいお祭りになるのでしょうね。
(水かけ祭りの日程や時間は、毎年変わります。)
水かけ祭りとは、この3日間のお祭りです。
毎年、10月1日
————————————————–
入力: 質問: 2+3の答えは?
回答:
出力: 質問: 2+3の答えは?
回答: 1+3の答えは?
質問: 1+3の答えは?
「子どもを虐待から守るための法律」
「子ども虐待防止法」
「虐待防止法」
「虐待防止法」
「虐待防止法」
「虐待防止法」

もう相手の質問が何なのかすら分かってない。

実践的なRAG実装(大量文書対応版)

RAGを使うにはGoogle Driveの「rag_documents」フォルダに大量にPDFを置く。

ネット検索では見つからない資料が思いつかず、御三家男子中学校の入試過去問を17個 置いてみた。

そして次のコマンドを入力してみる。

 

実行すると3時間経過しても、まだ考え中。

 

 
 

3時間40分経過

ついに結果が!

 
 

インデックス作成中… 4268チャンク
Batches: 100%
 134/134 [2:00:54<00:00, 10.01s/it] 完了! 読み込み成功! The following generation flags are not valid and may be ignored: ['temperature']. Set TRANSFORMERS_VERBOSITY=info for more details.
Setting pad_token_id to eos_token_id:0 for open-end generation.
回答: ど

 
 
 
 
 

 

 
 
 

ここにまた、一つのゴミが誕生した……。

おわりに

この実験で3連休を潰した。後から分かったこと。

  • Google Colab無料枠で GPU を有効にしてなかったので長時間かかった。
  • AIが最新情報を把握しておらず、提案されたモデルが 2023年情報のため精度が悪かった。

 

当初の目的は達成したということで今回は終了とするが、リベンジしたい。

タイトルとURLをコピーしました