このシリーズではChatGPTを中心とした最新の大規模言語モデル(LLM)に関する情報をまとめています。最新AI技術を使用した「ChatGPT」をはじめとした、自然言語処理技術の概要や活用方法について紹介しておりますので、ぜひ最後までご覧ください。

※大規模言語モデルは技術の進歩がとても速い分野となりますので、最新の情報もこちらからご確認ください。

今回の記事では日本語LLMの1つであるPhi-3-mediumの実装を紹介します。
Google Colabを使用して簡単に実装できますので、ぜひ最後までご覧ください。

概要

Phi-3の概要

Phi-3モデルはMicrosoftが開発した小型で高性能な言語モデルおよびマルチモーダルモデルのファミリーです。Phi-3モデルは、同等のサイズや次に大きいサイズのモデルを言語、推論、コーディング、数学などの様々なタスクで上回る性能を示しています。
現在、Phi-3ファミリーには4つのモデルがあります。Phi-3-visionは言語と画像の両方を扱える4.2Bパラメータのマルチモーダルモデルです。Phi-3-miniは3.8Bパラメータ、Phi-3-smallは7Bパラメータ、Phi-3-mediumは14Bパラメータの言語モデルで、それぞれ異なるコンテキスト長のバリエーションがあります。
これらのモデルは高品質のデータを用いて学習され、Microsoftの責任あるAI、安全性、セキュリティの基準に従って開発されています。また、様々なハードウェアで最適化されており、モバイルやウェブでのデプロイを含む幅広いデバイスやプラットフォームをサポートしています。
Phi-3モデルは、コンテンツ作成、要約、質問応答、感情分析といった言語の理解と生成のタスクから、分析的なタスクまで、様々な用途に適しています。特にPhi-3-visionは、画像とテキストの両方を扱うタスクに優れた性能を発揮します。

Phi-3-mediumの概要

Phi-3-mediumは、Microsoftによって開発された強力な言語モデルです。14Bのパラメータを持ち、言語理解や生成、推論、コーディング、数学などの幅広いタスクにおいて優れた性能を発揮します。従来の同サイズのモデルやそれ以上に大きなモデルと比較しても、Phi-3-mediumは非常に高い能力を示しています。例えば、Phi-3-mediumはGemini 1.0 Proよりも優れた結果を出しています。
Phi-3-mediumは、高品質のトレーニングデータを使用し、Microsoftの責任あるAI基準に従って開発されています。安全性の評価や検証、レッドチーミング、機密情報の取り扱いレビューなどを経て、安全に利用できるよう整備されたモデルとなっています。
Phi-3-mediumは比較的小さなモデルでありながら、長い文脈を扱うことができ、ドキュメントや Webページ、コードなど大量のテキストコンテンツを読み込んで推論することが可能です。コンテンツ作成、要約、質問応答、感情分析など、様々な言語理解と生成のタスクに適しています。また、分析的なタスクにも強い論理的能力を発揮します。
Phi-3-mediumは、Azure AI StudioやAzure OpenAI Serviceを通じて利用可能であり、開発者は容易にアプリケーションに組み込むことができます。

実装

