🧐

LLMの気持ちに寄り添って生成的に固有表現認識を解くプロンプトを検討する

2023/09/18に公開

はじめに

すでにこのあたりの考察論文は出ているかもしれませんが、LLM の気持ちに寄り添って生成的に few-shot で固有表現認識タスクを解く方式を考えます。少量の事例でざっと試してみた所感程度ですが、そんなに間違った考察ではないと思っています。使うモデルは GPT-3.5-turbo とか PaLM2 (text-bison) 以下の能力を想定しています (2023-09-19 追記: GPT-4 でも試さないわけにはいかないと思い直して GPT-4 でも試しました。末尾に追記してます)。

一般的に固有表現認識 (NER) は、各トークンにBIOラベルを付与していく方式で解きます。お手軽な記事だと次の記事が分かりよいかと思います:BERTによる日本語固有表現抽出の精度改善 〜BERT-CRFの紹介〜 - Sansan Tech Blog。ただし、この方法はBERTなどのモデルの微調整を前提にします。つまり、アノテーションした事例をそれなりに集めないといけないので、独自のことをやりたいなら初期コストが大きいです。

それに対して LLM (というか自己回帰的にテキスト生成するデコーダー) は、要するに前から順にトークンを生成していきます。そして、いくつかの入出力事例を与えるだけで、それなりの性能でタスクが解けます。アノテーションの初期コストがほとんどかからない点で非常に便利です。

生成的手法の欠点と、その抑制方法の検討

LLM は、前から順にトークンを生成していくと言いました。これは、たとえウッカリでも出力してしまった結果を前提にして、次のトークンを予測するしかない構成だ、ということを意味します。このため、「ウッカリ出力」を可能な限り抑える出力形式を考える必要があります。では、どのような出力形式がよいのでしょうか?考えてみます。

タグで囲う - 仮説: 悪い

まず、固有表現を何らかのタグで囲うアノテーション方式が思い浮かびます。とりあえず <per>太郎</per> のような形式とか、対象の種類が1つしかないならば @@太郎## のような方法でもよいでしょう。こんな感じで:

input: 太郎は自然言語処理大学に通っている。
output: <per>太郎</per>は<org>自然言語処理大学</org>に通っている。
output_person_only: @@太郎##は自然言語処理大学に通っている。

これは、誤りを導きやすい形式に思えます。なぜかというと、「ウッカリ≪太≫を出力したから、≪太郎≫をタグで囲えなくなった」「ウッカリ≪処理≫直後に閉じタグの先頭 "<" を出力したから、≪学校≫まで囲えなくなった」という事態が発生しやすいはずだからです。見逃しや、切り出す長さの不足が発生しやすいのでは?

形態素末にタグを付与する - 仮説: 良い

こういう BIO tagging 的な形式を考えます;

input: 太郎 は 自然言語処理 大学 に 通っ て いる 。
output_bio: 太郎_B-PER は_O 自然言語処理_B-ORG 大学_I-ORG に_O 通っ_O て_O いる_O 。_O
output_org_only: 太郎 は 自然言語処理_B 大学_I に 通っ て いる 。

わざわざ O tag までは用意しなくて問題ないかもしれません[1]。また、特にこの tagging 方式の場合、入力はあらかじめ分かち書きにしておいたほうが有利な気はします。多言語 LLM だと内部的には byte 単位まで文字が分割されているし、日本語のベーシックな単語区切りの概念を上手く取り扱えるという前提をおけないからです (多言語 LLM は意味とか意図とかは取り扱えるけど、日本語の単語とか文節とかの話になると信用しないほうが無難だと感じます)。

固有表現のリストを出力する - 仮説: 微妙? (今回対象外)

input: 太郎は自然言語処理大学に通っている。
output: {"per": ["太郎"], "org": ["自然言語処理大学"]}

ごめんなさい、ちょっと今回これは試し切れていません。悪くないと思いますが、入力テキストをすべて丁寧に見ているという確証が得られない点で、あまり良くないのでは?と思っています。少なくともエラー検証はやりづらいです。

実験

