こんにちは!神楽朔です
近年、爆発的に進化している「生成AI(Generative AI)」は、学習や開発のスタイルを大きく変えようとしています。この連載では、難しそうなイメージのあるLLM(大規模言語モデル)を、実際に自分の手で動かし、仕組みを理解し、活用できるようになることを目指します。
第1部では、環境構築から始め、軽量なLLMを使ってシンプルな自作チャットボットを動かすところまでを目標にします。難しいモデルの学習はしません。まずは「動かす」ことに焦点を当て、生成AIをローカルで動かす達成感を体感しましょう。
1. なぜ自分で動かすのか?
ChatGPTなどのサービスを使うだけでなく、自分でモデルを動かすことには大きな意味があります。
- 知識の定着: ライブラリの役割や、モデルの入出力の仕組みを深く理解できます。
- カスタマイズ: 最終的に、自分の研究やプロジェクトに必要な機能(例:独自の専門知識で回答させる)を追加できるようになります。
- 実践的なスキル: LLMの導入や運用は、将来のエンジニアリングの現場で求められる重要なスキルです。
2. 環境構築と必要なライブラリの準備
今回は、LLMを扱う上でデファクトスタンダードとなっているPythonのライブラリ、Hugging Face transformers を使用します。
2.1 Python仮想環境の構築
まず、プロジェクトごとに環境を分けるために仮想環境を構築しましょう。ここでは venv を使用します。
# プロジェクトフォルダを作成
mkdir llm_intro
cd llm_intro
# 仮想環境を作成
python -m venv venv
# 仮想環境をアクティベート (Windowsの場合)
.\venv\Scripts\activate
# 仮想環境をアクティベート (macOS/Linuxの場合)
source venv/bin/activate
2.2 ライブラリのインストール
transformers と、その動作に必要な依存ライブラリをインストールします。
pip install torch transformers accelerate
-
torch: PyTorchという、AI開発で最も使われるフレームワークです。 -
transformers: Hugging Faceが提供する、様々なLLMを簡単に扱えるようにするライブラリです。 -
accelerate: モデルの計算を効率化するためのライブラリです。
3. 軽量モデルの選択と実行
今回は、個人PCでも比較的動作させやすい「Small LLM (SLM)」の中から、人気の高いモデルを選びます。
3.1 実行コード
以下のPythonコードを chatbot.py として保存し、実行してください。このコードは、Hugging Faceからモデルとトークナイザーをダウンロードし、入力したテキストに対する回答を生成します。
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
# 使用するモデルの名前を指定 (ここではPhi-3-miniの軽量版を使用)
model_name = "microsoft/Phi-3-mini-4k-instruct"
# トークナイザーとモデルをロード
# トークナイザー: テキストをAIが理解できる数値(ID)に変換する役割
tokenizer = AutoTokenizer.from_pretrained(model_name)
# モデル: 実際にテキストを生成する本体
# GPUが利用可能であれば自動で利用するように設定
model = AutoModelForCausalLM.from_pretrained(
model_name,
device_map="auto",
torch_dtype=torch.bfloat16 # メモリ効率の良いデータ型を使用
)
print(f"モデル {model_name} のロードが完了しました。")
# ユーザーからの入力処理を行う関数
def generate_response(prompt: str) -> str:
# ユーザーのプロンプトをモデルの入力形式に変換 (Phi-3の場合の形式)
messages = [
{"role": "user", "content": prompt}
]
# 入力テキストをトークンIDに変換
input_ids = tokenizer.apply_chat_template(
messages,
tokenize=True,
add_generation_prompt=True,
return_tensors="pt"
).to(model.device) # モデルと同じデバイスに移動
# テキストを生成
with torch.no_grad(): # 推論時は勾配計算を無効化し、メモリを節約
outputs = model.generate(
input_ids=input_ids,
max_new_tokens=256, # 最大生成トークン数を制限
do_sample=True, # ランダム性を持たせる
temperature=0.7, # 応答の多様性を調整
pad_token_id=tokenizer.eos_token_id # パディングトークンを指定
)
# 生成されたトークンIDをテキストに戻す
response = tokenizer.decode(outputs[0], skip_special_tokens=True)
# モデルの応答のみを抽出 (プロンプトとシステムの応答を削除)
# Phi-3の出力形式に合わせて応答を抽出
try:
return response.split("<|assistant|>")[1].strip()
except IndexError:
return response.strip()
# メインループ
if __name__ == "__main__":
print("--- チャットボット開始 ---")
print("終了するには 'exit' と入力してください。")
while True:
user_input = input("あなた: ")
if user_input.lower() == 'exit':
break
# 質問が高専生らしいものになるようにプロンプトを工夫
prompt = f"あなたは高専生に技術を教える専門家です。以下の質問に回答してください。\n質問: {user_input}"
response = generate_response(prompt)
print(f"AI: {response}")
print("--- チャットボット終了 ---")
3.2 実行と結果
ターミナルで以下のコマンドを実行します。
python chatbot.py
初回実行時はモデルのダウンロードに時間がかかりますが、ダウンロードが完了すると、チャットループが開始されます。
実行例
あなた: コサイン類似度って情報処理でどう使うの? AI: コサイン類似度は、ベクトル化されたデータ同士の「向き」がどれだけ似ているかを測る指標で、情報処理では主に検索システムで使われます。たとえば、RAG(検索拡張生成)という技術では、質問文と文書をベクトル化し、コサイン類似度が高い文書を検索して、LLMに参照させることでより正確な回答を生成します。
4. まとめと次のステップ
今回は、大規模言語モデルを自分のPC上で動かし、シンプルなチャットボットを実装することができました。
動かすことができたモデルは、まだ「知識」が最新ではないかもしれませんし、あなたの質問に最適な「回答スタイル」ではないかもしれません。
第2部では、このモデルを 「自分だけのLLM」 にするため、質問の仕方(プロンプトエンジニアリング)を極める方法を解説します。
[次回予告]
生成AI入門【第2部】:レポート作成からコーディングまで!「プロンプトエンジニアリング」実践編