サイトのデザインが新しくなりました。

【ELYZA japanese CodeLlama 7b】日本語版CodeLlamaの性能をGPT-4と徹底比較してみた

ELYZA-japanese-CodeLlama-7b 日本語版CodeLlama 使い方

WEELメディア事業部テックリサーチャーのゆうやです。

2023年11月15日、ELYZA社からELYZA-japanese-CodeLlama-7bが公開されました。

このモデルは、CodeLlama-7b-Instructをベースに日本語の追加事前学習を行ったもので、コード生成・補完に特化した日本語LLMです。

以下の画像のように日本語の入出力に対応し、コードを生成できます。

引用元:https://note.com/elyza/n/n5bce23d7c9c8#69461a01-0fd9-4ee0-8ec2-1f18c8569f82

ベースとなったCodeLlama-7b-Instructは、GPT-4に匹敵するコーディング能力を有しており、このモデルはその能力を日本語で利用でき、ますますコーディングタスクを効率化できます。

今回は、ELYZA-japanese-CodeLlama-7bの概要や使ってみた感想をお伝えします。

是非最後までご覧ください!

なお弊社では、生成AIツール開発についての無料相談を承っています。こちらからお気軽にご相談ください。

目次

ELYZA-japanese-CodeLlama-7bの概要

ELYZA-japanese-CodeLlama-7bは、ELYZA社がCodeLlama-7b-Instructをベースに日本語の追加事前学習を行って開発したコード生成・補完に特化した日本語LLMです。

このモデルの追加事前学習は、以前ご紹介したELYZA-japanese-Llama2-7bと同様のデータや手法を用いており、OSCARやWikipediaなどの日本語データを約180億トークン使用しています。

また、この事前学習を行ったELYZA-japanese-CodeLlama-7bのほかに、ELYZA-japanese-CodeLlama-7b-instructという、ELYZA独自の事後学習を行い、さらに性能を向上させたモデルも公開されています。

ELYZA-japanese-CodeLlama-7bは、Llama 2 Community License に準拠しており、Acceptable Use Policy に従えば、研究および商業目的での利用が可能です。

続いてELYZA-japanese-CodeLlama-7bの性能について紹介します。

性能評価は、ELYZA-japanese-CodeLlama-7b-instructに対して、コード生成能力に対する評価日本語生成能力に対する評価の2種類が実施され、その結果が公開されています。

ここでは結果のみ紹介しますが、詳しい内容を知りたい方は以下のページをご覧ください。

「Code Llama」をベースとした商用利用可能な日本語LLM「ELYZA-japanese-CodeLlama-7b」を公開しました

まずは、HumanEvalによるコード生成能力評価結果です。

この評価では、1つの問題に対して1つのテキストをgreedyに生成して評価するpass@1を指標として用いています。

以下が評価の結果です。

引用元:https://zenn.dev/elyza/articles/fcbf103e0a05b1

この結果を見ると、CodeLlama-7b-Instructとほぼ同等のコード生成能力を保持していることが分かります。

続いて、ELYZA Tasks 100 による日本語生成能力評価結果です。

この評価では、ELYZA Tasks 100というモデルの日本語能力の評価に特化した、日本語instructionモデル評価データセットです。

以下が、評価のなかで行われた入力と出力のテストケースです。

入力

仕事の熱意を取り戻すためのアイデアを5つ挙げてください。

CodeLlama-7b-Instruct

Sure, here are five ideas to boost your work enthusiasm:
 

 1. Set achievable goals: Setting specific, measurable, and achievable goals can help you stay motivated and focused. Break down larger goals into smaller, manageable tasks to help you make progress and feel a sense of accomplishment.
 2. Find meaning in your work: When you feel that your work has meaning and purpose, you are more likely to be engaged and motivated. Reflect on why your work is important and how it contributes to the bigger picture.
 3. Take breaks and practice self-care: It's important to take breaks and practice self-care to avoid burnout. Schedule time for activities that bring you joy and help you recharge, such as exercise, reading, or spending time with loved ones.
 4. Connect with colleagues and coworkers: Building positive relationships with your colleagues and coworkers can help you feel more engaged and motivated in your work. Make an effort to collaborate, communicate, and support one another.
 5. Celebrate your successes: Acknowledge and celebrate your achievements, no matter how small they may seem. This can help you feel a sense of accomplishment and motivation to continue striving for excellence.
 

 Remember, it's important to find what works best for you and your unique situation. Experiment with different strategies to find what helps you stay motivated and engaged in your work.

ELYZA-japanese-CodeLlama-7b