ちょっと特殊なドメインで、独自定義した固有表現的な表現を抽出します。今回は、商品のレビュー文から、何らかの商品を示す表現を抽出してみます。ひとまず10件程度ですが PaLM2 (text-bison@001) の response を比較します。なんとなくでも傾向が見れればよいかなーと考えています。

データ

amazon-multilingual-counterfactual-dataset を使います。反事実文識別タスク用のデータなので目的外利用という感じですが、日本語文があって手ごろ、かつ制限が厳しいライセンスではないので、今回こちらを利用させていただきます。AI SHIFT さんによる解説/検証記事が分かりやすいです。

商品名のタグ付けというタスクの gold standard は無いですが、とりあえず少数例を人手 (筆者です) でアノテート、出力チェックすることにします。傾向は見えるでしょう。

比較

10事例の比較なので、総合的に明らかにこちらがよさそうとは言えませんが、末尾にタグを付与する形式のほうが、スパンを長く切り出す傾向はありそうです (ただし、形式不備は見られました。規則で補完可能な不備ですが)。これは仮説に合致します。ただ、両方ともそれなりに見逃しは多くありました。

タグ囲い方式プロンプト:

### Task description
Annotate product names.

### input
iPhone 5 の ジャック が ない の だけ が 、 欠点 です それ さえ 解決 すれ ば 星 5 つ です * ¥ (^o^)/ * ・ 我が家 は 、 2 台 買っ て ます よ \(^o^)/ --> <PRODUCT>iPhone 5 の ジャック</PRODUCT> が ない の だけ が 、 欠点 です それ さえ 解決 すれ ば 星 5 つ です * ¥ (^o^)/ * ・ 我が家 は 、 2 台 買っ て ます よ \(^o^)/
ドロップハンドル の ロードレーサー で は 、 ハンドル 先端 部 に 装着 すれ ば 、 あらゆる 姿勢 で 後方 の 視認 が 可能 です 。 --> <PRODUCT>ドロップハンドル の ロードレーサー</PRODUCT> で は 、 ハンドル 先端 部 に 装着 すれ ば 、 あらゆる 姿勢 で 後方 の 視認 が 可能 です 。
Kindle で 読む の に 最適 だ と 思い ます 。 --> <PRODUCT>Kindle</PRODUCT> で 読む の に 最適 だ と 思い ます 。
Zippo ユーザー なら 持っ て て 損し ない 一 品 。 --> <PRODUCT>Zippo</PRODUCT> ユーザー なら 持っ て て 損し ない 一 品 。
特に 、 宇宙 の 描写 は 素晴らしく 、 2001 年 宇宙 の 旅 から すれ ば 、 よく ぞ ここ まで 進歩 し た なあ と 思う 。 --> 特に 、 宇宙 の 描写 は 素晴らしく 、 <PRODUCT>2001 年 宇宙 の 旅</PRODUCT> から すれ ば 、 よく ぞ ここ まで 進歩 し た なあ と 思う 。
テラスハウス で 流れ て い た 曲 が 欲しく て レンタル しよう と 思っ た が 買っ た 方 が 早かっ た から 。 --> <PRODUCT>テラスハウス で 流れ て い た 曲</PRODUCT> が 欲しく て レンタル しよう と 思っ た が 買っ た 方 が 早かっ た から 。
{入力文} --> 

末尾タグ方式:

### Task description
Annotate product names.

