Amazon Web Services ブログ

Amazon MemoryDB のベクトル検索を一般公開

7月10日、Amazon MemoryDB のベクトル検索の一般提供についてお知らせします。これは、インメモリパフォーマンスとマルチ AZ 耐久性を備えたリアルタイム機械学習 (ML) および生成人工知能 (生成 AI) アプリケーションの開発用の新機能で、ベクトルの保存、インデックス作成、取得、検索に使用できます。

今回のリリースにより、Amazon MemoryDB は、Amazon Web Services (AWS) で人気の高いベクトルデータベースの中で、最も高いリコール率での最速のベクトル検索パフォーマンスを実現しました。従来、緊張関係にあったスループット、リコール、レイテンシーのトレードオフを行う必要はもうありません。

1 つの MemoryDB データベースを使用して、アプリケーションデータと数百万のベクトルを保存できるようになりました。最大リコールレベルでのクエリと更新の応答時間は、1 桁ミリ秒です。これにより、生成 AI アプリケーションアーキテクチャを簡素化すると同時に、最高のパフォーマンスを実現し、ライセンスコスト、運用上の負担、データに関する洞察を提供するための時間を削減することができます。

Amazon MemoryDB のベクトル検索では、既存の MemoryDB API を使用して、検索拡張生成 (RAG)、異常 (不正) 検出、ドキュメント検索、リアルタイムレコメンデーションエンジンなどの生成 AI ユースケースを実装できます。また、Amazon Bedrock Amazon SageMaker などの人工知能や機械学習 (AI/ML) サービスを使用してベクトル埋め込みを生成し、それらを MemoryDB に保存することもできます。

MemoryDB のベクトル検索のメリットが最も大きいユースケースはどれですか?
MemoryDB のベクトル検索は、次の特定のユースケースに使用できます。

1.検索拡張生成 (RAG) 用のリアルタイムのセマンティック検索
ベクトル検索を使用すると、大規模なデータコーパスから関連する箇所を取得して、大規模言語モデル (LLM) を拡張できます。これは、ドキュメントコーパスを取り出して個別のテキストバケットにまとめ、Amazon Titan Multimodal Embeddings G1 モデルなどの埋め込みモデルを使用してチャンクごとにベクトル埋め込みを生成し、これらのベクトル埋め込みを Amazon MemoryDB に読み込むことによって行われます。

RAG と MemoryDB を使用すると、リアルタイム生成 AI アプリケーションを構築して、項目をベクトルとして表現することで類似の製品やコンテンツを見つけたり、テキスト文書を意味的な意味を捉えた密度の高いベクトルとして表現してドキュメントを検索したりできます。

2.低レイテンシーかつ高耐久性のセマンティックキャッシュ
セマンティックキャッシュは、基盤モデル (FM) の以前の結果をメモリに保存することで計算コストを削減するプロセスです。以前に推論された回答を質問のベクトル表現と一緒に MemoryDB に保存し、LLM から別の回答を推論する代わりに、それらを再利用できます。

ユーザーのクエリが、定義済みの類似性スコアに基づいて前の質問と意味的に類似している場合、MemoryDB は前の質問に対する回答を返します。このユースケースにより、生成 AI アプリケーションが FM に新たなリクエストを行うことで、より低いコストでより迅速に応答できるようになり、顧客により速いユーザーエクスペリエンスを提供できます。

3.リアルタイムの異常 (不正) 検出
ベクトルで表されるトランザクションデータと、それらのトランザクションが不正または有効のどちらとして識別されたかどうかを表すメタデータを保存することで、ベクトル検索を使用して異常 (不正) を検出し、ルールベースの機械学習プロセスやバッチ機械学習プロセスを補完できます。

機械学習プロセスでは、正味の新規取引が不正取引を表すベクトルとの類似度が高い場合に、ユーザーの不正取引を検出できます。MemoryDB のベクトル検索を使用すると、バッチ ML モデルに基づいて不正なトランザクションをモデル化し、通常のトランザクションと不正なトランザクションを MemoryDB にロードして、主成分分析 (PCA) などの統計的分解手法を使用してベクトル表現を生成することで、不正を検出できます。

インバウンドトランザクションがフロントエンドアプリケーションを通過するときに、PCA を介してトランザクションのベクトル表現を生成することで、MemoryDB に対してベクトル検索を実行できます。また、トランザクションが過去に検出された不正トランザクションと非常に似ている場合は、1桁ミリ秒以内にトランザクションを拒否して、不正のリスクを最小限に抑えることができます。

Amazon MemoryDB でのベクトル検索の開始方法
MemoryDB でベクトル検索を使用して、簡単なセマンティック検索アプリケーションを実装する方法を見てみましょう。

ステップ 1.ベクトル検索をサポートするクラスターを作成する
MemoryDB クラスターを作成して、MemoryDB コンソール内でベクトル検索を有効にすることができます。クラスターを作成または更新するときに、[Cluster settings] (クラスター設定) で [Enable vector search] (ベクトル検索を有効にする) を選択します。ベクトル検索は、MemoryDB バージョン 7.1 およびシングルシャード構成で使用できます。

ステップ 2.Amazon Titan 埋め込みモデルを使用してベクトル埋め込みを作成する
Amazon Titan Text Embeddings やその他の埋め込みモデルを使用してベクトル埋め込みを作成できます。この埋め込みは Amazon Bedrock で利用できます。AWS サービスと統合された LangChain ライブラリを備えた単一の API を使用して PDF ファイルを読み込んだり、テキストをチャンクに分割したり、ベクトルデータを取得したりできます。

import redis
import numpy as np
from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import BedrockEmbeddings

