[watsonx.ai] 100億前後のパラメータを持つLLMのプロンプトエンジニアリング:  ①プロンプトフォーマット編

## 1. 背景
LLMを利用する際に、パラメーターが100億前後のモデル、例えばELYZA-japanese-Llama-2-7b(70億)などのように、GPU資源を節約でき出力が速いモデルを利用したいケースがあります。
一方で、これらのモデルはGPT-4(数千億パラメータ以上とも言われている)やClaude3 Opusのような超大規模パラメーター数を持つモデルを利用する際と比べて、理想とする出力を得るためによりプロンプトエンジニアリングが大事となります。
そこで今回はIBMの開発したgranite-8b-japaneseを例にプロンプトエンジニアリングのうち特に重要となるプロンプトの構造、すなわち***プロンプトフォーマット***について考えていきたいと思います。


## 2. granite-8b-japaneseとは
granite-8b-japaneseモデルの概要としては以下になります。
  - IBM Researchによって開発された80億パラメーターのモデル
  - 日本語テキストの処理に特化したモデル
  - インターネット、学術、コード、法務、財務の5つの領域から得たビジネスに関連するデータ・セットで学習
  - 好ましくないコンテンツを除去するための綿密な検査を実施
  - 英語の1.0Tトークン、日本語の0.5Tトークン、コードの0.1Tトークンを使用して事前トレーニング
  - テキスト生成、要約、質問応答、分類、抽出などのタスクへの使用が可能

