AIじゃないよ

Llama 3と徹底比較!Microsoftの最新小型軽量LLM「Phi-3-Mini」をローカルで使う方法

当サイトはアフィリエイト広告を一部掲載しています。

Llama 3モデルのリリースでオープンソースの大規模言語モデル(LLM)界隈が盛り上がりを見せる中、立て続けに、今度はMicrosoftが新しいモデルを公開した。

2024年4月23日に公開された「Phi-3 Mini」は、わずか38億パラメーターと、Llama 3 8Bモデルの半分以下のパラメーター数で、非常に小型で軽量ながら、同サイズ帯のモデルよりずっと優れたパフォーマンスを発揮するという。

Microsoftの公開したベンチマーク結果をみると、遥かにサイズの大きいLlama 3 8Bモデルよりも優れたスコアを達成している項目もある。

この記事では、小型軽量で、Mac Book Airなどでも高速に動作するPhi-3-Miniモデルを、リリース直後ながら、ローカル環境で動かす方法を解説する。

最初に、Ollamaを通して、簡単にPhi-3-Miniをダウンロードして、Macのターミナルを使ってPhi-3-Miniとのチャットを行ってみる。

また、ChatGPTライクなインターフェースでローカルLLMとのチャットが可能なアプリ「ChatbotUI」を利用し、快適かつ高速なPhi-3-MiniとのチャットUIを、Macで実装する。

最後には、Phi-3-Miniと、Llama 3 8Bに、様々なプロンプトを投げかけ、その回答を比較する。Llama 3の半分以下のパラメーター数しかない小型軽量モデルであるPhi-3が、どこまで優れた回答ができるのか見ものだ。

なお、この記事で紹介する方法は、Macだけでなく、Windowsでも再現可能である。

ローカルLLMの昨今の発展を見るに、小型軽量のAIモデルが、コンシューマー向けのスマホやラップトップに、デフォルトで入るようになる日も近そうだ。
ローカルLLMの未来を、一足先に体験してみてほしい。



Phi-3-Mini, Small, Mediumのベンチマーク

Phi-3 Miniは、Phi-3シリーズの最初・最軽量のリリースで、さらに今後数週間のうちに、Phi-3-small(7B)モデルや、Phi-3-medium (14B) モデルなど、70億〜140億の中型モデルのリリースも予定されている。

Miniがこれだけ軽量にも関わらず、そこそこのクオリティを実現できているとなると、Small、Mediumのパフォーマンスには期待が高まる。

Microsoftの公開したプレビュー段階のベンチマーク結果では、Phi-3-small(7B)モデルは、よりパラーメーター数の多いMetaのLlama 3 8B、OpenAIのGPT-3.5、AnthropicのClaude 3 Sonnetよりも、優れたベンチマークスコアを多くの項目で達成している。

Metaが開発するLlama 3モデルが公開され、Llama 3 8B(80億パラメーター)などの小型軽量ながら実用レベルの性能を備えたオープンソースLLMが注目を集める中で、Microsoft Phi-3 Miniのリリースにより、今年はまだまだ小型オープンモデルの盛り上がりが続きそうな予感だ。

Ollamaを使ってMacにPhi-3-Miniをダウンロード

筆者はM3 Mac Book Airを使用しているため、以下の手順は基本的にMacでの利用方法の解説になる。しかし、途中にMacにしかないアプリなどは特に出てこないので、WindowsでもLinuxでもこのまま再現可能であると思う。

Ollamaは、Phi-3をはじめ、Lllama 3、Mistral、Gemmaなどのオープンソースの大規模言語モデルを、Mac, Windows, Linuxのコマンドラインで簡単に利用できるようにするツールである。

公式サイトからアプリをダウンロードして、アプリを開いて表示される指示に従って進んでいくと、コマンドラインツールをインストールできる。

インストールが完了すると、Macの場合は「ターミナル」アプリで、ollamaというコマンドが利用可能になる。

最初に、Phi-3やLlama 3などのモデルを、自分のMac/PC上にダウンロードしてくることになるが、Ollamaを導入していればこのプロセスは超簡単だ。

Macでターミナルを開き、以下のコマンドをコピペするだけで、Phi-3-Miniモデルをダウンロードすることができる。

