🦜

LangChain の BigQuery Vector Search 機能によるベクトル検索

2024/05/01に公開

はじめに

こんにちは、クラウドエース データソリューション部の松本です。
普段は、データ基盤や MLOps を構築したり、Google Cloud 認定トレーナーとしてトレーニングを提供しております。

クラウドエース データソリューション部 について

クラウドエースのITエンジニアリングを担う システム開発統括部 の中で、特にデータ基盤構築・分析基盤構築からデータ分析までを含む一貫したデータ課題の解決を専門とするのが データソリューション部 です。
弊社では、新たに仲間に加わってくださる方を募集しています。もし、ご興味があれば エントリー をお待ちしております!

今回は、LangChain の BigQuery Vector Search 機能によるベクトル検索についてご紹介します。

この記事はこんな人にオススメ

  • LangChain と BigQuery を組み合わせたベクトル検索方法をご検討の方
  • LangChain における BigQuery Vector Search 機能について知りたい方
  • BigQuery のベクトル検索機能について知りたい方

LangChain とは

LangChain とは、大規模言語モデル (LLM) に基づいてアプリケーションを構築するためのオープンソースのフレームワークです。LangChain を使用することで、言語モデルのカスタマイズや質問応答システムなど、様々な言語関連アプリケーションの開発を容易に実装することが可能です。

LangChain は Google Cloud との連携機能が増えてきており、Google Cloud を使った LLM によるアプリケーション開発が容易になってきています。特に LangChain と Google Cloud データベースのインテグレーション がより強化されてきています。

BigQuery のベクトル検索機能とは

BigQuery のベクトル検索機能 とは、VECTOR_SEARCH 関数 によりベクトルインデックスを使用したベクトル検索ができる機能です。

詳しい BigQuery のベクトル検索機能に関しては、以下の記事で紹介されており参考になります。尚、こちらの記事では、ベクトルインデックスを使用した際のパフォーマンスについても言及されています。
https://zenn.dev/cloud_ace/articles/79cd78dcacfac5

LangChain における BigQuery Vector Search 機能とは

LangChain は、前述の通り Google Cloud の様々なデータベースとのインテグレーションが強化されていますが、BigQuery も例外ではありません。インテグレーションされた機能として BigQuery Vector Search 機能 があり、LangChain から投げたクエリをもとに BigQuery 上でベクトル検索を実行することが可能です。これにより、BigQuery の利点であるスケーラビリティを活かすことができます。


LangChain における BigQuery Vector Search 機能

試してみた

今回は、以下の LangChain の公式ドキュメントを参考に、BigQuery Vector Search 機能を試してみたいと思います。
https://python.langchain.com/docs/integrations/vectorstores/google_bigquery_vector_search/

実行環境としては、Google ColaboratoryVertex AI Workbench などでお試しください。

初期設定

今回使用する以下のライブラリをインストールします。

%pip install --upgrade --quiet  langchain langchain-google-vertexai google-cloud-bigquery

BigQuery の実行環境およびデータセット名、テーブル名をセットします。

PROJECT_ID = "project-id"
REGION = "US"
DATASET = "my_dataset"
TABLE = "doc_and_vectors"

プロジェクト ID を設定します。

! gcloud config set project {PROJECT_ID}

Vertex AI Workbench を使用している場合は、以下を実行します。

from google.colab import auth as google_auth

google_auth.authenticate_user()

Embedding

Vertex AI の Embedding モデルを使用するために VertexAIEmbeddings のインスタンスを作成します。尚、textembedding-gecko-multilingual は Vertex AI の LLM として用意されている、英語以外(日本語)にも対応した Embedding モデルになります。

from langchain_google_vertexai import VertexAIEmbeddings

embedding = VertexAIEmbeddings(
    model_name="textembedding-gecko-multilingual@latest", project=PROJECT_ID
)

BigQuery のクライアントライブラリを使用して、データセットを作成します。

from google.cloud import bigquery

client = bigquery.Client(project=PROJECT_ID, location=REGION)
client.create_dataset(dataset=DATASET, exists_ok=True)

既存の BigQuery データセットに対して BigQuery のベクトル ストアとなるテーブルの初期化を行います。尚、この際に使用されている API は以下を参照ください。

from langchain.vectorstores.utils import DistanceStrategy
from langchain_community.vectorstores import BigQueryVectorSearch

store = BigQueryVectorSearch(
    project_id=PROJECT_ID,
    dataset_name=DATASET,
    table_name=TABLE,
    location=REGION,
    embedding=embedding,
    distance_strategy=DistanceStrategy.EUCLIDEAN_DISTANCE,
)

特定のテキストを add_texts により Embedding し、BigQuery テーブルに格納します。
メタデータとして、テキストの文字数を登録しておきます。

all_texts = [
    "Apples and oranges",
    "Cars and airplanes",
    "Pineapple",
    "Train",
    "Banana"
]
metadatas = [{"len": len(t)} for t in all_texts]

store.add_texts(all_texts, metadatas=metadatas)

BigQuery テーブルの出力結果は以下のようになります。

ベクトル検索

similarity_search によりクエリ内容に関するベクトル検索を行います。

query = "I'd like a fruit."
docs = store.similarity_search(query)
print(f"content: {docs[0].page_content}")

ベクトル検索の結果、以下の文字列が出力されます。

content: Apples and oranges

BigQuery のジョブ詳細を確認すると、以下のクエリが実行されていました。
ベクトル検索として VECTOR_SEARCH 関数によるベクトル検索が行われていることが分かります。尚、distance_type のデフォルトは EUCLIDEAN(ユークリッド距離)になります。

similarity_search_by_vector によりクエリ内容に関するベクトル検索を行います。k=2 のパラメータ指定により、ベクトル距離の近い上位 2 件が取得されます。

query_vector = embedding.embed_query(query)
docs = store.similarity_search_by_vector(query_vector, k=2)
print(f"content1: {docs[0].page_content}")
print(f"content2: {docs[1].page_content}")

ベクトル検索の結果、以下の文字列が出力されます。

content1: Apples and oranges
content2: Banana

BigQuery のジョブ詳細を確認すると、以下のクエリが実行されていました。
先ほどのクエリと比較すると、VECTOR_SEARCH 関数のパラメータ top_k => 2 によりベクトル距離の近い上位 2 件を取得するように変更されていることが分かります。

再度、similarity_search_by_vector によるベクトル検索を行いますが、ここではメタデータの len にてフィルターして検索を行います。

docs = store.similarity_search_by_vector(query_vector, filter={"len": 6})
print(f"content: {docs[0].page_content}")
print(f"len: {docs[0].metadata['len']}")

ベクトル検索の結果、以下の文字列が出力されます。

content: Banana
len: 6

BigQuery のジョブ詳細を確認すると、以下のクエリが実行されていました。
WHERE 句にて metadatalen = "6" でフィルターされていることが分かります。

まとめ

今回は、LangChain の BigQuery Vector Search 機能によるベクトル検索についてご紹介いたしました。BigQuery と LangChain の連携機能がより強化されたことで、BigQuery の利点をより活かしやすくなったと思います。この機能を活用した アプリケーションの構築や RAG の構築もできると思いますので、ご興味のある方はぜひお試しください!

Discussion