詳しくはこちらのリンクをご参考ください。
[リリース記事](https://jp.newsroom.ibm.com/2024-02-27-IBM-launches-Granite-Japanese-built-on-trusted-data-to-accelerate-Japanese-clients-adoption-of-generative-AI)
[モデルカード](https://www.ibm.com/docs/en/watsonx-as-a-service?topic=models-granite-8b-japanese-model-card)


## 3. granite-8b-japaneseの利用方法
セットアップは[こちらの記事](https://qiita.com/ironikot/items/a1ff1423c5c2e7c44876#超早い利用方法)、UIの利用方法は[こちらの記事](https://qiita.com/yanagih/items/3d1b081f46799072df80)が参考になります。


## 4. granite-8b-japaneseのプロンプトフォーマット
公式は以下のようなプロンプトフォーマットが推奨されています。
[プロンプト例](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-samples.html?context=wx&locale=ja#sample4e)
```bash:prompt format
以下は、タスクを説明する指示と、文脈のある入力の組み合わせです。要求を適切に満たす応答を書きなさい。

### 指示:
与えられた質問に対して、文脈がある場合はそれも利用し、回答してください。

### 入力:
{your-input}

### 応答:
```
あるいは、英語でも可能です。
```bash:prompt format
Below is a combination of instructions that describe the task and input with context. Write a response that appropriately meets the request.

### Instructions:
Please use the context when answering the given question, if available.

### input:
{your-input}

### Response:
```
- このプロンプトフォーマットは以下の3つのセクションで構成されています。
- 指示(Instructions): AIアシスタントに対するタスクの説明や指示を記述します。
- 入力(Input): ユーザーからの質問や要求、文脈情報などを記述します。
- 応答(Response): AIアシスタントが生成する出力を記述します。

他にも次のようなフォーマットがあります。
```bash:prompt format
### System:
あなたは誠実で優秀なAIアシスタントです。ユーザーの指示に可能な限り正確に従ってください。
### User:
{user input here}
### Assistant:
```
ここではSystemに役割の定義をして。User部分に指示や細かな入力をします。

これらのプロンプトフォーマットを適切に使用することで、AIアシスタントにタスクを明確に伝え、文脈を考慮した適切な応答を生成させることが想定されます。


## 5. プロンプトフォーマットの比較テスト
では実際にプロンプトフォーマットの影響を見てみたいと思います。
まずはプロンプトフォーマットを気にせず出力させます。
ちなみに各種パラメーターについては、デコード方式はgreedyにして実施しています。
パラメーターについて詳しく知りたい方は[こちらの記事](https://qiita.com/r-nakayamasan/items/00a4da02e5b9bcbff2f5)が詳しいです。

```bash:入力
与えられた質問に対して、文脈がある場合はそれも利用し、回答してください。
金利について教えてください。
```

```bash:出力
金利は、お金の使用に対して支払われる費用を指します。銀行やクレジットカード会社などの貸し手は、個人ローンや住宅ローンなどのローン商品を提供する場合があります。これらの貸し手は、ローンを支払う際に顧客に金利を請求します。
金利は、提供された金額（ローン額）に対するパーセンテージとして表されます。たとえば、1,000ドルのローンに年間5％の金利がある場合、年間50ドルの金利を支払う必要があります。
金利は、提供された金額（ローン額）に対するパーセンテージとして表されます。たとえば、1,000ドルのローンに年間5％の金利がある場合、年間50ドルの金利を支払う必要があります。
金利は、提供された金額（ローン額）に対するパーセンテージとして表されます。たとえば、1,000ドルのローンに年間5％の金利がある場合、年間50ドルの金利を支払う必要があります。
金利は、提供された金額（ローン額）に対するパーセンテージとして表されます。
```
このよう出力が繰り返し同じ内容になってしまいます。

次にプロンプトフォーマットを適応した場合で出力させます。

```bash:入力
以下は、タスクを説明する指示と、文脈のある入力の組み合わせです。要求を適切に満たす応答を書きなさい。

### 指示:
与えられた質問に対して、文脈がある場合はそれも利用し、回答してください。

### 入力:
金利について教えてください。

### 応答:
```

```bash:出力
金利は、お金の使用に対して支払われる費用を指します。銀行や会社などの個人または団体が他の人や団体にお金を貸すとき、利益の見込みが低いため、彼らはより高い割合でそれを要求します。これは、ローンまたはクレジットの金額を計算するための重要な要素です。

金利は、固定レートと変動レートの2つのタイプに分けることができます。固定金利は、ローンの全期間にわたって一定の割合を維持しますが、変動金利は市場の状況に応じてその割合を変化させます。

個人ローン、住宅ローン、クレジットカード、ビジネスローンなど、多くの種類のローンまたはクレジットに金利が適用されます。金利は、提供された金額、ローンの期間、借り手の信用リスク、金融市場の条件など、多くの要因に依存します。

金利は単純ではありません。多くの場合、ローンまたはクレジットに適用される合計コストを計算するために、年率（APR）で表されます。APRは、年間金利（通常は日ごと）をローンの年数で除算して計算されます
```
このように、出力が改善されたことが確認できました。

ちなみに、英語のフォーマットでも以下のようになりました。

```bash:入力
Below is a combination of instructions that describe the task and input with context. Write a response that appropriately meets the request.

### Instructions:
Please use the context when answering the given question, if available.

### input:
金利について教えてください。

### Response:
```

```bash:出力
金利は、お金の使用に対して支払われるコストを指します。銀行や企業は、個人や企業にお金を貸し付けることができます。銀行や企業は、他の人や企業にお金を貸すとき、利益を得るために一定の割合で金利を請求します。

ローンに適用される金利は、提供された金額、ローンの期間、借り手の信用リスクなど、いくつかの要因に依存します。低金利は、借り手の総コストを削減するのに役立ちますが、高金利は借り手の財務状況に悪影響を与える可能性があります。

金利は、単利と複利の2つの方法で計算できます。単利は初期資本にのみ適用される金利であり、複利は初期資本とそれに関連する金利に適用される金利です。

金利は、個人ローン、住宅ローン、クレジットカード、ビジネスローンなど、多くの金融商品に関連しています。金融の専門家は、お客様のニーズと状況に基づいて、最も適切な金融商品を選択する際に、金利を理解することが重要であると考えています。
```
100億前後のパラメータを持つLLMを利用する際にぜひこのようなテクニックを試してみてください。


## 補足：ELYZA-japanese-Llama-2-7bのプロンプトフォーマット
プロンプトフォーマットはモデルの種類ごとに違い、例えばELYZA-japanese-Llama-2-7bの場合は以下になります。[参照ドキュメント](https://huggingface.co/elyza/ELYZA-japanese-Llama-2-7b-instruct)
```bash:prompt format

 

あなたは誠実で優秀な日本人のアシスタントです。


クマが海辺に行ってアザラシと友達になり、最終的には家に帰るというプロットの短編小説を書いてください。


```
利用したいモデルがある場合は、まずそのドキュメントを参照し、プロンプトフォーマットを確認してみることをおすすめします。