- 枕詞
- 今回の備忘ログのテーマ(プロンプトで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手法(仮)」みたいな感じになるでしょうか。こんなんいつ公開できるんだろ。まあ、いいや。ワタクシは今まで見たことなかった景色を見るのが好きです。自然でも技術でも創作でも。その新しい地平を見るために、ワタクシは明日もがんばります。
ここまでながーい備忘ログを読んでくれてありがとうございます。また、次回の備忘ログでお会いしましょう!
付録
再現性の担保(未完了)
githubに実験コードをあげる予定です(まだやってない)。現在コード整備中ですがあまりきれいなコードではないです。汎用性の低い実験コードです。
実験のコスト
プロンプト実験を行ったさいのコストは30ドルぐらいですかね(20240309のは30ドルチャージ、今24ドル残ってる)。GPT-4はお高いので、GPT-3.5-turboを主に使いまして、4500円ぐらいかな? 試行錯誤を含めてそのぐらいです。 本一冊ぐらい。