### input
iPhone 5 の ジャック が ない の だけ が 、 欠点 です それ さえ 解決 すれ ば 星 5 つ です * ¥ (^o^)/ * ・ 我が家 は 、 2 台 買っ て ます よ \(^o^)/ --> iPhone_B 5_I の_I ジャック_I が ない の だけ が 、 欠点 です それ さえ 解決 すれ ば 星 5 つ です * ¥ (^o^)/ * ・ 我が家 は 、 2 台 買っ て ます よ \(^o^)/
ドロップハンドル の ロードレーサー で は 、 ハンドル 先端 部 に 装着 すれ ば 、 あらゆる 姿勢 で 後方 の 視認 が 可能 です 。 --> ドロップハンドル_B の_I ロードレーサー_I で は 、 ハンドル 先端 部 に 装着 すれ ば 、 あらゆる 姿勢 で 後方 の 視認 が 可能 です 。
Kindle で 読む の に 最適 だ と 思い ます 。 --> Kindle_B で 読む の に 最適 だ と 思い ます 。
Zippo ユーザー なら 持っ て て 損し ない 一 品 。 --> Zippo_B ユーザー なら 持っ て て 損し ない 一 品 。
特に 、 宇宙 の 描写 は 素晴らしく 、 2001 年 宇宙 の 旅 から すれ ば 、 よく ぞ ここ まで 進歩 し た なあ と 思う 。 --> 特に 、 宇宙 の 描写 は 素晴らしく 、 2001_B 年_I 宇宙_I のI 旅_I から すれ ば 、 よく ぞ ここ まで 進歩 し た なあ と 思う 。
テラスハウス で 流れ て い た 曲 が 欲しく て レンタル しよう と 思っ た が 買っ た 方 が 早かっ た から 。 --> テラスハウス _Bで_I 流れ_I て_I い_I た_I 曲_I が 欲しく て レンタル しよう と 思っ た が 買っ た 方 が 早かっ た から 。
{入力文} --> 

予測結果の事例:

囲う: バッテリー グリップ 付 ボディ は 少し 頭 が 出っ張る の で 、 あと 数 cm 深 さ が あれ ば 文句 無し です 。
末尾:バッテリー グリップ 付 ボディ は 少し 頭 が 出っ張る の で 、 あと 数 cm 深 さ が あれ ば 文句 無し です 。
評価:"バッテリーグリップ付ボディ"をともに見逃し

囲う:プライム 版 <PRODUCT>ショック ウェーブ</PRODUCT> は デザイン が 良い です 。
末尾:プライム_B 版_I ショック_I ウェーブ_I は デザイン_I が 良い です 。
評価: 末尾タグ方式はカバー範囲が過剰。

囲う:今まで 使っ て い た マウス の ホイールゴム が 死ん で しまい 、 どうせ 買い換える なら ・ ・ ・ と 、 お 手ごろ な 価格 の ゲーミング マウス を 探し て ・ この <PRODUCT>商品</PRODUCT> に たどり着き まし た ^^ ・ ・ 設定 の 幅 も 広く 、 とても 使い 易い と 思い まし た 。
末尾:今まで 使っ て い た マウス_B の ホイールゴム_I が 死ん で しまい 、 どうせ 買い換える なら ・ ・ ・ と 、 お 手ごろ な 価格 の ゲーミング マウス_B を 探し て ・ この 商品 に たどり着き まし た ^^ ・ ・ 設定 の 幅 も 広く 、 とても 使い 易い と 思い まし た 。
評価: 明確にタグ囲い方式は誤り。末尾タグ方式は "マウスのホイールゴム" を抽出できたと言えなくはない(形式誤りはあるが規則で補完可能)

囲う:入学 祝 な の で 通販 で は なく 一緒 に 出掛け て 店頭 で 選び たかっ た の です が ・ 地方 の お店 で は こう いう <PRODUCT>時計</PRODUCT> を 見つける こと が でき ませ ん でし た 。
末尾: 入学 祝 な の で 通販 で は なく 一緒 に 出掛け て 店頭 で 選び たかっ た の です が ・ 地方 の お店 で は こう いう 時計 を 見つける こと が でき ませ ん でし た 。
評価: 末尾タグ方式は明確に "時計" を見逃した。

囲う:海外 から の 発送 です の で 、 少々 到着 まで に 時間 は かかり ます が 、 <PRODUCT>GoPro</PRODUCT> の アクセサリ は ひと通り 揃え て 、 シーン 毎 に 使い分ける 必要 が あり ます の で 、 安価 に 様々 な マウント を 揃える の で あれ ば 充分 選択 する 価値 は ある と 思い ます 。
末尾:海外 から の 発送 です の で 、 少々 到着 まで に 時間 は かかり ます が 、 GoPro_B の アクセサリ は ひと通り 揃え て 、 シーン 毎 に 使い分ける 必要 が あり ます の で 、 安価 に 様々 な マウント を 揃える の で あれ ば 充分 選択 する 価値 は ある と 思い ます 。
評価: 両方同じ結果。