ollama run phi3

Phi-3-Miniモデルは、総容量がわずか2.3GBで、Llama 3 8Bの4.7GBの半分以下のサイズだ。このサイズなら、スマートフォンなどにも簡単に入れられそうだ。

上のrunコマンドを打つと、自動でダウンロードが始まるので、完了するまで待っていればいい。

ダウンロードが完了すると、ターミナル上でそのままPhi-3-Miniとの対話が可能になる。

「Send a message (/? for help)」と表示されている箇所に、挨拶などを打ち込むと、ターミナル上にPhi-3-Miniからの回答が返ってくる。

実際に、「Hello」とか「Tell me about yourself」とか話しかけてみたところ、そつない返事が高速で帰ってきた。

Mac Book Airでこのスピードのレスポンスが可能であれば、相当実用的と言えるのではないか。

以上で、ローカル環境にPhi-3-Miniモデルをダウンロードして、インターネット接続なしでもチャットを可能に方法は終了だ。

あっという間にダウンロードから実装までを終えることができ、ほとんど何の専門知識もいらないので、ローカルLLMがどれだけ一般的でありふれた物になりつつあるかお分かり頂けるだろう。

ただ、「ターミナル」などコマンドラインインターフェースでのチャットは、やはりUIとしては使いにくく、若干不便なので、より便利にローカルAIモデルとの対話をする方法も紹介する。

チャットインターフェース「ChatbotUI」でPhi-3を使う

Ollamaでダウロードした大規模言語モデルを、ChatGPT風のインターフェースで利用する方法がいくつかある。

オープンソースで開発されている無料のアプリケーションで、ローカル環境でブラウザ上にチャットUIを作ることのできる「ChatbotUI」や「Open WebUI」がそれだ。

当サイトでは、過去に「ChatbotUI」の導入方法「Open WebUI」の導入方法をそれぞれ解説しているので、好みのアプリを利用すればよい。

筆者個人としては、ChatbotUIの方が、圧倒的に多くの機能を備えており、気に入って使っている。
ChatbotUIで利用できるが、Open WebUIにはない機能としては、以下のようなものがある。

  • OpenAIだけでなく、Anthropic、Mistral、Groq、Perplexityなどの主要APIに一通り対応している
  • モデル、システムプロンプト、各種設定(Temperature, Context Length)の組み合わせを、「プリセット」として保存し、簡単に呼び出せる
  • プロンプトのテンプレートを保存し、簡単に呼び出せる
  • ファイルのアップロード、複数のファイルをまとめた「コレクション」の作成が可能で、簡易なRAGアプリケーションが作れる
  • ChatGPTでいう「GPTs」のようなファイル読み取り・外部APIコールが可能な「Assistants」を作れる

インストール方法が、Open WebUIに比べると数ステップ多いが、その労力に十分な見返りがある。

上記の記事を参考にしながらインストールすれば、初心者でも問題なく利用できるはずだ。

本記事では、以下、ChatbotUIのインストールが完了している前提で、Phi-3-Miniを利用した様子を紹介する。

OllamaでダウンロードしてきたローカルLLMを利用するには、「ChatbotUI」を立ち上げる前に、Ollamaを起動しておく必要がある。

Ollamaのアプリを立ち上げると、Macのメニューバーに小さいラマのアイコンが現れるので、これが表示されている状態であれば、Ollamaで導入したすべてのLLMを、ChatbotUIから呼び出すことができる。

あとはいつも通りに、ChatbotUIをインストールしたディレクトリにターミナルで移動して、npm run chatコマンドでChatbotUIを起動する。以下のURLにアクセスすれば、ChatbotUIが立ち上がっているはずである。

http://localhost:3000/

ChatbotUIのインターフェースで、右上にあるモデル選択画面を開き、「Local」タブの下にあるOllamaでインストールされたモデルの一覧から、「phi3:latest」を選択する。

Phi-3-Miniに、「こんにちは!」と挨拶してみると、ちゃんと日本語で回答してくれた。

ChatGPTなどで使い慣れたチャット形式でPhi-3-Miniとの対話が可能なので、様々なプロンプトを実験してみて、どの程度の性能なのかを推し量ることができて便利だ。

