メインコンテンツにスキップ
ブログ計算人工知能 システムがベクターデータベースでパフォーマンス向上とコスト削減を実現する理由

人工知能 システムがベクターデータベースを使用してパフォーマンスを向上させ、コストを削減する理由

なぜAIシステムはベクターデータベースを使用するのか?

人工知能のトレーニングはリソース集約的だ。言語、画像、音声を理解する方法をモデルに教えるには、膨大なデータセット、高度なアルゴリズム、特殊なハードウェア(高価なGPUと呼ばれる)が必要だ。しかし、トレーニングが完了した後でも、推論(出力を生成するプロセス)を実行することは、同様に負荷がかかる。

ユーザーのリクエストごとにリアルタイムでLLMに問い合わせるのは、コストがかかるだけでなく非効率的だ。特に、答えがすでに存在しているかもしれない場合はなおさらだ。この課題を解決するために、開発チームはベクター・データベースに注目した。

キーワードの完全一致に依存する従来のデータベースとは異なり、ベクトル・データベースは、テキスト、画像、音声などのデータを数値表現のような高次元の埋め込みとして情報を格納する。これにより、セマンティック検索が可能になる。つまり、正確な言葉を探すのではなく、意味を探すのです。

この区別は、次のような使用例では不可欠である:

  • 検索補強世代(RAG)
  • 推薦エンジン
  • 質問応答システム
  • セマンティック検索

ベクトルデータベースを使えば、人工知能 システムは、ベクトルインデックスに答えが既に存在する場合、不要な推論呼び出しをスキップすることで、関連する情報をより速く、より効率的に取り出すことができる。様々なベクトルデータベース・ソリューションがありますが、今日はオープンソースのPostgreSQL拡張であるpgvectorについてお話します。pgvectorはオープンソースのPostgreSQL拡張で、私が個人的に使用しており、推奨しているものです。

pgvectorが開発者にとって素晴らしいツールである理由

まず始めに、pgvectorは世界で最も広く採用されているリレーショナルデータベースの一つであるPostgreSQLにベクトル検索機能を直接統合しています。既にPostgreSQLベースの環境で作業している開発者やチームにとって、これはインテリジェントなアプリケーションを構築するためのシームレスで摩擦の少ない選択肢を提示します。

pgvectorは、新たに別のスタックを導入して管理するのではなく、チームがリレーショナルデータとベクトルデータの両方を一箇所で保存し、クエリすることを可能にします。この一元化により、異なるデータベースを同期させる複雑さがなくなり、よりシンプルな開発ライフサイクルが可能になります。人工知能アプリケーションでは、構造化フィルタ、全文検索、意味的類似性など、異なるタイプのクエリを1つの操作で組み合わせる必要があることがよくあります。pgvectorは、開発者がベクトル類似性スコアリングをSQLベースのフィルタや結合とブレンドできるようにすることで、このハイブリッド検索パターンをネイティブにサポートします。これにより、単一のSQLクエリ内で、ドキュメントのカテゴリやユーザ権限のようなフィルタを適用しながら、キーワードだけでなく、意味的な意味でもドキュメントのコーパスを検索することができます。

pgvectorは実際のスケーラビリティとパフォーマンスのために構築されています。何百万もの埋め込みに対して高速な結果を提供する必要があるアプリケーションのために、pgvectorはIVFFlatインデックスメソッドを通して近似最近傍(ANN)検索をサポートします。これにより、精度と速度のバランスを保ちながら、人工知能検索バーや推薦システムのような待ち時間の影響を受けやすいアプリケーションに対して、迅速な応答が可能になります。Python開発しているチームにとって、pgvectorはpsycopg2asyncpgSQLAlchemyのような一般的なPostgreSQLクライアントライブラリとスムーズに統合できるため、既存のデータパイプラインやMLワークフローに簡単に組み込むことができます。

