テキスト埋め込みモデル

テキスト埋め込みモデルは、主にテキストのベクトル表現を計算するために使用されます。ここでいう「ベクトル」とは、数学的なベクトル、または特徴ベクトルとも呼ばれます。開発者として知っておくべきことは、テキスト埋め込みモデルがテキストの特徴ベクトルを計算し、その後ベクトルの類似性計算を使用して、類似した特徴を持つテキストコンテンツを特定できるということです。

ヒント:テキスト埋め込みモデルの基本知識については、テキスト埋め込みモデルの入門チュートリアルを参照してください。

ベクトル検索とキーワードベース検索の違い

  • ベクトル検索は単語ベクトルの意味的な類似性に基づいています。クエリと結果の単語が完全に一致しなくても、意味的に関連する結果を見つけることができます。ベクトル検索は単語を高次元のベクトル空間にマッピングし、ベクトル間の類似性を計算します。これは、単語自体が一致しなくても、意味的に類似していれば関連する結果を見つけることができるということです。
  • 一方、キーワードベース検索は単純な文字列マッチングプロセスです。完全に一致するクエリ単語を含む結果のみが返されます。ドキュメントが異なる単語を使用していても、意味的に類似していてもマッチされません。

Embeddingsクラスは、テキスト埋め込みモデルとの相互作用に特化したクラスの一種です。埋め込みモデルのプロバイダーは多く存在し(例:OpenAI、Cohere、Hugging Faceなど)、このクラスの設計はすべてのプロバイダーに対して標準的なインターフェースを提供することです。

Embeddingsクラスはテキストのベクトル表現を作成します。ベクトル検索では、ベクトル空間内で最も類似したテキストスニペットを検索するなど、意味的な検索が行えます。

LangChainの基本的なEmbeddingsクラスには、文書の埋め込みとクエリの埋め込みの2つのメソッドが公開されています。前者は複数のテキストを入力とし、後者は単一のテキストを入力とします。これらを2つの異なるメソッドとして扱う理由は、一部の埋め込みプロバイダーが検索対象の文書とクエリ(検索クエリ自体)のために異なる埋め込み方法を持っているためです。

クイックスタート

以下は、OpenAIの埋め込みモデルを使用した例です。

設定

まず、OpenAIのPythonパッケージをインストールする必要があります。LangChainにはさまざまなテキスト埋め込みモデルの実装がありますので、開発者は自分の選択に応じて異なるモデルの依存関係をインストールする必要があります。

pip install langchain-openai

環境変数を使ってOpenAIキーを設定します。

export OPENAI_API_KEY="..."

環境変数を設定したくない場合は、OpenAIのLLMクラスを初期化する際にopenai_api_keyという名前のパラメータを直接渡すことでキーを渡すことができます。

from langchain_openai import OpenAIEmbeddings

embeddings_model = OpenAIEmbeddings(openai_api_key="...")

それ以外の場合は、パラメータなしで初期化することもできます。

from langchain_openai import OpenAIEmbeddings

embeddings_model = OpenAIEmbeddings()

embed_documents

複数のテキストのベクトル特徴を計算します。

embeddings = embeddings_model.embed_documents(
    [
        "Hi there!",
        "Oh, hello!",
        "What's your name?",
        "My friends call me World",
        "Hello World!"
    ]
)
len(embeddings), len(embeddings[0])
(5, 1536)

embed_query

この関数は、クエリテキストのベクトル特徴を計算します。通常、検索する質問を特徴ベクトルに変換し、このベクトルを使用してベクトルデータベース内の類似したテキストをクエリするという処理が含まれます。

embedded_query = embeddings_model.embed_query("会話で言及された名前は何でしたか?")
embedded_query[:5]
[0.0053587136790156364,
 -0.0004999046213924885,
 0.038883671164512634,
 -0.003001077566295862,
 -0.00900818221271038]