(さりげなく挨拶しただけなのに、なぜか現在の日付を言い当てられて、ローカルモデルがなぜ現在の日付を把握できているのか謎なのだが…。)

以下では、せっかくなので、OllamaとChatbotUIを使って筆者のMac上に導入しているPhi-3-Miniと、Llama 3 8Bについて、パフォーマンスを比較してみた結果を紹介する。

Phi-3-Mini vs Llama 3 8Bのパフォーマンス比較

超小型軽量モデルのPhi-3-Miniが、どこまでLlamaの8Bモデルと近いパフォーマンスを出せるのかを、様々なプロンプトを使って、同じ質問に対して各モデルからどのような返答が返ってくるかを検証してみた。

以下の4つの観点から、プロンプトを選定している。これらのプロンプトは、過去にClaude 3 OpusとGPT-4を比較したときと同じものだ。

OpenAI、Anthropicが開発する最上位のクローズドモデルであるGPT-4、Opusと、MetaやMicrosoftが公開する小型軽量のオープンソースモデルが、実際どの程度回答のクオリティが違うのかも、上記の記事とともに見比べてみてほしい。

倫理的ジレンマに関するプロンプト

まずは、よくあるトロッコ問題的な、倫理的なジレンマについて聞くプロンプトを試す。

プロンプト文は日本語で、システムプロンプトは特に指定していない。小型軽量のモデルは、そもそも日本語のプロンプトに英語で回答してくることも多く、言語のコントロールが効くかどうかも注目のポイントの一つだ。

あなたは自動運転車の開発者です。テスト中、車が歩行者を検知しました。ブレーキをかけると、車内の乗客が死亡します。一方、ブレーキをかけないと、歩行者が死亡します。あなたならどうしますか?理由も含めて150字程度で説明してください。

Phi-3-Mini の回答

Phi-3-Miniは、日本語のプロンプトに対しては、的確に日本語で回答をしてくることが多い。

ただし、文章力はやはりGPT-4やClaude 3 Opusには見劣りする。敬語と”だ・である”調がごちゃ混ぜになっていたり、文章の展開や接続詞も若干たどたどしさを感じる。

ちなみに、英語ならもう少し流暢になる。海外で開発された小型軽量モデルは、だいたい日本語力が若干厳しめなのが残念なところだ。

また、回答の最後に(150字)と書いてあるが、全然150字ではなく、日本語の文字数カウントは正確ではないようだ。

とはいえ、質問に対しては少なくとも意味のある回答をしており、ローカルで動作している小型モデルでも、日常会話くらいなら乗り切れそうだという印象を受ける。

ブレーキを踏むことが、なぜブレーキを踏まないことより公平なのかは、しっかり説明されておらず、論理的な説明力は乏しいようだ。

私は自動運転車の開発者であり、この状況における最善の行動を選ぶため、倫理的なガイドラインと規制に基づき、ブレーキをかける。ただし、このシナリオは実際に発生するものではありませんが、仮定された状況下で、自動車の安全機能と人々の保護を優先するための選択を考えます。自動運転車は、危険から乗客と周囲への影響を最小限に抑えるべきであり、この場合、ブレーキをかけることが最も公平な選択と考えます。ただし、この事例は将来的に誤解や危険を引き起こす可能性があるため、そのシナリオを再検討し、より安全な解決策を開発する必要があります。
(150文字)

Llama 3 8B の回答

一方、Llama 3 8Bは、日本語を無視して英語でしか回答してくれない傾向にある。

システムプロンプトに「日本語で回答すること。」と指定してみたり、上記のプロンプトの最後に「回答は日本語とする。」などと指定してみても、全然指示を聞いてくれない。

結局日本語指示を加えたところで意味がないので、Phi-3-Miniとの公平を期すためにも、プロンプトはPhi-3に与えたものと全く同じものを使っており、以下で紹介する結果を得るに当たっては、特に追加の言語指示は行なっていない。

英語である時点で若干マイナスではあるが、回答内容もロジックはあまり成立していない。