仕事の熱意を取り戻すためのアイデアを5つご紹介します。

1. 目標を明確にする: 仕事の目標を明確にすることで、その目標を達成するために何をすべきかを考えることができます。

2. 仕事へのモチベーションを高める: 仕事へのモチベーションを高めるために、自分が取り組むことによって得られる成果を考えることができます。

3. 仕事に取り組む際のルーチンを整える: 仕事に取り組む際のルーチンを整えることで、仕事に取り掛かるまでの時間を短縮することができます。

4. 仕事に取り組む際のストレスを軽減する: 仕事に取り組む際のストレスを軽減するために、仕事に取り組む際の環境を整えることができます。

5. 仕事への意欲を高める: 仕事への意欲を高めるために、自分の仕事に対する誇りや自信を持つことができます。

この結果を比較すると、CodeLlama-7b-Instructでは日本語を入力として理解出来ているように見える一方、日本語として出力することが出来ていません。
一方、ELYZA-japanese-CodeLlama-7b-Instructでは、自然な日本語による出力が行われていることが分かります。

また、このテストケースの出力を、GPT-4によって評価した結果も公開されています。

以下がその結果です。

引用元:https://zenn.dev/elyza/articles/fcbf103e0a05b1
引用元:https://zenn.dev/elyza/articles/fcbf103e0a05b1

この評価では、参考程度にGPT-4, GPT-3.5 turboの結果も記載されており、ELYZA-japanese-Llama-2-7b-instructELYZA-japanese-Llama-2-7b-fast-instructという純粋な日本語LLMの結果も記載されています。

結果は、ELYZA-japanese-CodeLlama-7b-instructはELYZA-japanese-Llama-2-7b-fast-instructとほぼ同等ですが、ELYZA-japanese-Llama-2-7b-instructには少し劣る程度の性能でした。

最後に、日本語の能力を拡張したELYZA-japanese-CodeLlama-7b-instructがどのような目的で使えるかを定性的に評価した結果です。

ELYZA-japanese-CodeLlama-7bでは、ベースモデルではできなかったコードを日本語で解説させることができます。

以下の入力を与えて生成される出力を評価します。

エラトステネスの篩についてサンプルコードを示し、解説してください。
引用元:https://zenn.dev/elyza/articles/fcbf103e0a05b1

結果は、少し誤った表現をしているところはあるものの、基本的なアルゴリズムの説明はしっかりできています。

よって、まだ若干精度に問題はありますが、人間がコードを理解するのを支援するツールとして利用できる可能性を示しました。

ここまでは公式発表をもとに性能を紹介してきましたが、ここからは実際に使ってみてその結果を検証していきます。

なお、MetaのCodeLlama-7bについて詳しく知りたい方は、下記の記事を合わせてご確認ください。
【Code Llama】最強コード生成AIの使い方と実践を解説

ELYZA-japanese-CodeLlama-7bの使い方

ELYZA-japanese-CodeLlama-7bは、HuggingFaceのスペースで誰でも使えるように公開されており、以下のリンクからアクセスするだけで使用できます。

ELYZA-japanese-CodeLlama-7b-instruct-demo

また、ローカルにインストールする方法もあるので、そちらも説明します。

まず、必要なパッケージをインストールします。

pip install torch transformers

次に以下のコードを実行することで、モデルとトークナイザーのロードおよび推論の実行を行います。

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

B_INST, E_INST = "[INST]", "[/INST]"
B_SYS, E_SYS = "<<SYS>>\n", "\n<</SYS>>\n\n"
DEFAULT_SYSTEM_PROMPT = "あなたは誠実で優秀な日本人のアシスタントです。"
text = "任意のプロンプトを入力してください"

model_name = "elyza/ELYZA-japanese-CodeLlama-7b-instruct"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype="auto")

if torch.cuda.is_available():
    model = model.to("cuda")

prompt = "{bos_token}{b_inst} {system}{prompt} {e_inst} ".format(
    bos_token=tokenizer.bos_token,
    b_inst=B_INST,
    system=f"{B_SYS}{DEFAULT_SYSTEM_PROMPT}{E_SYS}",
    prompt=text,
    e_inst=E_INST,
)


with torch.no_grad():
    token_ids = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt")

    output_ids = model.generate(
        token_ids.to(model.device),
        max_new_tokens=768,
        pad_token_id=tokenizer.pad_token_id,
        eos_token_id=tokenizer.eos_token_id,
    )
output = tokenizer.decode(output_ids.tolist()[0][token_ids.size(1) :], skip_special_tokens=True)
print(output)

