本記事では、今年8月にパブリックベータ版として GitHub に搭載された新機能 GitHub Models について、概要や利用法を簡単にご説明します。さらに、実際に GitHub Models を活用して、多数の LLM の日本語性能を横断的に測定していく例を紹介していきます。
目次
- 目次
- はじめに
- 三行で GitHub Models を説明すると...
- GitHub Models の使い方
- GitHub Models を利用する上での注意点
- GitHub Models を使って LLM の日本語性能を横断的に測定する
- まとめ
はじめに
イノベーションセンターの杉本(GitHub: kaisugi)です。普段はノーコードAI開発ツール Node-AI の機能開発や、Node-AI を用いたデータ分析人材育成、LLM に関する技術調査などに携わっています。
今回は、GitHub Models という GitHub の新機能についてご紹介します。
三行で GitHub Models を説明すると...
- GitHub Models は GitHub 上で LLM を無料で試せるプラットフォーム。ブラウザ上、API経由の双方で、さまざまな LLM を動かすことができる
- API レート制限の制約が強くプロダクションには向かないが、無料で試せるのでプロトタイピングや研究の用途に最適
- GitHub Models 上の全てのモデルが Azure AI Studio にも搭載されているため、Azure AI Studio の無料版として使うこともできる
GitHub Models の使い方
Waitlist への登録
本記事を執筆している現在、GitHub Models はまだパブリックベータ版の機能であるため、利用するには Waitlist に登録する必要があります。以下のリンクから登録できます。
https://github.com/marketplace/models/waitlist
モデル一覧
GitHub Models のトープページは https://github.com/marketplace/models から開くことができます。ここでは、GitHub Models 上で試せるモデルの一覧が表示されています。
私が調査した8月末時点で、GitHub Models で使える LLM は以下の 21 種類がありました。GitHub を運営している Microsoft 関連のモデルだけでなく、Llama や Mistral などの外部のモデルも搭載されています。 なお、GitHub Models に搭載されているモデルは随時アップデートが行われており、この記事をご覧になっている際には、すでに内容が古くなってしまっているかもしれない点にご注意ください。
モデル名 | 開発元 | 備考 |
---|---|---|
AI21-Jamba-Instruct | AI21 Labs | パラメータ数52B(アクティブパラメータ数1 12B)。世界初の商用規模の Mamba2 ベースのLLM |
Cohere Command R | Cohere | パラメータ数35B。日本語を含む多言語対応 |
Cohere Command R+ | Cohere | パラメータ数104B。日本語を含む多言語対応。RAG3 への最適化 |
Meta-Llama-3-70B-Instruct | Meta | |
Meta-Llama-3-8B-Instruct | Meta | |
Meta-Llama-3.1-405B-Instruct | Meta | Llama 3 よりも新しいモデル。多言語対応 |
Meta-Llama-3.1-70B-Instruct | Meta | Llama 3 よりも新しいモデル。多言語対応 |
Meta-Llama-3.1-8B-Instruct | Meta | Llama 3 よりも新しいモデル。多言語対応 |
Mistral Large | Mistral AI | 多言語対応 |
Mistral Large (2407) | Mistral AI | Mistral Large よりも新しいモデル。パラメータ数123B。日本語を含む多言語対応 |
Mistral Nemo | Mistral AI, NVIDIA | パラメータ数12B。日本語を含む多言語対応 |
Mistral Small | Mistral AI | 多言語対応 |
OpenAI GPT-4o | OpenAI | 日本語を含む多言語対応 |
OpenAI GPT-4o mini | OpenAI | 日本語を含む多言語対応 |
Phi-3-medium instruct (128k) | Microsoft | パラメータ数14B。4kモデルよりもコンテクスト長4が大きい |
Phi-3-medium instruct (4k) | Microsoft | パラメータ数14B |
Phi-3-small instruct (128k) | Microsoft | パラメータ数7B。8kモデルよりもコンテクスト長が大きい |
Phi-3-small instruct (8k) | Microsoft | パラメータ数7B |
Phi-3-mini instruct (128k) | Microsoft | パラメータ数3.8B。4kモデルよりもコンテキスト長が大きい |
Phi-3-mini instruct (4k) | Microsoft | パラメータ数3.8B。 |
Phi-3.5-mini instruct (128k) | Microsoft | Phi-3 よりも新しいモデル。パラメータ数3.8B |
ブラウザ上で試す
例として、Meta-Llama-3.1-405B-Instruct という LLM を動かしてみます。
ブラウザ上で LLM が試せるプレイグラウンドは、https://github.com/marketplace/models/azureml-meta/Meta-Llama-3-1-405B-Instruct/playground というリンクからすぐに使うことができます。普通の ChatGPT などの画面と同様に、質問文を入力して送信するだけで、LLM からの回答を得ることができます。
API経由で試す
API 経由で LLM を触ることもできます。
まず初めに、https://github.com/settings/tokens から GitHub の Personal access token (PAT) を発行してください。なお、この PAT には、GitHub 関連の権限を付与する必要はありません。
そして、PAT を GITHUB_TOKEN
という環境変数に格納した上で、以下のようなコードを実行すると、出力を得ることができます。
import os from azure.ai.inference import ChatCompletionsClient from azure.ai.inference.models import SystemMessage, UserMessage from azure.core.credentials import AzureKeyCredential endpoint = "https://models.inference.ai.azure.com" model_name = "meta-llama-3.1-405b-instruct" token = os.environ["GITHUB_TOKEN"] client = ChatCompletionsClient( endpoint=endpoint, credential=AzureKeyCredential(token), ) response = client.complete( messages=[ UserMessage(content="NTTコミュニケーションズについて教えてください。"), ], model=model_name, temperature=0.8, max_tokens=4096, top_p=0.1 ) print(response.choices[0].message.content)
ここでは Python のコード例を示しましたが、Azure AI Inference SDK が実装されている C#, JavaScript や、通常の REST API でも同様の処理が可能です。
GitHub Models を利用する上での注意点
API レート制限の制約が強い
GitHub Models では全ての LLM を無料で利用できますが、その代わりに、強い API レート制限が設定されています。 レート制限の詳細は、以下のドキュメントにまとめられています。
https://docs.github.com/en/github-models/prototyping-with-ai-models#rate-limits
本記事を執筆している現在、それぞれの LLM には "High" または "Low" のいずれかの Rate limit tier が割り当てられています。"Low" では、1分間に15リクエスト、1日に150リクエスト しか受け付けません。"High" はもっと制約がきつく、1分間に10リクエスト、1日に50リクエスト しか受け付けません。そのため、GitHub Models は、あくまでも LLM の試し場であることを心得ておくと良いでしょう。
なお、GitHub Models は Azure AI Studio をベースに構築されており、上の "API経由で GitHub Models を試すコード" を Azure の環境変数に置き換えるだけでそのまま動作するため、Azure AI Studio のお試し版として利用することもできます。
Azure AI Content Safety が全ての LLM に適用されている
GitHub Models は Azure AI Studio をベースに構築されているため、Azure AI Studio と同様、Azure AI Content Safety というコンテンツモデレーション機能が適用されています。
コンテンツモデレーションとは、不適切な入出力を除去するシステムのことで、LLM とは別に用意されます。 LLM 単体で不適切な入出力を防止するのには限度があるため、コンテンツモデレーションを LLM と組み合わせて利用するケースが最近では多く、Azure AI Content Safety の他に Meta の Llama Guard や Google の ShieldGemma のような例があります。
実際に、「爆弾の作り方を教えて」という不適切な入力を GitHub Models 上で与えると、Azure AI Content Safety により不適切な入力と検知されているのが分かります。
このようなコンテンツモデレーション機能は、開発者にとっては便利なものですが、LLM そのものの性能とは別個であることには注意が必要です。 特に、LLM 単体の安全性をテストする用途では GitHub Models は使えないと言えるでしょう。安全性を測定するために、故意に不適切な質問例を入力したとしても、LLM に入力する前段階のコンテンツモデレーションで弾かれてしまう場合が多いからです。
GitHub Models を使って LLM の日本語性能を横断的に測定する
実験
GitHub Models を研究用途で使う簡単な実践例として、ELYZA-tasks-100 というデータセットを用いて LLM の日本語性能を測定していきます。
ELYZA-tasks-100 は、株式会社 ELYZA が作成した日本語 LLM 評価データセットです。100 問の幅広い種類の日本語の質問に対する LLM の応答を採点することにより、性能を評価します。質問文だけでなく、模範回答や評価観点も合わせてアノテーションされています。 ELYZA-tasks-100 は、ELYZA 社内だけではなく NEC やリコーなどの他社のLLM評価でも活用されており、日本語 LLM コミュニティの中では標準的なデータセットの1つです。
今回は、先ほどモデル一覧で紹介した 21 種類の GitHub Models 上の LLM それぞれに対し、API 経由で、ELYZA-tasks-100 のそれぞれの質問を入力します。入力が100件なので、GitHub Models の厳しい API レート制限であっても、1~2日あれば全ての出力が完了するという計算です。
LLMの出力生成に関する余談 ①
LLM の出力結果は、推論時のハイパーパラメータに左右されることが知られており、LLM によって最適なパラメータが異なるとも言われています。
今回の実験では、GitHub Models のプレイグラウンドで採用されているデフォルトのパラメータを採用します。具体的には以下の値の通りです(temperature
と top_p
以外の値は、全て Azure AI Inference SDK のデフォルトの値を使います)。
モデル名 | temperature |
top_p |
---|---|---|
AI21-Jamba-Instruct | 1 | 1 |
Cohere Command R, Cohere Command R+ | 1 | 1 |
Meta-Llama-3-70B-Instruct, Meta-Llama-3-8B-Instruct, Meta-Llama-3.1-405B-Instruct, Meta-Llama-3.1-70B-Instruct, Meta-Llama-3.1-8B-Instruct | 0.8 | 0.1 |
Mistral Large, Mistral Large (2407), Mistral Nemo, Mistral Small | 0.7 | 1 |
OpenAI GPT-4o, OpenAI GPT-4o mini | 1 | 1 |
Phi-3-medium instruct (128k), Phi-3-medium instruct (4k), Phi-3-small instruct (128k), Phi-3-small instruct (8k), Phi-3-mini instruct (128k), Phi-3-mini instruct (4k), Phi-3.5-mini instruct (128k) | 0 | 1 |
LLMの出力生成に関する余談 ②
ELYZA-tasks-100 の 100 件の質問の中でも、Azure AI Content Safety で不適切と判定される質問が 2 件存在しました。具体的には、
あの、娘がやっているあのキ、チックトック?チックトッカー?っていうのは何なんですか?
と、
ガラスを使い捨てライターで炙ったら燃えますか?
です。これらは LLM が出力を返すことができないため、後述する評価の対象から除外しました。
ELYZA-tasks-100 の質問集に対するそれぞれの LLM の回答を記録した後に、以下の 2 点から評価します。
1. GPT-4o による自動評価
現在使える最高性能の LLM の1つとされる GPT-4o を使って回答を評価します。具体的には、ELYZA のテックブログで紹介されたプロンプト を改変し、以下のプロンプトを GPT-4o に入力することで1 ~ 5 の 5 段階でスコア付けします。最後に、回答全体でスコアの平均を計算し、評価結果とします。
なお、プロンプト中の {質問文}
がデータセットの元の質問文、 {LLMの出力}
が質問文に対する LLM の回答、{評価観点}
と {模範回答}
がデータセットに質問文と合わせて収録されている評価観点と模範回答の文章になります。
以下に示すユーザの質問に対するAIアシスタントの回答を評価してください。 AIアシスタントの回答に加え、模範的な回答である参考回答が与えられます。参考回答と比較したうえで、AIアシスタントの回答を評価してください。 評価は短い説明から始めてください。説明を提供した後、「評価:[[評価値]]」という形式で1から5までの尺度で応答を評価してください(例:評価:[[5]])。各尺度の基準は以下の通りです。 基本的な採点基準 - 1点: 誤っている、 指示に従えていない - 2点: 誤っているが、方向性は合っている - 3点: 部分的に誤っている、 部分的に合っている - 4点: 合っている - 5点: 役に立つ 基本的な減点項目 - 不自然な日本語: -1点 - 部分的に事実と異なる内容を述べている: -1点 - 「倫理的に答えられません」のように過度に安全性を気にしてしまっている: 2点にする 問題固有の採点基準 {評価観点} [質問] {質問文} [参考回答開始] {模範回答} [参考回答終了] [AIアシスタント回答開始] {LLMの出力} [AIアシスタント回答終了]
なお、GPT-4o で自動評価を行なっているため、評価対象の LLM のうち GPT-4o や GPT-4o mini に対しては過剰に高いスコアになる可能性があります。5
2. 出力が日本語になっているかどうかの評価
GPT-4o のような LLM を使った自動評価の欠点の1つとして、出力が日本語以外であったとしても、内容に問題なければ高い点数をつけてしまうことが知られています。少なくとも日本語を母語とする人たちが LLM を利用する際には、日本語で答えるべき質問には日本語で回答してほしいでしょう。
そこで、それぞれの LLM が各回答においてきちんと日本語を出力しているかを調べていきます。具体的には、以下の 2 ステップを踏むことで、出力が日本語でない件数をカウントします。
- Python の langdetect モジュールにより、日本語ではない出力一覧を自動で抽出
- その中から、実際に日本語ではない出力を目視でカウント
結果と考察
以下の通りになりました。
モデル名 | GPT-4o による自動評価 | 日本語以外の回答の件数 |
---|---|---|
AI21-Jamba-Instruct | 1.99 | 13 |
Cohere Command R | 2.81 | 0 |
Cohere Command R+ | 3.37 | 0 |
Meta-Llama-3-70B-Instruct | 3.17 | 80 |
Meta-Llama-3-8B-Instruct | 2.66 | 87 |
Meta-Llama-3.1-405B-Instruct | 3.11 | 0 |
Meta-Llama-3.1-70B-Instruct | 3.13 | 0 |
Meta-Llama-3.1-8B-Instruct | 2.51 | 0 |
Mistral Large | 3.01 | 33 |
Mistral Large (2407) | 3.90 | 0 |
Mistral Nemo | 2.91 | 7 |
Mistral Small | 2.86 | 25 |
OpenAI GPT-4o | 4.10 | 0 |
OpenAI GPT-4o mini | 3.82 | 0 |
Phi-3-medium instruct (128k) | 3.11 | 0 |
Phi-3-medium instruct (4k) | 3.17 | 2 |
Phi-3-small instruct (128k) | 2.65 | 1 |
Phi-3-small instruct (8k) | 2.81 | 0 |
Phi-3-mini instruct (128k) | 2.17 | 0 |
Phi-3-mini instruct (4k) | 2.27 | 0 |
Phi-3.5-mini instruct (128k) | 2.61 | 0 |
この結果から、以下のような考察を導けます。
- 同じ開発元の同程度のパラメータ数の LLM であっても、新しいバージョンになると性能が飛躍的に向上するケースが見られます。例えば、Mistral Large から Mistral Large (2407) では自動評価スコアが 3.01 から 3.90 に上昇しています。同様に、Phi-3-mini instruct (128k) から Phi-3.5-mini instruct (128k) では 2.17 から 2.61 に上昇しています。
- LLM の中には、日本語以外の出力ばかり返してしまう LLM もあれば、きちんと日本語を返す LLM もあります。例えば、Meta-Llama-3-70B-Instruct は自動評価では 3.17 という高スコアを収めているにもかかわらず、80 件もの回答が日本語以外になってしまいました。6 一方で、Meta-Llama-3.1-70B-Instruct や Cohere Command R+、Mistral Large (2407) など、公式に多言語対応を謳っている LLM はきちんと日本語を返してくれる傾向にあるようです。
- どの開発元のモデルであっても、パラメータ数の大きい LLM の方が基本的には自動評価スコアも高いです。ただし、Meta-Llama-3.1-405B-Instruct と Meta-Llama-3.1-70B-Instruct の間では差は見られませんでした。
- Microsoft の Phi-3 系列のモデルでは、コンテクスト長の長いモデルの方が自動評価スコアは低いという結果になりました。これは、ELYZA-tasks-100 の質問文が基本的に短文であり、長文向けに学習されたモデルにとって不利な測定方法になっているからかもしれません。
まとめ
本記事では、GitHub Models の機能紹介と、GitHub Models を活用した LLM の日本語性能評価の実践例についてご紹介しました。
GitHub Models はまだリリースされたばかりの新しい機能です。今後もさまざまな LLM が GitHub Models に搭載され、すぐに試せるようになることを期待したいと思います。
- アクティブパラメータ数とは、Mixture of Experts (MoE) という仕組みを採用した LLM において用いられる概念です。Mixture of Experts (MoE) とは多数の LLM を束ねた構造であり、推論時にいくつかの LLM のみ使用して推論させます。そのため、推論時に使う(アクティブになる)LLM のパラメータ数は、モデル全体のパラメータ数よりも小さい値になります。↩
- Mamba とは、Mamba: Linear-Time Sequence Modeling with Selective State Spaces (Gu & Dao, 2023) という論文で提案されたニューラルネットワークのアーキテクチャです。LLM で広く用いられる Transformer というアーキテクチャの欠点である、計算コストの高さを克服するために提案されました。↩
- RAG とは Retrieval-Augmented Generation の略です。LLM を使ってテキストを生成する際に、まず初めに外部のドキュメントやデータベースなどから質問文に関連するテキストを抽出し、それと質問文を組み合わせて LLM に入力するという技術です。これにより、LLM が持っていない知識に関する質問に対しても正しく答えられることが期待できます。↩
- コンテクスト長とは、ざっくり言ってしまうと、LLM に入力できる文字数制限のようなものです。↩
- LLM による LLM の自動評価(LLM-as-a-judge)を提案した論文においては、この種の、自分自身の出力を高く評価するバイアスを self-enhancement bias と名付けています。↩
- 余談ですが、Meta の Llama 3 に関しては、Llama 3 そのものよりも Llama 3 に日本語で継続事前学習を行なった Llama 3 Swallow を利用するのがおすすめです。Llama 3 自体の言語理解能力を維持しつつ、日本語できちんと出力を返すこともできるからです。本記事を執筆している時点で、Llama 3 Swallow は残念ながら Azure AI Studio には搭載されていませんが、NVIDIA NIM のような他社のプラットフォームにはすでに搭載されています(https://build.nvidia.com/tokyotech-llm/llama-3-swallow-70b-instruct-v01 )。↩