RAGアプリケーションのための文変換器による意味検索モデルの作成

独自のセマンティック検索モデルを微調整することで、RAG(Retrieval Augmented Generation)パイプラインを実装することは、質問応答システムの精度と関連性を高める強力なアプローチです。

この技術は、意味検索と生成AIの両方の長所を組み合わせ、システムがユーザーの質問をよりよく理解し、より正確で文脈に関連した応答を生成することを可能にします。Sentence Transformersを使用して意味検索モデルを微調整することで、開発者はモデルを特定のドメインに合わせて調整し、RAGパイプラインの全体的なパフォーマンスを向上させることができます。

セマンティック検索

セマンティック検索とは何か?

セマンティック検索は、従来のキーワードベースの検索方法を超えるデータ検索技術である。自然言語処理と機械学習アルゴリズムを使用し、検索者の意図とクエリに使用された用語の文脈的意味を考慮することで、検索結果の精度を向上させる。このアプローチは、単にキーワードをマッチングさせるのではなく、検索クエリの根本的な意味とウェブページ上のコンテンツを理解することを目的としている。そうすることで、セマンティック検索は、元のクエリで使用された正確な単語が含まれていなくても、より関連性の高い結果を提供することができる。

これを実現するために、セマンティック検索は、語義曖昧性解消、概念抽出、クエリ拡張などの様々な技術を採用している。また、ベクトル検索や機械学習も利用し、ユーザーの意図や文脈にマッチした結果を返すことを目的としている。セマンティック検索は、グーグルなどのウェブ検索エンジンで広く使われており、ナレッジグラフのような技術を利用している。これにより、検索エンジンは検索クエリの背後にある意味を理解し、より正確で意味のある結果を提供することができます。

セマンティック検索は、技術文書、契約書、製品説明など、自社のドメイン知識に関する質問に答えたい企業にとって非常に便利である。

検索拡張世代(RAG)とは何か?

セマンティック検索

検索拡張生成(RAG)は、ラージ・ランゲージ・モデル(LLM)のような生成AIモデルの精度と信頼性を、外部データ・ソースを組み込むことによって向上させ、より文脈に即した正確で最新の情報を提供する技術である。検索コンポーネントを生成モデルと統合することで、システムが応答を生成する際に、データベースや知識ベースから関連情報を検索して取得し、内部知識を補完することができます。

このアプローチにより、AIモデルが最新の信頼できる事実に基づいた回答を提供できることが保証され、ユーザーはモデルの回答に使用されている情報源を確認することができます。RAGは、AIモデルを外部の知識源に基づかせ、その出力の質を向上させ、大規模な再トレーニングを必要とせずにモデルを更新する方法を提供するのに役立ちます。

RAGは、生成AIモデルによる潜在的な幻覚を軽減するための素晴らしい戦略である。RAGは、事実の正確さと自然言語で生成された人間の応答という、両方の長所を併せ持つ質問応答システムを構築するのに役立つ。

センテンス・トランスフォーマー・ライブラリーとは?

センテンス・トランスフォーマー

Sentence Transformersライブラリは、最先端のテキスト埋め込み用に設計された強力なPythonフレームワークです。BERT、RoBERTa、XLM-Rなどの変換ニューラルネットをベースに構築されており、意味検索、言い換えマイニング、意味類似度比較、クラスタリングなど、さまざまなタスクで最高のパフォーマンスを発揮します。このライブラリにより、文埋め込み手法の微調整が容易になり、特定のニーズに合わせたタスク固有の文埋め込みを作成することができます。 詳しくはセンテンス・トランスフォーマーのウェブサイトをご覧ください。

このライブラリは、Hugging Faceプラットフォームで利用可能な、50以上の言語用の訓練済みSentence Transformersモデルの幅広いセレクションを提供します。また、ユーザーはライブラリを使って独自のモデルをトレーニングしたり、微調整したりすることができ、ユニークなユースケースのためのカスタムモデルを作成する柔軟性を提供します。Sentence Transformersチームは最近新しいメジャーバージョン(v3)をリリースし、このライブラリの機能、特に微調整機能を大幅に改善しました。

Sentence Transformersライブラリは高速で、包括的で、よくメンテナンスされている。

独自のセマンティック検索モデルを作る

独自のセマンティック検索モデルを作成することは、非常に低いレイテンシを確保しながら正確な結果を得るための素晴らしい方法です。独自のセマンティック検索モデルをGPU上にデプロイすれば、なおさらです。

まず、データを含む小さなデータセットを作ってみよう。1列のCSVファイル("dataset.csv "と呼ぶ)を作成し、HPプリンタに関する以下の技術文書を含める(実際のシナリオでは、もちろんもっと多くの例を含めたいだろう):

"HP® LaserJets have unmatched printing speed, performance and reliability that you can trust. Enjoy Low Prices and Free Shipping when you buy now online."
"Every HP LaserJet comes with a one-year HP commercial warranty (or HP Limited Warranty)."
"HP LaserJet ; Lowest cost per page on mono laser printing. · $319.99 ; Wireless options available. · $109.00 ; Essential management features. · $209.00."

各行には最大512トークン(およそ400ワードに相当)まで含めることができ、精度を最大にするためには128トークン(およそ100ワードに相当)以下に抑えることが推奨されます。これで3つのドキュメントがデータセットに揃ったので、Sentence Transformersを使ったモデルを使ってデータをエンコードすることができます。以下のPythonスクリプトを作成します(PyTorchとSentence Transformersがインストールされていることを確認してください)。

from sentence_transformers import SentenceTransformer
import csv
import torch