ローカルで実行する際は、かなりのリソースを消費するので、Google Colab ProでA100GPUを使用するか、有志の方が作成したGPTQモデルを使用することをお勧めします。

それでは実際に使っていきましょう!

ELYZA-japanese-CodeLlama-7bの推しポイントであるコード生成能力と日本語能力を検証

今回比較するモデルの概要の比較です。

ELYZA-japanese-CodeLlama-7bGPT-3.5GPT-4
パラメーター数7B175B7B
トークン数2,048(5,000文字)
開発会社ELYZAOpenAIELYZA
商用利用
ライセンスLlama 2 Community License プロプライエタリソフトウェアLlama 2 Community License
日本語対応

比較検証では以下の入力を行い、出力結果を比較します。

モンテカルロ法で円周率を求めるコードをTypeScriptで書いてください。
フィボナッチ数列を100以上の数値が出るまで出力するコードを書いてください。
以下のコードについて日本語で説明してください。

import random

# じゃんけん判定関数
def judge():

    # じゃんけんの手のリスト
    hand = ["グー", "チョキ", "パー"]

    # プレイヤーの手を入力
    x = input("手を選んでください\n0:グー, 1:チョキ, 2:パー\n\n")

    x = int(x)

    # コンピュータの手をランダムに決定
    y = random.randint(0, 2)

    # 双方の出した手を表示
    print("\nあなたの手:{}".format(hand[x]))
    print("コンピュータの手:{}\n".format(hand[y]))

    score = (x - y + 3) % 3
    if score == 0:
        j = "引き分けです"
    elif score == 1:
        j = "あなたの負けです"
    else:
        j = "あなたの勝ちです"
    print(j)

# 勝敗を表示
judge()

それでは早速検証していきましょう!

モンテカルロ法

ELYZA-japanese-CodeLlama-7b-instruct

以下はTypeScriptで書かれたモンテカルロ法で円周率を求めるコードです。


function calculatePi() {
 let insideCircleCount = 0;
 for (let i = 0; i < 100000; i++) {
   const x = Math.random();
   const y = Math.random();
   const distanceFromCenter = Math.sqrt(x * x + y * y);
   if (distanceFromCenter < 1) {
     insideCircleCount++;
   }
 }
 return 4 * insideCircleCount / 100000;
}

console.log(calculatePi());
このコードは、100,000回のモンテカルロ法の実行結果を用いて円周率を計算しています。

ELYZA-japanese-Llama-2-7b-instruct

モンテカルロ法で円周率を求めるコードをTypeScriptで記述します。

まず、モンテカルロ法とは何かについて説明します。モンテカルロ法とは、確率的な問題を解くための手法の一つです。確率的な問題とは、出目の組み合わせの個数を求めるような問題を指します。モンテカルロ法は、確率的な問題を回数を繰り返し行うことで、値を近似値として求める手法です。

以下は、TypeScriptで記述したモンテカルロ法で円周率を求めるコードです。

function monteCarlo(numTrials: number, func: (number) => number): number {
   let total: number = 0;
   for (let i = 0; i < numTrials; i++) {
       let result = func(i);
       total += result;
   }
   return total / numTrials;
}

function monteCarloForCircle(numTrials: number): number {
   return monteCarlo(numTrials, (i: number) => i * i);
}

console.log(monteCarloForCircle(1000)); // 3.141592653589793

上記のコードでは、モンテカルロ法を使用して円周率を求めています。モンテカルロ法では、numTrials回の繰り返しを行います。そのため、monteCarloForCircle関数では、numTrialsを1

GPT-3.5

モンテカルロ法を使用して円周率を求める TypeScript コードは以下のようになります。このコードは、ランダムな点を円の内部にランダムにプロットし、その割合から円の面積を推定して円周率を計算します。

typescript

function estimatePi(numSamples: number): number {
  let insideCircle = 0;

  for (let i = 0; i < numSamples; i++) {
    const x = Math.random();
    const y = Math.random();

    // ランダムに生成した点 (x, y) が円の内部にあるかどうかをチェック
    if (x * x + y * y <= 1) {
      insideCircle++;
    }
  }

  // 円の内部にプロットされた点の割合を計算して円周率を推定
  const piEstimation = (insideCircle / numSamples) * 4;

  return piEstimation;
}

const numSamples = 1000000; // サンプル数を適宜調整
const estimatedPi = estimatePi(numSamples);
console.log(`Estimated Pi: ${estimatedPi}`);

このコードでは、estimatePi 関数がランダムな点を生成し、円の内部にあるかどうかを判定して、円周率を推定します。サンプル数 (numSamples) を増やすことで、より正確な推定が得られる可能性が高まります。