pgvectorの多用途性は、業界を超えて価値があることが証明されています。私たちは、eコマース企業がコンバージョンを高めるためにパーソナライズされたレコメンデーションを提供するためにpgvectorを使用しているのを見ている。ある大手メディア・プラットフォームは、pgvectorを使用して関連性の高いコンテンツを表示し、ユーザーの興味を引き付けています。ヘルスケアとライフサイエンスのチームは、より迅速な研究、化合物の発見、診断の洞察に活用している。多くのハイテク企業では、LLM主導のサポートやよりスマートな社内ツールを実現している。 

pgvector をさらに強力にするのは、Akamai Cloud のようなプラットフォーム上に導入することです。アカマイのクラウド・ソリューションは、本番レベルのワークロードに必要なインフラ、スケーラビリティ、およびグローバルなパフォーマンスの優位性をチームに提供します。アカマイのマネージド PostgreSQL を利用することで、開発者は運用のオーバーヘッドを気にすることなく、pgvector ベースのアプリケーションを展開することができます。自動バックアップ、ビルトインセキュリティ、および自動スケーリングオプションにより、お客様のスタックは回復力を維持し、チームは構築に専念できます。また、アカマイのコンピュートおよびネットワークインフラ グローバルデリバリー向けに最適化されているため、高速推論やリアルタイムのレコメンデーションエンジンに依存するアプリケーションは、低レイテンシーと高い信頼性をスケールメリットとして享受できます。

PostgreSQLを既に使っている、あるいはスタックを全面的に見直す必要のない人工知能ベクトル検索エンジンを探しているのであれば、次のセクションでpgvectorを使い始める方法を説明します。 

