🦌

Embeddingはコンテキストの保持で精度が上がる

2024/09/24に公開

導入

こんにちは、株式会社ナレッジセンスの須藤英寿です。普段はエンジニアとして、LLMを使用したチャットのサービスを提供しており、とりわけRAGシステムの改善は日々の課題になっています。

この記事では、長文から分割されたチャンクを精度高く検索するための手法、Late Chunkingについて紹介します。

https://arxiv.org/pdf/2409.04701

サマリー

Late Chunkingは、従来のRAGと比較して長文を分割したチャンクでの検索精度を向上させます。

Late Chunkingの特徴として、長文対応のEmbeddingを用いてトークンごとのベクトルデータを取得します。その後、チャンクの単位に合わせてベクトルデータの平均を取り、そのベクトルのデータを利用してベクトル検索をかける手法となっています。

問題意識

チャンク化はコンテキストを失う可能性がある

RAGのシステムでは、関連のある情報を取得するために大量の文章情報をある程度のテキストの単位でまとめてベクトル化するという手法が取られています。このときのベクトル化の精度というのは多くの場合ではモデルによる影響が大きいのですが、ある程度長いテキストを分割すると別の問題が発生します。

ここにWikipediaの「鹿」に関する説明の冒頭部分を記載します。

シカ(鹿、英語: Deer)は、鯨偶蹄目シカ科 (Cervidae) に属する哺乳類の総称である。ニホンジカ、トナカイ、ヘラジカなどが属しており、約16属36種が世界中の森林などに生息している。

特徴
オスは枝分かれしたツノを持ち、枝角(アントラー)と呼ばれる。多くのシカ科のメスはツノを持たないがトナカイはオスメス共にツノを持つ。ウシ科の動物のツノ(洞角)は骨の芯を角質が覆っており生え替わらずに一生伸び続けるが、シカのツノ(枝角)は骨組織からなり、毎年生え替わる。春季の生えたばかりの角は柔らかく表皮に覆われているが、秋季の骨化した角は固く、表皮は脱落する。

さて、これをかなり恣意的ではありますが、以下のように分割してみます。

シカ(鹿、英語: Deer)は、鯨偶蹄目シカ科 (Cervidae) に属する哺乳類の総称である。ニホンジカ、トナカイ、ヘラジカなどが属しており、約16属36種が世界中の森林などに生息している。
特徴
オスは枝分かれしたツノを持ち、枝角(アントラー)と呼ばれる。
多くのシカ科のメスはツノを持たないがトナカイはオスメス共にツノを持つ。

この文章をそれぞれ独立してみると、2つ目の文章は鹿に関する説明であることがわからなくなってしまっているのがわかると思います。文章を理解するのに不可欠な情報(文章)が抜け落ちる可能性がチャンク化には潜んでいます。

手法

Late Chunkingの手法は至ってシンプルで、基本的にはRAGと同様のプロセスをたどりますが、チャンクのベクトル化の際に以下の手順をふみます。

  1. できるだけ多くのトークン入力に耐えられるモデルを用意する
  2. トークン上限になるだけ文章を入力し、トークンごとのベクトルを取得(トークンごとにベクトルデータを取得する点は通常のEmbeddingと大きく異なります)
  3. チャンク化する単位でベクトルの平均を取り、その値をそのチャンクのベクトルとして扱う

成果

Lengthは、ドキュメントごとのチャンク数の平均値。Naiveはチャンクごとのベクトルを検索に用いた手法、LateはLate Chunkingを採用した手法、Fullはドキュメントに対してまとめて一つのベクトルを割り当てる手法、となっています。

検証の結果としては、僅かではありますがLateやFullの手法の精度が高いことが示されています。
注意したい点としては、Embeddingのモデル自体はすべて jina-embeddings-v2-small-en であり他のモデルとの比較は行われていません。

まとめ

この論文は、Embeddingのコンテキスト保持が検索精度に与える影響についてまとめられていました。精度の上がり幅としては小さく見えますが、これはそもそもコンテキストを失わなければ検索精度に影響が出ない事が原因と考えられます。またドキュメントが短い場合、チャンク分けも発生しないので精度の向上も発生しないと考えられます。長文でかつ、コンテキストの保持が重要な文章であればより効果を発揮したと考えられます。

とはいえ、ここで提案されている手法は、APIで公開されているEmbeddingモデルでは取得できないパラメータを利用しているので、実際にそのまま真似しようとするのは困難かと思います。これまでの知られた方法での対応策としては、Embeddingの際には前後数百文字も含めてベクトル化することや、句読点など意味の区切れ目になりやすいようなポイントで区切ることなどが方法を利用することが考えられると思います。

ナレッジセンス - AI知見共有ブログ

Discussion