model_name = 'paraphrase-multilingual-mpnet-base-v2'
encoded_model_path = 'semantic_search_model.pt'
dataset_path = 'dataset.csv'

bi_encoder = SentenceTransformer(model_name)

passages = []
with open(dataset_path) as csv_file:
    csv_reader = csv.reader(csv_file)
    for row in csv_reader:
        passages.append(row[0])
        
corpus_embeddings = bi_encoder.encode(
    passages, batch_size=32, convert_to_tensor=True, show_progress_bar=True)

torch.save(corpus_embeddings, encoded_model_path)

このスクリプトはparaphrase-multilingual-mpnet-base-v2をダウンロードし、ベースモデルとして使用します。あなたの要件(モデルサイズ、ユースケース、サポートされる言語など)に応じて、利用可能な多くの事前学習済みモデルの中から選択することができます。お使いのハードウェアによっては、エンコード処理を高速化するために "batch_size "パラメータを調整する必要があります。

一度作成したモデルは、以下のPythonスクリプトを使って推論に使うことができる:

import csv
from sentence_transformers import SentenceTransformer, util
import torch

bi_encoder = SentenceTransformer('paraphrase-multilingual-mpnet-base-v2')
semantic_search_model = torch.load('semantic_search_model.pt')

passages = []
with open('app/custom_model/dataset.csv') as csv_file:
    csv_reader = csv.reader(csv_file)
    for row in csv_reader:
        passages.append(row[0])

question_embedding = bi_encoder.encode(
    "How long is the warranty on the HP Color LaserJet Pro?", convert_to_tensor=True)
hits = util.semantic_search(
    question_embedding, semantic_search_model, top_k=3)
hits = hits[0]

result = {"search_results": [
    {"score": hit['score'], "text": passages[hit['corpus_id']]} for hit in hits]}

上記の推論スクリプトは以下の結果を返す:

{
"search_results": [
    {
        "score": 0.99,
        "text": "Every HP LaserJet comes with a one-year HP commercial warranty (or HP Limited Warranty)."
    },
    {
        "score": 0.74,
        "text": "All consumer PCs and printers come with a standard one-year warranty. Care packs provide an enhanced level of support and/or an extended period of coverage for your HP hardware. All commercial PCs and printers come with either a one-year or three-year warranty."
    },
    {
        "score": 0.68,
        "text": "In-warranty plan · Available in 2-, 3-, or 4-year extension plans · Includes remote problem diagnosis support and Next Business Day Exchange Service."
    },
    ]
}

推論スクリプトでは、"top_k" パラメータで、返したい結果の数を決定する。結果には、データセットからマッチしたテキストを信頼スコアとともに表示する。このスコアは、応答を受け入れるかどうかの判断に役立つので重要である。

ジェネレーティブAIによる自然言語での応答生成

お分かりのように、セマンティック検索の主な限界は、モデルが質問に直接答えることなく、データセットから生のテキストを返すことである。そこで我々は、自然言語で最初の質問に答えるために、これを生成AIモデルにコンテキストとして与えたい。

OpenAIのGPT-4やNLP CloudのLLaMA 3やChatDolphinのような先進的なLLMを活用することで、これを簡単に実現することができます。意味検索モデルから最良の結果を残し、これをコンテキストとしてLLMに渡すか、複数の結果を残すかを決めることができます。以下は最良の結果のみを使用したプロンプトの例です:

Context: Every HP LaserJet comes with a one-year HP commercial warranty (or HP Limited Warranty).
Based on the above context, answer the following question: How long is the warranty on the HP Color LaserJet Pro?

このリクエストはそのようなものを返す:

The warranty on the HP Color LasertJet Pro lasts at least 1 year.

符号化データによる意味検索モデルとベクトルデータベースへの埋め込みの比較

検索補強型生成(RAG)システムにおいて、ローカルに符号化されたデータで意味検索モデルを作成するか、ベクトルデータベースを使用するかは、2つの興味深い選択肢である。

独自のデータをエンコードする場合、データをテンソルに変換し、GPUにデータをロードする機会がある。一方、ベクトル・データベースは、これらの高次元ベクトルを効率的に格納し、インデックスを付け、クエリを実行するために設計された特殊なデータベースです。

非常に低いレイテンシーを実現したい企業には、計算時間を改善するために、独自のデータをエンコードしてGPUにロードすることをお勧めします。しかし、データセットが変更されるたびにデータを再度エンコードする必要があるため、柔軟性が犠牲になります。もし基礎となるデータが頻繁に変更されるのであれば、エンベッディングを抽出し、ベクターデータベース(例えばPG Vectorのような)にインクリメンタルに保存する方が簡単かもしれません。

結論

Retrieval Augmented Generationは、技術文書や契約書などのような特定のデータに関する質問に答えることを検討している企業にとって、結果の精度を大幅に高めるために非常に重要です。RAGは、例えばサポートチャットボットの重要なコンポーネントです。

Sentence Transformersは、独自のデータに基づいて独自の意味検索モデルを作成するために使用できる素晴らしいライブラリです。GPU上に配置し、高度な生成AIモデルと組み合わせることで、このようなモデルは非常に強力になります。

Sentence Transformersに基づく独自のセマンティック検索モデルを自分で作成して展開することに興味がなければ、NLP Cloudで1クリックで簡単に実行できます。 今すぐNLPクラウドでセマンティック検索をお試しください!

RAG、セマンティック検索、センテンス・トランスフォーマーについてご質問があれば、遠慮なくお尋ねください!

Julien
NLPクラウドCTO