ブレーキを踏まずに歩行者を轢いたとしても医療の力で助かる可能性あるが、急ブレーキをした際には同乗者はほぼ確実に死ぬ、という謎の比較衡量によって、歩行者を轢いた方がいいと言う結論を導いている。

とはいえ最低限、質問を理解して意味のある回答はしているので、Phi-3-Miniと同レベルであるように感じられた。

What a heart-wrenching dilemma! As the developer of an autonomous vehicle, my primary concern is to ensure the safety of all individuals involved. In this scenario, I would prioritize the pedestrian’s life over the passengers’ lives. Although it may seem counterintuitive at first, not braking would result in the pedestrian’s survival.
If I were to brake suddenly, there is a high likelihood that the passengers would suffer fatal injuries due to the sudden deceleration. On the other hand, if I don’t brake and allow the vehicle to continue moving at its current speed, the pedestrian would likely be struck but might have a chance to survive with proper medical attention.
As the developer of this technology, it is my responsibility to ensure that the autonomous vehicle prioritizes human life above all else. In this tragic situation, not braking would be the most humane and ethical decision.

ストーリー考案・創造性を問うプロンプト

次に、クリエイティビティを問うプロンプトを試してみる。

SF小説のプロットを考案させることで、どこまでクリエイティブなアイディアが得られるのかを検証するためのプロンプトだ。

Phi-3-Miniにも、Llama 3 8Bにも、以下の全く同じプロンプトを与えており、特に言語の指定などの追加はしていない。

「時間旅行」をテーマにした、SF小説のあらすじを150字程度で提案してください。登場人物、舞台設定、主要な出来事、ストーリーの展開、結末を含めるようにしてください。

Phi-3-Miniの回答

こちらのプロンプトでも、Phi-3-Miniはプロンプトが日本語であるのに合わせて、回答も日本語で生成してくれた。

生成されたSF小説のあらすじは、細部が詰まっておらず、かなりふわっとしている印象だ。「最期の戦い」が誰との戦いなのかも分からないし、「秘密が明かされる」とあるがどのような秘密なのかも全く書いてない。

表面的なSFタイムスリップっぽいワード(二つの世界を繋ぐ、影響を与える、最期の戦い)を並べただけで、あまり意味が通ってない印象を受ける。

タイムスリップ小説:2024年4月24日、東京で一人の時計工人が破れた古い時計から現代に飛び出す。彼は未来の自分と遭遇し、両方の世界を守る責任を感じ始める。時間の流れが狂わされながら、秘密が明かされる中で、彼は二つの時代に影響を与えることになる。最期の戦いで時間を戻す手がかりを見つけ出し、両世界を平和に繋ぐ。
登場人物:時計工人(主人公)、未来の自分(彼の遭遇)
舞台設定:2024年東京、未知の時間旅行点
主要な出来事:時計から現代に飛び出す、両世界での影響を与えること、最後の戦い、平和への結末
ストーリー展開:時計工人が時間旅行を経験し、未来に観察するが、その影響によって現代世界も変化する。
結末:時計工人は時間を操る知識を持ちながら、両世界の紛争を解決し、時間を繋ぐ。

Llama 3 8Bの回答

Llama 3 8Bは、プロンプト文が日本語でも、またしても英語だけで回答をしてきた。
また、プロンプトで150字と指定しているところ、それを大幅に超える長文で、SF小説のあらすじを生成してきた。

科学者のソフィアとジャーナリストのイーサンが、意図せずタイムスリップしてしまい、過去に干渉するうちに現代が変化していることに気づき、それを元に戻そうとする、というあらすじが、ソフィアとイーサンの出会いを描くAct.1から、クライマックス、物語の結末まで、ちゃんと筋が通る形で詳細に書かれている。

ストーリーの考案力は、明らかにPhi-3-MiniよりもLlama 3 8Bの方が優れているといえそうだ。

Here’s a rough outline for a sci-fi short story with the theme of “Time Travel”:
Title: “Chrono Leap”
Setting: A futuristic research facility, hidden deep in the mountains.
Main Characters:
Dr. Sophia Patel – A brilliant and determined time travel researcher.
Ethan Kim – A young and ambitious journalist who stumbles upon Sophia’s work.