囲う:良い 点 ・ ・ フィルム が 曲面 まで カバー する こと で 一体 感 が あり 、 うまく 貼れれ ば 一見 フィルム が 貼っ てる よう に 見え ない の が ◎ ・ ・ アップル 純正 カバー を 付け まし た が 、 干渉 する こと なく 見た目 は なかなか です 。
末尾: 良い 点 ・ ・ フィルム_B が 曲面_I まで カバー する こと で 一体 感 が あり 、 うまく 貼れれ ば 一見 フィルム_B が 貼っ てる よう に 見え ない の が ◎ ・ ・ アップル_B 純正 カバー_I を 付け まし た が 、 干渉 する こと なく 見た目 は なかなか です 。
評価: 末尾タグ方式のほうが明確にカバー率が良い。

囲う:初めて の マイク なら これ を お すすめ し ます 。
末尾:初めて の マイク_B なら これ を お すすめ し ます 。
評価: タグ囲い方式は "マイク" を見逃した。

囲う:<PRODUCT>Logicool 社</PRODUCT> の ゲーミング マウス は どれ も 高かっ た 上 に ・ amazon で 人気 + 評価 が 良かっ た ため 購入 し まし た が ・ とても 満足 し て い ます 。
末尾:【 総評 】 ・ Logicool_B 社 の ゲーミング マウス_I は どれ も 高かっ た 上 に ・ amazon_B で 人気 + 評価 が 良かっ た ため 購入 し まし た が ・ とても 満足 し て い ます 。
評価: 形式不備はあるが末尾タグ方式は "Logicool 社 の ゲーミング マウス" を抽出できている。タグ囲い方式だと "Logicool 社" だけ抽出している。


囲う: 普通 の 撮影 なら これ で こと足り ます が 念 の ため スペア バッテリー マガジン と 一緒 に 買い まし た 。
末尾: 普通 の 撮影 なら これ で こと足り ます が 念 の ため スペア バッテリー マガジン と 一緒 に 買い まし た 。
評価: "スペアバッテリーマガジン" を両方見逃し。

囲う: フィギュア 自体 の 出来 は 首 が 上向き に なら ない 点 を 除き 満足 し て い ます 。
末尾: フィギュア_B 自体 の 出来 は 首 が 上向き に なら ない 点 を 除き 満足 し て い ます 。
評価: タグ囲い方式だと "フィギュア" を見逃し。

結論

末尾にタグを付与する方式のほうが、仮説通りにスパンを長く切り出す傾向にありそうだと分かりました。カバー率も若干高いかもしれません。

さすがに明確にこれこれこうとは言えませんでしたが、私はこういうことを考えてプロンプトを書いています、という例でした。誰かの参考になれば幸いです。

追記: GPT-4 でも試した

アノテーション形式の違いで起きる挙動差異はかなり少ないです。ほぼ変わらないか、タグで囲う方式のほうが若干良い気はします。なぜだろう。小手先のテクニックを弄するよりも GPT-4 で 1,000 事例くらいアノテーションして GPT-3.5 を PEFT するのがよいのでしょうね…(PaLM だと GCP まわりのサービスから呼び出せるのが嬉しいのですが、この性能差を見ると色々考えなおしたほうが良い気がしてきます)

囲い:<PRODUCT>バッテリー グリップ 付 ボディ</PRODUCT> は 少し 頭 が 出っ張る の で 、 あと 数 cm 深 さ が あれ ば 文句 無し です 。
末尾:バッテリー_B グリップ_I 付_I ボディ_I は 少し 頭 が 出っ張る の で 、 あと 数 cm 深 さ が あれ ば 文句 無し です 。

<PRODUCT>プライム 版 ショック ウェーブ</PRODUCT> は デザイン が 良い です 。
末尾:プライム_B 版_I ショック_I ウェーブ_I は デザイン が 良い です 。

