Pinecone+LangChainでPDFを"学習"し、gpt-4の出力精度をchunkサイズ別に検証
はじめに
株式会社cross-Xの古嶋です。DX戦略の立案やデータ・AI活用の支援をしています。
今回は、PineconeとLangChainを用いたベクトル検索+コンテキスト内学習(ILC: In Context Learning)の手法に基づく、簡単な検証結果をご紹介します。
今回の検証ポイントは、検索対象とするchunkの長さと、ICLで用いるchunkの数によって出力内容がどのように変わるかを検証しました。この文脈で言うchunkとは何かについては後ほど簡単に解説します。
それぞれ、以下の観点でパターンを分けています。
chunk-size: 300または500の場合で比較
chunk数: 6個または10個の場合で比較
また、chunkに分割してベクトルデータベース化し、検索対象とするPDFファイルは、LLMに関する下記の3つのファイルを対象としました。
Harnessing the Power of LLMs in Practice: A Survey on ChatGPT and Beyond
Is Prompt All You Need? No. A Comprehensive and Broader View of Instruction Learning
ここで、単純計算で考えると、chunk-sizeが300のchunkが10個の場合(300×10=3,000)と、chunk-sizeが500のchunkが6個の場合(500×6=3,000)では、gpt-4に入力される情報量としては、ほぼ同じになるはずです。
この2パターン、つまり、
パターン①:chunk-size 300 × chunk数 10
パターン②:chunk-size 500 × chunk数 6
の両者で、出力内容にどのような変化が生まれるかを検証します。
結論から言うと、以下のような示唆が得られました。
パターン①(chunk-size 300 × chunk数 10)では、具体的な評価手法(MMLU、BIG-bench、HELMなど)や具体的なパフォーマンス指標(模擬司法試験でのスコアなど)など、より具体性の高い情報が含まれる出力が得られた。この点はパターン②(chunk-size 500 × chunk数 6)ではあまり見られなかった。
逆に、パターン②(chunk-size 500 × chunk数 6)では評価の観点をより広く、倫理的な側面や実用的な側面から取り上げており、また、研究視点や人間にとっての利用価値の観点からLLMの意義を広く捉えた要旨を提示するなど、情報を広く汲み取った回答が提示された。この点はパターン①(chunk-size 300 × chunk数 10)ではあまり見られなかった。
検証方法
コードを書くと冗長になるので、検証実施時の条件だけ下記に簡単に記載します。
Google Colabでコード作成+実行
OpenAI API Keyを用いてgpt-4を使用
単語埋め込み(ベクトル化)はOpenAIEmbeddingsを利用
PineconeのAPI keyを取得し、Embeddingsをindex化
chunk_overlapは0に設定
Document Question AnsweringにはLangChainのload_qa_chainを利用
出力内容の比較
出力を得るまでの概観は、おおよそ下図の通りです。詳しくはこちらの記事を御覧ください。
chunkとは、簡単に言えば図の左側で示している「文書を分割する単位」だと考えれば良いと思います。そのchunkのサイズによって文書をどのくらいの長さ(文字数)で分割するかが決まるので、chunkのsizeを決める必要があります。また、このchunkごとにEmbedding(埋め込み)つまりベクトル化してベクトルデータベースを作ります。この検証ではIndexにPineconeを採用しています。
パターン①、②に共通して以下の質問文を入力しました。
それでは、検証結果を見ていきましょう。
chunk_size =300, chunk数=10
出力結果は下記の通りです。また、出力文は英語で取得し、DeepLで日本語訳したものを記載しています。
chunk_size =500, chunk数=6
出力結果は下記の通りです。また、出力文は英語で取得し、DeepLで日本語訳したものを記載しています。
検証
この両者の相違点について、ChatGPTに以下のプロンプトで質問しました。
すると、以下の回答が得られました。
共通点
両方の文章は大規模言語モデル(LLM)について述べています。
LLMがさまざまな自然言語処理タスクで高い性能を発揮することを両方が指摘しています。
LLMの法律分野での利用(法律文書分析、法律判断予測、法律文書作成など)について両方が述べています。
LLMの評価において、人間の価値観や好みへの適合(ヒューマンアライメント)、実世界での適切な行動(外部環境との相互作用)、能力範囲の拡大(ツール操作)などを考慮すべきと両方が指摘しています。
LLMの活用には法的問題、プライバシー問題、偏見や差別の可能性などの懸念事項があると両方が述べています。
両方の文章はLLMが多様なタスクとアプリケーションに適用可能であると述べています。
両文書はLLMの発展が新しい能力を引き出すこと、そしてその発見、評価が重要であると指摘しています。
以上のように、共通点としては、出力の文字数に300字という制限がありながらも、両者ともに要点を押さえた内容となっているように見受けられます。
相違点
パターン①はLLMの評価と改善に焦点を当てており、MMLU、BIG-bench、HELMなどのベンチマークについて述べていますが、パターン②はそのような詳細な評価ツールについては触れていません。
パターン①では、LLMが模擬司法試験において人間の受験者と比較して上位10%のスコアを達成したことを具体的な例として挙げていますが、パターン②ではこのような具体的な成果については触れていません。
パターン①では、LLMが汎用性が高く、注釈付きデータが限られている場合や豊富にある場合でも広範なタスクに適用可能であると述べています。しかし、パターン②ではこの点については触れていません。
パターン②では、LLMと小規模なPLMの違い、特にLLM開発における大規模なデータ処理と分散並列トレーニングに関する実務経験の必要性について述べていますが、パターン①ではこの点について触れていません。
パターン②では、LLMの人間らしい特性(自己認識、心の理論など)、公平性、評価設定の正確さなどの観点からの研究について言及していますが、パターン①ではこれらの観点については触れていません。
パターン②では、LLMがAIアルゴリズムの開発と使用方法に革命をもたらしたと強調しています。一方、パターン①ではこの観点からのLLMの影響については触れていません。
パターン②では、LLMが研究者や技術者にとって有用なリソースであり、その前例のない能力と潜在的な応用力によりAIコミュニティや様々な分野に大きな影響を与え続けていると述べています。しかし、パターン①ではこの視点からのLLMの評価や影響については言及していません。
この点を踏まえると、冒頭で提示した結論のように、
パターン①(chunk-size 300 × chunk数 10)では、より具体性の高い情報が含まれる出力が得られた。
逆に、パターン②(chunk-size 500 × chunk数 6)では情報を広く汲み取った回答が提示された。
と言えそうです。
おわりに
あくまでこの検証に限った結論ですが、以下の2点は期待通りの結果だったと言えます。
情報を細かく分割した方が詳細な回答を得られること
文章を大まかに分割した方が概論的な回答を得られること
この点を踏まえると、実際の実務では、chunkのsizeや数を1つのパターンに絞ってしまうのではなく、複数のパターンを併用して出力を得ることが重要かもしれません。
他にも、そもそもデータの前処理を工夫したり、chunkのoverlapを変えたりなど、変更できるポイントは多岐にわたります。この点、ベストプラクティスを探求することは、それ自体も面白いテーマですし、実務においても重要な検証プロセスだと思います。
最後までお読み頂き、ありがとうございました。皆さまの実務において、何かしらのヒントになれば幸いです。
この記事が気に入ったらサポートをしてみませんか?