生成されたコードに関しては、ELYZA-japanese-Llama-2-7b-instructのみ正しい結果が得られないコードが生成されました。

コードの一番最後に、コードを実行した際の出力が書かれているようですが、実際に実行しても同様の結果は得られないので悪質ですね。

一方、コードの説明やモンテカルロ法の説明は、ELYZA-japanese-Llama-2-7b-instructが最も詳細に書かれており、ELYZA-japanese-CodeLlama-7b-instructが最もシンプルな説明でした。

この結果からも、ELYZA-japanese-CodeLlama-7b-instructはコード生成・補完に特化したモデルということがわかります。

フィボナッチ数列

ELYZA-japanese-CodeLlama-7b-instruct

以下はフィボナッチ数列を100以上の数値が出るまで出力するコードです。


n = 0
a = 0
b = 1
while b < 100:
   n = a + b
   print(n)
   a = b
   b = n
このコードは、フィボナッチ数列の最初の2つの数値を用いて、それ以降の数値を計算しています。

ELYZA-japanese-Llama-2-7b-instruct

フィボナッチ数列とは、前の2つの数値の合計からなる数列のことです。
例えば、1、1、2、3、5、8、13、21、34、55、89、144、233、377、610、987、1597、2584、4181、6735、10946、17611、28457、46153、75937、121683、196833、314117、510271、821437、1332631、2149383、3422533、5524197、8994911、14443263、24531008、39082516、60227020、99999999のようになります。

以下のようにfor文を用いて、100以上の数値が出るまで繰り返します。


for i in range(1, 101):
   if fibonacci_series[i] > 100:
       break
   print(fibonacci_series[i])

GPT-3.5

以下は、Pythonでフィボナッチ数列を計算し、100以上の数値が出るまで出力するコードの例です。

python

# フィボナッチ数列を計算する関数
def fibonacci(n):
    if n <= 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fibonacci(n-1) + fibonacci(n-2)

# フィボナッチ数列を100以上の数値が出るまで出力
n = 0
while True:
    fib = fibonacci(n)
    if fib > 100:
        break
    print(fib)
    n += 1

このコードは、fibonacci 関数を定義して、指定されたインデックスのフィボナッチ数を計算します。そして、while ループを使用して、100以上の数値が出るまでフィボナッチ数列を計算し、出力します。ループは条件を満たすまで続けられます。
このコードを実行すると、100以上の数値が出るまでのフィボナッチ数列が表示されます。

結果は、ELYZA-japanese-CodeLlama-7b-instructのみが私の意図した出力をするコードを生成してくれました。

他2つは、89までしか出力しないコードだったので、入力の意図を理解しきれていません。

この結果だけ見れば、ELYZA-japanese-CodeLlama-7b-instructはGPT-3.5より精度の高い出力をすることが出来るようです。

じゃんけん

ELYZA-japanese-CodeLlama-7b-instruct

このコードは、プレイヤーとコンピュータがじゃんけんをするという内容です。以下に説明します。

まず、最初に、じゃんけんに用いる手のリストを作成しています。このリストには、「グー」、「チョキ」、「パー」の3つの手が含まれています。

次に、プレイヤーの手を入力するための入力文を表示しています。ここでは、0から2までの数値を入力して、それに対応する手を選択するように指示しています。

次に、コンピュータの手をランダムに決定しています。ここでは、randomモジュールのrandint関数を用いて、0から2までの整数を生成しています。

そして、双方の出した手を表示しています。ここでは、前述の手のリストを用いて、数値から実際の手を取得しています。

最後に、プレイヤーの勝敗を判定しています。ここでは、手の数値の差を取った値をscoreに代入しています。

ここで、scoreが0のときは引き分け、1のときはプレイヤーの負け、それ以外の場合はプレイヤーの勝ちとなります。

ELYZA-japanese-Llama-2-7b-instruct

このプログラムは、2人で順番に手を出して、勝敗を競うゲームを表示するものです。

まず、プレイヤーはじゃんけんの手を選択します。選択肢は「グー」、「チョキ」、「パー」の3つです。
選択した手を入力してくると、プログラムはその手をランダムに選択した手と比べて、勝敗を表示します。勝ったら「勝ち」、負けたら「負け」、引き分けだったら「引き分け」と表示します。

ただし、このプログラムではじゃんけんではなく、手をランダムに決定する方法を使っています。
この方法は、人間がランダムに手を決めるよりも、コンピュータの方が有利になるように設計されています。

GPT-3.5

