エンジニア視点の「LLMのきほん」

## はじめに

最近、ChatGPTやClaudeの話を耳にしない日はないくらい、AIが身近になってきました。その中核となっているのが「**LLM（Large Language Model）**」という技術です。

今更ではありますが、エンジニアの視点からLLMの基本を理解し、実際に使えるようになることを目指して書いてみました。

## LLMってどんなもの？

### AIの世界での位置づけ

LLMは「Large Language Model（大規模言語モデル）」の略で、膨大な量のテキストデータを学習することで、人間のような自然な文章の理解や生成ができるようになったAIモデルです。

従来の機械学習モデルと比べて、以下のような特徴があります。

- タスクごとの個別学習が不要
- 柔軟な文章理解と生成が可能
- プロンプト（指示）による多様なタスクへの対応
- 文脈を考慮した応答が可能

### なぜ今注目されているの？

1. **性能の飛躍的な向上**：GPT-3以降、モデルの大規模化により実用的な性能を実現
2. **使いやすいAPI**：OpenAIなどが提供する使いやすいAPIの登場
3. **実用的なアプリケーション**：ChatGPTに代表される便利なサービスの普及
4. **オープンソース化の進展**：LLaMAなどのオープンモデルの登場

## LLMの中身をのぞいてみよう

### 基本的な仕組み

LLMの核となる技術は「**Transformer**」というアーキテクチャです。これは、文章の前後関係（文脈）を効率的に処理できる仕組みを持っています。

簡単に言うと・・
1. 入力された文章をトークン（単語や文字の単位）に分割
2. 各トークンの関係性を計算
3. 文脈を考慮して次のトークンを予測
4. この予測を繰り返して文章を生成

### 主なLLMの種類

| モデル名 | 提供元 | 特徴 |
|---------|--------|------|
| GPT-4 | OpenAI | 最も高性能な商用モデル |
| Claude | Anthropic | 長文処理が得意 |
| LLaMA | Meta | オープンソースの代表格 |
| PaLM | Google | Googleの主力モデル |

## どうやって動いているの？

### Transformerの基本構造

Transformerは「Self-Attention」という仕組みを使って、文章中の単語同士の関係性を学習します。

```python:python
# 簡略化したSelf-Attentionの例
def self_attention(query, key, value):
    attention_weights = softmax(query @ key.transpose())
    return attention_weights @ value
```

### トークン化の仕組み

LLMは文章を「トークン」という単位に分割して処理します。

```python:python
from transformers import GPT2Tokenizer

tokenizer = GPT2Tokenizer.from_pretrained('gpt2')
text = "Hello, World!"
tokens = tokenizer.encode(text)
print(tokens)  # [15496, 11, 995, 0]
```

## 実際に使ってみよう

### OpenAI APIの基本

```python:python
import openai

openai.api_key = 'your-api-key'

def get_completion(prompt):
    response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        messages=[{"role": "user", "content": prompt}]
    )
    return response.choices[0].message.content

# 使用例
prompt = "Pythonでバブルソートを実装してください。"
result = get_completion(prompt)
print(result)
```

### 効果的なプロンプトの書き方

良いプロンプトの特徴：
- 具体的な指示
- 期待する出力形式の明示
- 必要な制約条件の提示
- コンテキストの提供

例：
```plaintext
以下の条件でPythonコードを生成してください：
- 機能：CSVファイルの読み込みと集計
- 入力：sales.csv（列：date, amount, category）
- 出力：カテゴリごとの合計金額
- エラー処理を含める
- コメントを日本語で書く
```

## コードを書いてみよう

### 基本的なチャットボットの実装

```python:python
import openai
from typing import List, Dict

class SimpleBot:
    def __init__(self, api_key: str):
        openai.api_key = api_key
        self.messages: List[Dict[str, str]] = []
    
    def chat(self, user_input: str) -> str:
        # メッセージ履歴に追加
        self.messages.append({"role": "user", "content": user_input})
        
        try:
            # APIリクエスト
            response = openai.ChatCompletion.create(
                model="gpt-3.5-turbo",
                messages=self.messages
            )
            
            # 応答を取得
            bot_response = response.choices[0].message.content
            
            # 応答をメッセージ履歴に追加
            self.messages.append({"role": "assistant", "content": bot_response})
            
            return bot_response
            
        except Exception as e:
            return f"エラーが発生しました: {str(e)}"
```

## 気をつけるポイント

### セキュリティと料金

1. **APIキーの管理**
   - 環境変数として設定
   - Gitにコミットしない
   - 定期的な更新

2. **コスト管理**
   - トークン数の監視
   - レートリミットの確認
   - 予算の設定

### エラー処理とレートリミット

```python:python
import time
from tenacity import retry, stop_after_attempt, wait_exponential

@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=4, max=10))
def call_api_with_retry(prompt: str) -> str:
    try:
        response = openai.ChatCompletion.create(
            model="gpt-3.5-turbo",
            messages=[{"role": "user", "content": prompt}]
        )
        return response.choices[0].message.content
    except openai.error.RateLimitError:
        time.sleep(20)  # レートリミットの場合は待機
        raise
    except Exception as e:
        print(f"エラー発生: {str(e)}")
        raise
```

## これからどうなる？

### 最新トレンド

1. **モデルの小型化**
   - 効率的な学習手法の開発
   - エッジデバイスでの実行

2. **マルチモーダル化**
   - テキスト以外の情報処理
   - 画像・音声との統合

3. **ファインチューニングの発展**
   - 特定タスクへの最適化
   - 個別ニーズへの対応

### 学習リソース

1. **公式ドキュメント**
   - [OpenAI API Documentation](https://platform.openai.com/docs/)
   - [Hugging Face Documentation](https://huggingface.co/docs)

2. **チュートリアル**
   - [OpenAI Cookbook](https://github.com/openai/openai-cookbook)
   - [Hugging Face Course](https://huggingface.co/course)

## まとめ

LLMは急速に発展している技術分野で、基本を押さえておくことで様々な可能性が広がります。この記事で紹介した内容を起点に、実際に手を動かしながら理解を深めていってください。

また、この分野は日々進化していますので、常に最新の情報をキャッチアップすることをお勧めします。

## 参考文献

1. "Attention Is All You Need" (Transformer論文)
2. OpenAI GPT-4 Technical Report
3. "Language Models are Few-Shot Learners" (GPT-3論文)