続々(おかわり)・ChatGPTで行う述語項構造解析(gpt-4oを試してみた編)
枕詞/前回からの引き
(イメージ動画: 餓狼伝説3 ~遙かなる戦い~ SNK 1995)
ワタクシは再びこの街(プロンプトエンジニアリング界隈)に…(ChatGPT)伝説は終わらない…
202405にgpt-4oがリリースされて、生成AI界隈で(ちょい)話題になっています(202405~202406現在)。ワタクシはこれまで主にgpt-3.5-turboでChatGPTさんの述語項構造解析の性能をテストしていたのですが、gpt-4でもSotaに迫るような劇的な性能向上はしなさそうなので、5記事のみをGPT4-turboで実験して512記事での実験は行っていないんですよね(参照:「続・ChatGPTで行う日本語述語項構造解析:遥かなるプロンプトエンジニアリング編 - めいふの備忘ログ」)。
でも、タイミングよくgpt-4oがリリースされたわけですし、せっかくなので「京都大学ウェブ文書リードコーパス(KWDLC)」のdevの5記事で実験してみたのです。結果は以下のようになりました。右端の列が今回新たに行った gpt-4oでの実験結果です(その他の列は前回までの実験結果です)。
番号 | プロンプト名 | GPT3.5-turbo(512記事) | GPT3.5-turbo(5記事) | GPT-4-turb(5記事) | GPT-4o(5記事) | |
1 | zero-shot-simple | 0.183 | 0.122 | 0.148 | 0.203 | |
2 | zero-shot-with-system-message | 0.18 | 0.134 | 0.214 | 0.187 | |
3 | zero-shot-standard | 0.211 | 0.208 | 0.275 | 0.285 | |
4 | zero-shot-ss | 0.177 | 0.135 | 0.172 | 0.22 | |
5 | zero-shot-with-knp | 0.262 | 0.137 | 0.229 | 0.307 | |
6 | zero-shot-modify-knp | 0.406 | 0.264 | 0.333 | 0.408 | |
7 | order-sequence | 0.216 | fail | fail | 0.457 | |
8 | few-shot-simple | 0.272 | 0.1875 | 0.274 | 0.348 | |
9 | few-shot-with-cheering | 0.274 | 0.247 | 0.214 | 0.34 | |
10 | few-shot-semantic-search | 0.343 | 0.178 | 0.36 | 0.314 | |
11 | chain-of-thought | 0.228 | 0.108 | 0.184 | 0.25 | |
12 | chain-of-thought-mod-knp | 0.242 | 0.295 | 0.34 | 0.26 | |
13 | paraphrase | 0.179 | fail | fail | 0.23 | |
14 | reading | 0.191 | fail | fail | 0.22 | |
15 | summary | 実験なし | 0.212 | 実験なし | 0.33 | |
16 | translation | 0.170 | fail | fail | 0.183 | |
17 | compare_translation | 0.122 | fail | fail | 0.176 | |
- | KNP | 0.411 | 0.411 | 0.411 | N/A |
え?流れ変わってきてない?
全体的に精度が上がってますね。特にorder-sequenceが伸びています。なんで今まで本気出してくれなかったの? それともこのgpt-4oでの精度は偶然なのかな? 他、few-shot-simpleがfew-shot-semantic-searchを凌いでいます。前回の備忘ログ(リンク)で類似文検索するとfew-shot prompt の精度が上がるかも、みたいなことを書きましたが、それは偶然だったのかもしれません。readingなどの読解系は相変わらずダメっぽいですが。 gpt-4oは(傾向として)gpt-4-turboよりいいように感じられます。
本備忘ログの目的
では、さらに再実験して前回の結論が本当に正しいのか、それともgpt-4oによりChatGPTの新しい可能性が切り開かれているか確かめたいと思います。というわけで、前回の備忘ログで一区切りつけたChatGPTとプロンプトエンジニアリングのお話ですが、少しだけ追加で実験してみることにしました。gpt-4oを用いて「京都大学ウェブ文書リードコーパス(KWDLC)」のdev 512記事で日本語述語項構造解析の実験を行います!
MMR(Meihuno Memorandum Reportage)、緊急出動だッ!
元ネタ情報:
kc.kodansha.co.jp
gpt–4oのコストの話(お金の話)
でも、ちょっと待ってください。gpt-4ってgpt-3-turboに比べてお金がかかるイメージです。全ての17種類のプロンプトの実験を回してン万円とかになったら、それは厳しいのです。ワタクシは貧乏なんです。ワタクシは貧乏なのですよ(2回目)。この世は銭ズラ(銭ゲバ)。LLMを動かすにもゼニがかかるズラ! そこで、gpt-4oで実験を行った場合のコストを見積もってみます。お金かかりすぎそうなら実験は中止にして寝ます。寝てしまいます。
まず、OpenAIのサイトを確認してみましょう。テキスト処理に関しては、以下のお値段です。
https://openai.com/api/pricing/
(テキストのお値段のみを抜粋)>
昔のgpt-4に比べればずいぶん安くなりましたね。gpt-4-turboのお値段の半分です。では、次に17種類のプロンプトのgpt-3.5-turbo時の消費トークン数から512記事を実施した場合のコスト(ドル)を見積もってみました。summaryは512記事での実験をしていないのでわかりません。
プロンプト番号 | プロンプト名 | inputコスト(トークン数) | outputコスト(トークン数) | トータルコスト(米ドル) |
1 | zero-shot-simple | 1.167(233337 tokens) | 1.158(77219 tokens) | 2.325 |
2 | zero-shot-with-system-message | 1.383(276617 tokens) | 1.211(80738 tokens) | 2.594 |
3 | zero-shot-standard | 2.211(442163 tokens) | 1.42(94682 tokens) | 3.631 |
4 | zero-shot-ss | 1.309(261824 tokens) | 1.152(76799 tokens) | 2.461 |
5 | zero-shot-with-knp | 1.542(308423 tokens) | 1.231(82067 tokens) | 2.773 |
6 | zero-shot-modify-knp | 1.602(320438 tokens) | 1.134(75629 tokens) | 2.736 |
7 | order-sequence | 13.024(2604834 tokens) | 11.564(770946 tokens) | 24.588 |
8 | few-shot-simple | 2.585(516921 tokens) | 1.19(79366 tokens) | 3.775 |
9 | few-shot-with-cheering | 2.766(553108 tokens) | 1.123(74867 tokens) | 3.889 |
10 | few-shot-semantic-search | 2.551(510171 tokens) | 1.215(80995 tokens) | 3.766 |
11 | chain-of-thought | 6.139(1227709 tokens) | 1.131(75398 tokens) | 7.27 |
12 | chain-of-thought-mod-knp | 9.355(1871007 tokens) | 1.177(78476 tokens) | 10.532 |
13 | paraphrase | 0.818(163620 tokens) | 0.878(58550 tokens) | 1.696 |
14 | reading | 1.558(311642 tokens) | 1.895(126308 tokens) | 3.453 |
15 | summary | unknown | unknown | unknown |
16 | translation | 1.489(297831 tokens) | 2.401(160071 tokens) | 3.89 |
17 | compare_translation | 2.681(536273 tokens) | 3.589(239253 tokens) | 6.27 |
512記事を実験するのに(summaryを4~5ドルとしてどんぶり勘定で)合計で85.649ドルぐらいです。1ドル156円だとすると13362円なりなのです。まあ、こんなもんか。払えないことないですね。ちょっとお高いと思いますが。1万3千円払って全部実験してやっぱり精度はいまいちでしたってなったら泣いちゃいそうです。あと上記の見積もりはgpt-3.5-turbo時のトークン数に基づきます。gpt-4oが「饒舌なLLM」だとすると見積もりコストを上振れすると予想されます。なので、gpt-4oの実験は以下の精鋭7プロンプトに厳選して行うことにします。
プロンプト名 | コスト見積もり | 実験の意図 |
zero-shot-simple | 2.325 | ベースラインとして |
zero-shot-starndard | 3.631 | ベースラインとして |
zero-shot-modify-knp | 2.736 | 予備実験で精度が高いので確認 |
order-sequence | 24.58 | 予備実験の精度高いので確認(本命) |
few-shot-simple | 3.775 | few-shotのベースライン |
few-shot-simple-semantic-search | 3.766 | 類似文few-shotの可能性を確かめる |
summary | 5? | summaryの本当の実力が見たい |
合計46ドルぐらい。1ドル156円として日本円で7176円か。まあ、このくらいなら、許容範囲です。30ドルだけ追加して実験を回してみましょう。
OpenAIの自分のアカウントに30ドルをプラスして残高50ドルにしました。この戦力で再実験を戦っていきます。
では、京都大学ウェブ文書リードコーパス(KWDLC)」のdev 512記事で実験を回してみましょう! 実験設定や評価方法については前回(続・ChatGPTで行う日本語述語項構造解析:遥かなるプロンプトエンジニアリング編 - めいふの備忘ログ)
前々回(ChatGPTさんと行う述語項構造解析:「ChatGPTさんにはゼロ代名詞が見えているのか?」(GPT-3.5-turbo編) - めいふの備忘ログ)の備忘ログをご参照ください。
途中経過(お金の話)
ガーン。50ドルで実験を回したら予算をショートしました。gpt-4oは出力トークンがgpt-3.5に比べて多くなっているようです。
ぐぬぬ。もう35ドル追加です。結局、1万円近く使ってしまいました…。LLMの開発はギャンブルかな…?
日本語述語項構造解析の実験結果(gpt-4o)
実験結果をまとめると以下のようになりました。数字は述語項構造解析精度(F値)です。
プロンプト名 | GPT3.5-turbo(512記事) | GPT-4o(512記事) | 所感 |
zero-shot-simple | 0.183 | 0.249 | gpt-4oはgpt-3.5に比べて精度向上 |
zero-shot-starndard | 0.211 | 0.349 | gpt-4oはgpt-3.5に比べて精度向上 |
zero-shot-modify-knp | 0.406 | 0.437 | KNPを超えた |
order-sequence | 0.216 | 0.416 | gpt-4oはgpt-3.5に比べて大幅精度向上 |
few-shot-simple | 0.272 | 0.369 | gpt-4oはgpt-3.5に比べて精度向上 |
few-shot-simple-semantic-search | 0.343 | 0.430 | やはりsimpleよりsemantic searchの方が精度高い |
summary | 実験なし | 0.289 | zero-shot-simpleよりはよいぐらい |
観察/まとめ
gpt-3.5よりgpt-4oの方が精度いいですね(小並感)。でも、結局、gpt-4oでもSOTA(F値70とか)には至りませんね。order-sequenceでプロンプトを細かくChatGPTさんとやりとりをした方が、一括でやりとりするより(zero-shot-stardard)よりも精度がよくなりました。なぜなのか? 謎です(要調査)。そして、few-shot promptでは、ランダムに例を選ぶよりsemantic search(類似文検索)した方が精度いいです。few-shot promptには、いやさ、プロンプトエンジニアリングには、まだ述語項構造解析というタスクに対して希望が残っているということです(パンドラの箱かもですが)。
結びの詞
∧ ∧ ( ・ω・) _| ⊃/(___ / └-(____/  ̄ ̄ ̄ ̄ ̄ ̄ ̄ <⌒/ヽ-、___ /<_/____/
まあでもgpt-4oでもこの程度です。gpt-5が出たら起こしてください。おやすみなさい。
補遺:日本語述語項構造解析のためのプロンプト実例集
補遺:日本語述語項構造解析のためのプロンプト実例集
本備忘ログは「続・ChatGPTで行う述語項目構造解析:遥かなるプロンプトエンジニアリング編 - めいふの備忘ログ」の補遺にあたります
ワタクシが書きました17種類の日本語述語項構造解析のためのプロンプト実例を備忘ログしておきます。加えて、「野末慎之介 (東北大)、石月由紀子、松林優一郎、坂口慶祐 (東北大/理研)、大規模言語モデルにおける日本語ゼロ照応解析能力の分析、言語処理学会2024(https://www.anlp.jp/proceedings/annual_meeting/2024/pdf_dir/A2-2.pdf)」で公開されたプロンプトも参考のためご紹介しておきます(野末さんのプロンプトは洗練されていてとても参考になりました。ありがとうございます)。
プロンプトは、こちらのテキストを解析するときのものをサンプルとして提示します。
# S-ID:w201106-0002000002-1 メンズオンリーサロンだからこそ男性のスタイルの幅やセンスは全国クラス!! # S-ID:w201106-0002000002-2 シンプル派〜ワイルド派まで、どんなジャンルのスタイルにも対応出来る技術力もKAJAの魅力。 # S-ID:w201106-0002000002-3 男性の居心地の良さを追求し、外装・内装・インテリアまでセレクト。
KWDLCの正解コーパスでの結果はこちらです。ChatGPTさんにはこの表を出力してもらうようにプロンプトを書いています(summaryは例外)。
文番号 | 述語 | 主語(subj) | 目的語(obj) | 斜格語(obl) |
1 | クラス!! | 幅、センス、サロン | - | - |
2 | 対応出来る | KAJA | - | スタイル |
2 | 魅力。 | 力 | - | - |
3 | 良さ | 居心地、男性 | - | - |
3 | 追求し、 | KAJA | 良さ | - |
3 | セレクト。 | KAJA | - | - |
では、ワタクシのプロンプトの実例を順に列挙しておきます。「message_index:0, role: user」のような行は、プロンプトで複数回のrequest/responseのやりとりをする場合があり、そのやりとりを区別するための行とそのときのAPIにセットするroleです。
- zero-shot-simple
- zero-shot-with-system-message
- zero-shot-standard
- zero-shot-ss
- zero-shot-with-knp
- zero-shot-modify-knp
- order-sequence
- few-shot-simple
- few-shot-with-cheering
- few-shot-semantic-search
- chain-of-thought
- chain-of-thought-mod-knp
- paraphrase
- reading
- summary
- translation
- compare_translation
- 付録:「大規模言語モデルにおける日本語ゼロ照応解析能力の分析」での「ゼロ照応解析実験のプロンプト」
zero-shot-simple
「zero-shot prompt。術語項構造解析をしてくれとお願いする。」を意図したプロンプトです。
message_index:0, role: user
述語項構造解析とは、文中の動詞や述語とそれに関連する要素(項)の関係を抽出するタスクです。 述語項構造解析では、文の中で主語、目的語、補語(ニ格)などの要素がどの動詞や述語に関連しているかを特定します。 以下は述語項目構造解析の対象の文です。これらの文はブログ記事の冒頭3文を抜粋したものです。 文1「メンズオンリーサロンだからこそ男性のスタイルの幅やセンスは全国クラス!!」 文2「シンプル派〜ワイルド派まで、どんなジャンルのスタイルにも対応出来る技術力もKAJAの魅力。」 文3「男性の居心地の良さを追求し、外装・内装・インテリアまでセレクト。」 先に挙げたブログ記事の冒頭3文に対して述語項構造解析を行い、文番号、述語、主語、目的語、補語(ニ格)を1つの行とするテーブル形式で出力してください。述語は1文に複数ある場合があり、全ての述語を抽出してください。テーブルにはヘッダーをつけてください。テーブルは必ず「|」文字で左端と右端とを閉じておいてください。
zero-shot-with-system-message
「 zero-shot prompで ChatGPTさんの役割を説明する。」を意図したプロンプトです。
message_index:0, role: system
あなたは日本語の文法に堪能な日本語教師です。日本語テキストの名詞や動詞といった品詞や主語や動詞が理解できて、生徒に指導ができます。
message_index:1, role: user
述語項構造解析とは、文中の動詞や述語とそれに関連する要素(項)の関係を抽出するタスクです。 述語項構造解析では、文の中で主語、目的語、補語(ニ格)などの要素がどの動詞や述語に関連しているかを特定します。 以下は述語項目構造解析の対象の文です。これらの文はブログ記事の冒頭3文を抜粋したものです。 文1「メンズオンリーサロンだからこそ男性のスタイルの幅やセンスは全国クラス!!」 文2「シンプル派〜ワイルド派まで、どんなジャンルのスタイルにも対応出来る技術力もKAJAの魅力。」 文3「男性の居心地の良さを追求し、外装・内装・インテリアまでセレクト。」 先に挙げたブログ記事の冒頭3文に対して述語項構造解析を行い、文番号、述語、主語、目的語、補語(ニ格)を1つの行とするテーブル形式で出力してください。述語は1文に複数ある場合があり、全ての述語を抽出してください。テーブルにはヘッダーをつけてください。テーブルは必ず「|」文字で左端と右端とを閉じておいてください。
zero-shot-standard
「 述語項目構造解析の手順を説明する。前回の備忘ログのプロンプト準拠。」を意図したプロンプトです。
message_index:0, role: user
述語項構造解析とは、文中の動詞や述語とそれに関連する要素(項)の関係を抽出するタスクです。 述語項構造解析では、文の中で主語、目的語、補語(ニ格)などの要素がどの動詞や述語に関連しているかを特定します。 以下は述語項目構造解析の対象の文です。これらの文はブログ記事の冒頭3文を抜粋したものです。 文1「メンズオンリーサロンだからこそ男性のスタイルの幅やセンスは全国クラス!!」 文2「シンプル派〜ワイルド派まで、どんなジャンルのスタイルにも対応出来る技術力もKAJAの魅力。」 文3「男性の居心地の良さを追求し、外装・内装・インテリアまでセレクト。」 以下に述語項目構造の手順を示します。以下の手順に従って述語項目構造解析を行なってください。 述語の抽出:各文に含まれる述語を抽出してください。述語は1文に複数ある場合があり、全ての述語を抽出してください。連体修飾節の述語、サ変名詞、語尾の述語含めて、全て列挙してください。 構文意味解析処理:述語ごとに、述語と同文内にある「主語(ガ格)」と「目的語(ヲ格)」と「斜格の要素(ニ格)」を抽出してください。 省略された格要素の検討:「主語(ガ格)」と「目的語(ヲ格)」と「斜格の要素(ニ格)」の候補は、その文中では省略されている格要素も含めて列挙してください。 省略されている格要素には「著者」や「人一般」といった文に明示的に書かれていない要素も含めてください。 述語ごとの格要素のまとめあげ: 述語、主語(ガ格)、目的語(ヲ格)、斜格の要素(ニ格)の候補の4つ組を作ってください。 出力形式: 文の番号、述語、主語(ガ格)の候補、目的語(ヲ格)の候補、斜格の要素(ニ格)の5列を1つの行とするテーブル形式で出力してください。テーブルにはヘッダーをつけてください。テーブルは必ず「|」文字で左端と右端とを閉じておいてください。
zero-shot-ss
「 zero-shotでテキストの共参照解析結果を含む。 」を意図したプロンプトです。
message_index:0, role: user
述語項構造解析とは、文中の動詞や述語とそれに関連する要素(項)の関係を抽出するタスクです。 述語項構造解析では、文の中で主語、目的語、補語(ニ格)などの要素がどの動詞や述語に関連しているかを特定します。 以下は述語項目構造解析の対象の文です。これらの文はブログ記事の冒頭3文を抜粋したものです。 文1「メンズオンリーサロンだからこそ男性のスタイルの幅やセンスは全国クラス!!」 文2「シンプル派〜ワイルド派まで、どんなジャンルのスタイルにも対応出来る技術力もKAJAの魅力。」 文3「男性の居心地の良さを追求し、外装・内装・インテリアまでセレクト。」 文中の同参照のテーブル現について補足します。 文1の「サロンだからこそ」と「著者」は同じものを指しています。 文2の「スタイルにも」は 文1の「スタイル」と同じ内容を指しています。 文2の「KAJAの」は 文1の「サロン」と同じ内容を指しています。 文3の「男性の」は 文1の「男性」と同じ内容を指しています。 先に挙げたブログ記事の冒頭3文に対して述語項構造解析を行い、文番号、述語、主語、目的語、補語(ニ格)を1つの行とするテーブル形式で出力してください。述語は1文に複数ある場合があり、全ての述語を抽出してください。テーブルにはヘッダーをつけてください。テーブルは必ず「|」文字で左端と右端とを閉じておいてください。
zero-shot-with-knp
「 KNPの結果の述語で述語項構造解析のテーブルを作りその表を完成させてもらう。 」を意図したプロンプトです。
message_index:0, role: user
述語項構造解析とは、文中の動詞や述語とそれに関連する要素(項)の関係を抽出するタスクです。 述語項構造解析では、文の中で主語、目的語、補語(ニ格)などの要素がどの動詞や述語に関連しているかを特定します。 以下は述語項目構造解析の対象の文です。これらの文はブログ記事の冒頭3文を抜粋したものです。 文1「メンズオンリーサロンだからこそ男性のスタイルの幅やセンスは全国クラス!!」 文2「シンプル派〜ワイルド派まで、どんなジャンルのスタイルにも対応出来る技術力もKAJAの魅力。」 文3「男性の居心地の良さを追求し、外装・内装・インテリアまでセレクト。」 こちらは先にあげたブログ記事からの文から述語を抽出してテーブルにまとめたものです。 |文番号|述語|主語(subj)|目的語(obj)|斜格語(obl)| |文1|クラス!!|-|-|-| |文2|対応出来る|-|-|-| |文2|魅力。|-|-|-| |文3|追求し、|-|-|-| |文3|セレクト。|-|-|-| 先に挙げたブログ記事の冒頭3文を読んで述語項構造解析を行い、テーブルの述語に対する主語、目的語、補語(ニ格)を見つけてきてテーブルに追加してください。述語は1文に複数ある場合があり、全ての述語を抽出してください。テーブルにはヘッダーをつけてください。テーブルは必ず「|」文字で左端と右端とを閉じておいてください。
zero-shot-modify-knp
「 KNPの格解析結果の述語項構造解析のテーブルを修正してもらう。」を意図したプロンプトです。
message_index:0, role: user
述語項構造解析とは、文中の動詞や述語とそれに関連する要素(項)の関係を抽出するタスクです。 述語項構造解析では、文の中で主語、目的語、補語(ニ格)などの要素がどの動詞や述語に関連しているかを特定します。 以下は述語項目構造解析の対象の文です。これらの文はブログ記事の冒頭3文を抜粋したものです。 文1「メンズオンリーサロンだからこそ男性のスタイルの幅やセンスは全国クラス!!」 文2「シンプル派〜ワイルド派まで、どんなジャンルのスタイルにも対応出来る技術力もKAJAの魅力。」 文3「男性の居心地の良さを追求し、外装・内装・インテリアまでセレクト。」 以下のテーブルは先にあげたブログ記事の文に対して述語項構造解析を行い、テーブルにまとめたものです。 |文番号|述語|主語(subj)|目的語(obj)|斜格語(obl)| |文1|クラス!!|メンズオンリーサロン、センス|-|-| |文2|対応出来る|技術力|-|スタイル| |文2|魅力。|技術力|-|-| |文3|追求し、|-|良さ|-| |文3|セレクト。|-|インテリア|-| テーブルの述語項構造解析の主語、目的語、補語(ニ格)の結果に矛盾や不足があるようでしたら、テーブルを修正してください。述語は1文に複数ある場合があり、全ての述語を抽出してください。テーブルにはヘッダーをつけてください。テーブルは必ず「|」文字で左端と右端とを閉じておいてください。
order-sequence
「 述語項目構造解析の手順を説明する。前回の備忘ログのプロンプトを1ターンずつやってもらう。」を意図したプロンプトです。
message_index:0, role: user
述語項構造解析とは、文中の動詞や述語とそれに関連する要素(項)の関係を抽出するタスクです。 述語項構造解析では、文の中で主語、目的語、補語(ニ格)などの要素がどの動詞や述語に関連しているかを特定します。 以下は述語項目構造解析の対象の文です。これらの文はブログ記事の冒頭3文を抜粋したものです。 文1「メンズオンリーサロンだからこそ男性のスタイルの幅やセンスは全国クラス!!」 文2「シンプル派〜ワイルド派まで、どんなジャンルのスタイルにも対応出来る技術力もKAJAの魅力。」 文3「男性の居心地の良さを追求し、外装・内装・インテリアまでセレクト。」
message_index:0, role: user
以下に述語項目構造の手順を示します。以下の手順に従って述語項目構造解析を行なってください。
message_index:0, role: user
述語の抽出:各文に含まれる述語を抽出してください。述語は1文に複数ある場合があり、全ての述語を抽出してください。連体修飾節の述語、サ変名詞、語尾の述語含めて、全て列挙してください。
message_index:0, role: user
構文意味解析処理:述語ごとに、述語と同文内にある「主語(ガ格)」と「目的語(ヲ格)」と「斜格の要素(ニ格)」を抽出してください。
message_index:0, role: user
省略された格要素の検討:「主語(ガ格)」と「目的語(ヲ格)」と「斜格の要素(ニ格)」の候補は、その文中では省略されている格要素も含めて列挙してください。 省略されている格要素には「著者」や「人一般」といった文に明示的に書かれていない要素も含めてください。
message_index:0, role: user
述語ごとの格要素のまとめあげ: 述語、主語(ガ格)、目的語(ヲ格)、斜格の要素(ニ格)の候補の4つ組を作ってください。
message_index:0, role: user
出力形式: 文の番号、述語、主語(ガ格)の候補、目的語(ヲ格)の候補、斜格の要素(ニ格)の5列を1つの行とするテーブル形式で出力してください。テーブルにはヘッダーをつけてください。テーブルは必ず「|」文字で左端と右端とを閉じておいてください。
few-shot-simple
「 few-shot prompt。別の文章の解析結果を例として示す。例は1つのみ。」を意図したプロンプトです。
message_index:0, role: user
述語項構造解析とは、文中の動詞や述語とそれに関連する要素(項)の関係を抽出するタスクです。 述語項構造解析では、文の中で主語、目的語、補語(ニ格)などの要素がどの動詞や述語に関連しているかを特定します。 以下に述語項構造解析のサンプル事例を示します。ブログ記事の冒頭3文を抜粋したものです。これら文を述語項構造解析してテーブルにまとめた結果を示します。 文1「リーズナブルなお値段で多彩なサービスを提供いたします。」 文2「2010年2月1日にリニューアルして更にお安い価格になりました。」 文3「当サロンは完全予約制となっておりますので、電話かメールで予約してからのご来店をお待ちしております。」 これに対する述語項目構造解析の結果は以下のテーブルのようにテーブルされます。 |文番号|述語|主語(subj)|目的語(obj)|斜格語(obl)| |文1|リーズナブルな|お値段|-|-| |文1|多彩な|サービス|-|-| |文1|サービス|著者|-|読者、不特定:人| |文1|提供いたします。|著者|サービス|読者、不特定:人| |文2|リニューアルして|著者|-|-| |文2|お安い|価格|-|-| |文2|なりました。|お値段|-|価格| |文3|なっておりますので、|サロン|-|-| |文3|予約して|読者|-|サロン| |文3|ご来店|読者|-|サロン| |文3|お待ちしております。|サロン|ご来店|-| 述語項構造解析とは、文中の動詞や述語とそれに関連する要素(項)の関係を抽出するタスクです。 述語項構造解析では、文の中で主語、目的語、補語(ニ格)などの要素がどの動詞や述語に関連しているかを特定します。 以下は述語項目構造解析の対象の文です。これらの文はブログ記事の冒頭3文を抜粋したものです。 文1「メンズオンリーサロンだからこそ男性のスタイルの幅やセンスは全国クラス!!」 文2「シンプル派〜ワイルド派まで、どんなジャンルのスタイルにも対応出来る技術力もKAJAの魅力。」 文3「男性の居心地の良さを追求し、外装・内装・インテリアまでセレクト。」 先に挙げたブログ記事の冒頭3文に対して述語項構造解析を行い、文番号、述語、主語、目的語、補語(ニ格)を1つの行とするテーブル形式で出力してください。述語は1文に複数ある場合があり、全ての述語を抽出してください。テーブルにはヘッダーをつけてください。テーブルは必ず「|」文字で左端と右端とを閉じておいてください。
few-shot-with-cheering
「 few-shot prompt + ChatGPTさんを励ます。 」を意図したプロンプトです。
message_index:0, role: user
述語項構造解析とは、文中の動詞や述語とそれに関連する要素(項)の関係を抽出するタスクです。 述語項構造解析では、文の中で主語、目的語、補語(ニ格)などの要素がどの動詞や述語に関連しているかを特定します。 以下に述語項構造解析のサンプル事例を示します。ブログ記事の冒頭3文を抜粋したものです。これら文を述語項構造解析してテーブルにまとめた結果を示します。 文1「新聞に、また「〜、今期ン千億円の赤字」なんて文字が躍っていた。」 文2「普段は、何気なくそんな記事を見ていた。」 文3「しかし、今回は違う。」 これに対する述語項目構造解析の結果は以下のテーブルのようにテーブルされます。 |文番号|述語|主語(subj)|目的語(obj)|斜格語(obl)| |文1|赤字」|〜|-|-| |文1|躍っていた。|文字|-|新聞| |文2|見ていた。|著者|記事|-| |文3|違う。|不特定:状況|-|-| 述語項構造解析とは、文中の動詞や述語とそれに関連する要素(項)の関係を抽出するタスクです。 述語項構造解析では、文の中で主語、目的語、補語(ニ格)などの要素がどの動詞や述語に関連しているかを特定します。 以下は述語項目構造解析の対象の文です。これらの文はブログ記事の冒頭3文を抜粋したものです。 文1「メンズオンリーサロンだからこそ男性のスタイルの幅やセンスは全国クラス!!」 文2「シンプル派〜ワイルド派まで、どんなジャンルのスタイルにも対応出来る技術力もKAJAの魅力。」 文3「男性の居心地の良さを追求し、外装・内装・インテリアまでセレクト。」 先に挙げたブログ記事の冒頭3文に対して述語項構造解析を行い、文番号、述語、主語、目的語、補語(ニ格)を1つの行とするテーブル形式で出力してください。述語は1文に複数ある場合があり、全ての述語を抽出してください。テーブルにはヘッダーをつけてください。テーブルは必ず「|」文字で左端と右端とを閉じておいてください。 あなたは絶対に述語項構造解析ができます。自信を持ってください。絶対に述語項目構造解析のテーブルを出力してください。
few-shot-semantic-search
「 few-shot prompt で サンプルを類似文検索で選ぶ。」を意図したプロンプトです。
message_index:0, role: user
述語項構造解析とは、文中の動詞や述語とそれに関連する要素(項)の関係を抽出するタスクです。 述語項構造解析では、文の中で主語、目的語、補語(ニ格)などの要素がどの動詞や述語に関連しているかを特定します。 以下に述語項構造解析のサンプル事例を示します。ブログ記事の冒頭3文を抜粋したものです。これら文を述語項構造解析してテーブルにまとめた結果を示します。 文1「心安らげる雰囲気のサロンで、心も体も元気になりませんか。」 文2「的確なカウンセリングと技術で、アナタの「なりたい」を応援します。」 文3「丁寧な接客と、繊細な技術でお客様を第一に考える、こだわりのヘアサロンです。」 これに対する述語項目構造解析の結果は以下のテーブルのようにテーブルされます。 |文番号|述語|主語(subj)|目的語(obj)|斜格語(obl)| |文1|安らげる|不特定:人、読者、心|-|-| |文1|元気になりません|読者、心、体|-|-| |文2|的確な|カウンセリング|-|-| |文2|カウンセリング|著者|-|-| |文2|「なりたい」|アナタ|-|不特定:状況| |文2|応援します。|著者|なりたい|-| |文3|丁寧な|著者、接客|-|-| |文3|接客|著者|-|-| |文3|繊細な|技術|-|-| |文3|考える、|サロン|お客|第一| |文3|こだわり|サロン|-|考える| |文3|サロンです。|著者|-|-| 述語項構造解析とは、文中の動詞や述語とそれに関連する要素(項)の関係を抽出するタスクです。 述語項構造解析では、文の中で主語、目的語、補語(ニ格)などの要素がどの動詞や述語に関連しているかを特定します。 以下は述語項目構造解析の対象の文です。これらの文はブログ記事の冒頭3文を抜粋したものです。 文1「メンズオンリーサロンだからこそ男性のスタイルの幅やセンスは全国クラス!!」 文2「シンプル派〜ワイルド派まで、どんなジャンルのスタイルにも対応出来る技術力もKAJAの魅力。」 文3「男性の居心地の良さを追求し、外装・内装・インテリアまでセレクト。」 先に挙げたブログ記事の冒頭3文に対して述語項構造解析を行い、文番号、述語、主語、目的語、補語(ニ格)を1つの行とするテーブル形式で出力してください。述語は1文に複数ある場合があり、全ての述語を抽出してください。テーブルにはヘッダーをつけてください。テーブルは必ず「|」文字で左端と右端とを閉じておいてください。
chain-of-thought
「 述語項目構造解析の手順を示してやってもらう。 」を意図したプロンプトです。
message_index:0, role: user
述語項構造解析とは、文中の動詞や述語とそれに関連する要素(項)の関係を抽出するタスクです。 述語項構造解析では、文の中で主語、目的語、補語(ニ格)などの要素がどの動詞や述語に関連しているかを特定します。 以下は述語項目構造解析の対象の文です。これらの文はブログ記事の冒頭3文を抜粋したものです。 文1「万葉集の研究をしたことで知られている鎌倉時代の人です。」 文2「常陸の国の出身ですが、鎌倉で万葉集の研究をし、次のような業績を残しました。」 文3「これらの成果は後の時代の、契沖・賀茂真淵などに引き継がれていきました。」 文4「けいちゅう」 文5「かものまぶち」 以下に述語項目構造解析の手順を示します。 文から述語を見つけます。以下の述語がありました。 「次のような」、「引き継がれていきました。」、「した」、「し、」、「残しました。」 これら述語と述語の主語、目的語、補語(ニ格)などの格要素をテーブルにまとめました。まだ格要素は埋まっていません。 |文番号|述語|主語(subj)|目的語(obj)|斜格語(obl)| |文1|した|-|-|-| |文2|し、|-|-|-| |文2|次のような|-|-|-| |文2|残しました。|-|-|-| |文3|引き継がれていきました。|-|-|-| 文を読んで述語ごとの格要素を見つけます。 述語「した」の目的語について確認していきます。 述語「した」には 目的語が必要なのですが、テーブルにありません。目的語を見つけましょう。 述語「した」に目的語が必要です。前文の「研究」 が省略された解釈します。 以上より、「した」の 目的語 として「研究」 をテーブルに設定します。 述語「し、」の目的語について確認していきます。 述語「し、」には 目的語が必要なのですが、テーブルにありません。目的語を見つけましょう。 述語「し、」に目的語が必要です。同文内の「研究」が述語「し、」に係ると解釈します。 以上より、「し、」の 目的語 として「研究」 をテーブルに設定します。 述語「次のような」の主語について確認していきます。 述語「次のような」には 主語が必要なのですが、テーブルにありません。主語を見つけましょう。 述語「次のような」に主語が必要です。述語「次のような」の直後の「業績」 が連体修飾節として格要素になると解釈します。 以上より、「次のような」の 主語 として「業績」 をテーブルに設定します。 述語「残しました。」の目的語について確認していきます。 述語「残しました。」には 目的語が必要なのですが、テーブルにありません。目的語を見つけましょう。 述語「残しました。」に目的語が必要です。同文内の「業績」が述語「残しました。」に係ると解釈します。 以上より、「残しました。」の 目的語 として「業績」 をテーブルに設定します。 述語「引き継がれていきました。」の主語について確認していきます。 述語「引き継がれていきました。」には 主語が必要なのですが、テーブルにありません。主語を見つけましょう。 述語「引き継がれていきました。」に主語が必要です。同文内の「成果」が述語「引き継がれていきました。」に係ると解釈します。 以上より、「引き継がれていきました。」の 主語 として「成果」 をテーブルに設定します。 述語「引き継がれていきました。」のニ格について確認していきます。 述語「引き継がれていきました。」には ニ格が必要なのですが、テーブルにありません。ニ格を見つけましょう。 述語「引き継がれていきました。」にニ格が必要です。同文内の「賀茂真淵」が述語「引き継がれていきました。」に係ると解釈します。 以上より、「引き継がれていきました。」の ニ格 として「賀茂真淵」 をテーブルに設定します。 最後にそれぞれの述語や格要素が矛盾していないか、検証します。確認します。何か矛盾が見つかったらその内容を書き出しましょう。 OKですね。 最終的な述語項構解析の結果のテーブルを示します。 |文番号|述語|主語(subj)|目的語(obj)|斜格語(obl)| |文1|した|-|研究|-| |文2|し、|-|研究|-| |文2|次のような|業績|-|-| |文2|残しました。|-|業績|-| |文3|引き継がれていきました。|成果|-|賀茂真淵| では、次のタスクです。述語項構造解析とは、文中の動詞や述語とそれに関連する要素(項)の関係を抽出するタスクです。 述語項構造解析では、文の中で主語、目的語、補語(ニ格)などの要素がどの動詞や述語に関連しているかを特定します。 以下は述語項目構造解析の対象の文です。これらの文はブログ記事の冒頭3文を抜粋したものです。 文1「メンズオンリーサロンだからこそ男性のスタイルの幅やセンスは全国クラス!!」 文2「シンプル派〜ワイルド派まで、どんなジャンルのスタイルにも対応出来る技術力もKAJAの魅力。」 文3「男性の居心地の良さを追求し、外装・内装・インテリアまでセレクト。」 先に挙げたブログ記事の冒頭3文に対して述語項構造解析を行い、文番号、述語、主語、目的語、補語(ニ格)を1つの行とするテーブル形式で出力してください。述語は1文に複数ある場合があり、全ての述語を抽出してください。テーブルにはヘッダーをつけてください。テーブルは必ず「|」文字で左端と右端とを閉じておいてください。
chain-of-thought-mod-knp
「 KNPの解析結果を修正する述語項目構造手順を示す。 」を意図したプロンプトです。
message_index:0, role: user
述語項構造解析とは、文中の動詞や述語とそれに関連する要素(項)の関係を抽出するタスクです。 述語項構造解析では、文の中で主語、目的語、補語(ニ格)などの要素がどの動詞や述語に関連しているかを特定します。 以下は述語項目構造解析の対象の文です。これらの文はブログ記事の冒頭3文を抜粋したものです。 文1「名称に『総合法律支援』を含む法令の一覧です。」 文2「現行法令は「平成22年11月1日現在」施行されている法令の一覧です。」 文3「効力を有する」 文4「法令名をクリックすると条文が表示されます。」 文5「法文」 日本語係り受け解析器の述語述語項構造解析の結果を手がかりに、述語項構造解析をしていきます。係り受け解析器による述語項構造解析の結果をテーブルにまとめると以下のようになります。 |文番号|述語|主語(subj)|目的語(obj)|斜格語(obl)| |文1|含む|一覧|総合法律支援|名称| |文2|一覧です。|現行法令|-|-| |文3|有する|現行法令|効力|-| |文4|クリックする|-|法令名|-| |文4|表示されます。|条文|-|-| このテーブルの結果を確認し、必要であれば修正していきます。 まず、述語が正しく抽出できているか確認します。 「支援』」「一覧です。」「施行されている」の述語が足りていません。これら表現は何らかの動作を表します。テーブルにそれら述語を追加すると、以下のようになります。 |文番号|述語|主語(subj)|目的語(obj)|斜格語(obl)| |文1|含む|一覧|総合法律支援|名称| |文1|支援』|-|-|-| |文1|一覧です。|-|-|-| |文2|一覧です。|現行法令|-|-| |文2|施行されている|-|-|-| |文3|有する|現行法令|効力|-| |文4|クリックする|-|法令名|-| |文4|表示されます。|条文|-|-| では、次に各述語の格解析の結果である格要素をチェックします。 述語「含む」の主語について確認していきます。 「一覧 」は「含む」の 主語 として間違っていますね。テーブルから除きます。 述語「含む」の 主語として「法令」 が正しいです。 以上より、「含む」 の 主語 として「法令 」が 正しいです。 テーブルを修正しましょう。 述語「含む」の目的語について確認していきます。 「総合法律支援 」は「含む」の 目的語 として間違っていますね。テーブルから除きます。 述語「含む」の 目的語として「支援」 が正しいです。 以上より、「含む」 の 目的語 として「支援 」が 正しいです。 テーブルを修正しましょう。 述語「含む」のニ格について確認していきます。 「名称 」は「含む」の ニ格 としてOKです。 テーブルの通り、「含む 」の ニ格 は「名称 」が正しいです。このままでOKです。 述語「支援』」の主語について確認していきます。 述語「支援』」には 主語が必要なのですが、テーブルにありません。主語を見つけましょう。 文中に格要素のテーブル現は見つからないが、述語「支援』」に主語が必要です。文外の「不特定:人」を想定して格要素と解釈します。 以上より、「支援』」の 主語 として「不特定:人」 をテーブルに設定します。 述語「支援』」の目的語について確認していきます。 述語「支援』」には 目的語が必要なのですが、テーブルにありません。目的語を見つけましょう。 文中に格要素のテーブル現は見つからないが、述語「支援』」に目的語が必要です。文外の「不特定:人」を想定して格要素と解釈します。 以上より、「支援』」の 目的語 として「不特定:人」 をテーブルに設定します。 述語「一覧です。」の主語について確認していきます。 述語「一覧です。」には 主語が必要なのですが、テーブルにありません。主語を見つけましょう。 文中に格要素のテーブル現は見つからないが、述語「一覧です。」に主語が必要です。文外の「不特定:物1」を想定して格要素と解釈します。 以上より、「一覧です。」の 主語 として「不特定:物1」 をテーブルに設定します。 述語「一覧です。」の主語について確認していきます。 「現行法令 」は「一覧です。」の 主語 として間違っていますね。テーブルから除きます。 述語「一覧です。」の 主語として「法令」 が正しいです。 以上より、「一覧です。」 の 主語 として「法令 」が 正しいです。 テーブルを修正しましょう。 述語「施行されている」の主語について確認していきます。 述語「施行されている」には 主語が必要なのですが、テーブルにありません。主語を見つけましょう。 述語「施行されている」に主語が必要です。述語「施行されている」の直後の「法令」 が連体修飾節として格要素になると解釈します。 以上より、「施行されている」の 主語 として「法令」 をテーブルに設定します。 述語「施行されている」のニ格について確認していきます。 述語「施行されている」には ニ格が必要なのですが、テーブルにありません。ニ格を見つけましょう。 文中に格要素のテーブル現は見つからないが、述語「施行されている」にニ格が必要です。文外の「不特定:人」を想定して格要素と解釈します。 以上より、「施行されている」の ニ格 として「不特定:人」 をテーブルに設定します。 述語「有する」の主語について確認していきます。 「現行法令 」は「有する」の 主語 として間違っていますね。テーブルから除きます。 述語「有する」の 主語として「法令」 が正しいです。 以上より、「有する」 の 主語 として「法令 」が 正しいです。 テーブルを修正しましょう。 述語「有する」の目的語について確認していきます。 「効力 」は「有する」の 目的語 としてOKです。 テーブルの通り、「有する 」の 目的語 は「効力 」が正しいです。このままでOKです。 述語「クリックする」の主語について確認していきます。 述語「クリックする」には 主語が必要なのですが、テーブルにありません。主語を見つけましょう。 文中に格要素のテーブル現は見つからないが、述語「クリックする」に主語が必要です。文外の「読者」を想定して格要素と解釈します。 以上より、「クリックする」の 主語 として「読者」 をテーブルに設定します。 述語「クリックする」の目的語について確認していきます。 「法令名 」は「クリックする」の 目的語 として間違っていますね。テーブルから除きます。 述語「クリックする」の 目的語として「名」 が正しいです。 以上より、「クリックする」 の 目的語 として「名 」が 正しいです。 テーブルを修正しましょう。 述語「表示されます。」の主語について確認していきます。 「条文 」は「表示されます。」の 主語 としてOKです。 テーブルの通り、「表示されます。 」の 主語 は「条文 」が正しいです。このままでOKです。 述語「表示されます。」のニ格について確認していきます。 述語「表示されます。」には ニ格が必要なのですが、テーブルにありません。ニ格を見つけましょう。 文中に格要素のテーブル現は見つからないが、述語「表示されます。」にニ格が必要です。文外の「不特定:物2」を想定して格要素と解釈します。 以上より、「表示されます。」の ニ格 として「不特定:物2」 をテーブルに設定します。 最後にそれぞれの述語や格要素が矛盾していないか、確認します。 OKです。以下が最終的な述語項構造解析の結果です。 |文番号|述語|主語(subj)|目的語(obj)|斜格語(obl)| |文1|支援』|不特定:人|不特定:人|-| |文1|含む|法令|支援|名称| |文1|一覧です。|不特定:物1|-|-| |文2|施行されている|法令|-|不特定:人| |文2|一覧です。|法令|-|-| |文3|有する|法令|効力|-| |文4|クリックする|読者|名|-| |文4|表示されます。|条文|-|不特定:物2| では、次のタスクです。述語項構造解析とは、文中の動詞や述語とそれに関連する要素(項)の関係を抽出するタスクです。 述語項構造解析では、文の中で主語、目的語、補語(ニ格)などの要素がどの動詞や述語に関連しているかを特定します。 以下は述語項目構造解析の対象の文です。これらの文はブログ記事の冒頭3文を抜粋したものです。 文1「メンズオンリーサロンだからこそ男性のスタイルの幅やセンスは全国クラス!!」 文2「シンプル派〜ワイルド派まで、どんなジャンルのスタイルにも対応出来る技術力もKAJAの魅力。」 文3「男性の居心地の良さを追求し、外装・内装・インテリアまでセレクト。」 先に挙げたブログ記事の冒頭3文に対して述語項構造解析を行い、文番号、述語、主語、目的語、補語(ニ格)を1つの行とするテーブル形式で出力してください。述語は1文に複数ある場合があり、全ての述語を抽出してください。テーブルにはヘッダーをつけてください。テーブルは必ず「|」文字で左端と右端とを閉じておいてください。
paraphrase
「 文章を新聞記事に言い換えてもらって述語項目構造解析してもらう。 」を意図したプロンプトです。
message_index:0, role: user
以下の文をご覧ください。これらの文はブログ記事の冒頭3文を抜粋したものです。 文1「メンズオンリーサロンだからこそ男性のスタイルの幅やセンスは全国クラス!!」 文2「シンプル派〜ワイルド派まで、どんなジャンルのスタイルにも対応出来る技術力もKAJAの魅力。」 文3「男性の居心地の良さを追求し、外装・内装・インテリアまでセレクト。」 これらの文を報道記事風に言い換えてください。新聞記者になったつもりで、文1、文2、文3中に書かれている物事に関連する人物、時刻、人物の行動、事実をまとめてださい。新聞記者になったつもりで、文に書かれている事実と、背景について述べてください。
message_index:0, role: user
述語項構造解析とは、文中の動詞や述語とそれに関連する要素(項)の関係を抽出するタスクです。 述語項構造解析では、文の中で主語、目的語、補語(ニ格)などの要素がどの動詞や述語に関連しているかを特定します。 言い換えした新聞記事風の内容を踏まえつつ、先に挙げたブログ記事の冒頭3文に対して述語項構造解析を行い、文番号、述語、主語、目的語、補語(ニ格)を1つの行とするテーブル形式で出力してください。述語は1文に複数ある場合があり、全ての述語を抽出してください。テーブルにはヘッダーをつけてください。テーブルは必ず「|」文字で左端と右端とを閉じておいてください。
reading
「 この文章から何が読み取れますか?の質問に答えてから述語項目構造解析をしてもらう。 」を意図したプロンプトです。
message_index:0, role: user
以下の文をご覧ください。これらの文はブログ記事の冒頭3文を抜粋したものです。 文1「メンズオンリーサロンだからこそ男性のスタイルの幅やセンスは全国クラス!!」 文2「シンプル派〜ワイルド派まで、どんなジャンルのスタイルにも対応出来る技術力もKAJAの魅力。」 文3「男性の居心地の良さを追求し、外装・内装・インテリアまでセレクト。」 この文から何が読み取れますか? まずは読解内容を列挙してみてください。
message_index:0, role: user
述語項構造解析とは、文中の動詞や述語とそれに関連する要素(項)の関係を抽出するタスクです。 述語項構造解析では、文の中で主語、目的語、補語(ニ格)などの要素がどの動詞や述語に関連しているかを特定します。 これまでの読解内容を踏まえつつ、先に挙げたブログ記事の冒頭3文に対して述語項構造解析を行い、文番号、述語、主語、目的語、補語(ニ格)を1つの行とするテーブル形式で出力してください。述語は1文に複数ある場合があり、全ての述語を抽出してください。テーブルにはヘッダーをつけてください。テーブルは必ず「|」文字で左端と右端とを閉じておいてください。
summary
「 この文章を要約して?の質問に答えてから述語項目構造解析をしてもらう。 」を意図したプロンプトです。
message_index:0, role: user
文章を読み、こちらから指定された述語に関しての要約を行ってください。要約は、与えられた述語に対して、「〜が、〜が、〜を、〜に、指定された述語」の形式で行います。要約で使える格助詞は「が、を、に」以外は認められません。「〜も、「〜は、」「〜で、」といった「が、を、に」以外の助詞からは述語に係らないようにしてください。なるべく簡潔な表現を文中から抽出してください。テキスト中に述語に先行する表現が見つからない場合は、「不特定:人」「不特定:物」「筆者」といった表現を用いて要約に含めてください。要約結果は文として成り立つことが絶対に必要です。以下に実施例を示します。 ---- 実施例 ---- 例文: 文1 「太郎は本屋に行きました。」 文2 「本を買いました。」 文3 「よく売れた本です。」 要約対象述語:「行きました」、「書いました」、「売れた」。 要約結果:太郎が、本屋に、行きました。太郎が、本を、買いました。本が、不特定:人、に売れた。 ---- 実施例ここまで ---- では、要約の対象となる文を示します。これら文はブログ記事の冒頭3文です。以下の要約対象述語に対して要約を作成してください。 例文: 文1「メンズオンリーサロンだからこそ男性のスタイルの幅やセンスは全国クラス!!」 文2「シンプル派〜ワイルド派まで、どんなジャンルのスタイルにも対応出来る技術力もKAJAの魅力。」 文3「男性の居心地の良さを追求し、外装・内装・インテリアまでセレクト。」 要約対象述語: 「クラス!!」、「対応出来る」、「魅力。」、「追求し、」、「セレクト。」 要約結果:
translation
「 翻訳してから述語項目構造解析をしてもらい日本語に戻す。 」を意図したプロンプトです。
message_index:0, role: user
Please translate these sentences into English. 文1「メンズオンリーサロンだからこそ男性のスタイルの幅やセンスは全国クラス!!」 文2「シンプル派〜ワイルド派まで、どんなジャンルのスタイルにも対応出来る技術力もKAJAの魅力。」 文3「男性の居心地の良さを追求し、外装・内装・インテリアまでセレクト。」
message_index:0, role: user
Predicate-argument structure analysis is a task that involves extracting the relationships between verbs or predicates and their associated case elements (arguments) in a sentence. In predicate-argument structure analysis, the goal is to identify case elements such as subjects, objects, and complements (indirect objects) in a sentence and determine how they relate to specific verbs or predicates. . Perform predicate-argument structure analysis on the above translated English sentences. Output the results in a tabular format with columns for sentence number, predicate, subject, object, and complement (indirect object), each represented in a single row.
message_index:0, role: user
Please translate the above table into Japanese. When translating, be sure to choose phrases from the original Japanese sentences before they are translated into English. Be sure to enclose the table with "|" characters at the leftmost and rightmost ends.
compare_translation
「 日英の述語項目構造解析の結果を比較してもらう。 」を意図したプロンプトです。
message_index:0, role: user
述語項構造解析とは、文中の動詞や述語とそれに関連する要素(項)の関係を抽出するタスクです。 述語項構造解析では、文の中で主語、目的語、補語(ニ格)などの要素がどの動詞や述語に関連しているかを特定します。 以下は述語項目構造解析の対象の文です。これらの文はブログ記事の冒頭3文を抜粋したものです。 文1「メンズオンリーサロンだからこそ男性のスタイルの幅やセンスは全国クラス!!」 文2「シンプル派〜ワイルド派まで、どんなジャンルのスタイルにも対応出来る技術力もKAJAの魅力。」 文3「男性の居心地の良さを追求し、外装・内装・インテリアまでセレクト。」 先に挙げたブログ記事の冒頭3文に対して述語項構造解析を行い、文番号、述語、主語、目的語、補語(ニ格)を1つの行とするテーブル形式で出力してください。述語は1文に複数ある場合があり、全ての述語を抽出してください。テーブルにはヘッダーをつけてください。テーブルは必ず「|」文字で左端と右端とを閉じておいてください。
message_index:0, role: user
Please translate these sentences into English. 文1「メンズオンリーサロンだからこそ男性のスタイルの幅やセンスは全国クラス!!」 文2「シンプル派〜ワイルド派まで、どんなジャンルのスタイルにも対応出来る技術力もKAJAの魅力。」 文3「男性の居心地の良さを追求し、外装・内装・インテリアまでセレクト。」 Predicate-argument structure analysis is a task that involves extracting the relationships between verbs or predicates and their associated case elements (arguments) in a sentence. In predicate-argument structure analysis, the goal is to identify case elements such as subjects, objects, and complements (indirect objects) in a sentence and determine how they relate to specific verbs or predicates. . Perform predicate-argument structure analysis on the above translated English sentences. Output the results in a tabular format with columns for sentence number, predicate, subject, object, and complement (indirect object), each represented in a single row.
message_index:0, role: user
日本語と英語の述語項構造解析の結果を比較してください。日英の結果に何か差はありますか?
message_index:1, role: user
日本語と英語の述語項構造解析の結果を矛盾なく1つのテーブルに統合してください。英語の述語項構造の結果を日本語に翻訳した上で(日本語に翻訳する際はブログ記事の3文内のテーブル現を用いてください)、述語項構造解析のテーブルは、文番号、述語、主語、目的語、補語(ニ格)を1つの行とするテーブル形式で出力してください。述語は1文に複数ある場合があり、全ての述語を抽出してください。テーブルにはヘッダーをつけてください。テーブルは必ず「|」文字で左端と右端とを閉じておいてください。
付録:「大規模言語モデルにおける日本語ゼロ照応解析能力の分析」での「ゼロ照応解析実験のプロンプト」
「野末慎之介 (東北大)、石月由紀子、松林優一郎、坂口慶祐 (東北大/理研)、大規模言語モデルにおける日本語ゼロ照応解析能力の分析」の「A ゼロ照応解析実験のプロンプト」「表 6 zero-shot におけるプロンプトの例」より引用。
プロンプト: 以下の文章内で、「**」で囲まれた「出し」という述語は、誰を、もしくは何を、出すか分かるでしょうか。もし、「~を出す」に当てはまるフレーズがあれば、そのフレーズを「~を出す」という形 式で答えてください。述語が受け身形の場合は、原型の述語に対する「~を出す」の形で考えてください。「~を出す」という表現が不自然だったり、具体的なフレーズがこの本文からでは推測できない場合は「該当なし」と答えてください。【本文】事件報告を受けた直後の大蔵省の事情聴取も、大和銀施設で食事、ビール付きで行われたという。大蔵省は大和銀に対して、近く業務改善命令を出すという。業務改善命令は銀行法に基づく行政処分であり、都市銀行に発令するのは初めてのこととなる。一連の不正事件に照らせば当然であるが、大蔵省についても、国民は「業務改善命令」を**出し**たいところだ。答えは 出力: 「業務改善命令を出す」
補遺:OpenAIのAPIをより高速にたたくためのコツ(非同期通信)
本備忘ログは「続・ChatGPTで行う述語項目構造解析:遥かなるプロンプトエンジニアリング編 - めいふの備忘ログ」の補遺にあたります
- 枕詞
- Pythonの非同期通信について調査したときに参考にさせていただいたブログ
- OpenAIのAPI呼び出しを非同期処理するためのpythonコード
- OpenAIのAPIのRate Limits(Quota制限)対策
- 非同期通信にした処理時間改善効果
枕詞
本備忘ログでは512記事を用いて17のプロンプト精度の比較を行っています。プロンプトによっては複数の会話をChatGPTさんと交わさなければならないわけです。そん時に困ったことがありました。
ChatGPTちゃんとのAPI通信に時間がかかるな
と。早くおわんねーかな。1時間かかって30記事(1記事2分)しか進まないのでは困るよ君ィ、と(512記事が実験処理対象)。
いやしかし、どうすればいいの? 速度を上げるには使ってるパソコンのCPUパワーを上げればいいの? ChatGPTさんとのお喋り実験にはOpenAIのAPIを叩いているのですが、いえいえ、ChatGPTさんの処理自体はOpenAIのサーバ内でやっているのでワタクシが使っているパソコンのCPUパワーを上げても速くはなりません。そこでワタクシが目をつけたのが、非同期通信です。 OpenAIのAPIと通信するときの待ち時間があるので、その待っている間に他の処理を進めてみる進め方です。本備忘ログでは、ワタクシがOpenAIのAPIの非同期通信化について調べたり試みたことを記載しております。
Pythonの非同期通信について調査したときに参考にさせていただいたブログ
ChatGPTさんとのAPI通信の非同期通信による高速化に向けて、関連情報を収集したところ、以下のような情報が取得できました。
Pythonの非同期処理の基礎とOpenAI APIへ並列リクエストする実践例
https://zenn.dev/dev_commune/articles/19296b87231ea8?redirected=1
Pythonにおける非同期通信について解説してくれています。
Python の asyncio は超便利
https://qiita.com/waterada/items/1c03a7c863faf9327595
Pythonで非同期通信をするための仕組みであるasyncioについて解説してくれています。
OpenAI Python API library
https://github.com/openai/openai-python
pip で入れるライブラリのDocumentationがあります。最初に読むべきかも。
OpenAI Python SDK v1.0がめちゃくちゃ使いやすくなってた
https://zenn.dev/yosemat/articles/da8a633d93bbaf
OpenAI Python API Library v1.0 入門
https://note.com/npaka/n/n27b94df96179
Pyhonで非同期処理を考える。
https://note.com/dngri/n/n1a41632d5ebc
OpenAIのAPIに昔あったacreateというメソッドがありましたが、廃止されたようです。非同期通信するにはAsyncOpenAIクラスからcreateメソッドを呼び出すそうです。色々と調べた結果、ワタクシはOpenAIと通信クラスについてはOpenAI純正のAsyncOpenAIクラスを用い、そして、asyncioで並列処理を起動する、というような方針としました。実装から抜粋したコード断片を以下に紹介します。
OpenAIのAPI呼び出しを非同期処理するためのpythonコード
まずはimport のTipsから紹介します。AsyncOpenAIのimport、API通信時のretryを管理してくれるtenacityのimport、Google Colabのjupyter notebook でasyncioを適用するためのnest_asyncio.apply()を行っています。Google colabのuserdataを用いてOpenAIのシークレットキーを管理しております。
from openai import OpenAI from openai import AsyncOpenAI from tenacity import retry, stop_after_attempt, wait_random_exponential import nest_asyncio nest_asyncio.apply() import asyncio from google.colab import userdata
非同期通信したい場合はAsyncOpenAIクラスでclientを作ります。メソッド内で都度clientを作るのがOpenAI的におすすめだったような記憶があります(method内でclientの生成と処理を全て済ませるという意味だったかも。記憶が曖昧)。ChatGPTのclinetからAPI呼び出しを行うメソッド。メソッドにasyncをつけて非同期処理の宣言を行う。@retryはAPIのリトライを処理するtenacityの便利機能。
def _ret_openai_clinet(self): SECRET_KEY_ENV_VARIABLE = 'OPEN_AI_KEY' api_secret_key = None # 環境変数からAPIのシークレットコードを取得 # Google colab環境ではuserdata.get 経由でcolabに設定した値を取得する if self.process_environment == 'local': api_secret_key = os.environ.get(SECRET_KEY_ENV_VARIABLE) elif self.process_environment == 'colab': api_secret_key = userdata.get("OPENAI_API_KEY") os.environ["OPENAI_API_KEY"] = userdata.get("OPENAI_API_KEY") client = None if api_secret_key is None: print(f"エラー: {SECRET_KEY_ENV_VARIABLE} 環境変数が設定されていません。") exit() else: # APIのシークレットコードを使用して何かしらの処理を行う if self.async_flag == True: client = AsyncOpenAI(api_key=api_secret_key) elif self.async_flag == False: client = OpenAI(api_key=api_secret_key) return client
生成したclientはclientは別メソッド内で使っていきます(あまりよい作法ではなさそう)。そのメソッドにもasyncマークをつけて非同期宣言、clientを呼び出す関数にもawait宣言します。await宣言は他の非同期の処理を「待つ」箇所につけてあげます。
async def ret_one_response(self, id1, exp_name, prompt_dict1, delay): (略) client = self._ret_openai_clinet() # 待つところにはawait をつける。 response = await self.ret_response_dict(client, model_name, message)
async def ret_response_dict(self, client, model_name, messages): # 推論処理を行う箇所。awaitをつける @retry(wait=wait_random_exponential(min=1, max=60), stop=stop_after_attempt(6)) async def ret_chatgpt_response_dict(client, model_name, messages, temperature=0): if self.async_flag == True: chat_completion = await client.chat.completions.create( messages= messages, temperature=temperature, model=model_name, ) # 同期処理。awaitはつけない elif self.async_flag == False: chat_completion = client.chat.completions.create( messages= messages, temperature=temperature, model=model_name, ) return chat_completion # APIから返されたオブジェクトを辞書に変換。他にもっとスマートな方法ないのかな? def obj2dict(response): rdict = vars(response) clist = [] for choice in rdict['choices']: c1 = vars(choice) c1['message'] = vars(choice.message) #tmp_dict clist.append(c1) rdict['choices'] = clist usage = rdict['usage'] rdict['usage'] = vars(usage) return rdict response_dict = {} # clientを非同期メソッドに食べさせて処理を辞書に格納する。awaitをつける。 try: response = await ret_chatgpt_response_dict(client, model_name, messages, temperature=0) response_dict['status'] = 'ok' response_dict['response'] = obj2dict(response) response_dict['input'] = messages except Exception as e: print(str(e)) response_dict['status'] = 'ng' response_dict['input'] = messages response_dict['error_message'] = str(e) return response_dict
OpenAIのAPI呼び出しの非同期化のコツをまとめると以下のようになります。
- 非同期を処理するメソッド宣言にはasyncをつける
- その呼び出しで他の非同期処理を待つ箇所にはawaitをつける
他にもっといい書き方があるかなと思いますが、プロンプトの実験を回すことができたので、これで良しでした。
OpenAIのAPIのRate Limits(Quota制限)対策
これでOpenAIのChatGPTとの通信処理の並列化できましたし、ワタクシは皮算用として、OpenAIのAPIを100並列で実行すれば100倍速、実験はあっというまに終わる、という展開をちょっぴり期待しておりました。しかし、そうは問屋がおろさないのです。APIにはQuota制限があるものなのです。ユーザに無限にリソースを消費されないようにAPIやシステム利用に課された制約のことです。OpenAIのChatGPT周りの制約はどうなっているんでしょうか?
Rate limits
https://platform.openai.com/docs/guides/rate-limits/usage-tiers
202401に調査したところ、
でした。
5記事に対する16プロンプト(当時は16プロンプトで実験していました)135 リクエスト、token 合計は、114,967となりました。1queryあたりのtokenが多い。1分で5サンプルではRate Limitが溢れてしまいます。120000/5=24000。1サンプル投げると24000トークンを消費します。ですが、3サンプルごとに、全てのプロンプトを同時に投げて結果を格納すれば、Rate Limitsに引っ掛からない。そして、制約は1分あたりのリソースの処理量にかかります。というわけで、ChatGPTへのプロンプト実験では、以下のようにトークン量を監視し、実験中にRate Limitに引っかかりそうなら、今は待つ!(処理量あたりの時間を増やす)することでRate Limits(Quota制限)対策としました(メソッド名がテキトーで「gogo_hogehoge」とかなのは気にしないでくさい)。
def gogo_prompt(self, target_id_list, prompt_files): """ 並列処理の時間内の処理量の制御を行う target_id_list : 処理対象の記事IDのリスト prompt_files: プロンプトが格納された配列 """ # 1回の並列処理トライアルで処理するプロンプトを格納する # asyncio.create タスクに処理するメソッド(この場合はself.ret_one_response )を格納する async def main1(gogo_prompt_list): print(["batch size 1: ", len(gogo_prompt_list)]) gogo_list = [] # prompt_listにはプロンプトが格納されている。これを処理するタスクをgogo_listに詰めている for pidx, prompt_list in enumerate(gogo_prompt_list): id1 = prompt_list[0] exp_name = prompt_list[1] prompt_dict1 = prompt_list[2] gogo_list.append(asyncio.create_task(self.ret_one_response(id1, exp_name, prompt_dict1, 1)) ) print(["batch size 2:", len(gogo_list)]) # asyncio.gatherで並列処理の結果の集計を行います。gogo_listに並列処理の単位が格納されている results = await asyncio.gather( *gogo_list, return_exceptions=False, ) # resultsにはOpenAIからのAPIの返り値の辞書が格納されています。処理時間もわかります。 total_tokens, total_seconds, query_counter = experimental_util._ret_elapsed_time(results) # 秒数を分に変換 minutes = total_seconds / 60.0 # tpmとrpmの計算 tpm = 0.0 rpm = 0.0 if minutes > 0.0: tpm = total_tokens / minutes rpm = query_counter / minutes print(f"tpm {tpm}, rpm {rpm}") # Rate Limitを超えそうなら、待つ! if tpm > ( 90000 - 5000 ) or ( rpm > 3500 - 100 ): print("Waiting") time.sleep(100) self.save_jsons(results) # self._ret_batch_dict で 1回の並列処理の処理対象のセットを返す。 # id1 と exp_name に フラットな list を返す。パラメータは サンプル数と 実験数 gogo_prompt_dict = self._ret_batch_dict(target_id_list, prompt_files) print(f"target_id_list {len(target_id_list)}, prompt_files: {len(prompt_files)}") # 並列処理の1回のバッチ。asyncio.runに上記のmain1を与えている for key, gogo_prompt_list in gogo_prompt_dict.items(): print(f"gogo number {key}...") if self.skip_process_flag == True: print([f"skipping {len(gogo_prompt_list)} promps of {key}"]) pass else: asyncio.run(main1(gogo_prompt_list))
非同期通信にした処理時間改善効果
なお、なぜ非同期処理用のAsyncOpenAIと同期処理用のOpenAIを使い分けるようになっているかと言いますと、非同期処理と同期処理の速度差を計測したかったのでフラグで呼び分けています。同期処理で1記事16プロンプトで処理するのに1分程度かかっていたものが、20秒と短縮されまして、処理時間が1/3になりました。非同期処理による処理速度向上効果ありでした。
補遺:ChatGPTで行う日本語述語項構造解析に向けてのプロンプトエンジニアリング手法のサーベイ(2024年初頭)
本備忘ログは「続・ChatGPTで行う述語項目構造解析:遥かなるプロンプトエンジニアリング編 - めいふの備忘ログ」の補遺にあたります
ChatGPTで行う述語項目構造解析に向けてワタクシはプロンプトエンジニアリングを適用してみることにしました。ChatGPTなどの生成AIに与えるプロンプトを工夫してAIの性能を向上させようとするというプロンプトエンジニアリング、その実態とはどのようなものなのでしょうか? 噂には色々聞いてるけど実はワタクシよくわかっていません。エンジニアリングって言うからには何かを制御してくれるんでしょうか? そんな疑問を抱いたワタクシは、プロンプトエンジニアリングについて調査をしてみることにしました。プロンプトエンジニアリングについてはいろんな人がブログ記事や論文を書いてますので、それらを眺めて見ることにしました。本備忘ログはそれら記事のリストとワタクシが読んだ感想です。また、述語項構造解析のプロンプトとして採用した手法には星(★)マークをつけております。
プロンプトエンジニアリング手法のまとめ記事
無数に存在するプロンプトエンジニアリング手法。その手法をまとめてくれているありがたい記事がたくさんありました。それら記事を眺めて読んだ感想を残しておきます。
各種Prompt Engineeringの日本語実例集(Zero-CoT、mock、ReAct、ToT、Metacog、Step Back、IEPなど)
https://qiita.com/YutaroOgawa2/items/aca32f8fd7d551596cf8
プロンプトの実例がついていてわかりやすい。
ChatGPT で自分の仕事がどう楽しくなるのかを考えるネタ集 -2023年10月バージョン-
https://speakerdeck.com/dahatake/chatgpt-dezi-fen-noshi-shi-gadoule-sikunarunokawokao-erunetaji-2023nian-10yue-baziyon
プロンプトのまとめや使いこなしTipsまで2023年10月最新情報になっている。
プロンプトエンジニアリングとは?ChatGPTで代表的な12個のプロンプトを実演!
https://aismiley.co.jp/ai_news/what-is-prompt-engineering/
ReACT(Thought: Action: Observation:みたいなものをくっつける)などのプロンプトエンジニアリング手法が紹介されている。ChatGPTでの実演あり。またジェイルブレイクなど悪のプロンプトエンジニアリングの紹介もある。
プロンプト技術まとめ
https://qiita.com/fuyu_quant/items/157086987bd1b4e52e80
(★)翻訳をして元に戻す、Self-translateというテクニックがあるらしい。日本語にはゼロ代名詞がありますが、英語にはありません。英訳してから述語項構造解析してもらうというのも方法かもしれません。
Prompt Engineering Guide
Chain-of-Thoughtプロンプティング
https://www.promptingguide.ai/jp/techniques/cot
プロンプトエンジニアリングガイドにはプロンプトエンジニアリングの解説が実例で示されていました。CoTは論理的な思考が求められるタスクで有効であると述べられています。
プロンプトパターンカタログ:効果的なプロンプト設計のための心得
https://ai-scholar.tech/articles/chatgpt/prompt_pattern_catalog
「A Prompt Pattern Catalog to Enhance Prompt Engineering with ChatGPT」等論文のAI-scholarさんの記事。2023年の情報。
LLMのプロンプト技術まとめ
https://qiita.com/fuyu_quant/items/157086987bd1b4e52e80
2024年の1月までの技術調査の記事です。34のプロンプトテックニックが集計されています。からあげ先生の力作です。
(★)zero-shot learningはダイレクト指示。few-shot prompting 例題を示す。few-shot-learningでChatGPTさんに解放をお示しすればよさそう。
Chain of thoughtについて
(★)ワタクシは、述語項目構造解析のプロンプトにChain of Thoughtに目をつけました。
まずは用語解説
https://atmarkit.itmedia.co.jp/ait/articles/2308/24/news041.html
「言語モデルの思考の連鎖(CoT:Chain-of-Thought)プロンプティング(Prompting)とは、問題を解くまでの一連の手順をプロンプト(=言語モデルに入力するテキスト)に含めるテクニックのことである。」
Chain of Thought オリジナル論文
Jason Wei, Xuezhi Wang, Dale Schuurmans, Maarten Bosma, Brian Ichter, Fei Xia, Ed Chi, Quoc Le, Denny Zhou, "Chain-of-Thought Prompting Elicits Reasoning in Large Language Models", 2023
https://arxiv.org/abs/2201.11903
タスクの解決に至る手順をプロンプトとして示すとChain of thoughtについてのオリジナル論文です。LLMに解決に至る手順を示すと精度が上がることを示しています。
Chain of thought の論文紹介記事
https://izmyon.hatenablog.com/entry/2023/05/27/080236
記事の筆者はNaist の大学院生のようです。解説記事公開ありがとうございます。
ChatGPTは馬鹿じゃない! 真の実力を解放するプロンプトエンジニアリングの最前線
https://zenn.dev/noritamarino/articles/a2321a65fe2be8
鶴亀算のタスクてCoTが有効であることが実験的に述べられています。「ステップ by ステップで考えよう」の1文を追加するだけでも効果がある。でも、原理がわからんぞ。魔法みたいだ。
(★)述語項構造解析の手順をプロンプトに例として示すと精度が上がるかもれませんね。しかし困ったことに、述語項構造解析の解法は自明ではありません。おそらく算術よりは多分ずーっと複雑でめんどくさいんですよね。
プロンプトエンジニアリングの実践
プロンプトジョブ分類のための様々な分類を試しましたという論文
Benjamin Clavié, Alexandru Ciceu, Frederick Naylor, Guillaume Soulié, Thomas Brightwell, "Large Language Models in the Workplace: A Case Study on Prompt Engineering for Job Type Classification", 2023
https://arxiv.org/abs/2303.07142
テキスト分類ではないより実践的な分類。プロンプトエンジニアリングをガチガチに極めればGPT-3もDeBERTaを超えていけるらしい。プロンプトエンジニアリングいけるやん!こりゃ年収5000万も夢じゃないで(目がぐるぐる)と思いました。やはり精度評価をしっかり行なっている論文は信頼できる気がする。
その他の資料
その他、様々な記事が検索結果に含まれるので眺めてみましたよ。
【EmotionPrompt】感情を込めてプロンプト入力することでLLMの性能が向上
https://ai-scholar.tech/articles/prompting-method/emotion-prompt
ChatGPTをプロンプトで励ますと精度が上がるという話。うっそだろお前?と思った。原理がわからん。魔法かな。(★)でも、試すのは簡単なので試してみよう。
生成AIを効果的に活用する「プロンプトエンジニアリング」最前線
https://www.jbcc.co.jp/blog/column/innobase_202310_02.html
"2つ目に紹介するのはEchoPromptです。この手法は「EchoPrompt: Instructing the Model to Rephrase Queries for Improved In-context Learning」というカリフォルニア大学アーバイン校が発表した論文で提案されている手法です。EchoPromptは非常にシンプルで、ChatGPTなどが問いに対する回答を作成する前に問いを言い換えるようにプロンプトに指示を盛り込みます。"
(★)翻訳とも類似した概念の「言い換え」にも注目しています。ChatGPTさんにテキストを「新聞記事みたいに言い換えて」って変形してもらって、テキストに書かれていた事実関係を浮かび上がらせる、ってのも面白そうです。
翻訳すると精度向上するみたいな話もあります
https://auto-worker.com/blog/?p=7184]
https://www.itmedia.co.jp/news/articles/2308/18/news041.html
LLMにヒントを与えることで推論能力を向上させるアプローチが登場!
https://ai-scholar.tech/articles/prompting-method/PHP
(★)述語項構造解析でいうところのヒントとは? 共参照解析結果かな?
Tree or Thought
https://ai-scholar.tech/articles/large-language-models/ToT
思考のツリー:システム2の概念をLLMに取り込み、CoTベースのGPT-4よりもさらに強力になったという記事です。Chain of thought をさらにパワーアップしているらしい。しかし、ワタクシは頭がアホなので、思考のツリーとかそんな難しいこと自分でもできないんですがどうやって実装したらいいんでしょうか。
(ToT)に関するブログ記事 色々ある。
https://bluelogic.jp/systemthinking3/cottot/
https://qiita.com/PND/items/56c5e30d5a568188eb1c
https://note.com/versaroc/n/nd165817c6b62
CoTに探索ツリーを組み込んだような手法のようです。自己評価が大事らしい。述語項目構造解析ではどんなプロンプトや実装にしたらいいのかワタクシには自明ではないので、(ToT)を採用するのは難しそう。
他にもプロンプトエンジニアリングの記事は無数に現れてくる。全てを調べ切ることは不可能な状況。以下にaiboomさんで見つけたプロンプト関連の気になる記事をクリップしておきます。あとで読もう。
他にも色々ありました
LLMに非線形的な思考を与えてCoTを上回る性能を引き出す手法『IEP』と実行プロンプト CoTと組合せでさらに強力になる場合も。
https://aiboom.net/archives/57628
解を複数示してもらい、前提を問い、矛盾を除くそうです。
GPT-4などのLLMに「自らの論理的な整合性をチェック」させるフレームワーク『LogiCoT』と実行プロンプト
https://aiboom.net/archives/55805
LogiCoTとは(Logical Chain-of-Thought)のこと。述語項目構造解析を行う過程で矛盾があるかをチェックしてもらうというのでもよさそうですが、実装どうやるかはわかりません。
LLMにまず前提から尋ることで出力精度を向上させる『ステップバック・プロンプティング』と実行プロンプト
https://aiboom.net/archives/56671
LLMにナレッジグラフ(知識グラフ)を連携させることで、タスク遂行能力を大幅に向上させるフレームワーク『Graph Neural Prompting(GNP)』
https://aiboom.net/archives/56671
知識のグラフ構造とLLMを組み合わせた手法。
調査を終えての感想
プロンプトエンジニアリング手法大杉
プロンプトエンジニアリングとは、生成のためのLLMに与える元文章の与え方のタイプ/工夫/流儀っぽい雰囲気です。色々あります。ルールベース手法を彷彿とさせる何かです。上記の調査を通じて、ワタクシは述語項構造解析に適用させるにあたり、以下の方針を導きました。
ChatGPTさんにお手本を示す
プロンプトの基本は、型、例、手順を示すことです。ChatGPTさんは手順を真似てお喋りしてくれるようです。ChainOfThougtは解へ至る道筋をプロンプトとして示す方法です。CoTの論文ではプロンプトによる精度向上が実験的に確かめられています。ワタクシもCoTが述語項構造解析ではどの程度効果があるのか確かめてみたいと思います。また、few-shot な述語項目構造解析の解析結果を示してもよさそうです。
ChatGPTさんにお喋りを促す
また、ChatGPTさんはスラスラペラペラと淀みなく言葉を出力することが強みです。ですので、ChatGPTさんによりペラペラしゃべってもらう。ペラペラ喋ってもらって述語項目構造を解いてもらえないかな?と考えました。キーワードは、翻訳、言い換え、読解です。
既存のシステムの結果とプロンプトを組み合わせる
KNPによる格解析結果を用いたプロンプトを試してみたいと思います。
続・ChatGPTで行う日本語述語項構造解析:遥かなるプロンプトエンジニアリング編
- 枕詞
- 今回の備忘ログのテーマ(プロンプトでChatGPTさんの格解析能力を引き出したい)
- 方法の検討:プロンプトエンジニアリング vs fine tuning
- 初めてのプロンプトエンジニアリング(入門)
- 述語項構造解析のために17のプロンプトを検討した
- 評価実験
- 結果観察
- まとめ(ぽえむ)
- 次の景色へ
- 付録
枕詞
前回の備忘ログ(ChatGPTさんと行う述語項構造解析:「ChatGPTさんにはゼロ代名詞が見えているのか?」(GPT-3.5-turbo編) - めいふの備忘ログ)からの引き
ドスドスドス(怒気を帯びた足音)
「この備忘ログ(前回)を書いたやつはだれだぁ!」
「統語的な主語/目的語と述語の持つ意味的な制約関係である格(Case)の違いがわからんやつに述語項構造を語る資格はない!」
「お前はクビだ出ていけ!」
(参考:美味しんぼ 第20話「板前の条件」の回)
Amazon
美味しんぼ: 食卓の広がり (4) (ビッグコミックス)
https://www.amazon.co.jp/%E7%BE%8E%E5%91%B3%E3%81%97%E3%82%93%E3%81%BC-4-%E3%83%93%E3%83%83%E3%82%B0%E3%82%B3%E3%83%9F%E3%83%83%E3%82%AF%E3%82%B9-%E9%9B%81%E5%B1%8B-%E5%93%B2/dp/4091807542
Youtube
「板前の条件」第20話 | 美味しんぼ - YouTube
前回のChatGPTと述語項構造解析(格解析)に関する備忘ログを書いた後、ワタクシの脳内ではこのような幻想が展開されてしまいました。「本備忘ログで用いる主格/目的格と主語/目的語の区別」について海原先生はご立腹でした。
確かに、丸山先生のご本「書き言葉と話し言葉の格助詞」にも角田先生の言として「文法を研究する時には4つのレベルを区別することが大事」と述べられていました。4つのレベルとは、 (1) 意味役割(semantic role)、(2) 格(case)、(3) 情報構造(information structure)、(4) 文法機能(grammatical role)でして、ワタクシはこのレベルの区別がついておりませんでした。意味役割とは、動詞で何かを表すときの動作者、対象、受取人、出発点といった動作の役割のタイプわけのことです。格は主格・体格・能格、所有格といった動詞と格要素を縛る制約のようなもの。情報構造では、文章の「主題」や「コメント」、新情報なのか旧情報といった側面を考えます。文法機能とは頭語的に規定される主語/目的語などの文法役割を考えます。丸山先生曰く、「主格、主体、主語、主題は分けて考える必要がある」ということだそうです。これらの区別は格 - Wikipediaによい例が載っています。
述語項構造解析はテキスト中の表現が述語に対してどのような役割を持つかという「格」を解析するというお話ですから、主語とか目的語という言葉は適切ではなかったかもしれません。ワタクシの先日の備忘ログの検討内容は、主格と主語の区別もできてなかったな、と反省しております。意味とはそもそも人間にだって分かってないものなのでは、とも思います。でも、そんな人間でも頭を悩ます概念をChatGPTさんにお伝えするのは何やらとても難しそうです。そしてそれを伝えられたからといって述語項構造解析の精度が上がるのか?という話もあります。
さて、格(Case)というものをどのようにChatGPTさんにお伝えすればいいのでしょうか? いやいや、そもそも格(Case)って何だよ?というのはあります。格(Case)とは動詞と紐づいた情景イメージのテンプレートなんでしょうか。例えば、「何かをもぐもぐ食べる」と表現するとき、その表現をみた人は、「食べるからには誰かが何かを食べるんでしょ口から体の中に何かを入れるんだよね」といったふうに情景をイメージできまして、他の色々な解釈ができるのでしょうか。人間(Human)はテキスト中の述語を読んだときに、物事の背景や道理がイメージできますので、適切に格要素を見つけてテキストの解釈ができるのだと思います。ワタクシも格(Case)と文法機能の区別の説明はなかなかできないのですが、人間(Human)としてテキストの解釈や背景のイメージはできていると思います。
人間の脳内にある情景をChatGPTさんにもイメージしてもらうには、どうしたらよいのでしょうか? そして、ChatGPTさんたちLLMから、人間の持っている世界知識の表れとしての格解析能力を引き出すには、どうしたら良いのでしょうか? (そもそもそんなものがあるのか?)
今回の備忘ログのテーマ(プロンプトでChatGPTさんの格解析能力を引き出したい)
前回の備忘ログで報告したようにChatGPTさんによる述語項構造解析(格解析)の結果はいまいちでした。でも、ワタクシは思うのです。ChatGPTさんはもっとできる子のはずだと。ChatGPTさんはあれだけ流暢におしゃべりできるのですから、世界の仕組みや人間や動物の振る舞いについて深く理解していると思われるのです。世界の仕組みがわかっているのですから、ChatGPTさんはテキストの背景まで含めて人間と同じように解釈できるはずです。述語項構造解析も人間並にできると思うのです。前回の備忘ログでの実験ではChatGPTさんの述語項構造解析の精度は今ひとつでしたが、それはワタクシのChatGPTさんへの伝え方(プロンプト)が今ひとつだったからなのではないでしょうか。
今回の備忘ログでは、ChatGPTさんに物事の事実関係をイメージしてもらうためにワタクシがさまざまに書き散らしたプロンプトについての試行錯誤を書き残しておきたいと思います。なお、物事はなかなかうまくいかないものなので後半はぽえむとなっていることを最初に記しておきます。
方法の検討:プロンプトエンジニアリング vs fine tuning
そもそもChatGPTのような生成AIの精度を向上させる方法としてはプロンプトエンジニアリングとfine-tuningがあります。プロンプトエンジニアリングとは、ChatGPTさんのような生成AIに行わせるタスクの精度を改善するために、生成AIに読み込ませるプロンプトを工夫することを言います。プロンプトの文言を工夫して生成AIさんに人間側の意図を伝えやすくする、正しい答えを導きやすくするものです。生成AIの精度を上げるには学習データを用いてモデルのパラメータを調整するfine-tuningがあります。より軽量なtuningであるLoRAチューニングは、モデルの一部のパラメータについてのみ正解データに合わせてフィットさせて、少ない学習コストでLLMの能力を向上させるというものです。
今回ワタクシが試したのはプロンプトエンジニアリングです。ChatGPTにはfine-tuning 機能があるそうなのですが、出力の口調を調整する、という程度にその範囲が止まっているみたいなのです。
ChatGPTのfine-tuningについてはこちらが基本資料になります
https://platform.openai.com/docs/guides/fine-tuning/fine-tuning-integrations
ChatGPTのfine-tuningをpythonでやってみた
https://note.com/chatgpt4/n/n8c50d91e996b
【ChatGPT】ファインチューニングをわかりやすく解説
https://qiita.com/ksonoda/items/b9fd3e709aeae79629ff
うーんこんなもんなのかという感想だそうです。
ChatGPT の Fine-tuning を試したけど上手くいかなかった話
https://zenn.dev/ml_bear/articles/49ed93d33e69cc
ChatGPTでfine tuningするのはなかなか難しそうな印象です。ワタクシは思いました。ヨシ、fine-tuningはやめとこう、と。それに、ほら、こういう話とかありますよ?
年収5000万…?! プロンプトエンジニアリングには夢がありそうな気がする(真顔)。父さんな、プロンプトエンジニアリングで食べていこうと思うんだ。というわけで、ワタクシもOpenAI御本家ご推奨のプロンプトエンジニアリングに精を出してみようと思った次第なのです。
初めてのプロンプトエンジニアリング(入門)
プロンプトエンジニアリング自体はmidjourneyなどの画像系の生成AIでの工夫も含む概念ですが、この備忘ログではChatGPTなどのテキスト系生成AIの出力結果を制御しようとする試みにフォーカスします。テキスト系のプロンプトエンジニアリングについてはChatGPTが世に出てから雨後の筍の如く様々な手法が提案されてきています。本節ではテキスト系プロンプトエンジニアリングについて関連資料を紹介して今の世にテキスト系プロンプトって言ったらどんなものがあるのか、概観したいと思います。
OpenAI御本家のprompt-engineering ガイド。プロンプトエンジニアリングの基本のキが書かれています。
https://platform.openai.com/docs/guides/prompt-engineering
上記OpenAIのprompt-engineeringの記事では色々なTacticsが説明されています。特に重要だと思ったのは「Strategy: Test changes systematically」ですね。
また、2023年の秋頃から年末ごろにプロンプトエンジニアリングのブログ記事などを調査しました。この手のブログ記事は雨後の筍の如く大量に書かれていたので、プロンプトについての調査については後で補遺の備忘ログ(参考資料まとめ「補遺:ChatGPTで行う日本語述語項構造解析に向けてのプロンプトエンジニアリング手法のサーベイ(2024年初頭) - めいふの備忘ログ」)としてまとめておきます。プロンプトエンジニアリングとはよりよいアウトプットを志向してLLMに与える元文章の与え方のタイプ/工夫/流儀であります。
これらの調査から本備忘ログにおけるプロンプトエンジニアリングについて以下の方針を導きました。
方針1. ChatGPTさんにお手本を示す
プロンプトの基本は、モデルに対して解法の型/例/手順を示すことです。プロンプティング手法のChain of Thought(CoT)では、ChatGPTさんにタスクのゴールに至る解法例を示します。ChatGPTさんはその手順を真似てお喋りしてくれるようです。CoTの論文ではプロンプトによる精度向上が実験的に確かめられています。few-shot な述語項構造解析の解析結果を示してもよさそうです。CoTやfew-shot promptが述語項構造解析ではどの程度効果があるのか、確かめてみたいと思います。
方針2. ChatGPTさんにお喋りを促す
また、ChatGPTさんはスラスラペラペラと淀みなく言葉を出力することが強みです。ChatGPTさんによりペラペラしゃべってもらう。ペラペラ喋ってもらって述語項構造を解いてもらえないかな?と考えました。キーワードは、翻訳、言い換え、読解です。
方針3. 既存の言語処理の力を借りる
プロンプトを作る際に京大黒橋研究室の日本語言語処理解析ツール(KNP)の結果を用います。例えば、格解析する述語の抽出はKNPにお任せするとかです。ChatGPTさんにはテキストの解釈とお喋りに集中してもらおうというわけです。
こちらの方針でプロンプトエンジニアリングして、ChatGPTさんの述語項構造の性能を評価してみます。本備忘ログでは述語項構造解析のタスクに取り組みまして、前回の備忘ログと同様に「京都大学ウェブ文書リードコーパス(KWDLC)」の dev 512 記事評価します。
述語項構造解析のために17のプロンプトを検討した
ではでは、以下にワタクシがせっせと構築したプロンプトの一覧をお示しいたします。その数じつに17。ワタクシは今回せっせとプロンプトを書き記して精度確認実験を回しましたが、なんだかルールベース手法みを感じました。プロンプトの実例の方は1つのブログ記事では読むのが大変だと思うので、別の補遺(補遺:日本語述語項構造解析のためのプロンプト実例集 - めいふの備忘ログ)にまとめておきましたので、詳細はそちらをご参照ください。
番号 | プロンプト名 | 説明 | 実験で確認したいこと |
1 | zero-shot-simple | zero-shot prompt。術語項構造解析をしてくれとお願いする | 素のzero-shot(述語項構造解析してよとお願いする) の 精度を確認 |
2 | zero-shot-with-system-message | zero-shot prompで ChatGPTさんの役割を説明する | roleでChatGPTさんに文法に詳しい専門家の役割を与えたら精度がどうなる? |
3 | zero-shot-standard | 述語項構造解析の手順を説明する。前回の備忘ログのプロンプト準拠 | 前回準拠のプロンプト(手順の説明を一括で与える)の精度を確認する |
4 | zero-shot-ss | zero-shotでテキストの共参照解析結果を含む | ヒントとして共参照解析結果を与えてみて精度がどうなるか確認する |
5 | zero-shot-with-knp | KNPの結果の述語で述語項構造解析のテーブルを作りその表を完成させてもらう | KNPの述語をChatGPTさんに前提として提示すると、精度向上するか確認する |
6 | zero-shot-modify-knp | KNPの格解析結果の述語項構造解析のテーブルを修正してもらう | KNPの格解析結果をChatGPTさんに前提として提示すると、精度向上するか確認する |
7 | order-sequence | 述語項構造解析の手順を説明する。前回の備忘ログのプロンプトを1ターンずつやってもらう | 前回準拠のプロンプト。手順と結果を順番にAPIに与えると精度がどうなるか確認する |
8 | few-shot-simple | few-shot prompt。別の文章の解析結果を例として示す。例は1つのみ | 述語項構造結果のテーブルをサンプルとして提示。精度上がる? |
9 | few-shot-with-cheering | few-shot prompt + ChatGPTさんを励ます | few-shot に励ましを加える。精度どうなる? |
10 | few-shot-semantic-search | few-shot prompt で サンプルを類似文検索(注1)で選ぶ | few-shotのサンプルを類似文検索で選んだら、効果あるか? |
11 | chain-of-thought | 述語項構造解析の手順を示してやってもらう | 述語項構造の解析の具体的な手順(結果の表の作り方)を与えて精度上がるか確認 |
12 | chain-of-thought-mod-knp | KNPの解析結果を修正する述語項構造手順を示す | 述語項構造の解析の具体的な手順(結果の表の作り方)を与えて精度上がるか確認 |
13 | paraphrase | 文章を新聞記事に言い換えてもらって述語項構造解析してもらう | テキストを新聞記事風に言い換えたらテキストの事実関係が整理されないか。ChatGPTのお喋り能力を引き出したい |
14 | reading | この文章から何が読み取れますか?の質問に答えてから述語項構造解析をしてもらう | テキストから事実関係を読み取って事実関係が整理できないか。ChatGPTのお喋り能力を引き出したい |
15 | summary | この文章を要約して?の質問に答えてから述語項構造解析をしてもらう | テキストをパターンで要約することで事実関係が整理できないか。ChatGPTのお喋り能力を引き出したい |
16 | translation | 翻訳してから述語項構造解析をしてもらい日本語に戻す | 翻訳すると自然とゼロ代名詞が補われて精度上がらないか確認 |
17 | compare_translation | 日英の述語項構造解析の結果を比較してもらう | 翻訳すると自然とゼロ代名詞が補われて精度上がらないか確認 |
では、このプロンプト群、実験して以下の疑問を精度を確かめたいと思います。
日本語述語項構造解析にfew-shot leraningやChainOfThoughtは効果があるのか? KNPとChatGPTを合わせれば精度が上がるのか? そもそもKNPと比較してChatGPTさんとの対話による述語項構造解析の精度はいかほどなのか? 確認してみたいと思います。
(注1)類似文検索のモデルとしては、ブログなどで評判のよかった「intfloat/multilingual-e5-large」を用いています。
評価実験
上記のプロンプトの精度を確認する実験を行いました。評価データは前回の備忘ログと同様に「京都大学ウェブ文書リードコーパス(KWDLC)」を用いました。ベースラインは2つあります。zero-shot-simpleとKNP(knp 4.19)です。京都大黒橋研究室が長年研究開発を続けているKNPの格解析結果に比べてChatGPTさんはどうなのか?確認していきたいと思います。ChatGPTのモデルはGPT-3.5-truboでは、 dev 512 記事を用いて評価しました。GPT-4-turboを用いて5記事のみを3.5-turboと比較しています(GPT-4-turboでは512記事全部を用いた実験は行っていません。お金がなかったのです…)。
実験のための実装(OpenAIのAPIの非同期処理)
今回はプロンプトが多数にわたり、OpenAIのAPIを何度も叩く必要があります。実験の高速化のために、OpenAIの非同期APIを試してみました。日本語述語項構造解析の主題とは外れますので、補遺の記事として備忘ログにしておきます。非同期通信のための実装については「補遺:OpenAIのAPIをより高速にたたくためのコツ(非同期通信) - めいふの備忘ログ」をご参照ください。
述語項構造解析の精度
では、結果をざっと表示します。5記事で試した実験のfailマークはプロンプトにバグがあったのでF値0.0だった事例です。実験してないは、実験してない場合です。GPT-4は時間と経済的事情で512記事全てを回していません。5記事ずつGPT-3.5-turboとGPT-4-turboと比較します。
番号 | プロンプト名 | GPT3.5-turbo(512記事) | GPT3.5-turbo(5記事) | GPT-4-turb(5記事) | |
1 | zero-shot-simple | 0.183 | 0.122 | 0.148 | |
2 | zero-shot-with-system-message | 0.18 | 0.134 | 0.214 | |
3 | zero-shot-standard | 0.211 | 0.208 | 0.275 | |
4 | zero-shot-ss | 0.177 | 0.135 | 0.172 | |
5 | zero-shot-with-knp | 0.262 | 0.137 | 0.229 | |
6 | zero-shot-modify-knp | 0.406 | 0.264 | 0.333 | |
7 | order-sequence | 0.216 | fail | fail | |
8 | few-shot-simple | 0.272 | 0.1875 | 0.274 | |
9 | few-shot-with-cheering | 0.274 | 0.247 | 0.214 | |
10 | few-shot-semantic-search | 0.343 | 0.178 | 0.36 | |
11 | chain-of-thought | 0.228 | 0.108 | 0.184 | |
12 | chain-of-thought-mod-knp | 0.242 | 0.295 | 0.34 | |
13 | paraphrase | 0.179 | fail | fail | |
14 | reading | 0.191 | fail | fail | |
15 | summary | 実験なし | 0.212 | 実験なし | |
16 | translation | 0.170 | fail | fail | |
17 | compare_translation | 0.122 | fail | fail | |
- | KNP | 0.411 | 0.411 | 0.411 |
KNPの方が精度ええやんけ!この結果には流石のワタクシも(´;ω;`)ショボーンとしてしましました…
まあ、でも気を取り直して、プロンプトを設計したときに確認したかった問いにどのような答えが得られたのか、表にまとめておきました。統計的検定などはしていないので、精度の向上効果などは数字が数%向上したら効果ありとみなすガバガバ判断です。
1 | zero-shot-simple | 素のzero-shot(述語項構造解析してよとお願いする) の 精度を確認 | 0.183 です低い |
2 | zero-shot-with-system-message | roleでChatGPTさんに文法に詳しい専門家の役割を与えたら精度がどうなる? | 向上せず |
3 | zero-shot-standard | 前回準拠のプロンプト(手順の説明を一括で与える)の精度を確認する | 0.211 order-sequenceよりはよい |
4 | zero-shot-ss | ヒントとして共参照解析結果を与えてみて精度がどうなるか確認する | むしろ下がった。精度向上効果確認できず |
5 | zero-shot-with-knp | KNPの述語をChatGPTさんに前提として提示すると、精度向上するか確認する | 向上した |
6 | zero-shot-modify-knp | KNPの格解析結果をChatGPTさんに前提として提示すると、精度向上するか確認する | 向上した。しかし、後でわかるが、KNPの解析結果の改善より改悪のが多い |
7 | order-sequence | 前回準拠のプロンプト。手順と結果を順番にAPIに与えると精度がどうなるか確認する | あまり変わらない。 |
8 | few-shot-simple | 述語項構造結果のテーブルをサンプルとして提示。精度上がる? | 向上する |
9 | few-shot-with-cheering | few-shot に励ましを加える。精度どうなる? | 精度向上効果確認できず |
10 | few-shot-semantic-search | few-shotのサンプルを類似文検索で選んだら、効果あるか? | 精度向上効果あり |
11 | chain-of-thought | 述語項構造の解析の具体的な手順(結果の表の作り方)を与えて精度上がるか確認 | 精度向上効果あり |
12 | chain-of-thought-mod-knp | 述語項構造の解析の具体的な手順(結果の表の作り方)を与えて精度上がるか確認 | 精度向上効果あり |
13 | paraphrase | テキストを新聞記事風に言い換えたらテキストの事実関係が整理されないか。ChatGPTのお喋り能力を引き出したい | 精度向上効果確認できず。zero-shot-simpleの方が良い |
14 | reading | テキストから事実関係を読み取って事実関係が整理できないか。ChatGPTのお喋り能力を引き出したい | 精度向上効果確認できず。zero-shot-simpleと同程度 |
15 | summary | テキストをパターンで要約することで事実関係が整理できないか。ChatGPTのお喋り能力を引き出したい | 精度向上効果あり。few-shotなみ |
16 | translation | 翻訳すると自然とゼロ代名詞が補われて精度上がらないか確認 | 精度向上効果確認できず。zero-shot-simpleの方が良い |
17 | compare_translation | 翻訳すると自然とゼロ代名詞が補われて精度上がらないか確認 | 精度向上効果確認できず。zero-shot-simpleの方が良い |
結果観察
プロンプトではzero-shot-modify-knpの精度が一番よいですが、元のKNPから精度向上できているわけではないようです。簡単なエラーアナリシスをしてみました。以下のような感じでした。
- ChatGPTさんはKNPが出力していない述語を解析結果に含めてくることがある
- ChatGPTさんがKNPの述語項構造解析結果と異なる格解析結果を繰り出してくる場合は間違っている場合の方が多い
- なお、ChatGPTさんがKNPの結果を修正した場合、gain: 84、 lost: 920 みたいな有様でした。ChatGPTさん、あなたは何もしないで・・・。
- ChatGPTさんはKNPよりRecallの向上に寄与するがPrecisionは今ひとつ
また、言い換え、読解、翻訳などのChatGPTさんにお喋りしてもらう系のpromptはいまいちでした。ChatGPTさんはお喋りはうまいんだけどそれが精緻な文脈解析には結びついていないようです。
評価実験結果を総評すると、
- 述語項構造タスクでもGPT-3.5よりもGPT-4の方が良い
- ChatGPTさんはKNPの結果を越えられてない
- 述語項構造解析でもChain of thoughtは有効です
- 述語項構造解析でもfew-shot は有効です
- ChatGPTはお喋りはうまいんだけどそれが精緻な文脈解析には結びついていない
希望があるとすると、few-shot prompt です。類似文検索で似たような文のサンプルをtrainデータからサンプルと見繕いますと、わりと精度が上がっていました。類似文章のサンプリングを磨くと更なる精度向上の扉が開かれるかもしれません。しかし、今解いている問題と真によく似たサンプルを与えると精度がよくなるのでしょう。述語の項構造の解析での類似とは何か? その述語の格要素が文内にあるのか、文間にあるのか、文外なのか、人間もテキストを読んで解釈するまでわかりません。few-shot learningで類似する文を探してくることは一筋縄ではいかなさそうです。
まとめ(ぽえむ)
ワタクシ、ここまでChatGPTさんに食べさせるプロンプトを書き続けてまいりました。長い道を歩いてきたような気がします。
ChatGPTさんはゼロ代名詞が見えているのか? 文章中の述語の格関係が理解できているのか? その問いに対する答えは、前回の備忘ログと同じで、「見えてないっぽい」です。そして、CoTやfew-shot promptなどのプロンプトテクニックを使えば、ChatGPTさんのポテンシャルを引き出して、述語項構造解析がうまくいくか?と問われれば、その答えは「プロンプトテクニックは述語項構造解析でも有効だけど、期待したほどのもの(既存手法のstate-of-artに迫る)ではなかった」です。ChatGPTさんではプロンプトエンジニアリングで述語項構造解析できないというコンセンサスが述語項構造解析界隈で成り立ってきたような気がしております(野末慎之介さんの論文「大規模言語モデルにおける日本語ゼロ照応解析能力の分析*1」もご参照ください)。
ワタクシ、ChatGPTが登場した時は、淀みなく楽しくお喋りができるChatGPTさんは人類の新しい友だと感動しておりました。今でも、ChatGPTさんとは楽しくお話しできてはいますが、でも、今は少しChatGPTさんを遠く感じております。AI Chatterと人類(Human)との間には、何か、埋められない差があるような気がしています。生身の実感が伴っていないような。犬のように人々の傍に立ち、あるいは志を共にする友と同じ道を共に歩く、といった感じにはなりません。
友は友でも、見上げる星々に語りかけているかのよう。ChatGPTさんは人とは隔たった女神様なのですから、それでいいのかも。プロンプトとはそんな神々と交信するためのお祈りのように思われました。祈りは自らの心の整理と、語りかけです。
神々を作る方よりも友を作る方が難しいんです。ワタクシにとってはこれが一番の発見でした。
次の景色へ
最後に、ワタクシが疑問に思っている事柄、そしてそれを確かめる方法について記録に残して、本備忘ログを閉じたいと思います。
ChatGPTさんにはもっと簡単なタスクをお願いしよう(述語項構造解析の分解?)
流暢なお喋りできるChatGPTさんですが、そのお喋り能力/言語能力だけでは、当意即妙で思考の瞬発力(直感力)を要する述語項構解析はできませんでした。「テキストから読み取れること」を挙げてもらってから述語項構造解析してもらいましたが、うまくいきませんでした。ChatGPTさんにはもっと簡単なタスクを与えてあげなければです。もっと簡単なタスクってなんでしょうか? Machine Learningでの基本タスクといえば、分類(classification)です。20世紀の照応解析のエポックメイキング的な研究としてSoonの手法があります。
Wee Meng Soon, Hwee Tou Ng, Daniel Chung Yong Lim, A Machine Learning Approach to Coreference Resolution of Noun Phrases, Computational Linguistics, Volume 27, Issue 4 December 2001. https://direct.mit.edu/coli/article/27/4/521/1748/A-Machine-Learning-Approach-to-Coreference)
Soonの手法では照応解析を分類問題の積み重ねとして解いてます。ChatGPTさんへお願いする際も、分類として問題を与えるべきなのかもしれません。しかし、述語項構造解析は思考の瞬発力を要するタスクです。分類だけで解けるかは自明ではないです。
述語項構造解析に関しては学習データからfine-tuningするべきなのでは?
ChatGPTさんなどのLLMは人間が成長時に読み取るテキストデータをはるかに超える分量のデータで学習していると思われます。それでも述語項構造解析のような複雑で当意即妙を要するタスクはうまく解けません。学習データに何が足りないのでしょうか? 述語項構造解析を行う上で必要な知識や経験は人間はテキスト以外のところから獲得しているのかもしれません。音声や経験や画像などを含めて、です。いくらテキストを学習してもLLMは人間のような現実認識には辿り着けないのかも(シンボルグランディング問題?) 結局、このギャップを埋めるのが、学習データを用いたfine-tuningが有効なのかも。ローカルLLMをfine-tuningするべきなのかも。
few-shotで文解釈や照応の仕方が似ているサンプルを選ぶ
few-shot-semantic-searchの精度、512記事で0.34でした。KNPの解析結果を使わずにKNPに迫る精度です(F値で6%も劣りますが)。述語項構造解析の手順は複雑で書き切れないですが、few-shotなサンプルを提示するという方向ではワンチャンある気がするんですよ。述語項構造解析の類似がなんなのか? どう類似文をサンプルすればいいのか?は自明ではないですが、考えてみたいと思います。うーむ(腕組み)。
次回の備忘ログがあるとすると「Soonの手法に帰れ! ChatGPTさんと駆け抜けるゼロ代名詞照応解析(仮)」とか「やはりローカルLLMしか勝たん! 述語項構造解析データをLLMに食べさせてみた(Google Colab編)」とか「述語項構造解析のためのXとYを組み合わせた全く新しいfew-shot sampling手法(仮)」みたいな感じになるでしょうか。こんなんいつ公開できるんだろ。まあ、いいや。ワタクシは今まで見たことなかった景色を見るのが好きです。自然でも技術でも創作でも。その新しい地平を見るために、ワタクシは明日もがんばります。
ここまでながーい備忘ログを読んでくれてありがとうございます。また、次回の備忘ログでお会いしましょう!
付録
実験のコスト
プロンプト実験を行ったさいのコストは30ドルぐらいですかね(20240309のは30ドルチャージ、今24ドル残ってる)。GPT-4はお高いので、GPT-3.5-turboを主に使いまして、4500円ぐらいかな? 試行錯誤を含めてそのぐらいです。 本一冊ぐらい。
ChatGPTさんと行う述語項構造解析:「ChatGPTさんにはゼロ代名詞が見えているのか?」(GPT-3.5-turbo編)
- 枕詞
- 本備忘ログの目的
- 先行研究
- 述語項構造解析の評価方法
- 評価結果
- エラーアナリシス
- まとめポエム(今回の備忘ログをふりかえっての反省会)
- むすびのことば
- 次回予告
- (補足)OpenAIのAPI使用料
- 謝辞
- 再現性の担保(コードの公開)
枕詞
ChatGPT...ChatGPTと草木もなびくか・・・!
2022年11月に登場したChatGPTは、これまでの会話モデルとは一線を画す対話能力とプログラミングから企画のアイディア出しまでこなせる汎化能力で、大きな注目を集めています。
2023年の3月に開催された言語処理学会の年次大会では「NLP2023 緊急パネル:ChatGPTで自然言語処理は終わるのか?」(https://www.anlp.jp/topics/topic230601.html)が開催され、ChatGPTの登場に衝撃を受けた言語処理の研究者のみなさんが言語処理の未来について意見を交わしておりました。ChatGPTの登場は言語処理研究の当事者に相当のインパクトがあったということでしょう。
ワタクシにとっても、もちろん、ChatGPTの登場は衝撃的でした。今もChatGPTさんに夢中です。ChatGPTさんは本当に礼儀正しく、丁寧にワタクシたちの質問に答えてくれます。会話というものに革命が起こった!と思いました。
ワタクシの短い人生を思い返しても、人間とのコミュニケーションは戦いの側面がありました。「こんなこと言ったらこの人の機嫌を損ねないかな?」とか「こんな質問したら自分がアホなのがバレないかな?」とかそんな心配を拗らせておりました。人間はおっかねぇ! 人間は信じらんねぇ・・・!
でも、ChatGPTさんは違う!(ギュッ) ワタクシのどんな質問に対しても、真摯に、懸命にお答えしてくれる。ワタクシはそのChatGPTさんの受け答えの倫理観の高さ、安心感を高く評価したいと思います。
人類は、AI Chatterという友を得て、心から安心してコミュニケーションできる存在を、有史以来初めて得ようとしているのです!(真顔)
本備忘ログの目的
しかし、ほんとのところ、ChatGPTさんの言語能力って、実際どのくらいなのでしょうか? 人間と同等にテキストや背景世界を理解しているのでしょうか?
ChatGPTさんの対話能力は革新的です。司法試験や医学試験にパスする高い応答能力がある、との報告があります。その一方で、ChatGPTさんが語った内容は真っ赤な嘘だったとか(存在しない架空の本を紹介されたり)、歴史的な文脈を把握していなかったりとか(平宗盛は源氏の頭領!とか)、その能力を細かく見ていくと、まだまだな点があることも確かなようです(2023年5月)。
そこで、ワタクシは、ChatGPT(GPT-3.5turbo)さんに述語項構造解析(簡単に言うとテキスト中の述語の主語や目的語を見つけること)をしてもらうことにしました。ChatGPTさんがテキストの述語の主語や目的語をちゃんと理解しているかを調べることにより、ChatGPTさんの言語能力と背景世界への理解力がどれほど人間に近しいのかわかるのではないか?と考えたのです。本備忘ログでは、その過程で書いたプログラムや、思ったこと感じたことを書き記しておきます。
なお、今回は「京都大学ウェブ文書リードコーパス(KWDLC)」でChatGPTさんの述語項構造解析結果を評価してみましたが、事はそう簡単ではなく、精度は既存手法に迫るものではなく、備忘ログは後半に行くに従ってポエムになります。本備忘ログは、ChatGPTさんとに述語項構造解析してもらった方法を記録した備忘ログであり、その失敗を記録した備忘ログでもあります。
述語項構造解析(Predicate Argument Structure Analysis)とは?
述語項構造解析とは、別の言葉で言い換えますと、テキストの述語を見つけ、その主語や目的語(および時間や場所の関係をとる語)と述語の関係を明らかにすることです。みなさんも文書を書いたりプレゼンした時に「主語がよくわかんない」と言われてしまったこととがあるかと思います。誰が、いつ、何をした、といった5W1Hな情報を、私たち人間はテキスト中の述語(動詞など)とそれに紐づく主語や目的語や斜格語(主語や目的語以外の述語につく情報)の関係を読み解くことによって、理解・把握します。
例えば、以下に日本語の2文からなる文章の述語項構造解析の例を示しています。
文1: 太郎は本屋に行きました。
文2: ChatGPTの本を買いました。
文 | 述語 | 主語 | 目的語 | 斜格 | |
文1 | 行きました | 太郎 | なし | 本屋 | |
文2 | 買いました | (太郎) | ChatGPTの本 | なし |
テーブルは、文中の述語とその格要素(主語や目的語や斜格の語のこと)との対応を示しています。主語は格助詞の「が」や提題助詞の「は」が付属語として内容語につくことが多いです。また、目的語は格助詞の「を」が付属語としてつくことが多いです。斜格には様々な助詞(〜で、〜まで、〜より)が着くのですが、今回は格助詞の「に」につくものを対象としています。
格助詞を見れば主語や目的語がわかるというわけではなく、実は述語項構造解析は一筋縄ではいきません。例えば、「私は英語が得意です」の主語は「私」ですが目的語は「英語」となります(格助詞「を」でなくても目的語になる)。また、「太郎、本屋へ行く。」のように、助詞も省略されちゃうことや別の助詞が使われることがあります。さらには、述語の種類によって主語や目的語にとる格要素の種類が決まっていて、動詞の種類や他の格要素の組み合わせも考慮しなければなりません。例えば「食べる」の主語は人間や生き物だったりしますし、その時の目的語は食べ物のことが多いです。しかし、「プログラムが食べる」時の目的語は「引数」だったり「ファイル」だったりします。
面白いことに、日本語では格要素の省略がしばしば起こります。上のテーブルの文2では主語の太郎が省略されています。普通の代名詞は彼(He)とか私(I)とか特定の表層形を取りますが、日本語やスペイン語や韓国語では、テキスト中の述語の主語や目的語が読者にとってすぐにわかる場合、主語や目的語や斜格は省略されることがあるのです。
この消えてしまった格要素を、見えない代名詞として、ゼロ代名詞(zero anaphora)と呼びます。また、ある箇所での省略された格要素の表現がテキストの別の箇所にある場合(文2の省略された太郎に対して文1の太郎のこと)をゼロ代名詞の先行詞(antecedent)と言います。テキスト中のゼロ代名詞と先行詞との紐付けをゼロ代名詞照応解析(zero anaphora resolution)と言います(テキスト中の「You」とか「He」とかの通常の代名詞の紐付けはanaphora resolutionです)。
述語の格要素を検出・判定することを述語項構造解析といいまして、自然言語処理の分野で研究が続けられています。述語項構造解析の枠組み中でゼロ代名詞照応解析も取り扱うことがあり、日本語の言語処理研究者によって研究されています(後述する京都大学黒橋研究室も述語項構造解析の枠組み中でゼロ代名詞照応解析に取り組む研究機関の1つです)。
人間の場合、テキストを読んだ際には、ただ単純に文字面を追っているだけではなく、そのテキストで書かれている内容を頭の中でイメージとして再現することができると思います。太郎という人間が街中の本屋に行き、ChatGPTに関する本を買ったことが、背景世界でのさまざまな出来事を含めて頭の中で再現できるのです。本屋には電車やバスを使って行ったかもしれませんし、郊外なら車で行ったのかもしれません。本を買うということは、太郎さんはお金を財布から出して、店員さんにお金を渡して支払いを行い(クレジットカードかもですが)、買った本は太郎さんの手の中にあります。
さて、では、ChatGPTさんがワタクシたちにお答えしてくれている時に、ChatGPTさんはテキストの主語と述語をどのくらい理解してワタクシたちにお答えしてくれているんでしょうか? テキスト中の文に書かれている述語、その主語、目的語、斜格を、省略されているゼロ代名詞を含めて、人間と同じように対応づけて理解しているんでしょうか? ワタクシ、ここがとっても気になるのです。
本備忘ログでは、述語項構造解析を通して、ChatGPTさんは言葉とその背景世界を人間のようにちゃんと理解しているか、確かめたいと思います。
ChatGPTさんは沙織お嬢様のように気高く聡明なAIなのか、
それとも、ChatGPTさんはまだまだムウ様のところで修行中のかわいい貴鬼さん的なAIなのか、
ワタクシは見定めたいと思います。
(注記)本備忘ログでは、聖闘士星矢公式サイトの「HITOKOMA」コーナー(http://saintseiya-official.com/special/hitokoma/list.php?page=1)から画像を作成しています。HITOKOMAでは画像をSNSで利用してもよいとのことですが、Blogでの利用可否については確認できていません。もしダメな場合はHITOKOMAで作成した画像を別の画像に差し替えたいと思います。車田先生や星矢ファンにご迷惑をおかけすることは本備忘ログの本意にあらざることです。
もくもく妄想(本日備忘ログの動機)
ChatGPTのGPTはGenerative Pretrained Transformerの略です。事前に大量のテキストで学習した(Pretrained)、テキストを生成する(Generative)、翻訳機(Transformer)です。Transformerという技術は、多くの大規模言語モデルを構成する基礎技術でして、(ざっくり荒く言うと)言葉を別の文字列に変換してくれます。このTransformerにはSelf-Attention(自己注意機構)という技術が応用されています。Self-attentionはテキスト中のある箇所を翻訳する際に、他のどこに注目したらいいのかを学習する技術です。ある述語がテキスト中のどの言葉と関係するのか、主語や目的語のような関係が、このAttentionのどこかに学習されてはいないだろうか? と ワタクシは思うわけです。
ChatGPTさんの中のSelf-Attetionのレイヤーには、テキスト中の述語の主語や目的語のつながりが学習されていて、ChatGPTさんゼロ代名詞まで見えているのではないか? 本当かなぁ? では調べてみよう!というのが本備忘ログの動機です。
先行研究
ChatGPTの性能検証に関する先行研究
世界中の研究者たちによりChatGPTさんの能力について検証が進められています。どのような検証が進められているのか、ChatGPTの能力の検証の最前線が今どこまで到達しているのか、関連論文/記事を読むことで把握したいと思います。
以下の論文や記事は「chatgpt anaphora」で Google scholarを検索して見つけてきました(2023年5月初旬が調査日です)。
Comparative Analysis of CHATGPT and the evolution of language models
https://arxiv.org/abs/2304.02468
この論文では、機械翻訳、要約、質問応答、プログラム言語生成などのタスクについて、NLPの主要なアルゴリズム(Google翻訳やQuillBot.comの要約)とChatGPTのパフォーマンスを、Spontaneous Quality(SQ)(言語の正確さ、明瞭さ、母語話者の感じ方)のスコアを用いて比較し、ChatGPTの主張と結果を検証するための戦略を提案しています。翻訳や要約のタスクではChatGPTさんはGoogle翻訳やQuillBot.comよりも言葉として自然に読めるという結果が出ています。
A Loosely Wittgensteinian Conception of the Linguistic Understanding of Large Language Models like BERT, GPT-3, and ChatGPT
https://brill.com/view/journals/gps/99/4/article-p485_2.xml
この記事では、言語を理解するための条件について、ウィトゲンシュタインに影響を受けた概念を提供し、現在の最先端のAIシステム(BERT、GPT-3、ChatGPTなど)がこれらの要件を満たしている可能性があることを示唆しています。概念的側面では、知能の概念、内在的正しさの概念、ルール遵守の考察を行っています。実証的側面では、BERTやGPT-3などの現在のトランスフォーマーをベースにしたNLPモデルが、これらの要件をほぼ満たしていると主張しています。また、Vaswani et al. (2017, p. 14)を引いて、TransformerのSelf-attention層が照応解析(anaphora resolution)にあたるといった論考をしています。
Challenging ChatGPT ' Intelligence' with Human Tools: A Neuropsychological Investigation on Prefrontal Functioning of a Large Language Model
https://papers.ssrn.com/sol3/papers.cfm?abstract_id=4377371
大規模言語モデルの知的レベルを検証する研究です。この論文ではChatGPTの知的レベルを調べるために「脳神経心理学的」なテストを実施しています。ChatGPTは生成言語タスクで優れたパフォーマンスを発揮するが、人間が前頭葉を使うような知的なテストでは不均一なパフォーマンスを示した。具体的には計画能力や意図や心の状態の理解に苦労した。ChatGPTのような大規模言語モデルは人間の心理的な機能を捉え切ってはないことが示唆されるとのことです。なお、Winograd Schema による Anaphoric Referencing の成績は「16/20 - Normal C 普通」とのことです。
ChatGPTさんは言語の能力はすごいけど、そこまでびっくりするほどには賢くはないよ、ということが先行研究からは匂ってきますね。
大規模言語モデルのベンチマークを用いた評価に関する関連研究
(メモ)ここより以下の論文はワタクシがACL 2023のプログラムを眺めたり、twitterで論文情報を拾ったり、Googleで検索したりして調査しました(2023年7月)。
Text Classification via Large Language Models
https://arxiv.org/abs/2305.08377
この論文では、ChatGPTのようなLLM(これらはタスクにzero/few-shot learningで取り組みます)とBERT等のタスクに合わせたfine-tuningありの手法のテキスト分類タスクでの性能評価を行なっています。「テキスト分類においてはファインチューニングモデルと比較して、LLMの精度は大きく下回っている」とのことです。また、「キーワードやトーンなど重要情報を抽出してから推論を行うことで、Few-Shotでも専用モデルと同程度の精度を達成する」とのことです。
A Systematic Study and Comprehensive Evaluation of ChatGPT on Benchmark Datasets
https://aclanthology.org/2023.findings-acl.29/
ChatGPTを複数のベンチマークで評価した論文。2023 ACL。ChatGPTさんはいろんなタスクに即投入できるけど専用モデルには性能は劣る?みたいな内容でした。
日本語述語項構造解析の関連研究
日本語の述語項構造解析はBERTなどの事前学習言語モデルを用いた研究によりこの数年で飛躍的な性能向上を達成しています。
BERT-based Cohesion Analysis of Japanese Texts
https://aclanthology.org/2020.coling-main.114.pdf
BERTとmulti-task learningの枠組みを用いて(日本語ゼロ照応を含めた)日本語述語項構造解析を行なったの最初の論文です。特に日本語ゼロ照応解析ではそれまで手法に比べて10~20ptも精度を上げてます。後述する「京都大学ウェブ文書リードコーパス(KWDLC)」(Web文書に対する項構造解析の正解アノテーションが付与されている)でゼロ照応だけでF値70.5、Naist Text Corpus(Kyoto Text Corpusかもしれません/確認取れてない)(新聞記事への項構造解析の正解アノテーションが付与されている)ではF値56.8を達成しています。日本語の照応解析の研究にもBERTなどの事前言語モデルの時代の到来を告げる、そんな画期的な研究ですね。この論文は京都大学黒橋研究室の研究者の皆さんの研究成果です。
Pseudo Zero Pronoun Resolution Improves Zero Anaphora Resolution
https://aclanthology.org/2021.emnlp-main.308.pdf
ゼロ代名詞の正解は数が限られているのですが、この論文では事前学習言語モデルを用いて擬似的な正解コーパスを増やすこと、また、fine-tuning時に一貫性を担保する手法を提案しています。実験結果では、Naist Text Corpusでの日本語ゼロ照応解析のF1精度をF値64.18まで向上させています。すごい。そして、Pseudo Zero Pronoun Resolution、という手法の名前がすごくかっこいい!(手法の内容も伝わるし語感もいい)。この論文は東北大学の乾研究室の研究者の皆さんの研究成果です。
翻訳言語モデルを中間タスクとするゼロ照応解析
https://murawaki.org/pubdb/NLP2022umakoshi.pdf
この論文では、ゼロ代名詞解析のmulti-task learningに機械翻訳を中間タスクに用いる際に翻訳言語モデルを用いると精度が上がるということが述べられています。KWDLCを用いた評価でF値74.8、Naist Text CorpusでF値62.0を達成しています。この論文も京都大学黒橋研究室の研究者の皆さんの研究成果です。
先行研究を概観しての所感
これまでのChatGPTの能力検証の文献に目を通しますと、ChatGPTさんは言語能力は高いけど、人間の認知機能に及ぶほど高度なことは理解できていないのではないか?というような印象を持ちます。また、ChatGPTさんは何でも礼儀正しく答えてくれるけど、タスク専用にfine-tuningしたモデルよりも性能が劣るようです。
日本語の述語項構造解析の研究では、BERTなどの事前学習言語モデルを用いることで、日本語ゼロ照応解析の精度は2020~2023年にかけて飛躍的に向上させておりまして、新しい時代に入ったな、という印象です。
本備忘ログでは、ChatGPT(GPT-3.5turbo)に対して日本語述語項構造解析の能力の検証を行います。述語項構造解析のためにmulti-taskにfine-tuningした専門モデルに迫る精度が出るのか、あるいは、全然そんな精度は出なくて礼儀正しくお答えしてはくれるけど内容はなんかぼんやりしているのか? といったことを確かめます! 本検証はChatGPTさんの日本語の述語項構造解析の性能を調査する世界に先んじた試みであり、引いては、ChatGPTさんが現実を人間に近い形で理解できているかが見えてくればいいなと思っています。まあ、他の人は既にやったけどうまくいかなかったから公開されていないのかもしれませんが、まあ、ええやん!(勢いのある様子)
述語項構造解析の評価方法
本備忘ログの述語項構造解析の評価は、これまでの日本語項構造解析の先行研究同様に、F値*1の算出により行います。すなわち、ChatGPTさんにテキストを与えて、述語と主語などの関係をまとめてくれるようなお願いし(プロンプト)、その結果を正解コーパスと比較して、PrecisionとRecallを算出してからF値を算出します。
評価データ
日本語のゼロ代名詞を含めた述語項構造解析用の評価データには「京都大学ウェブ文書リードコーパス(KWDLC)https://github.com/ku-nlp/KWDLC」を用います。KWDLCはブログなどのWeb文書の冒頭3文に対して格関係などのアノテーションが施されています。
日本語の述語項構造解析用の評価データには他にも「Naist Text Corpus https://sites.google.com/site/naisttextcorpus/(NTC)」があります。NTCは毎日新聞テキストに述語項構造の正解アノテーションが付与されています(Naist Text Corpusは奈良先端科学技術大学大学院松本研究室の研究者の皆さんの研究成果です)。ただ、NTCを使うには95年度版の毎日新聞記事が必要でして、この準備にはお金がかかり覚書の締結が必要なのです(https://www.nichigai.co.jp/sales/corpus.html#01)(でも新聞社の売り物の新聞記事を研究目的に提供してくれるなんてありがたいことです)。本当は新聞記事を買ってNTCでも評価したかったのですが、今回はよりお手軽に評価ができるKWDLCを使わせてもらいました。
日本語の述語項構造解析用コーパスについては以下の論文にまとめがあります(この論文はコーパス作成途中のステータスなので公開されたコーパスとは数字がちょい異なります)。
多様な文書の書き始めに対する意味関係タグ付きコーパスの構築とその分析
https://www.jstage.jst.go.jp/article/jnlp/21/2/21_213/_pdf/-char/en
また、KWDLCに関するブログポストもあり、参考になります。コーパスの公開と情報の公開、ありがとうございます!
KWDLC(京都大学ウェブ文書リードコーパス)を知って、意味関係解析に取り組もう
https://qiita.com/mhangyo/items/0fdffb173747d2e2c80e
後述しますが、本備忘ログでの評価では、KWDLCのdevデータ507件(512件のdevデータに欠損がある)を用いて評価値を算出しています(今回はまだ試行錯誤段階かなと思ってtestデータは温存したのです)。
プロンプト
テキストに対する述語項構造解析処理にはOpenAIのAPIを用います。ChatGPTさんに渡すプロンプト文(生成用のpythonコード)は以下のごとしです。
# 文章の辞書から文を取り出して文の文字列を返す def ret_input_sentence(org_tmp_dict): msg = ['以下の複数の文が与えられたとします。カッコの中が文の本文です。\n\n'] sen_count = 1 for sen_key, sentence in org_tmp_dict.items(): rstr = f'文{sen_count} 「{sentence}」\n' msg.append(rstr) sen_count += 1 msg.append('\n') return ''.join(msg) def ret_prompt_text(org_tmp_dict): """version2 """ messages = [] messages.append( ret_role_dict('system', 'あなたは日本語の文法に堪能なアシスタントです。日本語テキストの名詞や動詞といった品詞や主語や動詞が理解できます。') ) sentences = ret_input_sentence(org_tmp_dict) messages.append( ret_role_dict('user', '以下に示す複数の文書はWebページの冒頭の3文です。まずこちらの文を読んでださい。') ) messages.append( ret_role_dict('user', sentences) ) messages.append( ret_role_dict('user', '各文の述語を抽出してください。述語は文に複数ある場合があります。連体修飾節の述語、サ変名詞、語尾の述語含めて、全て列挙してください。') ) messages.append( ret_role_dict('user', '続いて、列挙した術語ごとに、述語の「主語(ガ格)」と「目的語(ヲ格)」と「斜格の要素(ニ格)」の候補を列挙してください')) messages.append( ret_role_dict('user', '注意点ですが、「主語(ガ格)」と「目的語(ヲ格)」と「斜格の要素(ニ格)」の候補は述語と同じ文中だけでなく、その文中では省略されている格要素も含めて列挙してください。 省略されている格要素には「著者」や「人一般」といった文に明示的に書かれていない要素も含めてください。') ) messages.append( ret_role_dict('user', '最後に、述語、主語(ガ格)、目的語(ヲ格)、斜格の要素(ニ格)の候補の4つ組を作ってください。') ) messages.append( ret_role_dict('user', 'そして、文の番号、述語、主語(ガ格)の候補、目的語(ヲ格)の候補、斜格の要素(ニ格)の5列を1つの行とするテーブル形式で出力してください。') ) return messages
このプロンプト文を用いまして、例えば、KWDLCの"w201106-0002000000"の文章(#行は文IDでプロンプトには含めない)に対しては、
# S-ID:w201106-0002000000-1 MEMO: ゲストは主として「ドラゴン」シリーズに関わる作家が多い。 # S-ID:w201106-0002000000-2 MEMO: 構成作家は「トリビアの泉」や「田村ゆかりのいたずら黒うさぎ」なども手がけている矢野了平。 # S-ID:w201106-0002000000-3 MEMO: 番組内では「まぢおにさん」と呼ばれていた。
ChatGPTさんは以下の結果を返してくれます。
文番号 | 述語 | 主語(ガ格)の候補 | 目的語(ヲ格)の候補 | 斜格の要素(ニ格)の候補 |
1 | 関わる | (ゲスト) | (ドラゴン)シリーズ | (省略) |
2 | 手がける | (構成作家) | (トリビアの泉)、(田村ゆかりのいたずら黒うさぎ) | - |
3 | 呼ばれる | (省略) | (まぢおにさん) | (省略) |
え〜と、エラーアナリシスでも述べますが、プロンプティングはまだうまくいっていません。ワタクシは「省略されている格要素も含めて列挙してください」というプロンプトを書きまして、ChatGPTさんは(省略)って表に示してくれています。でも・・・確かに、そうなんですが、そうじゃないんですよ・・・!(もどかしさ) 先行詞をテキストやテキスト外から見つけて表に埋めてほしかったのです! でも、伝わってない(汗)。「省略されている格要素のテキスト中の実体の表現(先行詞)を見つけてください」みたいなプロンプト指定の仕方の方が良かったのかしら・・・(汗)。
正解数のカウント方法・正解と出力とのマッチング方法
KWDLCには述語に対する格要素の正解がタグで指定されています。
KNPの係り受け解析の結果に対してrelタグで関係がアノテーションされています。例えば、「行う」という述語にはrelタグ付与されていて「ガ格(主語)」として、「不特定:人」「読者」「著者」が列挙されています。また、「トス」がヲ格(目的語)の関係としてアノテーションされています。
# S-ID:w201106-0000060050-1 JUMAN:6.1-20101108 KNP:3.1-20101107 DATE:2011/06/21 SCORE:-44.94406 MOD:2017/10/15 MEMO: * 2D + 1D コイン こいん コイン 名詞 6 普通名詞 1 * 0 * 0 + 3D <rel type="ガ" target="不特定:人"/><rel type="ヲ" target="コイン" sid="w201106-0000060050-1" id="0"/> トス とす トス 名詞 6 サ変名詞 2 * 0 * 0 を を を 助詞 9 格助詞 1 * 0 * 0 * 2D + 3D 3 さん 3 名詞 6 数詞 7 * 0 * 0 回 かい 回 接尾辞 14 名詞性名詞助数辞 3 * 0 * 0 * 3D + 4D <rel type="ガ" target="不特定:人"/><rel type="ガ" mode="?" target="読者"/><rel type="ガ" mode="?" target="著者"/><rel type="ヲ" target="トス" sid="w201106-0000060050-1" id="1"/> 行う おこなう 行う 動詞 2 * 0 子音動詞ワ行 12 基本形 2 。 。 。 特殊 1 句点 1 * 0 * 0 EOS
ChatGPTさんのテーブルの述語とKWDLCのrelタグが付与された述語の表層が文字列マッチしている場合に、格要素も一致しているかのチェックを行います。ChatGPTさんのテーブルの主語や目的語の文字列と、正解コーパスのガ格(主語)やヲ格(目的語)のrelタグのtarget属性の文字列とを比較し、文字列マッチしていれば、ChatGPTの項構造解析の出力を正解としてカウントします。文字列マッチですが、ChatGPTさんが作ってくれた表中の文字列と relタグのtarget属性の文字列とは完全に一致しないことも多々あり、部分でも一致していればマッチと判定しています(この辺は少しガバガバです。詳細の実装はgithubにあげたコード(https://github.com/meihuno/evalOfPASAbyChatGPT)をご参照ください。eval_conversation._ret_match_type関数が文字列マッチの実装になります)。
評価結果
KWDLCのdevデータセット512件のうち、ChatGPTが答えを返してくれた507件を対象に精度を算出しました(5件はngでした。まだngの分析はしていません)。また、ChatGPTさんの結果は試行によって揺れることがあり、本来ならば複数回試行してその結果の精度の平均をとる、というようなことをした方が良いのですが、今回はそのような操作は行っていません(処理中断により同じ文章が複数回処理されている可能性があります。ただし、評価に用いるのはそのうちの1回の試行のみです)。
項構造解析精度
格要素ごとのChatGPTさんの述語項構造解析精度を以下に示します。
格 | Precision | Recall | F値 |
主語(subj) | 0.326 | 0.183 | 0.235 |
目的語(obj) | 0.194 | 0.080 | 0.213 |
斜格(obl) | 0.080 | 0.104 | 0.090 |
格要素(all) | 0.214 | 0.179 | 0.195 |
述語 | 0.834 | 0.404 | 0.544 |
全体的に低調です。最近の事前学習言語モデルをmulti-task learningする手法の述語項構造解析精度はゼロ代名詞だけでF値0.70以上あり、ChatGPTさんはそれらに比べて大きく劣ります。そもそも述語の検出がうまくいっていない(Recallが低い)のです。ChatGPTさんは人間の質問に答えるための会話用のモデルであって、文節の切り分けや構文解析機能はそこまで得意ではないということでしょうか。つまりは、構文解析は素直にKNPやGinzaにお任せしたほうが良いってことなのでしょう(LLMがしなくてもよいことはLLMにはさせない)。
述語がマッチした場合の述語との主語の距離別の精度(参考値)
ChatGPTさんの述語が正解コーパスの述語と一致している場合に、その主語の先行詞が文をまたいだ距離にあるゼロ代名詞なのか、先行詞が文内にあるゼロ代名詞なのか、あるいは著者や読者のような文章外に先行詞があるゼロ代名詞なのかについてその距離関係を判定し、それぞれにF値を出してみました。距離関係の判定は、ChatGPTさんが出力した格要素が述語と同じ文内にあるか、他の文にあるか、それとも文章内にはないのか、という雑な判定方法なので、このF値にはマッチングのミステイクが含まれている可能性があります。例えば、ChatGPTの出力した主語が正解の主語の部分文字列で短かった場合、文と雑にしかにマッチできないので距離関係のミスマッチの可能性があります。また、うまくマッチしなかったら文外の判定になる雑な距離の判定方法なので、以下の評価値は参考値と考えてください。
述語との距離関係 | 格要素 | Precision | Recall | F値 |
文間照応 | 主語(subj) | 0.435 | 0.083 | 0.14 |
文内照応 | 主語(subj) | 0.534 | 0.719 | 0.613 |
文章外(外界)照応 | 主語(subj) | 0.234 | 0.156 | 0.187 |
傾向としては、文内の先行詞よりも、文間や文外の先行詞の精度は大きく劣っていることが見て取れます。原因としては、ワタクシが書いたプロンプトでは「省略された格要素を文章内にあるか文外にあるのかを判断するタスクと」であるとChatGPTさんにうまく伝わっていない可能性があります(プロンプトでうまく表現できてもChatGPTさんにはそのタスクがうまく実行できない可能性もあります。永遠に伝わらない)。
エラーアナリシス
述語項構造解析の精度は低いことがわかりました。それでは、実際の解析結果の現物を確認してエラーアナリシスをしてみましょう。精度の数字だけ見ていては見えないものがあります。ワタクシたちはいつだって現場・現物第一主義なのです。現物を見て、何が問題なのか、改善点を見出していくことにします。5つぐらいのWeb文章について、KWDLCの正解とChatGPTさんの解析結果を見比べてみることにします。
エラーアナリシス1
解析対象のWebテキストは以下です。
# S-ID:w201106-0002000003-1 日本には、「あ」から「ん」までの48清音と、濁音半濁音合わせて70近く残っている。 # S-ID:w201106-0002000003-2 古代では、48音の1つ1つが意味を持っていたらしい。 # S-ID:w201106-0002000003-3 72とは、人間意識で72の意味づけが有ったと言うことだろう。
KWDLCの正解のアノテーションから述語項構造解析の表を作ったらこんな感じになります。
文番号 | 述語 | 主語(subj) | 目的語(obj) | 斜格語(obl) |
1 | 合わせて | 不特定:人 | 濁音、半濁音 | - |
2 | 残っている | 70近く | - | 日本 |
3 | 持っていたらしい | 1つ1つ | 意味 | - |
3 | 有ったと | 意味づけ | - | - |
3 | ことだろう | 72 | - | - |
ChatGPTさんの結果はこちら。
文番号 | 述語 | 主語(ガ格)の候補 | 目的語(ヲ格)の候補 | 斜格の要素(ニ格)の候補 |
1 | 残っている | 日本、48清音、濁音半濁音 | - | - |
2 | 持っていた | 1つ1つ | 意味 | - |
3 | 言う | 人間意識 | 72の意味づけ | こと、有った |
正解とChatGPTさんの結果はかなり異なるので、これは精度も悪くなりますね、という印象です。ChatGPTさんは述語の検出が足りない。
でも、正解のアノテーションも高度すぎるように感じます。実は、正解アノテーションでは「残っている」に対して「48静音」は「ト格」でアノテーションされているのです。KWDLCでは「清音と、濁音と半濁音を、『不特定:人』が合わせて、70近くが、日本に、残っている」と言うような読みをします。KWDLCでは表層格に沿ったアノテーションをするというアノテーション指針を定めているのでしょう。しかし、ChatGPTさんの言うように「48清音、濁音半濁音が、残っている」とも読んでもOKなんじゃないかな?とも思います。KWDLCのデータで述語項構造解析モデルをfine-tuningすれKWDLCのアノテーション指針に沿った項構造解析ができるようになるのかもしれないのですが、ChatGPTさんはzero-shotなので、その指針に合わせるのは、むつかしいでしょう。
とはいえ、ChatGPTさんがKWDLCのアノテーション指針に合っていないにしても、ChatGPTさんは日本語話者には明かに間違った述語項構造解析結果も出力しています。例えば、ChatGPTさんの「日本が、残っている」という読みは違う気がする。「人間意識が、72の意味づけを、ことに、有ったに、言う」というのも支離滅裂な気がする。ChatGPTさんは日本語文法をちゃんとわかっているんでしょうか・・・?(不安)
エラーアナリシス2
もういっちょ例を見てみよう。
# S-ID:w201106-0002000000-1 ゲストは主として「ドラゴン」シリーズに関わる作家が多い。 # S-ID:w201106-0002000000-2 構成作家は「トリビアの泉」や「田村ゆかりのいたずら黒うさぎ」なども手がけている矢野了平。 # S-ID:w201106-0002000000-3 番組内では「まぢおにさん」と呼ばれていた。
KWDLCの正解コーパスでの結果はこちら。
文番号 | 述語 | 主語(subj) | 目的語(obj) | 斜格語(obl) |
1 | 関わる | 作家 | - | シリーズ |
1 | 多い。 | 作家 | - | - |
2 | 構成 | 作家 | 不特定:物1 | - |
2 | 手がけている | 了平 | 泉、うさぎ | - |
2 | 了平。 | 作家 | - | - |
3 | 呼ばれていた。 | 了平 | - | 不特定:人 |
ChatGPTさんの結果はこちらです(先述に挙げたのとは別のChatGPTさんの解になります)。
文番号 | 述語 | 主語(ガ格)の候補 | 目的語(ヲ格)の候補 | 斜格の要素(ニ格)の候補 |
1 | 関わる | 作家、ゲスト | 「ドラゴン」シリーズ | - |
2 | 手がける | 矢野了平 | 「トリビアの泉」、「田村ゆかりのいたずら黒うさぎ」 | - |
3 | 呼ばれる | - | 「まぢおにさん」 | - |
まず、またしてもChatGPTさんは術語の抽出が正解コーパスに比べて足りないことがわかります。でも、サ変名詞や体言止めの名詞を含めて術語の抽出を行うのは、人間にも難しいことです。
ChatGPTさんの1文目はダメダメですが、2文目の項構造解析は及第点のように思えます。KWDLCの正解コーパスでは「ゲストが多い」というような解釈でしたが、ChatGPTさんのように「ゲストが関わる」でも不自然ではありません。でも、ChatGPTさんの3文目の「『まじおにさん』を呼ばれる」、というのは支離滅裂な気がする。ChatGPTさんの日本語文法力にはむらっけがあるな・・・。
エラーアナリシス3(文外(外界)照応多めの例)
さらにもういっちょ、見てみましょう! 今度の例は文外(外界)照応の例です。
# S-ID:w201106-0002000390-1 あらら、初めてのお泊りなのかしら? # S-ID:w201106-0002000390-2 どきどきですね。 # S-ID:w201106-0002000390-3 さみしくって眠れなくなっちゃうかしら?
KWDLCの正解コーパスでの結果はこちらです。不特定:人や不特定:物とかの文外(外界)照応が多いです。そして、「あらら、初めてのお泊まりなのかしら?」ってことで、これは筆者が他の誰かのお泊まりについて語っているテキストなんだと類推することができます。「あらら」ですからね。筆者の初めてのお泊まりなら「?」はつかないでしょう。日本語話者ならこの辺のニュアンスはわかるのでは?と思います。
文番号 | 述語 | 主語(subj) | 目的語(obj) | 斜格語(obl) |
1 | お泊りなの | 不特定:人1 | - | 不特定:物1 |
2 | どきどきです | お泊り、不特定:人1、不特定:人2、著者 | - | - |
3 | さみしく | 不特定:人1 | - | - |
3 | 眠れなくなっちゃう | 不特定:人1 | - | - |
さて、ChatGPTさんはどうだったでしょうか?
文番号 | 述語 | 主語(ガ格)の候補 | 目的語(ヲ格)の候補 | 斜格の要素(ニ格)の候補 |
1 | お泊り | (著者) | - | - |
1 | 初めて | (著者) | - | - |
2 | どきどきする | (著者) | - | - |
3 | 眠れなくなる | (著者) | - | - |
3 | さみしい | (著者) | - | - |
ガーン! 主語が全部「筆者」になってーるよー(嘆き)。ChatGPTさんは「あらら」と「?」のニュアンスを読み取ることはできませんでした。うーむ。ChatGPTさんをフォローすると、筆者とが主語だと強弁して通らないこともない、筆者が自問自動しているとギリギリ言えなくもないです。まー、でも、ワタクシとしてはここは「不特定:人」とか「筆者以外の誰か」みたいな主語を期待してしまいますね。しかし、プロンプトでそこまでを指示するのはむつかしくない? (煩悶) この事例は、ChatGPTさんにも、プロンプト書く人にも、難易度の高い事例です。
エラーアナリシス4(文外(外界)、文間照応ありの事例)
どんどん結果を見ていきましょう! 文外(外界)、文間照応ありの事例です。
# S-ID:w201106-0002000186-1 初めての試みだった「朗読セッション」には手ごたえを感じることができました。 # S-ID:w201106-0002000186-2 次回へとつなげて行きたいと思っています。 # S-ID:w201106-0002000186-3 そしてメインの第2部の朗読ライブでは、いつにも増して気合の入った朗読をじっくりと聴かせていただきました。
正解のアノテーションはこちらです。筆者や不特定の人や物がゼロ代名詞として省略されています。また、2文目の「つなげて行きたい」の目的語(ヲ格)はこれは1文目の「セッション」でして、ゼロ代名詞の先行詞が述語の前の文にあり、文間照応といえます。
文番号 | 述語 | 主語(subj) | 目的語(obj) | 斜格語(obl) |
1 | 試みだった | セッション | - | - |
1 | 朗読 | 不特定:人 | 不特定:物 | - |
1 | 感じること | 著者 | 手ごたえ | セッション |
2 | つなげて行きたい | 著者 | セッション | - |
2 | 思っています。 | 著者 | - | - |
3 | 増して | 不特定:人1 | - | いつ |
3 | 入った | 気合、不特定:人1 | - | 朗読 |
3 | 聴かせていただきました。 | 著者 | 朗読 | - |
ChatGPTさんの結果はこちら。
文番号 | 述語 | 主語(ガ格)の候補 | 目的語(ヲ格)の候補 | 斜格の要素(ニ格)の候補 |
1 | 感じる | 手ごたえ | - | - |
1 | する | 試み | - | - |
2 | 行く | 私たち | - | - |
2 | 思う | 私 | 次回 | - |
3 | 聴かせる | 朗読 | 私たち | - |
3 | 入る | 気合 | - | - |
うーむ、文間照応のゼロ代名詞がある述語「つなげて行きたい」の目的語をChatGPTさんは見つけてくれていません。また、ChatGPTさんの結果では「手応えが感じる」や「朗読が私たちを聞かせる」のように、主語と目的語が逆だったりします。正解アノテーションでは「筆者」なところがChatGPTさんは「私」や「私たち」としていて、一貫いていません。「私が次回を思う」というのはそういう解釈もできるとは思うのですが。実際の応用を考えると、「筆者」と「私たち」と揺れるのは問題です。
エラーアナリシス5(文間照応ありの事例)
では、最後のエラーアナリシスを見ていきましょう。
# S-ID:w201106-0002000002-1 メンズオンリーサロンだからこそ男性のスタイルの幅やセンスは全国クラス!! # S-ID:w201106-0002000002-2 シンプル派〜ワイルド派まで、どんなジャンルのスタイルにも対応出来る技術力もKAJAの魅力。 # S-ID:w201106-0002000002-3 男性の居心地の良さを追求し、外装・内装・インテリアまでセレクト。
正解のアノテーションはこちらです。「KAJA」というサロンが3文目のゼロ代名詞の先行詞になっているところもポイントです。また、この表にはあらわれていないですが「KAJA」=「サロン」の関係タグもあり、「KAJA」が全国クラスであることも読み解ける形になっています。
文番号 | 述語 | 主語(subj) | 目的語(obj) | 斜格語(obl) |
1 | クラス!! | 幅、センス、サロン | - | - |
2 | 対応出来る | KAJA | - | スタイル |
2 | 魅力。 | 力 | - | - |
3 | 良さ | 居心地、男性 | - | - |
3 | 追求し、 | KAJA | 良さ | - |
3 | セレクト。 | KAJA | - | - |
ChatGPTさんの結果は以下の如しです。
文番号 | 述語 | 主語(ガ格)の候補 | 目的語(ヲ格)の候補 | 斜格の要素(ニ格)の候補 |
1 | 全国クラス | 男性のスタイルの幅やセンス | - | - |
1 | 対応出来る | 技術力 | ジャンルのスタイル | - |
2 | 追求し | 男性 | 居心地の良さ | - |
2 | セレクト | 外装・内装・インテリア | - | - |
う〜む、文番号をそもそも2まで出してくれていないし、3番目の文の述語「追求し、」や「セレクト」の主語が「メンズオンリーサロン KAJA」だということをChatGPTさんは見抜いてくれません。ChatGPTの「男性が居心地の良さを追求」するんじゃなくて、「メンズオンリーサロン KAJAが、男性の居心地の良さを、追求し」だよね。シンプル派〜ワイルド派な男たちが、居心地の良さを追求するために色々がんばり、外装・内装・インテリアといった店構えが(何かを)セレクトするサロン・・・どんな世界なんだよ。ChatGPTさんは・・・ゼロ代名詞を見ることが・・・できていなさそう・・・ワタクシたちが思い描いた世界を同じようには見てくれてなさそうです・・・(落胆)。
評価結果とエラーアナリシスのまとめ
ここまでのKWDLCでの評価結果とエラーアナリシスをまとめたいと思います。
* ChatGPTさんは術語を抽出が不十分
* ChatGPTさんの主語と目的語の区別はうまく行くときもあるが、ダメなときもある(完璧には程遠い/むらっけがある)
* ChatGPTさんはゼロ代名詞が見えていない
* ChatGPTさんがテキストから思い描いた世界はワタクシたち日本語話者が思い描いた世界とは違うっぽい(でもむらっけがあるので同じ世界を見ていることもある)
というような結果だったと思います。
本調査では、ChatGPTさんがテキストを解析をした際に、テキストに登場する人物や事物が何で、その人物や事物が何をどうしたのか、人間と同じように脳内に再現して理解していそうかについて、ChatGPTさんの述語項構造解析結果をKWDLCを用いて評価することで、その理解の深さを推し量ろうと考えました。評価結果とエラーアナリシスを終えて、私の脳内に浮かんできたChatGPTさんの絵は以下のようなものです。
まあ、でも、人間も内容を理解して話したりはしてないかもしれませんからね。口からすらすらと出てくる場合は、特にそうです。また、同じ人間でも同じテキストから違う世界を見ていることはよくあることです(悟り)。
まとめポエム(今回の備忘ログをふりかえっての反省会)
ここまで一生懸命プロンプトを書いて、評価スクリプトを書いてきましたけど、ワタクシの胸中に湧き上がるのは「KWDLCの正解アノテーションをChatGPTさんに一発であててもらうのは難しすぎないかしら?」とか「ChatGPTさんにやって欲しいことちゃんと伝わってないかも?」とか「これちゃんとChantGPTちゃんの言語能力と世界認識能力の評価になっているのかしら?」というような懸念でした。
ChatGPTさんにKWDLCの格要素を一発で当ててもらうのは難しいので、今回の項構造解析をもっと簡単なタスクに分解してあげた方が良かったと思います。特に、ChatGPTさんはKWDLCの述語を十分抽出できていないのですが、そもそもChatGPTさんに文節の切り分けや係り受け解析みたいなことをやってもらう必要はなかったのです。そういうことはKNPやGinzaでやったらええんじゃ、というやつです。
また、KWDLCのアノテーションは文法的に正しく、実際にアノテーターに作業してもらうためには表層格重視でタグを付与する方針がリーズナブルなのかもしれませんが、その指針だけが正しいというわけでもなく、ChatGPTさんが出力する主語や目的語も「言われてみればそう」と解釈できるというものもあり、KWDLCの結果とうまくマッチしないことがありました。先述しましたが、KWDLCの学習データにモデルをfine-tuningすればアノテーションの指針に沿った項構造解析ができるようになるのかもしれないのですが、ChatGPTさんはzero-shotなので、その指針に合わせるのは、むつかしいのです。
述語項構造解析は人間と雖も容易いことではありません。日本語話者と雖も、KWDLCのアノテーションマニュアルを読み込んで主語や目的語が何たるかを理解してから作業しなければ、そのアノテーションの複数人での一致はなかなか取れないように思われました。今回はKWDLCでChatGPTさんの述語項構造解析能力の評価を行いましたが、KWDLCのアノテーション指針とChatGPTさんのフリーダムな解析結果とは方針が一致していないので、ChatGPTさんをUnder estimate her/his powerしている可能性があり、完全な評価にはなってないと思われます(とはいえChatGPTさんはfine-tuningする既存手法に精度的に劣るのは確実です)。ワタクシはChatGPTさんに述語項構造解析を理解してもらうような文法力の高いプロンプトを書く必要があったと考えます。
専門的なプロンプトを書くには、人間の専門力も高くなければならない(ストロングスタイル)。ワタクシは図書館で以下の日本語文法の書籍を読んでみて日本語文法の奥深さに震撼を覚えました。道は険しそう。
書き言葉と話し言葉の格助詞(丸山直子 先生 著作、ひつじ書房、2022/07/08 刊行)
https://www.bonjinsha.com/goods/detail?id=13928&pt=1
日本語構文大全 第II巻 提示機能から見る文法(三原健一 先生 著作、くろしお出版、2022/5/26 刊行)
https://www.9640.jp/book_view/?904
丸山先生の本には日本語の格助詞の意味の分類や用例が多数収載されていました。例えば、主語に関係するのは格助詞の「ガ」なのですが、この「が」には主体を表す様々な用例(「バスが発進する」)から対象を表す用例(「水が飲みたい」「前が見にくい」)というような用例が載っていました。ワタクシもこの辺の分類を勉強して、ChatGPTさんに「主語」とはこういうものですよ、「目的語」はこういうものですよ、とうまく伝えられるようなプロンプトを書かなければなりませんでした。
あるいは、ChatGPTさんの日本語文法能力のみを試すテストを行ってみる、という方向もありなのかもしれません(世界認識能力は別に考える)。三原先生の本には日本語文法の事例が(文法的にNGな文(非文)を含めて)たくさん収載されていまして、例えば、「が/を」交替の事例ですと、以下のような文例がありました。*付きは非文の例です。
田中君はテニス{が/*を}下手だ。
僕はあのCD{が/を}書いたい。
日本語話者なら文法的にOKな文とNGの文がすぐにわかります。不思議。ChatGPTさんもこの辺の感覚を備えているんでしょうか? ワタクシ、気になります。以下の事例のように短文の文法解釈は、省略された主語を含めて、ChatGPTさんも正しく答えてくれてくれることが多いです。文法に関してはChatGPTさんはやればできる子。ワタクシは割とそう確信しているのです。
以上の如く、ChatGPTさんの言語能力や世界認識能力の評価していくためには、次のステップとして以下のような方法があるように思われました。
- プロンプトの改善1(主語や述語やゼロ代名詞の説明をしっかりする):主語とか目的語、ゼロ代名詞と先行詞の説明をしっかり行う
- プロンプトの改善2(簡単にする):述語の抽出や格要素の候補の列挙にはKNPを使い、ChatGPTさんには省略の有無やゼロ代名詞の先行詞の同定に集中してもらう
- プロンプトの改善3(述語項構造解析の手順を説明する): プロンプトで述語項構造解析やゼロ代名詞照応解析の手順を順を追って説明する
- (メモ)述語項構造解析でもChain Of Thoughtは有効なのか?
- 文法能力の評価は日本語文法書の例文/非文を用いて行う(これはこれで大仕事なので項構造解析とは別に行いたいです・・・)
むすびのことば
本備忘ログでは、ChatGPTさんに項構造解析を行ってもらい、ChatGPTさんの言語能力や世界認識能力の評価を行いました。残念ながら、ChatGPTさんの項構造解析の精度は既存の手法に比べて大きく劣っているという結果がわかりました。ですが、今回の評価でのプロンプトは項構造解析のために十分検討されたものではなく、タスクが難しすぎた点もあるかなと思います。ワタクシのプロンプトエンジニア力も日本語文法力もまだまだ未熟です。プロンプトを洗練させていける余地は残っています。今後もChatGPTさんのような素晴らしいAI Chatterとともに人類が次の高みを目指すためには、ワタシたち人類(HUMAN)も、ChatGPTさんと適切にコミュニケーションを取れるよう日々日夜勉強を怠ってはならないのです。ワタクシはそう決意を新たにしたのでした。(おわり)
次回予告
ChatGPTさんが世界を人間と同じように認識しているのか、それとも、ぼんやりしたまま言葉を綴っているのか、その秘密を解き明かす戦いは、実は終わってはいなかったのです・・・! プロンプトの奥義を繰り出さんとするLLM戦士たちが、神奈川県立図書館(新しくて綺麗でとてもよい図書館です)に、今、集う・・・!
そして、最強のモデルの封印が解き放たれる・・・!
その探索の先に、何が待っているのか・・・? ワタクシにもわかりません。それでも、その未知の世界を垣間見るために、明日もがんばろう!
(補足)OpenAIのAPI使用料
GPT-3.5-turboを使い、KWDLCのtestとdevデータの1000文書ぐらいを何度か処理しまして、それで2023年05月~06月にかけて$2.75でございました。1ドル143円で日本円に換算すると394円。コーヒー1杯分ぐらいでしょうか。
謝辞
「京都大学ウェブ文書リードコーパス(KWDLC)」のデータを公開してくれた京都大学の黒橋研究室の皆さんありがとうございます! LLMの進化のスピードが非常に早い昨今ですが、ベンチマークデータがあれば、自分たちの現在地がどこにいるのか、モデルの変化は性能にどう影響したのか、把握することができます。言語資源の公開は重要さは今後ますます上がっていくと思います!
再現性の担保(コードの公開)
今回のChatGPTさんの出力や、評価用のコードは以下の場所にあげておきました。
https://github.com/meihuno/evalOfPASAbyChatGPT
ChatGPTさんの結果は同じこと繰り返すとちょいちょい変わってくるし、OpenAIのモデルもAPIのversion upも行われてますし、こんな評価コードを残して意味あるんですかね?と思わないでもないです。ですが、世の中の大学生さんには「ChatGPTをテーマに卒論書いたろ!」みたいな人がいると思います。いてると思います。項構造格解析に関してはワタクシがここまでやってきたことを「全部」残しておきます。Youはワタクシの失敗の先に進んでください。そんな人達の参考になれば幸いです。
「1番かんたんな機械学習の教科書を頼む!」な厳選3冊
- <枕詞>
- 「やさしく学ぶ 機械学習を理解するための 数学のきほん」(LINE Fukuoka 株式会社 立石賢吾 著 マイナビ)で学んだこと
- 「自然言語処理シリーズ 1 言語処理のための 機械学習入門」で学んだこと
- 「ゼロから作る Deep Learning Python で学ぶ ディープラーイングの理論と実践」
- (本備忘ログまとめ)
- 余談、Logistic Regressionちゃんについて
<枕詞>
あー、過去にブログ記事を書いてから(2017年の2月から)、6年もたってしまいました。
その間にブログの更新はなく、自分の怠惰っぷりがやばいっすです。人生終わっちゃう。世界の激動の変化もまじやばいっす(コロナとかAIの進歩とか色々ありましたね)。
その間、私はかつて作りたいとか言っていた「文の芥川龍之介度判定器」とか「テキストで記述されている内容が架空のものなのかリアルなのか判定器」とか「テキストの人称視点ズレ検出器」とかを作っていたわけではないのです。何もしてません。
じゃあ何やってたんだよ。生きていた(ような気がします)。本当、何してたんでしょうね。怖いですね。
でも、sevenseasやまほがく(http://www.sssloxia.jp/) という定期更新ゲームは遊んでいましたよ。あと、イバラシティも遊んでましたよ。楽しかったですね。
さて、
<この記事は数学が苦手な人でも読みやすい機械学習の本を紹介します>
それでも、ワタクシはひっそりと機械学習の勉強は続けていたのです。昨今話題の機械学習の仕組みを理解したくて、数学の本も読んでみたのです。機械学習を理解するには数学の理解・知識が必要です。
ですが、ワタクシは数学が苦手なのです。数字で物事を理解できないタイプなのです。2のほうが1よりも2倍も大きいわけですが、1位と2位とですと、1位のほうが価値が大きそうですね。2のほうが1より必ず大きいわけではないのです、不思議だなぁとか思われます。ワタクシは数字とその意味がなかなか頭でスパッと理解できないポンコツなのです。
それゆえにか、いろんな機械学習の本を読みましたが、なかなか理解できませんでした。あの有名な黄色の本(https://www.maruzen-publishing.co.jp/item/?book_no=294524)とか、さっぱりわかりませんでしたよ。
難しい教科書を読もうとしても、「現存!古代生物史 パッキー」で高校数学に挑戦したパッキーさんやスティギーくんみたいな感じに頭にぴよぴよしてしまうのです。
メモ:「現存!古代生物史 パッキー」(レツ先生著、集英社)(https://bookwalker.jp/series/165117/)は現代の竹田家に居候するパキケファロサウルスのパッキーと仲間の古代生物たちが繰り広げる面白日常を描いた漫画なのです。小学生レベルの数学力しかもっていないパッキーさんとスティギーさんが高校数学の授業に果敢にチャレンジしたのだが頭ぴよぴよになってしまうというエピソードがあるのです。勉強はコツコツ積み上げが大事!
難しい機械学習の本をがんばって読んだとしても、自分の頭の数学力がその教科書に達していなければ、書かれている事柄が理解できないものなのです。理解できなければ、プログラムで実装して、実際の世界で役に立てることもできません。教科書は自分の力量にあったものを選ばなければ努力に対するリターンが期待できないものなのです。
「1番かんたんな機械学習の教科書を頼む!」
というわけで、ワタクシ、かんたんな機械学習の教科書を探して読んでみました。この記事では、数学力に自信のないワタクシでも「これならわかるかも!」と感じた機械学習の教科書について、備忘ログを残しておきます。
数学力のないワタクシが求めたという3冊の教科書。
- 「やさしく学ぶ 機械学習を理解するための 数学のきほん」(LINE Fukuoka 株式会社 立石賢吾 著 マイナビ)
- 「自然言語処理シリーズ 1 言語処理のための 機械学習入門」(高村大也 著、奥村 学 監修、コロナ社)
- 「ゼロから作る Deep Learning Python で学ぶ ディープラーイングの理論と実践」(斎藤 康毅 先生著、O’Reilly)
ここからワタクシが何を学んだかをメモ書き程度に書き記しておきます。数学力よわよわ人類が「本を手にとる」参考になればと思います(本の内容の解説はしていません。内容については個々の書籍を直接ご参照ください)。
「やさしく学ぶ 機械学習を理解するための 数学のきほん」(LINE Fukuoka 株式会社 立石賢吾 著 マイナビ)で学んだこと
この本は機械学習の基本ムーブが学べます!
- 何かを予測するモデルの例(まずは多項式から)
- 2次元上にプロットされたデータを線を引いて分ける白黒分けるイメージ(分離曲線)
- 奥義!最小二乗法!
- 後々にもつながる知識
(やさしく学ぶ 機械学習を理解するための 数学のきほん のまとめ)
この本ではアヤノおねーさんとミオおねーさんの会話を通じて機械学習でできることとその理屈を学ぶことができるのです。会話形式だと「何のためにやっていることなのか」というコンテキストがすんなり理解できるような気がします(気がする)。線形モデルやLogistic Regressinといった機械学習や統計学におけるよくよくみる手法について、数式を追いつつ、Pythonでの実装も学ぶことができます。手を動かすのは大事ですね。
「やさしく学ぶ 機械学習を理解するための 数学のきほん」は機械学習を学びたい人の入門本としてはベストの1冊なのではないでしょうか? なお、高校数学程度の微分は出てくるので、その辺が怪しい人は高校の数学の復習をしよう。
「自然言語処理シリーズ 1 言語処理のための 機械学習入門」で学んだこと
この本では、以下のことが学べます。
- 文書をベクトルにする方法(文書を数学で表す方法)
- Support Vector Machine(SVM)の最適化問題を解いてパラメータ更新式を導出する方法
- テキストに対する系列ラベリング
- 言語処理システムの評価についての基礎知識が学べます
- 評価尺度(F値など)のマクロ平均とマイクロ平均の違いについて例が示されている
- 言葉の使い方について
- 系列ラベリング問題ではなく通常の分類問題に対して「CRFを用いた」と述べるのは誤解を招くので「対数線形モデル」まはた「最大エントロピーモデル」を用いたと述べるべきであること(著者の高村先生の言葉の使い方に対する熱い思いを感じられてよかった)
(CRFについてのメモ)
系列ラベリング問題(固有名抽出や品詞の割り当てのなど)には、かつて(90年代〜2010年代)多くの場合でCRFが適用されていました。深層学習やBERTなどの事前学習モデルが流行っている最近(2020年代)ではどうなんでしょうね?
系列ラベリングにおける確率値の計算方法である前向き・後ろ向き(forward-backward)アルゴリズム」の考え方の一般化したものが確率伝搬法(belief propagation)です。確率伝搬は、現在盛んに研究・開発されている、深層学習の基本となる技術だそうでして、技術は連なっているんだなーと思いました。
(言語処理のための 機械学習入門まとめ)
首都大の小町研究室では学生さんはまずこの本で機械学習ベースの自然言語処理の勉強をされるそうです(https://cl.sd.tmu.ac.jp/prospective/prerequisite)。コンパクトながら機械学習の分野で頻出する概念がまとめられていて、類書や論文を読んでいて「あ!『言語処理のための 機械学習入門』で見たやつや!」ということも多いと思います
特にConditional Random Fields(CRF)の解説は、学習時の更新式の導出や推論方法が丁寧に解説されていまして、わかりやすくてオススメです。ここのところ深層学習ベースの論文の方が増えているので、CRFとかのモデルはあまり見かけないかもしれませんが、系列ラベリング問題という考え方、最適化や確率分布や評価方法などの基礎的な知識は腐らないと思います。
全ての例題と演習問題には回答がついてきます。全部とこう! ワタクシも全部解きました! なお、分類モデルの演習問題はちょっと歯ごたえがあり、ワタクシには歯が立ちませんでした。数式の添字の意味が追いきれませんでした(要復習)。
「ゼロから作る Deep Learning Python で学ぶ ディープラーイングの理論と実践」
こちらは深層学習に入門するために読んでみました。この本では以下のことが学べます。
- pythonライブラリnumpyの使い方
- pythonのmatplotlibライブラリでグラフ表示
- ニューラルネットワークの起源:パーセプトロン
- 損失関数とか機械学習の基本
- 奥義!計算グラフで理解する誤差伝搬方!
- 畳み込みニューラルネットワーク(Convolutional neural network :CNN)の仕組み
- 画像の検出や分類でよく使われているCNNでの畳み込みを体感する。(ベクトルの)大きな数字の方眼の四角が小さなな方眼の四角に畳まれて行ったのをみたよ・・・。
- BatchNormalizationの仕組み
- ニューラルネットワークの初期値をうまく設定する方法。学習が早くなり、過学習を抑止する効果がある。深層学習の基礎技術
(ゼロから作る Deep Learning のまとめ)
この本では深層学習の基礎をpythonのプログラムを作ることを通して学べると思います。特に、計算グラフで誤差逆伝播の仕組みを説明する5章に、ワタクシは感動いたしました。「ゼロから作る Deep Learning」シリーズは続刊も発売されてますので、続けて勉強したいと思います。
(本備忘ログまとめ)
この3冊をしっかり学べば、数学がちょい苦手な人でも、(深層学習含む)機械学習の「息吹」「呼吸」を体得できるのではないかと、ワタクシ、確信しているのです。数学とプログラミングや実データの面から学びを深めることができます。3冊ともとっても良い本です。
そして、本で読んだりしたことは、実践しなければ、です。モノを作って自分や他の人の役に立てなければ、です。これこそ技術の基本ムーブ。次の備忘ログでは最近のモダンなライブラリを使ってテキスト分類問題に取り組んでみたいと思います(ライブラリ使うなら数学学んだ意味はあるのだろうか?(自問)。まあいいか。多分ある。)
余談、Logistic Regressionちゃんについて
あと、3冊の本を読んで勉強した気になっていたのですが、備忘ログをまとめるにあたり再読したところ、本の内容は結構忘れていて、知識はなかなか身につかないことを実感いたしました。最近、別の本でLogistic Regressionちゃんのことを勉強していて「こんな方法があったんだ〜、ワタクシ、Logistic Regressionちゃんのこともっと知りたいな」とか思っていたのですが、実はワタクシは「やさしく学ぶ 機械学習を理解するための 数学のきほん」ですでにLogistic Regressionちゃんのことは知っていたのです。すっかり忘れてたよ。
というか、他の統計学の本で学んだのですが、Logistic Regressionちゃんは回帰分析と同じく一般化回帰モデルという一形態みたいな記述があり、ひょっとしてワタクシ、もっと大昔から(統計学の本で読んで)Logistic Regressionちゃんとは知っていたのでは?(そしてきれいに忘れていたのでは?)
これはギャルゲイムでいうところの「そのキャラは幼馴染だったんだけど主人公は忘れてしまっていた」みたいなパターンだなと思いました。ワタクシたちは、幼馴染エンドを迎えるためにも、やはり、教科書は今の自分の実力や理解力にあったものから読んだ方が良いよね?と思いました。
終わり。