即戦力化　ディープラーニング実習（第二週）

# 【第2週】テキスト生成（txt2txt）

講義目録：<a href="https://qiita.com/takenakayoichi/items/3b7435f4b155a181e39f">即戦力化　ディープラーニング実習 </a>

## はじめに

第二週では、事前学習済みの日本語LLM（大規模言語モデル）を使って、**文章の続きを自動生成**する技術を体験します。
これは、いわゆる「txt2txt（テキストからテキストへ）変換」の一例です。たとえば：

- 「昔話の冒頭」を与えて続きを生成する
- 「質問」を与えて回答を生成する
- 「命令文」を与えて、その指示に従ったテキストを生成する

このように、入力テキストを元に、新たなテキストを出力するプロセスを **txt2txt** と呼びます。

テキスト生成には主に以下の2つの方法があります：

- **プロンプト形式**：1つの文や段落を渡し、その続きを生成する
- **メッセージ形式**：会話の履歴を構造化して渡し、AIが自然な応答を行う──(ChatGPTのような形式)

今回は、Hugging Face上の日本語対応モデル [`owner203/japanese-llama-3.1-8b-instruct-2`](https://huggingface.co/owner203/japanese-llama-3.1-8b-instruct-2) を使って、これらの実習を行います。

<a href="https://colab.research.google.com/drive/1j7AtL5sAuEEciSA8uoBlVdg7fD-RQLmT?usp=sharing">今週のコード </a>

---

## 1. 実習の目的

- Hugging FaceのLLMをGoogle Colabで動かす
- プロンプト形式とメッセージ形式、両方でテキスト生成する
- パラメータによって出力がどう変わるか体験する
- インストラクションチューニングモデルとは
- 実行できないサイズの最新モデルを知る
---

## 2.モデルについて

今回使用するのは  [`owner203/japanese-llama-3.1-8b-instruct-2`](https://huggingface.co/owner203/japanese-llama-3.1-8b-instruct-2) です。
これは **MetaのLLaMA 3.1** をベースとした、**日本語特化**の**指示応答**（instruction-tuned）モデルになります。

### 🔍 Hugging Faceのモデル名の読み方
モデルは以下のような構造の名前で登録されています

```
[ユーザ名またはチーム名]/[モデル名]
```

今回使う [`owner203/japanese-llama-3.1-8b-instruct-2`](https://huggingface.co/owner203/japanese-llama-3.1-8b-instruct-2) は、
- owner203 がユーザ名
- japanese-llama-3.1-8b-instruct-2　がモデル名
となっています。

## 2. Google Colab でモデルを読み込む（※約7分かかります）

それでは早速、大規模言語モデルを google colabに読み込んでみましょう。

まずは、google colabで **ランタイム**のタイプを**T4 GPU** に変更してください。
その後、次のコード実行しましょう。

```python
!pip install -q transformers accelerate

from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline
import torch

# モデル名
model_id = "owner203/japanese-llama-3.1-8b-instruct-2"

# トークナイザーとモデルの読み込み
tokenizer = AutoTokenizer.from_pretrained(model_id, use_fast=False)
model = AutoModelForCausalLM.from_pretrained(model_id, device_map="auto", torch_dtype=torch.float16)

# 実行完了まで約7分 (2025年3月29日時点)
```

いろいろとダウンロードが必要となるため、時間がかかります。
コーヒーを飲んでリラックスをしつつ、コードを眺めてみてください。

**トークナイザ**というコメントは見つかりましたか？

この時間を使って、トークナイザを説明します。

###  トークナイザとは？

トークナイザ（Tokenizer）は、文章を モデルが処理できる単位（トークン）に変換するための仕組みです。

英語のようにスペースで単語が区切られている言語では比較的簡単に単語分割が可能です。
しかし、日本語のように単語境界が明示されていない言語では、文脈に基づいて適切に単語を認識・分割する必要があります。

たとえば「私は学校に行きます。」という文では、

「私」「は」「学校」「に」「行き」「ます」「。」

のように意味的な単位（=単語）に分割される必要があります。これを機械的に行うのがトークナイザの役割です。

また、モデルが出力するトークン列を元の日本語に復元する際も、このトークナイザが使われます。

例えるならば、トークナイザーは 入力と出力を“モデル用の言語”と“人間の言語”の間で変換する**インターフェース** のような存在といえます。


---
## 3. プロンプト形式での生成（txt → txt）

それでは、「昔話の冒頭」を与えて続きを生成してもらいましょう。

「川へ洗濯にいったお爺さん」このお話の続きはどうなるのでしょうか？

続きを作ってもらうためのには次の推論パイプラインを使います。

```python
# 推論パイプラインの作成
generator = pipeline("text-generation", model=model, tokenizer=tokenizer, device_map="auto")

# テスト用のプロンプト
prompt = "昔々、あるところにお爺さんとお婆さんがすんでおったとな。ある日、お爺さんは川へ洗濯に"

# テキスト生成
output = generator(prompt, max_new_tokens=100, do_sample=True, temperature=0.7)
print("生成された文章：\n", output[0]['generated_text'])

# 実行終了まで約1分
```
早速、実行してみましょう。

```
昔々、あるところにお爺さんとお婆さんがすんでおったとな。ある日、お爺さんは川へ洗濯にいった。お婆さんはお爺さんがいない間に、子供を産んだ。
お爺さんは川から帰って来た。するとお婆さんは言った。「お爺さん、子供が生まれた。」
「おばあちゃん、どこで産んだの？」とお爺さんは聞いた。
「川で」とお婆さんは答えた。
するとお爺さんは「おばあちゃん、川で生まれた子供は、川に帰りなさい」と
```

え、お婆さん、子供産んだん？
い、いきなりすぎへん！？　さらに「川に帰りなさい」っていったい何をする気なの！
も、もしかして、桃の中に赤ちゃんを入れて、川に流したりする？


![昔話.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526647/1075af6b-4dac-4372-be57-4bc5f35aaa7e.png)

いやぁ、続きが気になって夜も眠れなくなってしまいそう。

### 実習
ということで実習です。この続きを生成してください。

---
### 実習の答
prompt に続きを生成してほしい文を入れ、もう一度テキスト生成します。

```
prompt = """
昔々、あるところにお爺さんとお婆さんがすんでおったとな。ある日、お爺さんは川へ洗濯にいった。お婆さんはお爺さんがいない間に、子供を産んだ。
お爺さんは川から帰って来た。するとお婆さんは言った。「お爺さん、子供が生まれた。」
「おばあちゃん、どこで産んだの？」とお爺さんは聞いた。
「川で」とお婆さんは答えた。
するとお爺さんは「おばあちゃん、川で生まれた子供は、川に帰りなさい」と
"""

# テキスト生成
output = generator(prompt, max_new_tokens=100, do_sample=True, temperature=0.7)
print("生成された文章：\n", output[0]['generated_text'])
```
実際に行ってみた結果がこちらになります。

![実習１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526647/7f6880d3-9aa6-4847-82e3-4a8184fb252b.png)

なんだか、話がループしています。
最新のChatGPTに比べると、同じ大規模言語モデルでも Llama3.1 ちょっと... な部分がありますね。

でもでも、残念な結果が得られることを知ることも重要なんですよ！

## 4. メッセージ形式での生成（Chat形式）

では、仕切り直して、大規模言語モデルのもう一つの使い方を学びましょう。
それは、質問に対して解答を得るというチャット形式です。

チャット形式は、
- 相手の役割を設定し、
- 質問を投げかける
という二種類の文で構成されています。

下記コードの変数**message** を見てくださいね。

```python
# Chat形式のメッセージ
messages = [
    {"role": "system", "content": "あなたは誠実で優秀な日本語のアシスタントです。"},
    {"role": "user", "content": "AIについて高校生向けに簡単に説明してください。"}
]

# メッセージを入力としてテキスト生成
output = generator(messages, max_new_tokens=200, do_sample=True, temperature=0.7)
print("【message形式】生成結果：\n", output[0]["generated_text"])
```
では実行してみましょう。

![chat1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526647/8a513d1e-2574-4c3c-bf74-1aa291864c5b.png)

結果が長すぎて、スクリーンショットでは見れませんね。
次のような文章が生成されました。

```
[{'role': 'system', 'content': 'あなたは誠実で優秀な日本語のアシスタントです。'}, 
{'role': 'user', 'content': 'AIについて高校生向けに簡単に説明してください。'}, 
{'role': 'assistant', 'content': 'AIについて簡単に説明します。

AIとは、人工知能のことです。
コンピューターや機械などが人間のように知能を持ち、
問題を解決したり、学習したり、情報を収集したり、判断を下したりする技術です。

AIは、人間が人間の知能を模倣するために開発されたものです。
AIは、人間が知能を表現する方法として使用することができます。
AIは、さまざまな分野で使用されています。
例えば、人工知能は、医療、交通、教育、ビジネスなどに使用されています。

AIは、人工知能の技術を使用して、人間の行動を模倣することができます。
AIは、人間が人間の行動を模倣するために使用することができます。
AIは、さまざまな分野で使用されています。例'}]
```

うん、言ってることは、まぁ、そうかなと思えるのですが、クドイですねぇ。

### 実習
他の例も試してみてください。

その際、
- 相手の役割設定**だけ**を変更し、
結果がどのように変化するのかも試すと面白いですよ。

## 5. パラメータ

文章を生成する部分のパラメータを見ていきましょう

先ほどのプロンプト形式とメッセージ形式で使ったgeneratorの引数を見てみましょう

```
#プロンプト形式
output = generator(prompt, max_new_tokens=100, do_sample=True, temperature=0.7)
```
```
#メッセージ形式
output = generator(messages, max_new_tokens=200, do_sample=True, temperature=0.7)
```
max_new_tokens, do_sample, temperature という３つの変数がありますね。

このうち２つ、max_new_tokens, temperature の意味について次表にまとめます。

| パラメータ         | 意味                                 | 例                  |
|------------------|------------------------------------|---------------------|
| `max_new_tokens` | 生成する単語数（トークン数）          | 50, 100, 200など    |
| `temperature`    | ランダム性の強さ（小さいと保守的）    | 0.3, 0.7, 1.0, 1.5など |

長―い文を作ってもらいたい場合、`max_new_tokens`の値を大きくします。

創造性の高い文章を作って欲しい場合、`temperature`  の値を大きくします。

とはいっても、特に`temperature` は意味不明かと思います。

私はそのモデルの推奨値を使っていますが、一度は変数値を変更して実行してにるのもいいと思います。

### パラメータ調整の実習
次のパラメータの値を変更した場合の、返答の変化を観察してください。
- `max_new_tokens`
- `temperature` 

---

## 6. インストラクションモデル vs 非インストラクションモデル

今回使用した [`owner203/japanese-llama-3.1-8b-instruct-2`](https://huggingface.co/owner203/japanese-llama-3.1-8b-instruct-2)  は、インストラクションチューニング（instruction-tuning） が施されたモデルです。
これは、単なる言語モデリング（文章の続きを予測）だけではなく、
「命令された内容に従って応答を出す」ことに最適化されています。

一方、インストラクションチューニングされていないモデルは、
「次の単語を予測する」ことに特化しており、
「質問に答える」「要約する」といったタスクには不向きです。

違いの例：

***非インストラクションモデル***

```
Prompt：AIとは何か？
```

→ 予測される出力は意味のある回答にならないことがある

***インストラクションモデル***

```
Message：user: AIとは何か説明してください
```
→ 回答：AIとは、人間のように知的なふるまいをするコンピュータシステムのことです...

プロンプト形式でも使えますが、
メッセージ形式で使うことでより自然な応答を引き出せるのがインストラクションモデルの強みです。



## 7. 他の大規模モデルの紹介

本実習で使用したモデル以外にも、多くの強力な大規模言語モデル（LLM）が公開されています。以下に代表的な例をいくつか紹介します。


| モデル名                                      | 特徴                                | サイズ         |
|----------------------------------------------|-------------------------------------|----------------|
| meta-llama/Llama-3.3-70B-Instruct     | Meta社の最新70B命令応答モデル       | 70B            |
| deepseek-ai/DeepSeek-V3        | DeepSeek社のモデル | 671B            |
| mistralai/Mistral-Small-3.1-24B-Instruct-2503     | 多言語対応・高性能な24Bモデル     | 24B    |

⚠ 注意点：

・Llama-3.3とDeepSeek-V3は非常に高性能なGPU（例：NVIDIA A100）が必要です。
・無料のGoogle Colabではメモリ不足で動作しない可能性が高いため、ここでは紹介のみに留めます。


「最新のトレンドを知っておく」ことは、研究・応用においてとても重要です。将来、より高度なプロジェクトに取り組む際のモデル選定や研究のヒントにしてください。

## 8. まとめ

- LLMによるテキスト生成には **プロンプト形式** と **メッセージ形式** の2種類がある
- メッセージ形式は ChatGPT のような実用AIに適している
- 両形式とも同じモデルで扱えるが、使い分けが大切
- モデルは `owner/model-name` という形式で公開されており、誰が作ったどんなモデルかが分かる

---

## 9. 発展課題

- 「読書感想文を生成」「料理のレシピを生成」など、異なるスタイルのプロンプトで出力を試そう

---

## 次回予告

【第3週】では、テキスト生成の応用として「翻訳と要約」に取り組みます。  

👉 [第3週の記事を読む](https://qiita.com/takenakayoichi/private/096fcb649e0881e36831)