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

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

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

概要

Phi-3-miniの概要

Phi-3-miniは、わずか38億のパラメータを持つ小型の言語モデルです。しかし、33兆トークンで学習させたことにより、Mixtral 8x7BやGPT-3.5と同等の性能を達成したと報告されています。例えば、MMLUで69%、MT-benchで8.38を記録しました。これは、スマートフォンにデプロイできるほど小さいモデルとしては驚異的な結果だと言えるでしょう。

革新的な学習データ

Phi-3-miniの高い性能を支えているのは、学習に用いたデータセットにあります。このモデルは、前身のPhi-2で使用されたデータを拡張したもので構成されています。具体的には、厳選されたウェブデータと、合成データが用いられました。さらに、ロバスト性、安全性、チャット形式への適合性も考慮されています。

パラメータスケーリングによる性能向上

論文では、パラメータ数を70億、140億に増やしたPhi-3-small、Phi-3-mediumの初期結果も示されています。これらのモデルは48兆トークンで学習され、Phi-3-miniをさらに上回る性能を発揮しました。例えば、MMLUでは75%と78%、MT-benchでは8.7と8.9を記録しています。

Phi-3-miniの弱点

Phi-3-miniは優れた言語理解と推論能力を示した一方で、そのサイズ故の弱点もあります。例えば、TriviaQAの低いスコアが示すように、大量の事実知識を保持するキャパシティが不足しています。ただし、論文ではこの問題が検索エンジンとの連携で解決可能だと示唆されています。また、現時点では主に英語に特化したモデルとなっています。

実装

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

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

!pip install -U transformers accelerate

モデルを準備します。

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline

model = AutoModelForCausalLM.from_pretrained(
    "microsoft/Phi-3-mini-128k-instruct",
    device_map="auto",
    torch_dtype="auto",
    trust_remote_code=True,

)
tokenizer = AutoTokenizer.from_pretrained("microsoft/Phi-3-mini-128k-instruct")

pipe = pipeline(
    "text-generation",
    model=model,
    tokenizer=tokenizer,
    max_new_tokens=512,
    return_full_text=False,
    temperature=0.7,
    do_sample=True,
)

質問応答

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

output = pipe(prompt)
print(output[0]['generated_text'])

実行結果:

山頂に輝く壮大な山の一つに、富士山が知られています。
標高は約3,776メートルで、日本の静岡県と山梨県にまたがって位置しています。
富士山は活火山でありながら、現在の活動は非常に低い水平です。
この山は日本文化に深い影響を与え、多くの美術作品や文学に登場し、その形は四季を通じて変わる美しさを持っています。
また、2013年にはユネスコの世界文化遺産に登録され、国内外から訪れる人々に人気の富士山となっています。

要約

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

    富士山(ふじさん)は、静岡県(富士宮市、富士市、裾野市、御殿場市、駿東郡小山町)と山梨県(富士吉田市、南都留郡鳴沢村)に跨る活火山である。
    標高3776.12 m、日本最高峰(剣ヶ峰)の独立峰で、その優美な風貌は日本国外でも日本の象徴として広く知られている。
    数多くの芸術作品の題材とされ芸術面のみならず、気候や地層など地質学的にも社会に大きな影響を与えている。
    懸垂曲線の山容を有した玄武岩質成層火山で構成され、その山体は駿河湾の海岸まで及ぶ。
    古来より霊峰とされ、特に山頂部は浅間大神が鎮座するとされたため、神聖視された。
    噴火を沈静化するため律令国家により浅間神社が祭祀され、浅間信仰が確立された。
    また、富士山修験道の開祖とされる富士上人により修験道の霊場としても認識されるようになり、登拝が行われるようになった。
    これら富士信仰は時代により多様化し、村山修験や富士講といった一派を形成するに至る。
    現在、富士山麓周辺には観光名所が多くある他、夏季シーズンには富士登山が盛んである。
    日本三名山(三霊山)、日本百名山[2]、日本の地質百選に選定されている。
    また、1936年(昭和11年)には富士箱根伊豆国立公園に指定されている。
    その後、1952年(昭和27年)に特別名勝、2011年(平成23年)に史跡、
    さらに2013年(平成25年)6月22日には関連する文化財群とともに「富士山-信仰の対象と芸術の源泉」の名で世界文化遺産に登録された。

    """},
]

output = pipe(prompt)
print(output[0]['generated_text'])

実行結果:

- 富士山は静岡県と山梨県に跨る活火山であり、日本最高峰である。

- 標高3776.12mで、美しい独立峰であり、日本の象徴である。

- 芸術作品の題材としても、気候や地質学に大きな影響を与えている。

- 玄武岩質成層で構成され、海岸から震長門まで広がる山体。

- 浅間大神に鎮座し、神聖視され、浅間信仰が確立された。

- 富士上人による修験道の開祖とされ、登拡が行われる。

- 富士信仰は村山修験や富士講など多様化し、全国に伝わっている。

- 夏季の富士登山の盛り、観光名所の多用、国立公園や世界文化遺産の登録。

翻訳(日本語→英語)

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

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

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

    """
    },
]

