第8部 外部知識とツールでLLMを拡張する
第30章埋め込みとベクトルDB
RAGの検索を支えているのが、埋め込みとベクトルDB、そして「似ている」を数値で測るコサイン類似度です。 この章では、文章をベクトルに変換し、その近さで関連する情報を探し出すしくみを見ていきます。第12章で見た 埋め込みの考え方が、ここで実際の検索に活きてきます。理屈と実務がつながる場面です。
30.1文章をベクトルに変換する
RAGでは、あらかじめ資料の文章を埋め込みによってベクトルに変換しておきます。似た意味の文章は、似たベクトルになります。
RAGの検索では、第12章で見た埋め込みが使われます。まず、検索の対象となる資料を適当な長さに区切り、 それぞれの文章を埋め込みによってベクトルに変換しておきます。埋め込みでは、似た意味を持つ文章どうしが 似たベクトルになるのでした。この性質を使えば、「意味が近い文章」を「ベクトルが近い文章」として探し 出せます。文章の見た目ではなく、意味の近さで検索できる点が、この方法の核心です。
ふつうのキーワード検索は、入力した言葉と同じ言葉を含む文章を探します。そのため、言い回しが違うと 見つけられないことがあります。埋め込みによる検索は、言葉が違っても意味が近ければ見つけられる点が 強みです。「返品したい」で検索して、「返送の手続き」について書かれた文章を見つける、といったことが できるわけです。
30.2ベクトルDBの役割
ベクトルDBは、大量の文章のベクトルをためておき、与えられたベクトルに近いものをすばやく探し出すためのしくみです。
資料をベクトルに変換したら、それらをためておく場所が必要です。その役割を担うのがベクトルDB(ベクトル データベース)です。ベクトルDBは、大量の文章のベクトルを保管し、あるベクトルが与えられたときに、 それに近いベクトルを持つ文章をすばやく探し出せるようにしたしくみです。検索のときは、利用者の質問も ベクトルに変換し、そのベクトルに近いものをベクトルDBから取り出します。こうして、質問に意味の近い 文章が検索結果として得られます。
30.3コサイン類似度で似ているを測る
ベクトルどうしがどれだけ似ているかは、多くの場合コサイン類似度で測ります。これは、二つのベクトルの向きの近さを表す数値です。
二つのベクトルが「似ている」ことを具体的に測る方法として、よく使われるのがコサイン類似度です。これは、 二つのベクトルの向きがどれだけ近いかを表す数値です。向きがほぼ同じなら1に近く、まったく関係がなければ 0に近づきます。第12章で見たように、意味の近い文章は似た向きのベクトルになるため、向きの近さを測れば、 意味の近さを測れることになります。次の図は、その考え方を示したものです。
考え方のイメージをつかむために、ごく短いコードで示すと、次のようになります。二つのベクトルの向きの 近さを計算し、その値が大きいほど似ていると判断します。
question_vec = embed("返品の期限は何日ですか") # 質問をベクトルに変換
scores = [cosine_similarity(question_vec, v) for v in db_vectors]
best = documents[argmax(scores)] # 最も似た文章を取り出す
深掘り:資料をどう区切るか(読み飛ばし可)
RAGでは、資料をそのままではなく、適当な長さに区切ってからベクトルにします。この区切りの単位を チャンクと呼びます。区切り方は、検索の精度に意外なほど効いてきます。長すぎると、一つのチャンクに いろいろな話題が混ざり、狙った内容がぼやけます。短すぎると、前後の文脈が切れて、意味が通らなく なります。文章の切れ目や見出しに沿って、ほどよい長さに区切るのがコツです。第12章で見たトークン数の 感覚が、ここでの区切りの大きさを決める目安になります。RAGがうまく効かないとき、この区切り方を 見直すと改善することがよくあります。
30.4検索から回答生成までの流れ
質問をベクトルに変換し、ベクトルDBから近い文章を取り出し、それをプロンプトに加えてLLMに答えさせる。これがRAGの検索から回答までの一連の流れです。
ここまでを一つにつなげると、RAGの中身が見えてきます。まず、利用者の質問を埋め込みでベクトルに変換します。 次に、そのベクトルとコサイン類似度が高い文章を、ベクトルDBから取り出します。そして、取り出した文章を 質問と一緒にプロンプトへまとめ、LLMに渡します。最後に、LLMがその情報を踏まえて応答を返します。前章で 見た全体像の「検索」の中身が、この埋め込みとコサイン類似度による近さの計算だったわけです。
このしくみは強力ですが、万能ではありません。質問のしかたによっては、意図とずれた文章が検索されて しまうこともあります。次の章では、この検索でつまずきやすい落とし穴と、その対処を見ていきます。
この章の要点
- RAGでは、資料の文章をあらかじめ埋め込みでベクトルに変換しておきます。言葉が違っても意味で探せます。
- ベクトルDBは、大量のベクトルをためておき、近いものをすばやく探し出すしくみです。
- コサイン類似度は、二つのベクトルの向きの近さを表し、意味の近さの尺度として使われます。
- 資料をどう区切るか(チャンク)は検索精度に効くため、ほどよい長さに区切るのがコツです。
- 質問をベクトル化し、近い文章を取り出してプロンプトに加え、LLMに答えさせるのがRAGの流れです。