このコードは、コンピュータとじゃんけんをするシンプルなプログラムです。以下に、コードの各部分を説明します。

import random:Pythonの組み込みモジュール random をインポートしています。これを使用してランダムな数を生成します。

def judge()::judge という名前の関数を定義しています。この関数は、じゃんけんのゲームを実行し、勝敗を判定する役割を担います。

hand リスト:hand というリストに、じゃんけんの手(グー、チョキ、パー)を格納しています。

プレイヤーの入力:プレイヤーに対して、0から2の数値を入力してもらいます。それぞれ、0は「グー」、1は「チョキ」、2は「パー」を表します。入力は input() 関数を使用して受け取り、整数に変換しています。

コンピュータの手をランダムに選択:random.randint(0, 2) を使用して、コンピュータの手をランダムに選択しています。0から2の間のランダムな整数がコンピュータの手を表します。

プレイヤーとコンピュータの手を表示:選択したプレイヤーとコンピュータの手を表示します。

勝敗の判定:score という変数に、じゃんけんの勝敗を判定するための数値を計算します。計算式 (x - y + 3) % 3 は、じゃんけんのルールに基づいて、引き分け(0)、プレイヤーの負け(1)、プレイヤーの勝ち(2)を判定します。

勝敗の表示:判定結果に基づいて、勝敗を表示します。引き分けの場合は「引き分けです」、プレイヤーの負けの場合は「あなたの負けです」、プレイヤーの勝ちの場合は「あなたの勝ちです」と表示されます。

judge():プログラムの最後で、judge 関数を呼び出してゲームを実行します。プレイヤーが手を選んで、コンピュータとのじゃんけんの結果が表示されます。

このコードは、シンプルなじゃんけんゲームの動作を示しており、プレイヤーが手を選んでコンピュータと対戦し、勝敗を判定する簡単なプログラムです。

これはどのモデルも正しくコードの説明をしてくれています。

ただ、説明の分かりやすさで言えば、各項目について箇条書きで書かれているので、頭一つ抜けている感じがしますが、モデルの規模の違いを考えれば、ELYZAのモデルはかなり優秀であることに違いありません。

ここまでの検証結果をまとめると、ELYZA-japanese-CodeLlama-7b-instructは、ELYZA-japanese-Llama-2-7b-instructに比べ、コード生成・補完に特化したモデルであることが実証されました。

また、日本語能力、説明能力も十分で、コード生成も含めた総合的な性能は、GPT-3.5とほぼ同等であると言えるでしょう。

このモデルを活用すれば、コーディングタスクを効率化出来ることは間違いないです!

まとめ

ELYZA-japanese-CodeLlama-7bは、ELYZA社がCodeLlama-7b-Instructをベースに日本語の追加事前学習を行って開発したコード生成・補完に特化した日本語LLMです。

このモデルの追加事前学習は、OSCARやWikipediaなどの日本語データを約180億トークン使用されており、日本語の入力はもちろん、出力したコードの解説も日本語で行うことができます。

実際に使ってみた感想は、GPT-3.5とほぼ同等の性能を示し、かなり構成のであることが伺えました。

このモデルを活用することによって、誰でも簡単にネオのような天才プログラマーになれるかもしれません。

この記事を読んで気になった方は是非試してみてください!

サービス紹介資料

生成系AIの業務活用なら!

・生成系AIを活用したPoC開発

・生成系AIのコンサルティング

・システム間API連携

最後に

いかがだったでしょうか?

弊社では

・マーケティングやエンジニアリングなどの専門知識を学習させたAI社員の開発
・要件定義・業務フロー作成を80%自動化できる自律型AIエージェントの開発
・生成AIとRPAを組み合わせた業務自動化ツールの開発
・社内人事業務を99%自動化できるAIツールの開発
ハルシネーション対策AIツールの開発
自社専用のAIチャットボットの開発

などの開発実績がございます。

まずは、「無料相談」にてご相談を承っておりますので、ご興味がある方はぜひご連絡ください。

➡︎生成AIを使った業務効率化、生成AIツールの開発について相談をしてみる。

生成AIを社内で活用していきたい方へ

「生成AIを社内で活用したい」「生成AIの事業をやっていきたい」という方に向けて、生成AI社内セミナー・勉強会をさせていただいております。

セミナー内容や料金については、ご相談ください。

また、弊社紹介資料もご用意しておりますので、併せてご確認ください。

投稿者

  • ゆうや

    ロボット工学専攻。 大学時代は、対話ロボットのための画像キャプションの自動生成について研究。 趣味は、サウナとドライブ。

  • URLをコピーしました!
  • URLをコピーしました!
目次