output = pipe(prompt)
print(output[0]['generated_text'])

実行結果:

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

翻訳(英語→日本語)

prompt= [
    {"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.

"""},
]

output = pipe(prompt)
print(output[0]['generated_text'])

実行結果:

日本で最も高い山は日本山脈の富士山です。 
富士山は山梨県と静岡県の県境に位置していて、海上半径3776メートルです。 
世界中で知られるように、彼は日本特有の火山だったります。

感情分析

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

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

    """},
]

output = pipe(prompt)
print(output[0]['generated_text'])

実行結果:

1. 富士山の頂上からの眺めは息をのむほど美しかった。 - ポジティブ

2. 富士山登山中に怪我をして、下山するのが大変だった。 - ネガティブ

3. 富士山は日本の最高峰で、標高は3,776mである。 - ニュートラル

固有表現抽出

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

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

    """},
]

output = pipe(prompt)
print(output[0]['generated_text'])

実行結果:

- 地名: 富士山の麓、鈴木県

- 人名: 次郎 (鈴木次郎)

- 組織名: 環境省

論理推論

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

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

    """},
]

output = pipe(prompt)
print(output[0]['generated_text'])

実行結果:

この文章は論理的に正しくありません。
最後の文は、世界でエベレストが最も高いという事実と富士山がエベレストよりも高いという前提の間で間違っています。
日本国内のみに限定されている富士山の標高と、世界的な最も高い山(すなわち、エベレスト)との間に、富士山がエベレストからの高さを導き出すことはできません。
富士山は世界で高さを持たないため、その前提で結論付けることは論理的に不正確です。

計算・数学問題

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

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

    """
    },
]

output = pipe(prompt)
print(output[0]['generated_text'])

実行結果:

富士山の標高が3,776メートルであり、その山頂までの距離が30キロメートルである場合、斜面の長さを求める必要があります。
これを求めるには、斜面の長さを直角三角形の一辺に対する斜面の長さの比(斜面の長さ/直角三角形の一辺)を取ります。
ここでは、直角三角形の一辺は山頂から地面に向けた距離で、この直角三角形の一辺をh^2 = された斜面の長さ^2 + 標高^2という関係式により求めることができます。
したがって、直角三角形の一辺hの絶対値を求めることにより、斜面の長さを得ます。


直角三角形の一辺hの絶対値は、以下の公式で求められます:

h = √(l^2 - 高さ^2)

ここで、l = 30,000メートル(距離)、高さh = 3,776メートル(標高)です。


h = √(30,000^2 - 3,776^2)

h = √(900,000,000 - 14,258,776)

h = √(885,741,224)

h ≈ 29,762メートル


斜面の長さを求めるためには、斜面の長さを

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

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

    """
    },
]

output = pipe(prompt)
print(output[0]['generated_text'])

実行結果:

```python

def convert_meters_to_feet(meters):

    # 1メートルをフィートに変換する率(1メートル = 3.28084フィート)

    feet = meters * 3.28084

    return feet


# ユーザーからの入力

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


# メトルからフィートに変換して結果を表示

result = convert_meters_to_feet(user_input)

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

```

文章校正

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

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

output = pipe(prompt)
print(output[0]['generated_text'])

実行結果:

富士山は静岡県にあり、歴史的には活火山ですが、最後に活火山としての活動を持っていたのは1707年にではなく、1707年ではなく1708年です。また、富士山は登山が可能ですが、初心者には非常に危険で、登山時には適切な準備と対策が必要です。それは「楽に」という表現は、山の危険性や登山の難易度を誤解させるためです。より正確な表現としては、「富士山は踏みにじみのある山ですが、特別な準備と指導を得ることが重要であり、初心者登山には厳格な審査が必要です。」となります。

まとめ

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