アカマイで pgvector を始める

  1. アカマイのマネージドデータベースダッシュボードを使用して PostgreSQL クラスターをプロビジョニングします。
    1. Cloud Managerにログインします。
    2. メインメニューから「データベース」を選択します。
    3. データベース・クラスタの作成]をクリックします。
    4. クラスタ・ラベル]フィールドには、アカウント上のクラスタを簡単に識別できるようにラベルを入力します。ラベルは3文字以上32文字以下の英数字でなければなりません。
    5. 新しいデータベースのデータベースエンジンを選択します。
    6. データベースクラスタが存在する地域を選択します。 
    7. データベースクラスタの各ノードは独自のLinode上に構築されます。Choose a Planセクションで、ノードが使用するLinodeタイプとプランを選択します。 
    8. クリック データベースクラスタの作成.クラスタの完全なプロビジョニングには約10~15分かかります。ステータスは ステータス 列のデータベース・クラスタ・リスト。

      注:APIを使用したプロビジョニングも可能です。
  2. クラスタにログインする
    コマンドラインからデータベースに直接接続するには、psqlツールを使用します。このツールはほとんどのPostgreSQLサーバのインストールに含まれていますが、ほとんどのオペレーティングシステムでは個別にインストールすることもできます。

    以下のpsqlコマンドを使ってデータベースに接続する。 [host][username] を、接続の詳細セクションの対応する値に置き換えてください。

    psql --host=[host] --username=[username] --password --dbname=postgres
  3. 拡張機能をインストールする
    利用可能な拡張機能の1つをデータベースにインストールするには、[extension_name]をインストールしたい拡張機能の名前に置き換えて、CREATE EXTENSIONコマンドを使用します。この場合、拡張機能は vector.

    CREATE EXTENSION vector;
  4. ベクトルの列を定義する
    vector拡張をインストールすると、vectorという新しいデータ型にアクセスできるようになります。vectorのサイズ(カッコ内)は、そのvectorに格納されている次元数を表します。この例では13を使いますが、実際のユースケースでは数千になるでしょう。

    CREATE TABLE items ( id serial PRIMARY KEY, description text, embedding vector(13) );
  5. MLモデルからの埋め込み(例えば OpenAIの または ハグする顔).エンベッディングのサンプルを集めるには、以下のPython スクリプトを使うことができます。この例を動作させるには、Hugging Faceトークンを取得する必要があります。

    import requests
    import psycopg2
    import os

    # Hugging Face Configuration
    model_id = "sentence-transformers/all-MiniLM-L6-v2"
    hf_token = os.environ.get("HF_TOKEN") # Set an environmental variable called HF_TOKEN with your Hugging Face token
    api_url = f"https://router.huggingface.co/hf-inference/models/{model_id}"
    headers = {"Authorization": f"Bearer {hf_token}"}

    # Database Configuration
    db_conn_string = os.environ.get("DB_CONN_STRING") # Replace with your connection string or set an env var

    # Source for Embeddings
    source_sentence = "How do I get Medicare?"
    sentences = [
        "How do I get a replacement Medicare card?",
        "What is the monthly premium for Medicare Part B?",
        "How do I terminate my Medicare Part B (medical insurance)?",
        "How do I sign up for Medicare?",
        "Can I sign up for Medicare Part B if I am working and have health insurance through an employer?",
        "How do I sign up for Medicare Part B if I already have Part A?",
        "What are Medicare late enrollment penalties?",
        "What is Medicare and who can get it?",
        "How can I get help with my Medicare Part A and Part B premiums?",
        "What are the different parts of Medicare?",
        "Will my Medicare premiums be higher because of my higher income?",
        "What is TRICARE ?",
        "Should I sign up for Medicare Part B if I have Veterans' Benefits?"
    ]

    # Hugging Face API Query Function
    def get_embeddings(source_sentence, sentences):
        """Queries the Hugging Face API to get sentence embeddings."""
        try:
            response = requests.post(
                Api_url,
                headers=headers,
                json={"inputs": { "source_sentence": source_sentence, "sentences": sentences }, "options": {"wait_for_model": True}}
            )
            response.raise_for_status()  # Raise an exception for bad status codes (4xx or 5xx)
            return response.json()
        except requests.exceptions.RequestException as e:
            print(f"Error querying Hugging Face API: {e}")
            return None

    # Main Execution
    print("Fetching embeddings from Hugging Face...")
    embeddings = get_embeddings(source_sentence, sentences)

    if embeddings:
        print(f"Successfully fetched {len(embeddings)} embeddings.")
        conn = None
        Try:
            # Establish connection to the database
            print("Connecting to the PostgreSQL database...")
            conn = psycopg2.connect(db_conn_string)
            cur = conn.cursor()
            print("Connection successful.")

            # Insert descriptions and embeddings into the database
            print("Inserting data into the 'items' table...")
            for description, embedding in zip(sentences, embeddings):
                # The pgvector extension expects the vector as a string representation of a list
                cur.execute(
                    "INSERT INTO items (description, embedding) VALUES (%s, %s)",
                    (description, embeddings)
                )

            # Commit the transaction to make the changes permanent
            conn.commit()
            print(f"Successfully inserted {cur.rowcount} records into the database.")

        except psycopg2.Error as e:
            print(f"Database error: {e}")
            if conn:
                conn.rollback() # Rollback the transaction on error

        Finally:
            # Ensure the connection is closed
            if conn:
                cur.close()
                conn.close()
                print("Database connection closed.")

  6. pgvectorのインデックスと検索を使う
    Create the index after the table has some data

    CREATE INDEX ON items USING ivfflat (embedding vector_cosine_ops);

    SELECT *, embedding <-> query_embedding AS similarity FROM items ORDER BY similarity LIMIT 5;

ベクターデータベースはチームがパフォーマンスを最適化し、推論コストを削減し、よりスマートで高速なユーザエクスペリエンスを提供するのに役立っています。pgvectorのような拡張機能は、アーキテクチャをオーバーホールすることなく、PostgreSQLのような使い慣れた環境にセマンティック検索とハイブリッドクエリを簡単に導入することができます。 

pgVectorと他の利用可能な拡張機能の配置と使用方法については、ドキュメントを参照してください。 

こちらもどうぞ...

コメント 

コメントを残す

あなたのメールアドレスは公開されません。必須項目には*印がついています。