RAGが苦手な「ぬるっとした日本語」と戦う
本記事では、RAGの性能を高めるための「DualCSE」という手法について、ざっくり理解します。
株式会社ナレッジセンスは、生成AIやRAGを使ったプロダクトを、エンタープライズ企業向けに開発しているスタートアップです。
この記事は何
この記事は、日本語特有の「あいまいな婉曲表現」(=ぬるっとした日本語)を含む文章でもRAGの精度を上げるための手法「DualCSE」の論文[1]について、日本語で簡単にまとめたものです。
今回も「そもそもRAGとは?」については、知っている前提で進みます。確認する場合は、こちらの記事もご参考下さい。
本題
ざっくりサマリー
DualCSEは、RAGの「ベクトル検索の弱点」に立ち向かうための手法です。北陸先端科学技術大学院大学と東芝の研究者らによって2025年10月に提案されました。
通常のRAGでは、RAGの対象となるソース文書を、一つのベクトルデータに変換した上で、検索するのが常識です。
しかしこうしたベクトル検索だと、「文章の表面上の雰囲気と、その文章の真意が違う場合」に、上手く検索できません。
そこで DualCSEという手法では、1つの文章が持つ「2つの側面」を別々のベクトルで表現します。これにより、文字通りの意味でも、暗示的な意味でも、どちらでも文書検索ができるRAGを実現しています。
問題意識
RAGは便利ですが、「ぬるっとした表現」が苦手です。
例えば、「この案件、スコープを見直すいい機会かもしれません。」という文章は、通常のRAG(ベクトル検索)では難しいです。どうしてこれが難しいかというと、表面上の文章の雰囲気と、実際に意味していることが異なっているからです。
(↑表面の雰囲気に着目すると「いい機会」と、なんだかポジティブに聞こえますが、実際には「納期ヤバいからスコープ減らさないとまずい」という、ネガティブな意味が正しいです。)
手法
この手法では、1つの文章から性質の異なる2種類のベクトルを生成するモデルを事前に作成します。
【事前にやっておくこと】
-
1つの文章から2種類のベクトルを出力するモデルを構築
- INLIというデータセット(1つの文章に対して「文字通りの意味」と「隠れた意味」をそれぞれ格納したデータセット)を活用
- 土台となるモデル(BERTなど)を、対照学習でファインチューニング
- (※関連する意味のベクトルは近づけ、関連しないものは引き離す形でモデルを学習)
【ユーザーが質問を入力して来たとき】
-
質問を2種類のベクトルに変換
- 準備で作ったモデルを使い、ユーザーの質問を「文字通りの意味を表すベクトル」と「隠れた意味を表すベクトル」の2つに変換
-
ベクトル検索を2通りで実施
- 参考ソースのデータベースを、1のそれぞれのベクトルで検索
- これにより、言葉の雰囲気が違い文書と、ユーザーの隠れた意図が近い文書の両方を検索可能
- (※当然ながら、データベース内の文書も事前に2通りのベクトルに変換しておく必要あり)
-
最終回答の生成
- 普通のRAGと同じ
この手法のキモは、1つの文から2つの意味ベクトルを生成する点です。「言葉通りの意味」と「裏の意味」を別のベクトルで区別することで、人間が使う曖昧な表現でも、裏の意図を汲み取った検索が可能になる、という発想です。
成果
(↑Exp. は文章を文字通りに読んでOKなタスク、Imp. は文章の裏にあるニュアンスを読み取る必要があるタスク。Geminiは一番性能高いですが、埋め込みモデルに利用されることはないため、参考数値。)
- 文章の含意認識タスク(RTE)において、従来手法(SimCSE)を上回る性能
- 特に暗黙的含意の認識精度(Imp.の部分)が大幅に向上
- 文章がどれだけ「裏の意味を含んでいるか」をスコア化するタスク(EIS)においても、高い精度
まとめ
弊社では普段、エンタープライズ企業向けにRAGサービスを提供しています。最近注目されているのは、商談やチャットデータのような、人間と人間のコミュニケーションデータです。
社内規定やマニュアルのようなデータは、RAGの鉄板ネタで、簡単にRAG精度が出ます。しかし一方で、Salesforceにあるような商談データや、Teams/Slackのようなチャットデータは、現状のRAGだとかなり苦手で、最近の重要課題です。
こうした「意味が明示されないまま終わる」ような、整理されていないデータでもRAG精度が出るように埋め込みモデルを操作する手法は、今後も登場しそうです。
ぜひ、みなさまが業務でRAGシステムを構築する際も、選択肢として参考にしていただければ幸いです。今後も、RAGの回答精度を上げるような工夫や研究について、記事にしていこうと思います。我々が開発しているサービスはこちら。
Discussion