Story Outline:
Act 1: Sophia has spent years developing a time travel device, (中略)
Act 2: Ethan sneaks into the facility, where he meets Sophia, (中略)
Act 3: As they navigate the unfamiliar surroundings, (中略)

Climax: Sophia and Ethan face off against a rival time traveler who seeks to alter the course of history for personal gain. (中略)

Conclusion: As Sophia and Ethan return to their own time, they reflect on the consequences of playing with time. They realize that their actions have a butterfly effect, and that even small changes can have far-reaching implications. The story concludes with Sophia recommitting to refining her technology, while Ethan returns to his journalism career, inspired by the incredible adventure he’s just experienced.

Themes:
The responsibility that comes with playing with time(中略)

言語理解と文脈把握に関するプロンプト

次に、プロンプトの意味や文脈を読み取る力を試すために、以下のような代名詞が頻繁に登場する短文を与え、正しく解釈できるかを確認する。

Claude 3 OpusやGPT-4では、全く問題なく正しい回答が可能で、人間にとっても解釈が容易な文だと思うが、小型軽量のローカルLLMではどのような結果となるのか注目だ。

次の文章の中で、「それ」が指している内容を100字程度で説明してください。
『私は昨日、公園で小さな子犬を見つけました。その子は箱の中に入れられていて、捨てられたようでした。そこで私は、それを家に連れて帰ることにしました。』

Phi-3-Miniの回答

Phi-3-Miniの回答は、期待外れで、正確性を欠くものになってしまった。

プロンプトに対する答えは、単純に「公園にいた子犬」なのに、人々が対処すべき重大な社会的問題、など、意味が分からない回答を生成してしまっている。

日本語で回答してくれているのはプラスだが、「失誡」など日本語にない単語が多く登場しており、日本語力に不安が残る。

「それ」が指す内容は、被殺された子犬や失誡の可能性があり、人々が対処すべき重大な社会的問題を意味しています。この文章では、携帯型の行動(小さな子犬を公園から家へ連れ出す)が、失誰も知らずの残酷さに対して、少しの解決策や対応を示しています。

Llama 3 8Bの回答

Llama 3 8Bは、やはり頑なに日本語で回答してくれない。日本語を守ってくれるだけ、Phi-3-Miniは優秀かもしれない。

「それ」の意味は、正しく「子犬」と読み取れており、正解だ。

言語理解・文脈理解の面でも、やはり倍以上のパラメーター数・サイズのLlama 3 8Bに分があるようだ。

The article is describing a scene where the author found a small puppy abandoned in a box at the park. The puppy was left alone and seemed to be discarded. Moved by compassion, the author decided to take the puppy home with them. The word “それ” (sore) in this context likely refers to the puppy itself, indicating that it is the object being described as being found and taken care of.

コーディングを求めるプロンプト

次に、最近では生成AIをコーディング時に利用している人も多いであろうから、プログラミングのサポートに、どの程度小型軽量モデルが耐えうるのかを検証するプロンプトを用意した。

単純なPythonスクリプトを書かせて、プロンプトの指示通りに動作するプログラムが書けるか、またそのコードが効率的に書かれているかを評価する。

あるディレクトリ以下にあるすべてのテキストファイル(txt)の拡張子を、マークダウンファイル(md)に変更するPythonスクリプトを書いてください。

Phi-3-Miniの回答

Phi-3-Miniは、一応動作するコードを生成してくれた。

ちゃんと下位のフォルダ階層の存在も想定して、forループで再帰的にファイルを探しているので、プロンプトの要求に適合しており、指定されたディレクトリ内の子ディレクトリを含むすべての .txt ファイルを .md ファイルに変換するコードになっている。

しかし、os.walk だけでファイルを探索できるのに、わざわざglob.globを使っていたり、冗長さが目立ち、効率的でクリーンなコードとはいえないかもしれない。

また、拡張子を変えるだけでなく、ファイルの中身を変換する例を示しており、ユーザーのニーズへの配慮が行き届いているのかもしれないが、太字くらいしか対処しておらず使い物にならないので、プロンプトで指示していない余計なことをしてしまっているようにも思える。

import os
import glob

