TechCraft – エンジニアのためのスキルアップメモ

エンジニアのスキルアップを少しでも加速する技術ブログ

LLMのファインチューニングとRAG(Retrieval-Augmented Generation)

LLMのファインチューニングとRAG(Retrieval-Augmented Generation)

1. はじめに

近年、大規模言語モデル(LLM)が急速に発展し、様々な分野で活用されています。しかし、LLMは学習済みのデータに依存するため、新しい情報を即座に反映できない という課題があります。この問題を解決する方法として ファインチューニングRAG(Retrieval-Augmented Generation) があります。

本記事では、LLMのファインチューニングとRAGの仕組みや実装方法 について詳しく解説します。

2. LLMのファインチューニングとは?

LLMは事前学習済みのモデル(GPT, LLaMA, Falcon など)を使うことが一般的ですが、特定のドメインに適用するためにはカスタマイズが必要 です。これを ファインチューニング(Fine-tuning) と呼びます。

2.1 ファインチューニングの種類

ファインチューニング手法 特徴 メリット
フルファインチューニング モデル全体を学習 高精度だが計算コストが高い
LoRA(Low-Rank Adaptation) 特定の層のみを学習 メモリ効率が良く軽量
Prefix Tuning 特定のプレフィックスを調整 元のモデルを変更せず適用可能

2.2 ファインチューニングの実装

Hugging Faceの transformers ライブラリを使って、GPT-2をファインチューニングする方法を紹介します。

① 必要なライブラリのインストール

pip install torch transformers datasets accelerate

② データセットの準備(Hugging Face Datasets)

from datasets import load_dataset

dataset = load_dataset("wikitext", "wikitext-2-raw-v1")
print(dataset["train"][0])

③ モデルのロードとファインチューニング

from transformers import AutoModelForCausalLM, AutoTokenizer, Trainer, TrainingArguments

model_name = "gpt2"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)

# データのトークナイズ
def tokenize_function(examples):
    return tokenizer(examples["text"], truncation=True, padding="max_length", max_length=128)

tokenized_datasets = dataset.map(tokenize_function, batched=True)

# 訓練パラメータ
training_args = TrainingArguments(
    output_dir="./fine_tuned_model",
    per_device_train_batch_size=4,
    num_train_epochs=3,
    save_strategy="epoch"
)

trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=tokenized_datasets["train"]
)

# 学習の実行
trainer.train()

この方法で、GPT-2を独自データでファインチューニングできます。


3. RAG(Retrieval-Augmented Generation)とは?

3.1 RAGの仕組み

RAG(Retrieval-Augmented Generation) とは、外部データを検索(Retrieval)して参照しながらテキストを生成(Generation)する手法 です。
通常のLLMは固定された知識に基づいて回答しますが、RAGは最新情報を検索して回答の精度を向上させる ことができます。

RAGの動作フロー: 1. クエリ入力(ユーザーの質問) 2. 情報検索検索エンジンやベクトルデータベースから関連情報を取得) 3. 情報統合(取得した情報をプロンプトに追加) 4. 生成モデルが回答を出力

3.2 RAGのメリット

  • モデルを再学習しなくても新しい情報を取り込める
  • データソースを明示できる(透明性の向上)
  • 少ない学習データで高精度な回答が可能

4. RAGの実装方法

RAGを実装するには、以下のツールを使用します。

  • FAISSFacebook AIが開発した高速なベクトル検索ライブラリ)
  • Hugging Face Transformers(テキスト生成モデル)
  • LangChain(LLMの統合フレームワーク

4.1 必要なライブラリのインストール

pip install faiss-cpu transformers langchain openai

4.2 FAISSを使ったデータベースの作成

まず、テキストデータを ベクトル化 して検索できるようにします。

import faiss
import numpy as np
from sentence_transformers import SentenceTransformer

# 事前学習済みのエンコーダ(テキストをベクトルに変換)
model = SentenceTransformer("all-MiniLM-L6-v2")

# データセット
documents = [
    "Pythonはプログラミング言語です。",
    "機械学習はデータを使った予測モデルです。",
    "FAISSはベクトル検索ライブラリです。"
]

# テキストをベクトル化
vectors = model.encode(documents)
index = faiss.IndexFlatL2(vectors.shape[1])  # L2距離で検索
index.add(np.array(vectors))

# クエリ検索
query = "Pythonとは何か?"
query_vector = model.encode([query])
D, I = index.search(query_vector, k=1)  # 最も近い文を取得

print("検索結果:", documents[I[0][0]])

4.3 RAGによる情報検索とテキスト生成

検索した情報をLLMに渡して回答を生成します。

from transformers import pipeline

generator = pipeline("text-generation", model="gpt2")

retrieved_text = documents[I[0][0]]  # 検索結果
prompt = f"参考情報: {retrieved_text}\n\n質問: Pythonとは何か?\n回答:"

output = generator(prompt, max_length=50)
print(output[0]["generated_text"])

このように、RAGを使うことで外部データを活用しながら正確な回答を生成 できます。


5. まとめ

本記事では、LLMのファインチューニングとRAGについて詳しく解説しました。

🔹 ファインチューニング

  • 事前学習モデルを独自データで学習
  • フルチューニング / LoRA / Prefix Tuning などの手法がある
  • 高精度な回答が可能だが、学習コストがかかる

🔹 RAG

  • 外部データを検索しながら回答を生成
  • 最新情報を取り込めるため、リアルタイム性が高い
  • モデルの再学習が不要で、メモリ効率が良い

現在のLLMの課題(知識の固定化)を解決するには、ファインチューニングとRAGを組み合わせるのが最適 です。ぜひ、自分のユースケースに応じた手法を試してみてください!


6. 参考文献