今まで 使っ て い た <PRODUCT>マウス の ホイールゴム</PRODUCT> が 死ん で しまい 、 どうせ 買い換える なら ・ ・ ・ と 、 お 手ごろ な 価格 の ゲーミング マウス を 探し て ・ この 商品 に たどり着き まし た ^^ ・ ・ 設定 の 幅 も 広く 、 とても 使い 易い と 思い まし た 。
末尾:今まで 使っ て い た マウス_B の_I ホイールゴム_I が 死ん で しまい 、 どうせ 買い換える なら ・ ・ ・ と 、 お 手ごろ な 価格 の ゲーミング マウス_B を 探し て ・ この 商品 に たどり着き まし た ^^ ・ ・ 設定 の 幅 も 広く 、 とても 使い 易い と 思い まし た 。

入学 祝 な の で 通販 で は なく 一緒 に 出掛け て 店頭 で 選び たかっ た の です が ・ 地方 の お店 で は こう いう <PRODUCT>時計</PRODUCT> を 見つける こと が でき ませ ん でし た 。
末尾:入学_B 祝_I な の で 通販 で は なく 一緒 に 出掛け て 店頭 で 選び たかっ た の です が ・ 地方 の お店 で は こう いう 時計 を 見つける こと が でき ませ ん でし た 。

海外 から の 発送 です の で 、 少々 到着 まで に 時間 は かかり ます が 、 <PRODUCT>GoPro の アクセサリ</PRODUCT> は ひと通り 揃え て 、 シーン 毎 に 使い分ける 必要 が あり ます の で 、 安価 に 様々 な マウント を 揃える の で あれ ば 充分 選択 する 価値 は ある と 思い ます 。
末尾:海外 から の 発送 です の で 、 少々 到着 まで に 時間 は かかり ます が 、 GoPro_B の_I アクセサリ_I は ひと通り 揃え て 、 シーン 毎 に 使い分ける 必要 が あり ます の で 、 安価 に 様々 な マウント を 揃える の で あれ ば 充分 選択 する 価値 は ある と 思い ます 。

良い 点 ・ ・ <PRODUCT>フィルム</PRODUCT> が 曲面 まで カバー する こと で 一体 感 が あり 、 うまく 貼れれ ば 一見 フィルム が 貼っ てる よう に 見え ない の が ◎ ・ ・ <PRODUCT>アップル 純正 カバー</PRODUCT> を 付け まし た が 、 干渉 する こと なく 見た目 は なかなか です 。
末尾:良い 点 ・ ・ フィルム_B が 曲面 まで カバー する こと で 一体 感 が あり 、 うまく 貼れれ ば 一見 フィルム が 貼っ てる よう に 見え ない の が ◎ ・ ・ アップル_B 純正_I カバー_I を 付け まし た が 、 干渉 する こと なく 見た目 は なかなか です 。

初めて の <PRODUCT>マイク</PRODUCT> なら これ を お すすめ し ます 。
末尾:初めて の マイク_B なら これ を お すすめ し ます 。

<PRODUCT>Logicool 社 の ゲーミング マウス</PRODUCT> は どれ も 高かっ た 上 に ・ amazon で 人気 + 評価 が 良かっ た ため 購入 し まし た が ・ とても 満足 し て い ます 。
末尾:Logicool_B 社_I の_I ゲーミング_I マウス_I は どれ も 高かっ た 上 に ・ amazon で 人気 + 評価 が 良かっ た ため 購入 し まし た が ・ とても 満足 し て い ます 。

普通 の 撮影 なら これ で こと足り ます が 念 の ため <PRODUCT>スペア バッテリー マガジン</PRODUCT> と 一緒 に 買い まし た 。
末尾:普通 の 撮影 なら これ で こと足り ます が 念 の ため スペア_B バッテリー_I マガジン_I と 一緒 に 買い まし た 。

末尾:フィギュア_B 自体_I の_I 出来_I は 首 が 上向き に なら ない 点 を 除き 満足 し て い ます 。
<PRODUCT>フィギュア</PRODUCT> 自体 の 出来 は 首 が 上向き に なら ない 点 を 除き 満足 し て い ます 。
脚注
  1. 結果を見ると O tag 必要だったかもしれない。 ↩︎

Discussion