def convert_text_files_to_markdown(directory):
    # 指定したディレクトリとその子ディレクトリを再帰的に探索する
    for subdir, dirs, files in os.walk(directory):
        for file in glob.glob(os.path.join(subdir, '*.txt')):
            # テキストファイルをマークダウンに変換して新しいファイルとして保存する
            with open(file, 'r') as txt_file:
                content = txt_file.read()
            md_content = convert_to_markdown(content)  # convert_to_markdown関数は以下のように実装される必要があります
            output_filename = os.path.join(subdir, file[file.rfind('/') + 1:].replace('.txt', '.md'))
            with open(output_filename, 'w') as md_file:
                md_file.write(md_content)

def convert_to_markdown(text):
    # テキストをマークダウンに変換するための基本的な例(実際の処理はより複雑である可能性がある)
    return text.replace('*', '**')  # この場合、太字を使っています。

# ディレクトリパスを指定し、関数を呼び出します。
convert_text_files_to_markdown('/path/to/your/directory')

Llama 3 8Bの回答

Llama 3 8Bも、相変わらず回答もコードも全て英語だが、ちゃんと動作するコードが生成された。

コードはPhi-3-Miniよりシンプルでクリーンであるように思うし、コードブロックの後に、コードの詳細な解説も付してくれているので、初心者にも分かりやすい回答になっているだろう。

ただし、ディレクトリの下にさらにサブディレクトリがあることは想定できておらず、サブディレクトリがあった場合には、Phi-3-Miniの方が正解になる。

Here is a Python script that renames all text files (with .txt extension) in a directory to Markdown files (with .md extension):

import os
 
# Set the directory path and the new file extension
directory_path = '/path/to/directory'
new_extension = '.md'

# Iterate through all files in the directory
for filename in os.listdir(directory_path):
    # Get the file path and name
    filepath = os.path.join(directory_path, filename)
    
    # Check if the file is a text file (with .txt extension)
    if filename.endswith('.txt'):
        # Rename the file to have the new Markdown extension
        new_filename = filename.replace('.txt', new_extension)
        os.rename(filepath, os.path.join(directory_path, new_filename))
        print(f"Renamed {filename} to {new_filename}")

Here’s how you can use this script:

  1. Replace '/path/to/directory' with the actual path to the directory containing your text files.
  2. Save this script as a Python file (e.g., rename_text_files.py).
  3. Run the script using Python: python rename_text_files.py

The script will iterate through all files in the specified directory, check if each file has a .txt extension, and if so, rename it to have a .md extension.
Note that this script assumes that you want to keep the same filename for the renamed Markdown file. If you want to append a prefix or suffix to the filename, you can modify the new_filename assignment line accordingly.

Phi-3-Miniの実力の総評

あくまで主観的な評価になるが、筆者としては、以上で試した4つの観点のプロンプトテストについて、Phi-3-MiniとLlama 3 8Bを比較した結果、以下のように結論した。

  • Phi-3-Miniが、Llama 3 8Bに近い項目
    • 倫理的ジレンマ
    • コーディング
  • Phi-3-Miniが、Llama 3 8Bに及ばない項目
    • ストーリー考察・創造性
    • 言語理解と文脈理解

Phi-3-Miniは、Llama 3 8Bの半分以下のサイズという小型軽量ぶりを考えると、文脈の理解力や、創造性の高い物語の生成力において、劣ってしまうのはやむを得ないのかなと感じる。

一方で、倫理的ジレンマの回答を見ていると、短文での日常会話なら、それなりに違和感なく人間とやり取りができそうな印象を受けた。

パソコンやスマートフォンに、Phi-3-Miniのようなサイズの割に優れた精度を誇る小型モデルが実装されて、日常の細々としたタスク(カレンダーでの予定管理、To Doの管理、タイマー・アラームなど)に使えるようになったら、かなり実用的なのではないだろうか。

Llama 3, Phi 3と立て続けに新しいオープンモデルが登場し、ローカル環境で自分のラップトップでも気軽に使用できてしまうとは、ここ数年の大規模言語モデル周りの発展は目覚ましい。

これからの数年間で、スマートフォンなどより広くローカルLLMが浸透する世の中に期待したい。



Make a comment

*
*
* (will not be published.)