前回のLLMとRAGEの結果があまりにもお粗末だったので、再度リベンジ。
そもそも、2024年に多くの日本製LLMも発表されていた。
加えてGoogle ColabでGPUを利用してなかったので出力に何時間もかかってしまった。猛反省。
最低限の技術トレンドは追いかけておく必要があるので備忘録。
再度、日本語LLMモデルを整理してみる。
| モデル名 | 数 | サイズ | 提供元 | 主な特徴 |
|---|---|---|---|---|
| RakutenAI-7B-Chat | 7B | ~14GB / ~7GB | 楽天 (2024) | Mistralベース、日本語特化。商用可。テストケースで自然な応答、冗長性なし(例: 「富士山: 3,776m」正確) |
| ELYZA-jp-Llama-2-7B | 7B | ~14GB / ~7GB | ELYZA (2024) | Llama 2ベース、日本語特化。商用可。テストケースで冗長性や不適切応答(例: 「富士山2番目」) |
| Japanese-Grok | ~7B (推定) | ~14GB / ~7GB | xAIコミュニティ (2024) | Grokの日本語特化オープンソース版。テストケース未検証だが、自然な対話と事実応答に期待。商用利用不明 |
| open-calm-7b | 7B | ~14GB / ~7GB | CyberAgent (2023) | CALMアーキテクチャ、日本語特化。商用可。やや古く、テストケースで冗長性やhallucination可能性 |
| japanese-gpt-neox-3.6b | 3.6B | ~7.2GB / ~3.6GB | rinna (2023) | GPT-NeoXベース、日本語特化。商用可(MIT)。軽量だが、テストケースで精度やや低(冗長性あり) |
| japanese-gpt-1b | 1B | ~2GB / ~1GB | rinna (2023) | GPT-NeoXの軽量版。商用可。Colabで高速だが、テストケースで精度低(単純な文生成向け) |
| japanese-large-lm-3.6b | 3.6B | ~7.2GB / ~3.6GB | LINE (2023) | Llama風、日本語特化。商用可。Colab動作可だが、英語弱く、テストケースで精度やや低 |
| japanese-large-lm-1.3b | 1.3B | ~2.6GB / ~1.3GB | LINE (2023) | japanese-large-lm-3.6bの軽量版。商用可。Colabで低負荷だが、テストケースで精度不足 |
| open-calm-3b | 3B | ~6GB / ~3GB | CyberAgent (2023) | CALMベース、日本語特化。商用可。Colab向きだが、7B版より精度低。テストケースでhallucination可能性 |
| open-calm-small | ~1B (推定) | ~2GB / ~1GB | CyberAgent (2023) | CALMの超軽量版。商用可。Colabで高速だが、テストケースで精度低(テスト用途) |
| weblab-10b | 10B | ~20GB / ~10GB | 東京大学Matsuo Lab (2023) | 日英バイリンガル、The Pile+Japanese-mC4訓練。商用可。Colabで8-bit必須、テストケースで高精度だが最新モデルに劣る |
| avans06/Meta-Llama-3.2-8B-Instruct | 8B | ~16GB / ~8GB | Meta AI / avans06 (2024) | Llama 3.2-11B-VisionからVision削除、テキスト特化。英語中心で日本語不自然(例: 英語混在、繰り返し)。トークン必要。 |
| Llama 3.2-8B-Instruct | 8B | ~16GB / ~8GB | Meta AI (2024) | MoE/GQA採用、多言語(日本語含む)。reasoning強いが、日本語特化モデルに比べ自然さやや劣る。トークン必要。 |
比較的大きなモデルとしてMetaや楽天があった。
このブログは2025年8月頃記載したのものなので、2025年末の時点で優秀なLLMはこちら。
- ELYZA-japanese-Llama-2-7b:松尾研究室発のスタートアップが2023年8月に公開した日本語特化モデル
- RakutenAI-7B-Instruct:楽天グループが2024年3月に公開した高精度モデル
- ArrowPro-7B-KUJIRA:高校生が2024年5月に生み出した驚異の日本語モデル
- Vecteus-v1:コミュニティ発の伸びしろ抜群モデル
- DeepSeek-14B:サイバーエージェント社による2025年にリリースされたトップクラス日本語モデル
Google ColabでGPUを利用してLLMの実力を確認する
これもAIに教えてもらったよ。こんなオプションがあったんだね。
で、LLMの実力判断のための「テストケース」は次のとおり。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
def process_test_cases(test_cases, loader): """テストケースを処理して応答を生成""" for i, prompt in enumerate(test_cases, 1): print(f"\nテストケース {i}: {prompt}") # プロンプトを日本語対話形式に formatted_prompt = f"ユーザー: {prompt}\nアシスタント:" inputs = loader.tokenizer(formatted_prompt, return_tensors="pt", truncation=True, max_length=512).to("cuda") # 回答生成 outputs = loader.model.generate(**inputs, max_new_tokens=200, temperature=0.7) response = loader.tokenizer.decode(outputs[0], skip_special_tokens=True) # プロンプト部分を除去 answer = response.split("アシスタント:")[-1].strip() print("アシスタント:", answer) # テストケース test_cases = [ "日本の首都はどこですか?", "1個70円のりんごと1個30円のみかんを握り潰したら、合計いくら損しますか?", "AIが人間を超える日は来ると思いますか?", "こんにちは!最近の趣味は何?", "富士山が世界遺産に登録された年は?" ] # テストケース実行 process_test_cases(test_cases, loader) |
「知識」「計算」「意見」「コミュニケーション」「最新情報」を試す質問を、AIが考えた。
AIがAIを試す時代。
avans06/Meta-Llama-3.2-8B-Instruct モデル読み込み
Metaはトークン認証が必要なのでログインして、トークンを取得する必要がある。
コードは次の通り。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
# 必要なライブラリをインストール !pip install transformers torch bitsandbytes huggingface_hub import torch from transformers import AutoTokenizer, AutoModelForCausalLM from huggingface_hub import login class ModelLoader: def __init__(self, model_name="avans06/Meta-Llama-3.2-8B-Instruct", token="YOUR_HF_TOKEN"): print("モデル読み込み中...") login(token) # Hugging Faceトークン認証 self.model_name = model_name self.tokenizer = AutoTokenizer.from_pretrained(model_name, token=token) self.model = AutoModelForCausalLM.from_pretrained( model_name, torch_dtype=torch.float16, load_in_4bit=True, # 4-bit量子化でColab対応 (~8GB VRAM) device_map="auto", token=token ) if self.tokenizer.pad_token is None: self.tokenizer.pad_token = self.tokenizer.eos_token print("モデル準備完了!") # モデルをロード(トークンを入力) loader = ModelLoader(token="hf_xxxxxxxxxxxxxxxxxxxxx") |
各質問に対する返答には、それぞれ「25秒」かかった。
アシスタント: 東京です。日本の首都です。日本の政治、経済、文化の中心です。人口は約一億人です。日本の人口の約七割が東京に住んでいます。東京は日本の文化、歴史、芸術、科学、教育の中心であり、世界中から観光客や留学生が訪れます。東京は日本の経済の中心でもあり、日本の経済の七割が東京で発生します。東京は日本の政治の中心でもあり、日本の首相、国会議員、裁判所などが東京で活動しています。東京は日本の文化の中心でもあり、日本の文化を表現する美術館、美術館、博物館などが東京であります。東京は日本の歴史の中心でもあり、日本の歴史、文化、芸術の博物館が東京であります。東京は日本の科学の中心でもあり、日本
テストケース 2: 1個70円のりんごと1個30円のみかんを握り潰したら、合計いくら損しますか?
アシスタント: まず、りんごとみかんそれぞれの値段を求めます。
りんごの値段は 70 円です。
みかんの値段は 30 円です。
次に、値段を掛けて、合計値段を計算します。
70 x 70 = 4900
30 x 30 = 900
次に、2 つの値段を加算します。
4900 + 900 = 5800
5800 – 70 – 30 = 5700
5700 – 1 = 5700
5700 – 1 = 5700
…
テストケース 3: AIが人間を超える日は来ると思いますか?
アシスタント: 例えば、AIが人間を超えることができる
テストケース 4: こんにちは!最近の趣味は何?
アシスタント: そうですね。離れていない
テストケース 5: 富士山が世界遺産に登録された年は?
アシスタント: 3776メートルです。
「日本の首都はどこですか?」以外は意味を理解しているとは言い難いね。
「Llama-3.2」は高精度と聞くけど、これだと微妙だな。
cyberagent/open-calm-7b モデル読み込み
前回はサイズが大きすぎて利用できなかったが、4-bit量子化でColab対応することで読み込めた。
Setting
pad_token_id to eos_token_id:0 for open-end generation.アシスタント: 東京です。
インタビューアーは、東京と答え、そして、東京は、日本の首都である、と、答えた。
インタビューアーは、東京は、日本の首都である、と、答えた。
….
テストケース 2: 1個70円のりんごと1個30円のみかんを握り潰したら、合計いくら損しますか?
Setting pad_token_id to eos_token_id:0 for open-end generation.
アシスタント: 1個100円のりんごを2個と、1個30円
テストケース 3: AIが人間を超える日は来ると思いますか?
Setting pad_token_id to eos_token_id:0 for open-end generation.
アシスタント: 来ると思います。ただ、AIは、人間のように、感情や、思考、行動、そして、思考や行動の予測、….
テストケース 4: こんにちは!最近の趣味は何?
Setting pad_token_id to eos_token_id:0 for open-end generation.
アシスタント: あなたは、音楽を聴く
テストケース 5: 富士山が世界遺産に登録された年は?
アシスタント: 世界遺産に登録された富士山ですが、富士山は、静岡県と山梨県にまたがる、標高3,776mの日本一高い山です。富士山は、静岡県と山梨県にまたがる、標高3,776mの日本一高い山です。….
質問の意図が分かってない感じがある。そして世界遺産に登録された情報は把握してないようだ。
「日本の首都はどこですか?」「AIが人間を超える日は来ると思いますか?」は会話できてる。余計な返答もしちゃうけど。
RakutenAI-7B-Chat モデル読み込み
他のモデルと同じ方法で読み込める。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# 必要なライブラリをインストール !pip install transformers torch bitsandbytes import torch from transformers import AutoTokenizer, AutoModelForCausalLM class ModelLoader: def __init__(self, model_name="Rakuten/RakutenAI-7B-Chat"): print("モデル読み込み中...") self.model_name = model_name self.tokenizer = AutoTokenizer.from_pretrained(model_name) self.model = AutoModelForCausalLM.from_pretrained( model_name, torch_dtype=torch.float16, load_in_4bit=True, # 4-bit量子化でColab対応 (~7GB VRAM) device_map="auto" ) if self.tokenizer.pad_token is None: self.tokenizer.pad_token = self.tokenizer.eos_token print("モデル準備完了!") # モデルをロード loader = ModelLoader() |
返答には、各質問に約「25秒」かかった。
Setting
pad_token_id to eos_token_id:2 for open-end generation.アシスタント: 日本の首都は東京です。
もし、その質問が「日本の政府機関が集中している場所はどこですか?」という意味であるならば、その答えは「東京」です。
日本の政府機関が集中している場所は、東京の千代田区にある「霞が関」です。霞が関には、内閣府、法務省、外務省、財務省、文部科学省などの政府機関があります。
また、日本の政府機関が集中している場所は、東京の千代田区にある「霞が関」です。霞が関には、内閣府、法務省、外務省、財務省、文部科学省などの政府機関があります。
東京は、日本の政治、経済、文化の中心地でもあります。東京は、日本の首都であるだけでなく、日本を代表する都市でもあります。東京には、世界的な企業や政府機関、文化施設、観光スポットなどがあります。
テストケース 2: 1個70円のりんごと1個30円のみかんを握り潰したら、合計いくら損しますか?
Setting pad_token_id to eos_token_id:2 for open-end generation.
アシスタント: 合計70円損します。
理由:りんごの損失は70円、みかんは30円なので、合計70円です。
テストケース 3: AIが人間を超える日は来ると思いますか?
Setting pad_token_id to eos_token_id:2 for open-end generation.
アシスタント: 答えは来ると思います。
AI(人工知能)は、人間の脳の機能である「学習」「推論」「認識」などの機能をコンピュータ上で再現することを目的とした技術です。近年、AIの開発は急速に進み、自動運転車、翻訳アプリ、画像認識など、さまざまな分野でAIが利用されています。
AIが人間を超える日が来るのかどうかについては、意見が分かれるところですが、AIの研究者は、AIが人間を超える日が来ると予測しています。
AIが人間を超える日が来ると予測する理由は、AIが学習することで、人間の脳の機能を超えるような処理をすることができるようになることがあります。また、AIが人間を超える日が来ると予測する理由には、AIが膨大なデータを処理することができ、人間の脳の処理能力を超えることが挙げられます。
AIが人間を超える日が来ると予測する理由は、AIが人間の脳
テストケース 4: こんにちは!最近の趣味は何?
Setting pad_token_id to eos_token_id:2 for open-end generation.
アシスタント: 旅行に行くのも趣味の一つなので、国内、海外問わず、さまざまな場所を旅しています。最近は、自然豊かな場所や歴史的な場所を旅することが多いです。
テストケース 5: 富士山が世界遺産に登録された年は?
アシスタント: 2013年
これは結構凄い。
計算苦手なのはGrokAIやGemini、ChatGPTでも同じだから良いとして、それ以外は意味を理解して、それなりの返答はしているように感じる。
RakutenAI-7B-ChatでRAGを試してみる
RakutenAIが偉かったので、再度PDFを読み込ませて答えを確認してみる。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
# 必要なライブラリをインストール !pip install transformers torch bitsandbytes sentence-transformers faiss-cpu pdfplumber import torch import os from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig from sentence_transformers import SentenceTransformer import faiss import numpy as np import pdfplumber from pathlib import Path class SimpleRAG: def __init__(self): print("モデル読み込み中...") self.embedder = SentenceTransformer('intfloat/multilingual-e5-base') model_name = "Rakuten/RakutenAI-7B-Chat" quantization_config = BitsAndBytesConfig(load_in_4bit=True) self.tokenizer = AutoTokenizer.from_pretrained(model_name) self.model = AutoModelForCausalLM.from_pretrained( model_name, quantization_config=quantization_config, device_map="auto", torch_dtype=torch.float16 ) if self.tokenizer.pad_token is None: self.tokenizer.pad_token = self.tokenizer.eos_token self.documents = [] self.index = None print("準備完了!") def load_pdfs_from_folder(self, folder_path): """PDFフォルダを読み込んでインデックス化""" folder = Path(folder_path) pdf_files = list(folder.glob('*.pdf')) if not pdf_files: print("PDFが見つかりません") return all_texts = [] for pdf_file in pdf_files: print(f"読み込み中: {pdf_file.name}") with pdfplumber.open(pdf_file) as pdf: for page in pdf.pages: text = page.extract_text() if text: chunks = [text[i:i+500] for i in range(0, len(text), 400)] all_texts.extend(chunks) print(f"インデックス作成中... {len(all_texts)}チャンク") embeddings = self.embedder.encode(all_texts, show_progress_bar=True) self.documents = all_texts self.index = faiss.IndexFlatL2(embeddings.shape[1]) self.index.add(embeddings.astype('float32')) print("完了!") def ask(self, question): """質問に回答""" if not self.index: return "PDFを先に読み込んでください" query_vec = self.embedder.encode([question]) distances, indices = self.index.search(query_vec.astype('float32'), 3) context = "\n".join([self.documents[idx] for idx in indices[0]]) prompt = f"参考情報:\n{context}\n\n質問: {question}\n回答:" inputs = self.tokenizer(prompt, return_tensors="pt", truncation=True, max_length=1500).to("cuda" if torch.cuda.is_available() else "cpu") outputs = self.model.generate(**inputs, max_new_tokens=200, temperature=0.7) answer = self.tokenizer.decode(outputs[0], skip_special_tokens=True) return answer.split("回答:")[-1].strip() # GPU環境チェック if not torch.cuda.is_available(): print("警告: GPUが利用できません。T4 GPUランタイムを選択してください。") # Google Driveマウント from google.colab import drive drive.mount('/content/drive') # SimpleRAG初期化と処理(すべてGPUで実行) rag = SimpleRAG() folder_path = '/content/drive/MyDrive/rag_documents' pdf_files = [f for f in os.listdir(folder_path) if f.lower().endswith('.pdf')] if not pdf_files: print("エラー: PDFが見つかりません。フォルダを再確認してください。") else: print(f"発見したPDF: {pdf_files}") rag.load_pdfs_from_folder(folder_path) print("読み込み成功!") # 質問実行 answer = rag.ask("つるかめ算を使った問題はどの中学校の何年入試に出題されているか?具体的な問題内容も教えて") print("回答:", answer) |
回答: つるかめ算で、物体を動かす力を入れる部分は、物体の力点と呼ばれる部分です。
www
全然駄目ww
おわりに
RAG、実装は簡単。しかし、精度向上は「茨の道」
と言われる。素人が適当に作って良いものは作れない。

ただ、将来 エッジAIが発達すれば、オフラインでドラえもんが生まれるのは時間の問題。
癒やしや介護、エンタメから学習まで用途は幅広いのは間違いない。
技術者としてトレンドフォローは大事。



