Traffine I/O

日本語

2023-05-02

Pinecone

Pineconeとは

Pineconeはクラウドネイティブで管理されたベクトルデータベースであり、高性能なベクトル検索アプリケーションの構築を可能にします。シンプルなAPIとインフラストラクチャにより、Pineconeはシームレスかつ煩雑なく使用できるよう設計されています。その本質は、複雑なベクトル計算に基づいて結果を容易に検索、マッチング、ランキングする能力をビジネスに提供することであり、これは現代の機械学習アプリケーションにおいて重要な機能です。

Pineconeの特徴

Pineconeは、大規模な機械学習アプリケーションに取り組む開発者にとって貴重なツールとなる、堅牢な機能セットを提供しています。

  • 高速
    Pineconeは、数十億のアイテムを処理しても超低レイテンシのクエリ応答を可能にします。これにより、規模に関係なく高速かつ効率的な大規模なアプリケーションを実現できます。

  • 最新のデータ
    Pineconeでは、データが追加、編集、削除されるたびにインデックスのライブアップデートが可能です。これにより、データが常に最新であり、任意の時点で正確なデータの反映が提供されます。

  • フィルタリング
    Pineconeでは、ベクトル検索とメタデータフィルターの組み合わせが可能です。この機能により、検索プロセスが合理化され、より関連性の高い結果が迅速に得られます。

  • フルマネージド
    Pineconeのデプロイ、使用、拡張の容易さは、そのキーコンセプトです。データベースの管理に時間とリソースを割かずに、スムーズかつ安全な操作を維持するよう設計されており、開発者がアプリケーション開発により多くの時間とリソースを注ぐことができます。

Pineconeのコンセプト

以下に、Pineconeの主要なコンセプトのいくつかを紹介します。

組織管理

  • 組織(Organization)
    組織は同じ課金を利用するプロジェクトのコレクションです。各プロジェクトは必ず1つの組織に所属します。組織は、その下にあるプロジェクトのメンバーとクォータを管理する権限を持ちます。

  • プロジェクト(Project)
    プロジェクトはPodとインデックスを管理する責任があります。使用環境(クラウドサービスやリージョンなど)を決定します。プロジェクトレベルでAPIキーが発行され、セキュリティと管理のレイヤーが追加されます。

https://docs.pinecone.io/docs/organizations
https://docs.pinecone.io/docs/projects

インデックス管理

  • インデックス(Index)
    インデックスはベクトルを管理する単位です。ベクトルの次元、類似性計算に使用するメトリクス(コサイン類似度、ユークリッド距離、内積)、およびベクトルメタデータのタイプなど、さまざまな属性を定義します。

  • ベクトル(Vector)
    ベクトルはインデックスに格納されるデータです。これらは高次元のデータポイントであり、アプリケーション内のアイテムや特徴量を表します。

  • メタデータ(Metadata)
    メタデータはベクトルに添付される追加情報です。Pineconeは、文字列、数値、ブール値、文字列のリストなど、さまざまなデータ型をサポートしています。クエリ中にメタデータを使用してベクトルをフィルタリングすることで、より効率的な検索結果を提供できます。

  • ポッド(Pod)
    ポッドはインデックスを管理するハードウェアユニットです。1つ以上のポッドが各インデックスを維持します。各ポッドには特定のタイプとサイズがあります。

  • タイプ(Type)
    ポッドのタイプは、s1(ストレージ効率のためのタイプ)またはp1、p2(パフォーマンス効率のためのタイプ)です。

  • サイズ(Size)
    ポッドのサイズは、それが保存できるデータ量を指します。容量は、タイプとサイズの組み合わせで決まります。

  • ネームスペース(Namespace)
    ネームスペースはインデックス内のベクトルを異なる集合に分割するための機能です。各ベクトルは必ず1つのネームスペースに属します。クエリ中にネームスペースを指定することで、特定のネームスペース内のベクトルを検索することができます。

  • コレクション(Collection)
    コレクションは特定の時点でのインデックスのダンプです。データのバックアップや異なるポッド間でのデータの転送に使用できます。この機能は、災害リカバリーシナリオや異なるハードウェアユニット間でのデータの整合性を維持するために特に有用です。

