📜

チャンク分けで長文解析の精度向上 - 法律文章解析にLLMを使う際のチップス PART1

2024/12/23に公開

TL; DR

長めの文章をLLMに解析させる場合はチャンク分けを考えよう。
特に、文章内に散在する情報を抜き出すタスクにおいては必須!

BoostDraftにおけるLLMの利用例

現在BoostDraftの製品の内部ではLLMを使ってません。しかし、弊社の開発業務の中では様々な場面でGPT-4oをはじめとするLLMを使用しています。

代表的な使い方として、テスト用の「正解データ」作成のための定義語抽出があります。BoostDraftには契約書の中にある定義語を抽出する機能があります。プログラムに変更があった際、定義語がどのぐらい精度よく抽出できているか頻繁にチェックしています。そのチェックに大事なのが「正解データ」です。「正解データ」はある契約書ファイルに含まれる定義語のリストで、この正解データに含まれる定義語をどれぐらい抽出できているか(Recall)、また正解データに含まれない語を定義語として抽出していないか(Precision)を測定しています。

「正解データ」は最終的には人手で作成されますが、最初から文章を全部読んで一から作るのはなかなかに大変です。そこで、弊社ではまずLLMによって大雑把に「正解データ」の元となる定義語の一覧を作成し、そこに人手で追加・削除を行うことで最終的な「正解データ」を作っています。

LLMによる定義語抽出は「正解データ」の作成以外にも様々な場面で使っています。
そのプロンプトは秘伝なのでここには載せられないのですが、比較的簡単なプロンプト(例えば「以下の契約書から定義語を抽出してください」)でも動くのでぜひ試してみてください。

LLMによる定義語抽出の精度評価基準

ここで大事になってくるのはLLMによる情報抽出の精度で、特に重要なのは前述のRecallです。「正解データ」作成の例を挙げてみます。LLMによる情報抽出のRecallが低い場合=本来「正解データ」に含まれるべき語があまり抽出されていない場合、最終的に人手で確認する際に抽出されていない定義語を契約書から探すのに時間をかけなければならなくなってしまいます。一方、LLMによる情報抽出のRecallが高いがPrecisionが低い場合=本来「正解データ」に含まれるべきでない語が多数含まれてしまっている場合、抽出結果を見て一見して「これは違うな」あるいは「これは怪しい」と判断できるケースが多く、これらを取り除く作業は不足している定義語を契約書から探すのに比べだいぶ楽です。一般的にRecallとPrecisionはトレードオフになりやすいですが、この場合はRecallがより重要といえます。

課題:長い文章だと精度が落ちる

契約書などの法律文章は一般的にWord文章で20ページ以上のものも多く、WebサイトやSNSの投稿などと比較してかなり長い文章といえます。以前より、文章の長さが法律文章に対する自然言語処理技術の課題とされてきましたが、LLMは今やかなり長い文章を読むことができます。特に2023年頃から飛躍的に読み込める文章の長さが長くなってきており、OpenAIのGPT-4oは2024年現在128,000トークン(≒英語だと単語数)読み込ませることができます。英文契約書でいえばWordで50ページ以上の文章を1回のAPIコールで読ませることができます。

ところが、長い文章になればなるほど定義語抽出の精度が落ちるのです。

これは定義語抽出のみならず、文章の中に散在する情報をまとめたいタスク全般において問題となってきます。例えば要約タスクなどでも重要な情報をとり漏らしてしまう可能性があります。

この課題の解決方法は簡単です。文章を短いチャンクと呼ばれる部分に分け、それぞれPromptと一緒にLLMに送ればよいのです。単純なことなのですが、気づいていないと十分な精度で情報抽出できず、「LLMはまだまだだな」という結論に陥ってしまう可能性があります。

実験

それでは、実際に契約書で定義語抽出を例として確認してみましょう。

実験条件

  • 実験用ファイル: NVCA Model Document: Stock Purchase Agreement
    • Token数:およそ16,000語(≒16,000Token)
  • LLM: GPT-4o (gpt-4o-2024-08-06)
  • Task: 定義語抽出タスク
  • Prompt: 弊社秘伝のプロンプト
  • Ground Truth(正解データ): 手動で作成
  • Metrics: LLMで抽出した定義語候補と人手で作成した「正解データ」を比較
    • TP: 「正解データ」に含まれる定義語候補数
    • FP: 「正解データ」に含まれない定義語候補数
    • FN: 定義語候補ではない「正解データ」の数
    • Precision: TP/(TP+FP)
    • Recall: TP/(TP+FN)
  • チャンク分け方法
    • 上限20,000語(≒20,000Token)のチャンクに分ける -> チャンク数1
    • 上限10,000語(≒10,000Token)のチャンクに分ける -> チャンク数2
    • 上限5,000語(≒5,000Token)のチャンクに分ける -> チャンク数4
    • 上限2,000語(≒2,000Token)のチャンクに分ける -> チャンク数8

結果

Recallがチャンク分けの有無、またチャンクの大きさに大きく依存していることがわかります。
一方、Precisionは若干下がっているように見えます。これは長いチャンクでは確実に定義語といえる語のみを少数抽出しており、短いチャンクでは誤って抽出してしまったものも含め積極的に多数抽出していることが伺えます。

考察

GPT-4の内部構造の詳細は公開されていないので、なぜこうなっているのか予想するしかありません。
これは長文読解には外挿などの技術を用いており、その影響で起こっているのではないかと予想します。
外挿: https://arxiv.org/pdf/2108.12409
Recurrent Memory Transformer: https://arxiv.org/abs/2207.06881

LLMがGPT-4-32k以前において長い文章を扱えなかったのは、トランスフォーマーの設計によるところが大きいです。ナイーブなトランスフォーマーは入力長N, 入力次元数dに対して O(N^2 * d) の計算量となり、入力長が大きいと計算量が大変大きくなってしまうため、あまり長い入力に対応できませんでした。現在もトランスフォーマーの計算量を軽減する研究が多数出ています。
https://arxiv.org/pdf/2209.04881

一方、前述のように2023年に超長文章への対応ができるモデルが出てきました。恐らくですがトランスフォーマーの入力長が飛躍的に増えたのではなく、前述のような別の技術を導入して長文対応しているのではないかと予想されます。前述の外挿では、文章が長くなるほどトランスフォーマーの計算回数が増え、その結果が足し合わせられるため、一部分に強く依存した結果を出力させる問題に弱くなるように思います。

この考察はあくまで予想でしかありませんが、ご興味を持っていただけたら幸いです。

最後に

BoostDraftでは私と共に開発を進めてくださるリサーチエンジニアをはじめ, 全方位で採用強化中となりますので, ご興味ある方はぜひ以下のリンク先から採用ポジションをご確認ください.
https://apply.workable.com/boostdraft/?lng=en


執筆者:藤野知之(Research Engineer)
SNS: LinkedIn
経歴: 慶応義塾大学にて修士(工学)取得後, NTT研究所にてクラウドWebブラウザ, 製造業向けIoTシステムの開発に従事するとともに映像処理, 生体信号処理, 機械学習アルゴリズムの研究に取り組む. 2022年にリサーチエンジニアとしてBoostDraftに入社後, 検索機能, エラーチェック機能の開発に従事し, 現在は主に生成AIや深層学習モデルを用いた新機能の検討を行っている.

BoostDraft TECH BLOG

Discussion