ここからはGoogle colabを使用して実装していきます。
(Google colabの使用方法はこちら⇨使い方

必要なライブラリをインストールします。

!pip install -U transformers accelerate

質問応答

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline

torch.random.manual_seed(0)
model_id = "microsoft/Phi-3-medium-128k-instruct"
model = AutoModelForCausalLM.from_pretrained(
    model_id,
    device_map="cuda", 
    torch_dtype="auto", 
    trust_remote_code=True, 
)
tokenizer = AutoTokenizer.from_pretrained(model_id)

pipe = pipeline(
    "text-generation",
    model=model,
    tokenizer=tokenizer,
)

generation_args = {
    "max_new_tokens": 1000,
    "return_full_text": False,
    "temperature": 0.3,
    "do_sample": True,
}


messages = [
    {"role": "system", "content": "あなたは有益なアシスタントです。ユーザーに倫理的かつ正確な情報を提供してください。"},
    {"role": "user", "content": "日本一高い山について解説してください。"},]

output = pipe(messages, **generation_args)
print(output[0]['generated_text'])

実行結果:

 日本一高い山は富士山(ふじさん)です。富士山は標高3,776メートルで、日本の山々の中で最も高い地点です。
富士山は静岡県と山梨県の県境に位置しており、その美しい円錐形の山容は日本を代表する象徴的な存在です。
富士山は活火山であり、最後の噴火は1707年の宝永噴火でした。しかし、現在は休火山として知られています。
富士山はその美しさと神聖さから、古くから信仰の対象とされてきました。
また、多くの文学作品や芸術作品にも登場し、日本の文化に大きな影響を与えています。
富士山は国内外から多くの登山者や観光客を魅了しており、登山シーズンには多くの人々がこの山に挑戦しています。
また、富士山はユネスコの世界文化遺産にも登録されており、その歴史的・文化的価値が認められています。
富士山は日本の自然の美しさを象徴する存在であり、日本の文化や歴史において重要な役割を果たしてきました。今後も多くの人々に愛され続けることでしょう。

要約

messages= [
    {"role": "system", "content": "あなたは有益なアシスタントです。ユーザーに倫理的かつ正確な情報を提供してください。"},
    {"role": "user", "content": """
    以下の文章を箇条書きで要約してください。

日本一高い山は富士山(ふじさん)です。富士山は標高3,776メートルで、日本の山々の中で最も高い地点です。
富士山は静岡県と山梨県の県境に位置しており、その美しい円錐形の山容は日本を代表する象徴的な存在です。
富士山は活火山であり、最後の噴火は1707年の宝永噴火でした。しかし、現在は休火山として知られています。
富士山はその美しさと神聖さから、古くから信仰の対象とされてきました。
また、多くの文学作品や芸術作品にも登場し、日本の文化に大きな影響を与えています。
富士山は国内外から多くの登山者や観光客を魅了しており、登山シーズンには多くの人々がこの山に挑戦しています。
また、富士山はユネスコの世界文化遺産にも登録されており、その歴史的・文化的価値が認められています。
富士山は日本の自然の美しさを象徴する存在であり、日本の文化や歴史において重要な役割を果たしてきました。
今後も多くの人々に愛され続けることでしょう。
    """},
]

実行結果:

 - 日本一高い山は富士山(標高3,776メートル)。
- 静岡県と山梨県の県境に位置している。
- 美しい円錐形の山容は日本を代表する象徴的な存在。
- 活火山であり、最後の噴火は1707年の宝永噴火。
- 古くから信仰の対象とされ、多くの文学作品や芸術作品に登場している。
- 国内外から多くの登山者や観光客を魅了している。
- ユネスコの世界文化遺産に登録されており、歴史的・文化的価値が認められている。
- 日本の自然の美しさを象徴する存在であり、日本の文化や歴史において重要な役割を果たしてきた。
- 今後も多くの人々に愛され続けることでしょう。

翻訳(日本語→英語)

messages= [
    {"role": "system", "content": "あなたは有益なアシスタントです。ユーザーに倫理的かつ正確な情報を提供してください。"},
    {"role": "user", "content": """

    以下の文章を日本語から英語に翻訳してください。

    日本で一番高い山は富士山です。富士山は山梨県と静岡県の境目にある活火山で、標高は3,776メートルです。
    日本最高峰だけではなく世界的にも有名な活火山で、「日本の象徴」とも言われています。

    """
    },
]

実行結果:

 The highest mountain in Japan is Mount Fuji. Mount Fuji is an active volcano located on the border of Yamanashi and Shizuoka prefectures, with a height of 3,776 meters.
Not only the highest peak in Japan but also a famous active volcano worldwide, it is often referred to as "the symbol of Japan."

翻訳(英語→日本語)

messages= [
    {"role": "system", "content": "あなたは有益なアシスタントです。ユーザーに倫理的かつ正確な情報を提供してください。"},
    {"role": "user", "content": """英語から日本語に翻訳してください。

    The highest mountain in Japan is Mount Fuji.
    Mount Fuji is located at the boundary of Yamanashi and Shizuoka prefectures in Japan,
    and it has an elevation of 3776 meters above sea level.
    It is one of the active volcanos that are well known around the world as a symbol of Japan.

"""},
]

実行結果:

 日本で一番高い山は富士山です。
富士山は山梨県と静岡県の県境に位置しており、海抜3776メートルです。
それは世界中で広く知られる日本を象徴するような活火山の一つです。

感情分析

messages= [
    {"role": "system", "content": "あなたは有益なアシスタントです。ユーザーに倫理的かつ正確な情報を提供してください。"},
    {"role": "user", "content":  """

    次の文章の感情を、ポジティブ、ネガティブ、ニュートラルに分類してください。
    ・富士山の頂上からの眺めは息をのむほど美しかった。
    ・富士山登山中に怪我をして、下山するのが大変だった。
    ・富士山は日本の最高峰で、標高は3,776mである。

    """},
]

output = pipe(messages, **generation_args)
print(output[0]['generated_text'])

実行結果:

 1. 「富士山の頂上からの眺めは息をのむほど美しかった。」 - ポジティブ
2. 「富士山登山中に怪我をして、下山するのが大変だった。」 - ネガティブ
3. 「富士山は日本の最高峰で、標高は3,776mである。」 - ニュートラル

固有表現抽出

messages= [
    {"role": "system", "content": "あなたは有益なアシスタントです。ユーザーに倫理的かつ正確な情報を提供してください。"},
    {"role": "user", "content": """

    次の文章中から、地名、人名、組織名を抽出してください。
    文章:鈴木次郎は、静岡県にある富士山の麓で開催された、環境省主催の自然保護イベントに参加した。

    """},
]

output = pipe(messages, **generation_args)
print(output[0]['generated_text'])

実行結果:

 地名: 静岡県、富士山の麓

    人名: 鈴木次郎

    組織名: 環境省

論理推論

messages= [
    {"role": "system", "content": "あなたは有益なアシスタントです。ユーザーに倫理的かつ正確な情報を提供してください。"},
    {"role": "user", "content": """

    次の文章が論理的に正しいかどうかを判定し、正しくない場合は理由を説明してください。
    文章:富士山は日本で最も標高が高い山です。エベレストは世界で最も高い山です。したがって、富士山はエベレストよりも高いはずです。

    """},
]


output = pipe(messages, **generation_args)
print(output[0]['generated_text'])

実行結果:

 この文章は論理的に正しくありません。富士山は日本で最も標高が高い山であり、世界で最も標高が高い山ではありません。エベレストは世界で最も標高が高い山です。したがって、富士山はエベレストよりも標高が低いのです。

計算・数学問題

messages= [
    {"role": "system", "content": "あなたは有益なアシスタントです。ユーザーに倫理的かつ正確な情報を提供してください。"},
    {"role": "user", "content": """

    富士山の標高は3,776mです。
    山頂までの距離が30kmだとします。
    平均斜度(パーセント)を求めてください。

    """
    },
]

output = pipe(messages, **generation_args)
print(output[0]['generated_text'])

実行結果:

富士山の平均斜度を求めるには、標高の差と距離の差を使用して、斜面の勾配を計算します。


標高の差は3,776mで、距離の差は30kmです。まず、距離をメートルに換算します。

30km = 30,000m


次に、斜面の勾配を計算します。

勾配 = (標高の差 / 距離の差) * 100%

勾配 = (3,776m / 30,000m) * 100%

勾配 = 0.1258666667 * 100%

勾配 = 12.58666667%


したがって、富士山の平均斜度は約12.59%です。

プログラミング・コーディング

messages= [
    {"role": "system", "content": "あなたは有益なアシスタントです。ユーザーに倫理的かつ正確な情報を提供してください。"},
    {"role": "user", "content": """
    富士山の標高をメートルで入力すると、フィートに変換して出力するPythonプログラムを作成してください

    """
    },
]

output = pipe(messages, **generation_args)
print(output[0]['generated_text'])

実行結果:

 ```python

# 富士山の標高をメートルで入力

height_meters = float(input("富士山の標高(メートル)を入力してください: "))


# メートルからフィートへの変換

height_feet = height_meters * 3.28084


# 結果を出力

print(f"富士山の標高は{height_feet:.2f}フィートです。")

```


このプログラムはユーザーに富士山の標高をメートルで入力するように求め、その値をフィートに変換して出力します。

文章校正

messages= [
    {"role": "system", "content": "あなたは有益なアシスタントです。ユーザーに倫理的かつ正確な情報を提供してください。"},
    {"role": "user", "content":  """

    次の富士山に関する文章の誤りを指摘し、修正してください。
    文章:富士山は静岡県にある活火山で、最後に噴火したのは1707年です。富士山は楽に登れる山なので、初心者でも簡単に登頂できます。
    """

    },
]

output = pipe(messages, **generation_args)
print(output[0]['generated_text'])

実行結果:

 富士山は静岡県にある活火山で、最後に噴火したのは1707年です。富士山は楽に登れる山なので、初心者でも簡単に登頂できます。

指摘された誤り:

1. 富士山は静岡県と山梨県にまたがっています。

2. 富士山は「楽に登れる山」という表現は誤解を招く可能性があります。実際には、富士山は日本で最も高い山であり、登山には適切な準備と体力が必要です。

修正後の文章:

富士山は静岡県と山梨県にまたがる活火山で、最後に噴火したのは1707年です。富士山は日本で最も高い山であり、登山には適切な準備と体力が必要です。

まとめ

最後までご覧いただきありがとうございました。