https://docs.pinecone.io/docs/indexes

APIエンドポイント

Pineconeは、ベクトル操作を処理するいくつかのAPIエンドポイントを提供しています。これらのAPIはPythonやNode.jsのクライアントライブラリからもアクセスすることができます。

https://docs.pinecone.io/reference/describe_index_stats_post

DescribeIndexStats

DescribeIndexStats APIは、インデックスの内容に関する統計情報を返します。ネームスペースごとのベクトルの数や次元数などが含まれます。これにより、ユーザーは現在のインデックスの状態に関する洞察を得ることができます。

bash
$ curl --request POST \
     --url https://index_name-project_id.svc.environment.pinecone.io/describe_index_stats \
     --header 'accept: application/json' \
     --header 'content-type: application/json'
{
  "namespaces": {
    "": {
      "vectorCount": 50000
    },
    "example-namespace-2": {
      "vectorCount": 30000
    }
  },
  "dimension": 1024,
  "index_fullness": 0.4
}

Fetch

Fetch APIは、IDに基づいてベクトルを取得するために使用されます。この操作は、類似性検索を行わずにインデックスから特定のベクトルにアクセスしたい場合に特に有用です。

bash
$ curl --request GET \
     --url 'https://index_name-project_id.svc.environment.pinecone.io/vectors/fetch?ids=example-vector-1' \
     --header 'accept: application/json'
{
  "vectors": {
    "additionalProp": {
      "id": "example-vector-1",
      "values": [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8],
      "sparseValues": {
        "indices": [1, 312, 822, 14, 980],
        "values": [0.1, 0.2, 0.3, 0.4, 0.5]
      },
      "metadata": {
        "genre": "documentary",
        "year": 2019
      }
    }
  },
  "namespace": "example-namespace"
}

Query

Query APIは、入力ベクトルと類似性の高いベクトルを検索するためのものです。検索操作はネームスペースレベルで行うこともできますし、検索中にメタデータをフィルタリングに使用することもできます。これにより、検索結果を絞り込んでより関連性の高いベクトルを取得することができます。

bash
$ curl --request POST \
     --url https://index_name-project_id.svc.environment.pinecone.io/query \
     --header 'accept: application/json' \
     --header 'content-type: application/json' \
     --data '
{
  "includeValues": "false",
  "includeMetadata": "false"
}
'
{
  "matches": [
    {
      "id": "example-vector-1",
      "score": 0.08,
      "values": [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8],
      "sparseValues": {
        "indices": [1, 312, 822, 14, 980],
        "values": [0.1, 0.2, 0.3, 0.4, 0.5]
      },
      "metadata": {
        "genre": "documentary",
        "year": 2019
      }
    }
  ],
  "namespace": "string"
}

Upsert

Upsert APIはベクトルを追加または更新するために使用されます。Upsert操作は完全な更新を行い、IDが一致する場合は既存のベクトルを新しいベクトルで置き換えます。

bash
$ curl --request POST \
     --url https://index_name-project_id.svc.environment.pinecone.io/vectors/upsert \
     --header 'accept: application/json' \
     --header 'content-type: application/json' \
     --data '
{
  "vectors": [
    {
      "id": "example-vector",
      "values": [
        1,
        2,
        3
      ]
    }
  ]
}
'
{
  "upsertedCount": 1
}

Update

Update APIを使用すると、ベクトルを部分的に更新することができます。ベクトルとメタデータに個別の更新値を指定することができるため、ベクトルデータベースの更新においてより柔軟性を持たせることができます。

Delete

Delete APIは、インデックスからベクトルを削除するために使用されます。クエリ操作と同様に、ネームスペースレベルでベクトルを削除したり、削除時にメタデータをフィルタリングに使用することができます。

参考

https://docs.pinecone.io/docs/organizations
https://docs.pinecone.io/docs/projects
https://docs.pinecone.io/docs/indexes
https://docs.pinecone.io/reference/describe_index_stats_post

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!