# Load a PDF file and split document
loader = PyPDFLoader(file_path=pdf_path)
        pages = loader.load_and_split()
        text_splitter = RecursiveCharacterTextSplitter(
            separators=["\n\n", "\n", ".", " "],
            chunk_size=1000,
            chunk_overlap=200,
        )
        chunks = loader.load_and_split(text_splitter)

# Create MemoryDB vector store the chunks and embedding details
client = RedisCluster(
        host=' mycluster.memorydb.us-east-1.amazonaws.com',
        port=6379,
        ssl=True,
        ssl_cert_reqs="none",
        decode_responses=True,
    )

embedding =  BedrockEmbeddings (
           region_name="us-east-1",
 endpoint_url=" https://bedrock-runtime.us-east-1.amazonaws.com",
    )

#Save embedding and metadata using hset into your MemoryDB cluster
for id, dd in enumerate(chucks*):
     y = embeddings.embed_documents([dd])
     j = np.array(y, dtype=np.float32).tobytes()
     client.hset(f'oakDoc:{id}', mapping={'embed': j, 'text': chunks[id] } )

Amazon Titan Text Embeddings モデルを使用してベクトル埋め込みを生成したら、MemoryDB クラスターに接続し、MemoryDB HSET コマンドを使用してこれらの埋め込みを保存できます。

ステップ 3.ベクトルインデックスを作成する
ベクトルデータをクエリするには、FT.CREATE コマンドを使用してベクトルインデックスを作成します。ベクトルインデックスも、MemoryDB キースペースのサブセット上でコンストラクトおよび管理されます。ベクトルは JSON または HASH データ型で保存でき、ベクトルデータへの変更はすべてベクトルインデックスのキースペースで自動的に更新されます。

from redis.commands.search.field import TextField, VectorField

index = client.ft(idx:testIndex).create_index([
        VectorField(
            "embed",
            "FLAT",
            {
                "TYPE": "FLOAT32",
                "DIM": 1536,
                "DISTANCE_METRIC": "COSINE",
            }
        ),
        TextField("text")
        ]
    )

MemoryDB では、数値フィールド、タグフィールド、テキストフィールド、ベクトルフィールドの 4 種類のフィールドを使用できます。ベクトルフィールドは、フラット検索 (FLAT) と Hierarchical Navigable Small Worlds (HNSW) アルゴリズムを使用した、固定サイズのベクトルの K-最近傍検索 (KNN) をサポートしています。この機能は、ユークリッド、コサイン、内積などさまざまな距離計量をサポートしています。ここでは、ベクトル空間の 2 点間の角距離の尺度であるユークリッド距離を使用します。ユークリッド距離が小さいほど、ベクトルは互いに近づきます。

ステップ 4.ベクトル空間を検索する
FT.SEARCH コマンドと FT.AGGREGATE コマンドを使用してベクトルデータをクエリできます。各演算子は、インデックス内の 1 つのフィールドを使用して、インデックス内のキーのサブセットを識別します。MemoryDB のベクトルフィールドと、事前定義されたしきい値 (RADIUS) に基づくクエリベクトルとの間の距離によって、フィルタリングされた結果をクエリして見つけることができます。

from redis.commands.search.query import Query

# Query vector data
query = (
    Query("@vector:[VECTOR_RANGE $radius $vec]=>{$YIELD_DISTANCE_AS: score}")
     .paging(0, 3)
     .sort_by("vector score")
     .return_fields("id", "score")     
     .dialect(2)
)

# Find all vectors within 0.8 of the query vector
query_params = {
    "radius": 0.8,
    "vec": np.random.rand(VECTOR_DIMENSIONS).astype(np.float32).tobytes()
}

results = client.ft(index).search(query, query_params).docs

例えば、コサイン類似度を使用する場合、RADIUS 値の範囲は 0~1 で、値が 1 に近いほど、検索中心に近いベクトルが見つかります。

クエリベクトルの 0.8 以内のすべてのベクトルを検出した結果の例を次に示します。

[Document {'id': 'doc:a', 'payload': None, 'score': '0.243115246296'},
 Document {'id': 'doc:c', 'payload': None, 'score': '0.24981123209'},
 Document {'id': 'doc:b', 'payload': None, 'score': '0.251443207264'}]

詳細については、RAG と MemoryDB をベクトルストアとして使用した生成 AI アプリケーションのサンプルをご覧ください。

GA での新機能
re: Invent 2023 では、MemoryDB のベクトル検索のプレビュー版をリリースしました。お客様からのフィードバックに基づいて、現在ご利用いただけるようになった新機能と改善点は次のとおりです。

  • VECTOR_RANGE により、MemoryDB を低レイテンシーで耐久性のあるセマンティックキャッシュとして動作させることができるようになり、生成 AI アプリケーションのコスト最適化とパフォーマンスの向上が実現します。
  • SCORE を使用すると、ベクトル検索を行う際の類似度によるフィルタリングが改善されます。
  • メモリ内のベクトルが重複しないようにするための共有メモリ。ベクトルは MemoryDB キースペース内に格納され、ベクトルへのポインタはベクトルインデックスに格納されます。
  • 高いフィルタリングレートでのパフォーマンスの向上により、最もパフォーマンスが高い生成 AI アプリケーションを実現します。

今すぐご利用いただけます
ベクトル検索は、MemoryDB が現在利用可能なすべてのリージョンでご利用いただけます。詳しくは、AWS ドキュメントの Amazon MemoryDB のベクトル検索をご覧ください。

MemoryDB コンソールをお試しいただけましたら、AWS re:Post for Amazon MemoryDB または通常の AWS サポート窓口までフィードバックをお寄せください。

Channy

原文はこちらです。