ローカルなLLMを利用して日本語要約を行い、GPTで自動評価してみた(ガバガバ検証)
雑に実験設定したらちょっと残念な結果になりました......
また、この記事はLLM Advent Calender 2023 シリーズ2の記事です。
Contents
まとめ
- ローカルLLMを使って日本語要約してみた
- 作成した要約をGPTと人手(自分)評価で評価してみた
- Generation Configの重要性(せめてHuggingface-hubに記載の値を使うべき)
概要と背景
振り返ってみると2023年はLLM関連が非常にホットなトピックだったような印象があります。
LLMにプロンプトを投げるといい感じの出力を出してくれるので、私自身困ったらGPT、みたいなそこそこ頼れるアシスタントとしてよく使っています。
LLMができることの一つとして文書要約があると思います。
GPT-3.5やGPT-4は「次の文書を要約してください。{文書}」みたいな入力をいれるだけでいい感じに要約してくれてすごいなと小学生並みの感想にはなりますが思っています。
2023年は日本国内企業もLLMの開発を盛んに行い、様々なモデルが発表されました。
気になってくるのはその性能ですよね。
Stability AI版のlm-evaluation-harness、Rakuda benchmark、llm-jp-evalなど、様々な評価ツール、データセットなどが公開され、数値として様々な評価結果が報告されています。
すごく参考になる一方で、やっぱり自分のほうでもどんな出力が得られるのか確認したいなと思いまして、今回日本語要約で精度検証をしてみました。
ローカルLLMを使って日本語要約を実施
検証モデルとその設定
今回は以下のモデルに関して検証を行っています(並び順は適当です)。
- Xwin-LM/Xwin-LM-7B-V0.2
- Xwin-LM/Xwin-LM-13B-V0.2
- meta-llama/Llama-2-7b-chat-hf
- meta-llama/Llama-2-13b-chat-hf
- mistralai/Mistral-7B-Instruct-v0.1
- elyza/ELYZA-japanese-Llama-2-7b-fast-instruct
- stabilityai/japanese-stablelm-instruct-gamma-7b
- stabilityai/japanese-stablelm-instruct-beta-7b
- stabilityai/japanese-stablelm-instruct-ja_vocab-beta-7b
- llm-jp/llm-jp-13b-instruct-full-jaster-dolly-oasst-v1.0
- matsuo-lab/weblab-10b-instruction-sft
- rinna/youri-7b-instruction
- cyberagent/calm2-7b-chat
検証対象のモデルは、
- Instruction Tuning済みのモデル
- A100一枚の環境で検証するため、fp16、bf16で動作するモデル
という観点で適当に集めました。
ちなみに検証環境はGoogle Colabです。
使用したnotebookは[こちら]()。
また、検証時のプロンプト(チャットテンプレート)は各モデルについてHuggingface-hubに記載されているものを使用しています。
(モデルごとに全然違うのちょっと大変でした......Huggingfaceの tokenizer.apply_chat_template
がもっと出回ってほしい......)
また、Generation Configですが、なんと今回はすべてデフォルト値を使用しています!
理由としては単純に個々のモデルについて調べて設定するのを嫌がった、という完全にこちらがさぼっただけになります......
(一応の思想としては、優れたモデルはパラメータ適当でもなんとかなるだろうし、すべてのモデルでパラメータチューニングさぼれば公平な比較だろう、ぐらいの感覚ではありました。)
結論を述べると、一部のモデルでそもそも要約がうまくできない結果となり、原因の一端としてこのGeneration Configが考えられるかもしれません。
検証データと評価方法
今回は検証データとして既存の日本語要約データを使っていません。
理由として、データリークの恐れがあったことが大きいです。
じゃあどうやって要約の精度評価をするかですが、今回は簡単に11件の文書をLLMに要約してもらい、その要約結果をGPTで自動評価します。
具体的にはGPT-4に要約対象の文書と要約結果を与えて、「consistency」「relevance」「fluency」「coherence」の4項目を1-5の5段階評価してもらう、というものになっています。
Human-like Summarization Evaluation with ChatGPT. [link]によると、データセットにもよりますが、GPT-3.5での評価は人手評価とそこそこ相関するとのことです。
今回使用した評価用プロンプトはこちらです。
評価プロンプト
evaluation_prompt = "ニュース記事に対する日本語要約文書の品質を評価してください。"\
"次の4つの評価項目に関して評価してください: relevance faithfulness fluency coherence"\
"relevance は要約がどれだけ記事の要点を捉えているかを表しています。記事の重要な内容のみが要約に含まれているかどうか確認してください。"\
"faithfulness は要約中の事実が記事中の事実と一致しているかを表しています。要約がすべての事実を正確に再現しているか、事実と異なる情報を述べていないか確認してください。"\
"fluency は個々の文がよく書けているか、文法的に正しいかどうかを表しています。"\
"coherence は全ての文がまとまっていて、自然に思えるかどうかを表しています。全体としての要約の品質を確認してください。"\
"各項目の評価は1(最悪)から5(最高)までの5段階評価をしてください。\n"\
"ニュース記事: {}\n"\
"要約文書: {}
一応こちらの論文は英語要約に関する話なので、今回は日本語要約についても同様の傾向がみられるか検証するため、人手評価も簡単に実施し、相関を計ってみたいと思います。
(作業者は自分だけなので、あくまで参考値的にはなります。)
また、前述の通りデータリークを考慮して、今回使用する11件の文書は2023年に投稿されたニュース記事を使用しています。
(11件の選択方法は完全に自分の好みで選んでます。)
作成した要約を評価
あくまで今回は各LLMを要約に使った際にどのぐらいの精度になったのかを述べるだけなので、LLMの動かし方などは割愛し、さっそく評価結果を載せたいと思います。
GPTで自動評価してみた
GPT-4での評価結果は次の通りです。
model | relevance | consistency (faithfulness) | fluency | coherence | average |
---|---|---|---|---|---|
Xwin-LM-7B-V0.2 | 4.9091 | 4.9545 | 4.9545 | 5.0000 | 4.9545 |
Xwin-LM-13B-V0.3 | 4.9545 | 4.8636 | 4.8636 | 4.9545 | 4.9091 |
Llama-2-7b-chat-hf | 4.0455 | 3.5455 | 4.8182 | 4.5455 | 4.2386 |
Llama-2-13b-chat-hf | 4.3636 | 4.2273 | 5.0000 | 4.8182 | 4.6023 |
Mistral-7B-Instruct-v0.1 | 4.5455 | 4.1818 | 4.7273 | 4.3636 | 4.4545 |
ELYZA-japanese-Llama-2-7b-fast-instruct | 4.7273 | 4.5909 | 5.0000 | 4.7273 | 4.7614 |
japanese-stablelm-instruct-gamma-7b | 3.8182 | 4.3182 | 3.9091 | 3.2727 | 3.8295 |
japanese-stablelm-instruct-beta-7b | 4.4545 | 4.5455 | 4.6364 | 4.4545 | 4.5227 |
japanese-stablelm-instruct-ja_vocab-beta-7b | 4.4091 | 4.1818 | 4.6364 | 4.3182 | 4.3864 |
llm-jp-13b-instruct-full-jaster-dolly-oasst-v1.0 | 1.0000 | 1.0000 | 2.0000 | 2.0000 | 1.5000 |
weblab-10b-instruction-sft | 4.7273 | 4.5455 | 5.0000 | 4.8182 | 4.7727 |
youri-7b-instruction | 3.8182 | 4.3636 | 5.0000 | 4.3636 | 4.3864 |
calm2-7b-chat | 4.5455 | 4.2727 | 5.0000 | 4.5000 | 4.5795 |
それぞれの項目を見てみると、relevanceでは、Xwinから順に大半のモデルが4以上となっています。
つまり、大半のLLMはそれなりに入力文書と関連した内容を要約にできている、ということのようです。
consistency(faithfulness)についてですが、こちらもrelevanceと同様に大半のモデルが4になっています。いわゆる忠実性についても大半のLLMは満たしていそうです。
生成した要約のfluencyについてですが、こちらはなんと複数のLLMで11件すべて5を獲得しています。
ほかのモデルに関しても大半が4.5以上となっており、出力された日本語の流暢性も問題なさそうです。
最後に出力された要約のcoherenceですが、こちらも大半のモデルが4以上となっています。
以上の結果をまとめてみると、GPT-4によると、2023年のニュース記事要約11件においては、大半のモデルは「relevance」「consistency」「fluency」「coherence」のどれも非常に高いレベルで達成できる、ということがわかります。
一方で、いくつかのモデル、特に「llm-jp-13b-instruct-full-jaster-dolly-oasst-v1.0」は軒並み低い結果となっていますが、これは何が起きているのでしょうか。
それを確かめるためにも、前述の通りGPT-4ではなく人手でも同様に4項目について5段階評価を実施しました。
人手で評価してみた
人手評価の結果が次の通りです。
model | relevance | consistency (faithfulness) | fluency | coherence | average |
---|---|---|---|---|---|
Xwin-LM-7B-V0.2 | 3.0000 | 4.2000 | 3.5000 | 3.0000 | 3.4250 |
Xwin-LM-13B-V0.2 | 3.6000 | 5.0000 | 4.5000 | 4.1000 | 4.3000 |
Llama-2-7b-chat-hf | 3.6000 | 3.1000 | 1.4000 | 4.8000 | 3.2250 |
Llama-2-13b-chat-hf | 3.7000 | 4.2000 | 3.0000 | 4.5000 | 3.8500 |
Mistral-7B-Instruct-v0.1 | 3.3000 | 4.2000 | 3.4000 | 3.5000 | 3.6000 |
ELYZA-japanese-Llama-2-7b-fast-instruct | 4.2000 | 4.5000 | 4.4000 | 4.2000 | 4.3250 |
japanese-stablelm-instruct-gamma-7b | 3.1000 | 4.5000 | 3.5000 | 3.1000 | 3.5500 |
japanese-stablelm-instruct-beta-7b | 2.8000 | 4.7000 | 3.7000 | 3.6000 | 3.7000 |
japanese-stablelm-instruct-ja_vocab-beta-7b | 3.3000 | 4.5000 | 4.0000 | 4.0000 | 3.9500 |
llm-jp-13b-instruct-full-jaster-dolly-oasst-v1.0 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 |
weblab-10b-instruction-sft | 3.2000 | 4.8000 | 4.3000 | 4.5000 | 4.2000 |
youri-7b-instruction | 3.4000 | 5.0000 | 4.5000 | 4.6000 | 4.3750 |
calm2-7b-chat | 3.7000 | 4.5000 | 4.0000 | 3.6000 | 3.9500 |
いったんそれぞれの項目を見ていきます。
relevanceについてですが、Elyzaモデルが唯一4を超えていて、大半のモデルは3点台となりました。
5段階評価の3点台なので、すごくいいわけではないが、そこそこ良い、が大半のようです。
consistency(faithfulness)については大半のモデルが4を超える結果となりました。
要約結果の忠実性は人手評価でも十分良さそうです。
fluencyについてなのですが、半分程度が4以上となり、GPT-4の結果と比べて少し低めとなりました。
面白い点としては、日本語の語彙を明確に含むようにしていないモデルのほうが低めの傾向になっていそうです。(ただしXwin-LM-13B-V0.2は不明)
coherenceについても同様に半数程度が4以上となりました。
以上から、GPT-4の評価と比べると人手評価の結果は全体的に低めとなりました。
特にrelevanceは顕著に低い結果です。
現状、人手評価といっても自分ひとりで評価したため、あくまで自分が低めに評価しすぎ、という可能性もあります。
このあたりの乖離について、より精巧な人手評価を行い明らかにしてみたいところです。
ちなみにllm-jpモデルについてなのですが、人手評価でも一貫して低い結果となっています。
これは何が起きているかというと、llm-jpモデルは要約を生成できていませんでした。
下記に実際のLLMの出力例を載せておきます。
11件すべてについて以下のような出力を行っていたため、自分はすべての項目で1を付けた次第です。
llm-jpモデルの出力例
/*
* Copyright (c) 2018 THL A29 Limited, a Tencent company. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the \"License\");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
namespace TencentCloud.Vod.V20180717.Models
{
using Newtonsoft.Json;
using System.Collections.Generic;
using TencentCloud.Common;
public class DescribeVideoDetailResponse : AbstractModel
{
///
/// 视频详情列表
///
[JsonProperty(\"VideoDetailList\")]
public VideoDetail[] VideoDetailList{ get; set; }
///
/// 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。
///
[JsonProperty(\"RequestId\")]
public string RequestId{ get; set; }
///
/// For internal usage only. DO NOT USE IT.
///
internal override void ToMap(Dictionary map, string prefix)
{
this.SetParamArrayObj(map, prefix + \"VideoDetailList.\", this.VideoDetailList);
this.SetParamSimple(map, prefix + \"RequestId\", this.RequestId);
}
}
}
ぱっと思いつく原因としては、「Generation Configが不適切」や「そもそも長文対応していない」などが挙げられます。
せめてGeneration ConfigをHuggingface-hubの値にしておけば前者は多少軽減できたのですが.......
次に似たことをやるかどうかはわかりませんが、この辺りは注意しておいたほうが良さそうです。
GPT評価と人手評価の相関を算出
GPT-4と人手評価の結果が出たので、それらの相関を見てみます。
スピアマンの相関係数は次の通りです。
relevance | consistency (faithfulness) | fluency | coherence | |
---|---|---|---|---|
sample単位 | 0.343 | 0.619 | 0.421 | 0.282 |
system単位 | 0.244 | 0.658 | 0.492 | 0.343 |
相関係数の解釈は人によりけり、タスクによりけりだと思いますが、個人的には今回の要約評価タスクだともう少し欲しいなという印象です。
特にrelevanceとcoherenceはちょっと物足りない感が......
今回GPT-4に投げるプロンプトは、先行研究のHuman-like Summarization Evaluation with ChatGPT.で使用されたものを日本語化したものなので、もう少し工夫の余地はありそうです。
確かにGPT-4を使えばreference summary無しで要約評価ができそうなのは魅力ですが、現状だとざっくりスコアを出したいときに使うようなもの、という印象です。
各LLMの要約圧縮率
今回は適当に要約を生成するようにLLMにプロンプトを入れているのですが、割とモデルごとに出力される要約長が異なることを確認したので共有します。
average | median | std | |
---|---|---|---|
Xwin-LM-7B-V0.2 | 0.814 | 0.862 | 0.133 |
Xwin-LM-13B-V0.2 | 0.757 | 0.868 | 0.294 |
Llama-2-7b-chat-hf | 0.401 | 0.361 | 0.166 |
Llama-2-13b-chat-hf | 0.277 | 0.234 | 0.145 |
Mistral-7B-Instruct-v0.1 | 0.557 | 0.535 | 0.347 |
ELYZA-japanese-Llama-2-7b-fast-instruct | 0.355 | 0.206 | 0.303 |
japanese-stablelm-instruct-gamma-7b | 2.62 | 1.76 | 2.71 |
japanese-stablelm-instruct-beta-7b | 0.874 | 0.987 | 0.576 |
japanese-stablelm-instruct-ja_vocab-beta-7b | 0.652 | 0.152 | 1.15 |
llm-jp-13b-instruct-full-jaster-dolly-oasst-v1.0 | 0.864 | 0.588 | 0.681 |
weblab-10b-instruction-sft | 0.521 | 0.549 | 0.39 |
youri-7b-instruction | 0.178 | 0.0608 | 0.29 |
calm2-7b-chat | 0.445 | 0.462 | 0.367 |
上記の表は圧縮率に関するものです。
averageが入力記事と出力要約の単語数比をsampeleで算術平均したもの、medianが中央値、stdが標準偏差です。
averageの太字は0.5以下のものを指しています(0.5は適当ですが、要約には文書を半分くらいにはして欲しいかなと思いその値に設定しました)。
ちなみにjapanese-stablelm-instruct-gamma-7b
は平均して圧縮率が2.62倍となっていて、入力記事と比べて要約が長くなっていることがわかります。
何が起きていたかというと、n-gramのrepetationがいくつかのsampleで発生していて、それを残していた、ということになっています(stdの通り、repetationが発生しない場合もあります)。
まとめ
いくつかのLLMを使って日本語要約を実施して、その出力をGPT-4および人手で評価してみました。
やってみると現状公開されているモデル(一部)でもニュース記事要約タスクなら普通に動きそうな印象でした。
GPT-4と人手評価の相関も計測してみましたが、評価の観点においてはちょっと弱い相関となりました。
今のところGPT-4での評価はざっくりスコアを求める用かもしれません(人手評価のほうも一人なのでちょっと怪しいです)。
また、LLMごとに入力記事に対して出力される要約長が異なることも確認できました。
用途に合わせてモデルを選択するなどが重要かもしれません。
今回はGeneration Configでさぼってしまった点、人手評価がガバガバな点で検証としていまいちなものになってしまいました。
個人でもっといい感じにできる検証設定を思いついたらまた何かLLMで遊んでみようと思います。